/* JohnsonB Studio — direction A "Atelier": warm charcoal, gold / steel / ember accents.
   One stylesheet for every page; each page sets data-area="craft|eng|hobby|studio" on <body>
   to pick its accent. No build step, no framework. */
:root{
  --bg:#121110; --bg2:#1B1917; --card:#211E1B; --card2:#26221E; --ink:#F1EBE1; --ink2:#C9C0B2; --muted:#8B8377;
  --line:#2E2A26; --line2:#433D37;
  --gold:#D4A648; --gold2:#F0C76A; --gold-s:rgba(212,166,72,.14);
  --steel:#6FA3D6; --steel2:#9CC4EA; --steel-s:rgba(111,163,214,.14);
  --ember:#E0623E; --ember2:#F28B6A; --ember-s:rgba(224,98,62,.14);
  --accent:var(--gold); --accent2:var(--gold2); --accent-s:var(--gold-s);
  --serif:"Playfair Display",Georgia,serif; --sans:"Manrope",system-ui,-apple-system,"Segoe UI",sans-serif; --mono:"JetBrains Mono",ui-monospace,Consolas,monospace;
  --r:18px;
}
body[data-area="eng"]{--accent:var(--steel);--accent2:var(--steel2);--accent-s:var(--steel-s)}
body[data-area="hobby"]{--accent:var(--ember);--accent2:var(--ember2);--accent-s:var(--ember-s)}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:17px;line-height:1.55;-webkit-font-smoothing:antialiased}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
.wrap{max-width:1180px;margin:0 auto;padding:0 24px}
.mono{font-family:var(--mono)}
/* header */
.site-header{position:sticky;top:0;z-index:20;background:rgba(18,17,16,.86);backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}
.site-header .wrap{display:flex;align-items:center;gap:16px;height:72px}
.logo{display:flex;align-items:center;gap:12px}
.logo img{width:44px;height:44px;border-radius:8px}
/* the wordmark is set, not drawn: at 44px the lettering inside the logo file would be under
   4px tall.  Manrope 800 uppercase tracks close to it and stays sharp at every zoom.  The B is
   hard-coded gold rather than var(--accent): it belongs to the brand, and an accent that turns
   steel on Engineering or ember on Games would fight the gold crescent right beside it. */
.logo b{font-family:var(--sans);font-weight:800;font-size:19px;letter-spacing:.055em;line-height:1;text-transform:uppercase}
.logo b span{color:var(--gold)}
/* STUDIO is spread to the exact width of JOHNSONB above it, as the logo sets it; the
   negative margin takes back the trailing gap letter-spacing adds after the last O. */
.logo b small{display:block;font:500 11px/1 var(--sans);letter-spacing:1.09em;margin-right:-1.09em;color:var(--ink2);margin-top:6px}
.site-nav{margin-left:auto;display:flex;gap:4px;align-items:center;font:600 12px var(--mono);letter-spacing:.12em;text-transform:uppercase}
.site-nav a{color:var(--ink2);padding:8px 11px;border-radius:8px}
.site-nav a:hover{background:var(--bg2);color:var(--ink)}
.site-nav a.g{color:var(--gold)} .site-nav a.s{color:var(--steel)} .site-nav a.e{color:var(--ember)}
.site-nav a.on{background:var(--bg2);box-shadow:inset 0 -2px 0 currentColor}
.site-nav .kofi{color:var(--ember);border:1px solid var(--ember);border-radius:999px;padding:7px 13px;margin-left:8px}
.site-nav .kofi:hover{background:var(--ember-s)}
/* support tooltip on the header button */
.kofi{position:relative}
.kofi:after{content:attr(data-tip);position:absolute;top:calc(100% + 10px);right:0;width:280px;background:var(--card);color:var(--ink2);border:1px solid var(--line2);border-radius:10px;padding:10px 12px;font:400 13px/1.4 var(--sans);letter-spacing:0;text-transform:none;box-shadow:0 12px 30px -12px rgba(0,0,0,.7);opacity:0;transform:translateY(-4px);pointer-events:none;transition:opacity .15s,transform .15s;z-index:30}
.kofi:before{content:"";position:absolute;top:calc(100% + 4px);right:22px;border:6px solid transparent;border-bottom-color:var(--line2);opacity:0;transition:opacity .15s}
.kofi:hover:after,.kofi:focus-visible:after,.kofi:hover:before,.kofi:focus-visible:before{opacity:1;transform:none}
@media (max-width:760px){ .kofi:after,.kofi:before{display:none} }
.menu-btn{display:none;margin-left:auto;background:none;border:1px solid var(--line2);color:var(--ink);border-radius:8px;padding:8px 10px;font:600 12px var(--mono);letter-spacing:.1em;cursor:pointer}
/* hero */
.hero{padding:88px 0 60px;position:relative;overflow:hidden;border-bottom:1px solid var(--line)}
.hero:before{content:"";position:absolute;inset:0;background:radial-gradient(800px 420px at 12% 0%,var(--accent-s),transparent 60%),radial-gradient(700px 400px at 88% 40%,rgba(255,255,255,.04),transparent 60%)}
.hero .wrap{position:relative}
.kicker{font:600 12px var(--mono);letter-spacing:.22em;text-transform:uppercase;color:var(--accent);margin-bottom:22px}
h1{font-family:var(--serif);font-weight:500;font-size:clamp(42px,6.6vw,88px);line-height:.98;margin:0 0 26px;letter-spacing:-.01em;max-width:15ch}
h1 em{font-style:italic;font-weight:500;color:var(--accent2)}
.lead{font-size:20px;color:var(--ink2);max-width:660px;margin:0 0 34px}
.cta{display:flex;flex-wrap:wrap;gap:10px}
.btn{display:inline-flex;align-items:center;gap:8px;background:var(--accent);color:#121110;border:1px solid var(--accent);border-radius:10px;padding:12px 18px;font:700 14.5px var(--sans);cursor:pointer}
.btn:hover{background:var(--accent2);border-color:var(--accent2)}
.btn.ghost{background:transparent;color:var(--ink);border-color:var(--line2)}
.btn.ghost:hover{background:var(--bg2)}
/* doors (hub) */
.doors{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:22px}
.door{position:relative;border:1px solid var(--line);border-radius:var(--r);background:linear-gradient(180deg,var(--card),var(--bg2));padding:28px 26px 24px;min-height:330px;display:flex;flex-direction:column;overflow:hidden;transition:transform .2s,border-color .2s}
.door:hover{transform:translateY(-3px);border-color:var(--line2)}
.door .n{font:600 11px var(--mono);letter-spacing:.2em;text-transform:uppercase;margin-bottom:auto}
.door h2{font-family:var(--serif);font-weight:500;font-size:40px;line-height:1;margin:18px 0 10px}
.door p{margin:0 0 16px;color:var(--ink2);font-size:15.5px}
.door ul{margin:0 0 18px;padding:0;list-style:none;font:500 12.5px var(--mono);color:var(--muted);display:flex;flex-wrap:wrap;gap:6px}
.door li{border:1px solid var(--line2);border-radius:999px;padding:3px 9px}
.door .go{font:600 12px var(--mono);letter-spacing:.14em;text-transform:uppercase}
.door:after{content:"";position:absolute;right:-60px;top:-60px;width:220px;height:220px;border-radius:50%;filter:blur(40px);opacity:.35}
.door.craft .n,.door.craft .go{color:var(--gold)} .door.craft:after{background:var(--gold)}
.door.eng .n,.door.eng .go{color:var(--steel)} .door.eng:after{background:var(--steel)}
.door.hobby .n,.door.hobby .go{color:var(--ember)} .door.hobby:after{background:var(--ember)}
/* strip of numbers */
.strip{border-bottom:1px solid var(--line);background:var(--bg2)}
.strip .wrap{display:flex;flex-wrap:wrap;gap:12px 40px;padding:18px 24px;font:500 12.5px var(--mono);color:var(--muted);letter-spacing:.06em}
.strip b{color:var(--ink)}
/* sections */
section{padding:64px 0;border-bottom:1px solid var(--line)}
.sec-n{font:600 12px var(--mono);letter-spacing:.2em;text-transform:uppercase;color:var(--accent);margin-bottom:10px}
h2.t{font-family:var(--serif);font-weight:500;font-size:44px;line-height:1.05;margin:0 0 14px}
.intro{color:var(--ink2);max-width:720px;margin:0 0 30px}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px}
.grid.two{grid-template-columns:repeat(auto-fill,minmax(420px,1fr))}
.card{border:1px solid var(--line);border-radius:var(--r);background:var(--card);padding:24px 24px 20px;display:flex;flex-direction:column;gap:10px}
.card.wide{grid-column:1/-1}
.card .top{display:flex;align-items:flex-start;gap:12px}
.card .ic{flex:none;width:44px;height:44px;border-radius:11px;background:var(--accent-s);display:grid;place-items:center;color:var(--accent)}
.card .ic svg{width:26px;height:26px;stroke:currentColor;fill:none;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.card h3{font-family:var(--serif);font-weight:500;font-size:28px;line-height:1.05;margin:2px 0}
.card h3 a:hover{color:var(--accent2);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:4px}
.card .tag{font:500 11px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.card p{margin:0;color:var(--ink2);font-size:15.5px}
.card ul{margin:0;padding-left:18px;color:var(--ink2);font-size:14.5px}
.card li{margin:3px 0}
.card .links{margin-top:auto;padding-top:10px;display:flex;flex-wrap:wrap;gap:8px 18px;font:600 12.5px var(--mono);letter-spacing:.04em}
.card .links a{color:var(--accent)} .card .links a:hover{text-decoration:underline}
.status{margin-left:auto;flex:none;font:600 10.5px var(--mono);letter-spacing:.1em;text-transform:uppercase;padding:4px 9px;border-radius:999px;border:1px solid}
.status.live{color:var(--gold2);border-color:var(--gold)}
.status.test{color:var(--steel2);border-color:var(--steel)}
.status.dev{color:var(--ember2);border-color:var(--ember)}
.status.proto{color:var(--muted);border-color:var(--line2)}
.shot{border-radius:12px;border:1px solid var(--line2);overflow:hidden;background:var(--bg2)}
/* the opening film: nothing is fetched until it is asked for (preload=none + a poster) */
.film{margin:0 0 18px}
.film video{display:block;width:100%;height:auto;border-radius:12px;border:1px solid var(--line2);background:#000}
.film figcaption{font:500 13px/1.6 var(--mono);color:var(--muted);margin-top:10px}
.film figcaption b{color:var(--ink);font-family:var(--serif);font-weight:500;font-size:16px}
.shot img{width:100%;height:auto}
/* service cards with an example picture */
.card.svc{padding-bottom:0}
.svc-img{margin:auto -24px 0;padding-top:8px;width:calc(100% + 48px);max-width:none;aspect-ratio:2/1;height:auto;object-fit:cover;object-position:center;border-top:1px solid var(--line)}
.yt{border-radius:12px;overflow:hidden;border:1px solid var(--line2);background:#000;margin:4px 0 2px}
.yt-btn{display:block;width:100%;padding:0;border:0;background:#000;cursor:pointer;position:relative;aspect-ratio:16/9}
.yt-btn img{width:100%;height:100%;object-fit:cover;opacity:.9;transition:opacity .2s}
.yt-btn:hover img{opacity:1}
.yt-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:64px;height:64px;border-radius:50%;background:rgba(18,17,16,.78);border:1px solid var(--accent);color:var(--accent);display:grid;place-items:center;font-size:22px;padding-left:5px}
.yt-cap{position:absolute;left:12px;bottom:10px;font:600 11.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--ink);background:rgba(18,17,16,.7);padding:5px 9px;border-radius:6px}
.yt iframe{display:block;width:100%;aspect-ratio:16/9;border:0}
.card .app-ic{flex:none;width:44px;height:44px;border-radius:11px}
.card .app-banner{margin:4px 0 2px}
/* gallery */
.gal-h{font-family:var(--serif);font-weight:500;font-size:24px;margin:26px 0 12px;color:var(--ink2)}
.gal-h:first-of-type{margin-top:0}
.gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px}
.gallery figure{margin:0;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:var(--card)}
.gallery img{aspect-ratio:1/1;object-fit:cover;width:100%;transition:transform .3s}
.gallery figure:hover img{transform:scale(1.03)}
.gallery figcaption{padding:12px 14px;font-size:14px;color:var(--ink2)}
.gallery figcaption b{display:block;color:var(--ink);font-family:var(--serif);font-weight:500;font-size:18px;margin-bottom:2px}
/* reels: poster first, Instagram embed only after a tap */
.reels{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:14px}
.reel{margin:0;border:1px solid var(--line);border-radius:14px;overflow:hidden;background:var(--card)}
.reel-btn{display:block;width:100%;padding:0;border:0;background:#000;cursor:pointer;position:relative;aspect-ratio:9/16}
.reel-btn img{width:100%;height:100%;object-fit:cover;opacity:.92;transition:opacity .2s}
.reel-btn:hover img{opacity:1}
.reel-play{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:56px;height:56px;border-radius:50%;background:rgba(18,17,16,.75);border:1px solid var(--accent);color:var(--accent);display:grid;place-items:center;font-size:20px;padding-left:4px}
.reel video{display:block;width:100%;aspect-ratio:9/16;background:#000;object-fit:cover}
.reel figcaption{padding:10px 12px;font-size:13.5px;color:var(--ink2)}
.reel figcaption a{color:var(--accent);font:600 11.5px var(--mono);letter-spacing:.04em;white-space:nowrap}
.reel figcaption b{display:block;color:var(--ink);font-family:var(--serif);font-weight:500;font-size:18px;margin-bottom:2px}
/* MECHFALL class list inside the pillars */
.card ul.classes{margin:8px 0 4px;padding-left:16px;list-style:square}
.card ul.classes li{margin:5px 0;font-size:14px}
.card ul.classes li b{color:var(--accent2)}
/* class poll */
.poll-row{display:grid;grid-template-columns:118px 1fr 44px;gap:10px;align-items:center;margin:7px 0}
.poll-btn{font:600 12.5px var(--mono);letter-spacing:.06em;text-transform:uppercase;text-align:left;background:none;border:1px solid var(--line2);border-radius:8px;color:var(--ink);padding:7px 10px;cursor:pointer}
.poll-btn:hover{border-color:var(--accent);color:var(--accent2)}
.poll-row.mine .poll-btn{background:var(--accent-s);border-color:var(--accent);color:var(--accent2)}
.poll.voted .poll-btn{cursor:default}
.poll-bar{height:14px;border-radius:7px;background:var(--bg2);overflow:hidden}
.poll-bar i{display:block;height:100%;width:0;border-radius:7px;background:linear-gradient(90deg,var(--ember),var(--ember2));transition:width .5s ease}
.poll-n{font:600 12px var(--mono);color:var(--muted);text-align:right}
.poll-note{margin:8px 0 0}
/* menu theme player */
.theme{display:flex;align-items:center;gap:16px;border:1px solid var(--line);border-radius:14px;background:var(--card);padding:12px 16px;margin-bottom:18px}
.theme-btn{display:flex;align-items:center;gap:14px;background:none;border:0;color:var(--ink);text-align:left;cursor:pointer;padding:0;font:inherit}
.theme-btn b{display:block;font-family:var(--serif);font-weight:500;font-size:20px;line-height:1.1}
.theme-btn small{display:block;font:500 12px var(--mono);color:var(--muted);margin-top:3px}
.theme-ic{flex:none;width:48px;height:48px;border-radius:50%;border:1px solid var(--accent);color:var(--accent);background:var(--accent-s);display:grid;place-items:center;font-size:17px;padding-left:3px}
.theme-btn[aria-pressed="true"] .theme-ic{padding-left:0}
.theme-viz{margin-left:auto;display:flex;align-items:flex-end;gap:3px;height:26px}
.theme-viz i{width:4px;height:6px;background:var(--accent);border-radius:2px;opacity:.35}
.theme.on .theme-viz i{animation:viz .9s ease-in-out infinite alternate;opacity:1}
.theme.on .theme-viz i:nth-child(2){animation-delay:.15s}.theme.on .theme-viz i:nth-child(3){animation-delay:.3s}.theme.on .theme-viz i:nth-child(4){animation-delay:.45s}.theme.on .theme-viz i:nth-child(5){animation-delay:.6s}
@keyframes viz{from{height:5px}to{height:26px}}
@media (prefers-reduced-motion:reduce){ .theme.on .theme-viz i{animation:none;height:16px} }
/* lore grid */
.lore{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:16px}
.lore div{border:1px solid var(--line);border-left:2px solid var(--accent);border-radius:0 12px 12px 0;background:var(--card);padding:16px 18px}
.lore b{display:block;font-family:var(--serif);font-weight:500;font-size:21px;line-height:1.1;margin-bottom:6px}
.lore p{margin:0;color:var(--ink2);font-size:14.5px}
/* MECHFALL artboards */
.mechs{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:14px}
.mechs figure{margin:0;border:1px solid var(--line);border-radius:14px;background:#0b0a0a;overflow:hidden}
.mechs img{width:100%;aspect-ratio:480/417;object-fit:cover}
.mechs figcaption{padding:10px 12px 12px;font-size:13px;color:var(--ink2);border-top:1px solid var(--line)}
.mechs figcaption b{display:block;font-family:var(--serif);font-weight:500;font-size:20px;color:var(--ink);margin-bottom:2px}
.city{display:flex;gap:10px;overflow-x:auto;padding-bottom:8px;scroll-snap-type:x mandatory}
.city figure{flex:0 0 150px;margin:0;scroll-snap-align:start;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:#0b0b0c}
.city img{width:150px;height:170px;object-fit:cover;object-position:center top}
.city figcaption{padding:7px 10px;font:500 11px var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
/* steps */
.steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:14px;counter-reset:s}
.steps div{border-top:2px solid var(--accent);padding-top:12px;counter-increment:s}
.steps div:before{content:"0" counter(s);font:600 11px var(--mono);letter-spacing:.2em;color:var(--accent)}
.steps b{display:block;font-family:var(--serif);font-weight:500;font-size:22px;margin:6px 0 4px}
.steps p{margin:0;color:var(--ink2);font-size:14.5px}
/* principles */
.princ{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:18px}
.princ div{border-left:2px solid var(--accent);padding:2px 0 2px 16px}
.princ b{display:block;font-family:var(--serif);font-weight:500;font-size:22px;margin-bottom:4px}
.princ p{margin:0;color:var(--ink2);font-size:15px}
/* form + boxes */
.split{display:grid;grid-template-columns:1.1fr .9fr;gap:36px;align-items:start}
.split>*{min-width:0}   /* long addresses in .kv must not widen the page on phones */
.box{border:1px solid var(--line);border-radius:var(--r);background:var(--card);padding:22px 24px}
.box h4{font:600 11px var(--mono);letter-spacing:.2em;text-transform:uppercase;color:var(--muted);margin:0 0 14px}
.box p{margin:0 0 10px;font-size:15px;color:var(--ink2)} .box p:last-child{margin:0}
.kv{display:grid;grid-template-columns:auto 1fr;gap:9px 16px;font-size:15px;margin:0}
.kv dt{font:500 11.5px var(--mono);letter-spacing:.08em;text-transform:uppercase;color:var(--muted);padding-top:3px}
.kv dd{margin:0;overflow-wrap:anywhere} .kv a{color:var(--accent)}
form label{display:block;font:600 11.5px var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin:14px 0 6px}
form input,form select,form textarea{width:100%;background:var(--bg2);border:1px solid var(--line2);border-radius:9px;color:var(--ink);padding:11px 12px;font:inherit;font-size:15px}
form input:focus,form select:focus,form textarea:focus{outline:none;border-color:var(--accent)}
form textarea{min-height:120px;resize:vertical}
.form-row{display:grid;grid-template-columns:1fr 1fr;gap:0 14px}
.hint{font-size:13px;color:var(--muted);margin-top:10px}
/* about */
.story{font-size:18px;color:var(--ink2);max-width:760px}
.story p{margin:0 0 16px}
/* the maker */
.maker{display:grid;grid-template-columns:300px 1fr;gap:40px;align-items:center}
.maker img{width:300px;height:300px;border-radius:50%;object-fit:cover;box-shadow:0 0 0 3px var(--bg),0 0 0 5px var(--gold),0 24px 60px -20px rgba(212,166,72,.45)}
@media (max-width:760px){ .maker{grid-template-columns:1fr;gap:22px;text-align:center} .maker img{width:220px;height:220px;margin:0 auto} .maker .cta{justify-content:center} }
/* footer */
.site-footer{padding:36px 0 52px;color:var(--muted);font-size:13.5px}
.site-footer .wrap{display:flex;flex-wrap:wrap;gap:10px 26px;align-items:center}
.site-footer a{color:var(--ink2)} .site-footer a:hover{color:var(--ink)}
.site-footer .legal{width:100%;margin-top:12px;font-size:12.5px;line-height:1.5;border-top:1px solid var(--line);padding-top:14px}
@media (max-width:900px){
  .doors{grid-template-columns:1fr}
  .split{grid-template-columns:1fr}
  .grid.two{grid-template-columns:1fr}
}
@media (max-width:760px){
  .site-nav{display:none;position:absolute;left:0;right:0;top:72px;flex-direction:column;align-items:stretch;background:var(--bg);border-bottom:1px solid var(--line);padding:10px 16px 16px}
  .site-nav.open{display:flex}
  .site-nav .kofi{margin:8px 0 0;text-align:center}
  .menu-btn{display:inline-block}
  .hero{padding:56px 0 40px}
  section{padding:46px 0}
  .form-row{grid-template-columns:1fr}
  .card.wide{grid-column:auto}
}
