/* ============================================================
   Daiya Dai — portfolio
   Faithful to toddham.com: 3D-ish centerpiece + mono UI +
   single-project CAROUSEL + routed pages w/ spinner transition.
   ============================================================ */

:root{
  --ink:#1d1b17;
  --dim:#8b877d;
  --line:#c9c4b7;
  --bg-top:#f4f2ee;
  --bg-bot:#d7d8da;
  --accent:#b4471f;
  --led:#5ad06a;
  --tv-hi:#e9e2d2; --tv:#d8cfba; --tv-lo:#b9ae93; --tv-edge:#a99d80;
  --serif:"Cormorant Garamond",Georgia,serif;
  --mono:"Google Sans Code","JetBrains Mono",ui-monospace,Menlo,monospace;
  --sans:"Inter",system-ui,sans-serif;
  --ease:cubic-bezier(.22,.61,.36,1);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  font-family:var(--mono);color:var(--ink);
  background:linear-gradient(180deg,var(--bg-top) 0%,var(--bg-top) 36%,var(--bg-bot) 100%);
  -webkit-font-smoothing:antialiased;overflow:hidden;
}
a{color:inherit;text-decoration:none}
button{font-family:inherit}
::selection{background:var(--accent);color:#fff}

.grain{position:fixed;inset:0;z-index:9998;pointer-events:none;opacity:.04;mix-blend-mode:multiply;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
body.no-grain .grain{display:none}

/* edge ruler ticks */
.ticks{position:fixed;top:50%;transform:translateY(-50%);width:13px;height:230px;z-index:5;opacity:.5}
.ticks--l{left:16px;background:repeating-linear-gradient(to bottom,var(--ink) 0 1px,transparent 1px 18px);-webkit-mask:linear-gradient(90deg,transparent,#000);mask:linear-gradient(90deg,transparent,#000)}
.ticks--r{right:16px;background:repeating-linear-gradient(to bottom,var(--ink) 0 1px,transparent 1px 18px);-webkit-mask:linear-gradient(270deg,transparent,#000);mask:linear-gradient(270deg,transparent,#000)}

/* TOPBAR */
.topbar{position:fixed;top:0;left:0;right:0;z-index:50;display:grid;grid-template-columns:repeat(4,1fr);
  padding:18px clamp(20px,4vw,40px);font-size:11px;letter-spacing:.06em}
.topbar__col{display:flex;flex-direction:column;gap:3px}
.topbar__col--end{text-align:right;align-items:flex-end}
.t-strong{color:var(--ink);font-weight:500}.t-dim{color:var(--dim)}
.topbar a:hover{color:var(--accent)}
.arr{color:var(--accent)}.dot{color:var(--accent);font-size:9px}
.navlink .arr,.navlink .dot{opacity:0;transition:opacity .3s}
.navlink.is-active .arr,.navlink.is-active .dot{opacity:1}
.navlink.is-active{color:var(--ink)}
.socials{display:flex;gap:8px}

/* APP / VIEWS */
.app{position:fixed;inset:0}
.view{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:96px 24px 96px;opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .5s var(--ease)}
.view.is-active{opacity:1;visibility:visible;pointer-events:auto}

/* ---------- TV SCENE ---------- */
.scene{perspective:1300px;display:flex;flex-direction:column;align-items:center;margin-bottom:34px}
.tv{position:relative;z-index:2;transform-style:preserve-3d;transition:transform .15s ease-out;
  animation:bob 7s ease-in-out infinite;will-change:transform}
.scene.is-dragging .tv{animation:none;transition:none;cursor:grabbing}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-7px)}}
.tv__body{display:flex;padding:22px;border-radius:26px;
  background:linear-gradient(155deg,var(--tv-hi),var(--tv) 42%,var(--tv-lo));
  box-shadow:inset 0 2px 2px rgba(255,255,255,.55),inset 0 -8px 14px rgba(0,0,0,.18),inset 6px 0 12px rgba(255,255,255,.18),0 2px 0 var(--tv-edge)}
.tv__screen-wrap{padding:16px;border-radius:18px;background:linear-gradient(160deg,#cabd9f,#9c906f);
  box-shadow:inset 0 3px 8px rgba(0,0,0,.45),inset 0 -2px 3px rgba(255,255,255,.25)}
.tv__screen{position:relative;overflow:hidden;width:min(52vw,460px);aspect-ratio:4/3;border-radius:14px/16px;
  background:#0b0c0d;cursor:pointer;box-shadow:inset 0 0 28px rgba(0,0,0,.9),inset 0 0 4px rgba(0,0,0,1),0 0 0 3px #1a1814}
.tv__screen img,.tv__screen video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transform:scale(1.02);transition:opacity .5s var(--ease)}
.tv__screen video{opacity:0}
.tv.is-playing .tv__screen video{opacity:1}
.tv.is-playing .tv__screen img{opacity:0}
.tv__scan{position:absolute;inset:0;pointer-events:none;mix-blend-mode:overlay;opacity:.5;background:repeating-linear-gradient(to bottom,rgba(255,255,255,.06) 0 1px,transparent 1px 3px)}
.tv__glare{position:absolute;inset:0;pointer-events:none;border-radius:14px;background:radial-gradient(120% 80% at 28% 12%,rgba(255,255,255,.22),transparent 42%),radial-gradient(140% 120% at 50% 50%,transparent 58%,rgba(0,0,0,.45))}
.tv__noise{position:absolute;inset:0;pointer-events:none;opacity:0;transition:opacity .2s}
.tv.is-switching .tv__noise{opacity:.55;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='80' height='80'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
.tv__expand{position:absolute;right:12px;bottom:12px;z-index:4;font-family:var(--mono);font-size:10px;letter-spacing:.08em;color:#1d1b17;background:rgba(255,255,255,.82);backdrop-filter:blur(4px);border:none;border-radius:100px;padding:7px 12px;cursor:pointer;opacity:0;transform:translateY(6px);transition:.3s var(--ease)}
.tv__screen:hover .tv__expand{opacity:1;transform:translateY(0)}
.tv__panel{width:70px;margin-left:18px;display:flex;flex-direction:column;align-items:center;padding:6px 0}
.tv__brand{font-size:9px;line-height:1.15;letter-spacing:.1em;color:#6f6650;text-align:center;font-weight:700;margin-bottom:14px;text-shadow:0 1px 0 rgba(255,255,255,.4)}
.tv__grille{width:44px;height:88px;border-radius:6px;margin-bottom:18px;background:repeating-linear-gradient(to bottom,#9b906f 0 2px,#bdb393 2px 6px);box-shadow:inset 0 1px 2px rgba(0,0,0,.4)}
.tv__knob{border-radius:50%;background:radial-gradient(circle at 38% 32%,#efe9da,#a99d80 70%,#8a7e62);box-shadow:inset 0 1px 2px rgba(255,255,255,.6),0 2px 3px rgba(0,0,0,.35);border:none;cursor:pointer}
.tv__knob--big{width:36px;height:36px;margin-bottom:14px;position:relative;transition:transform .3s var(--ease)}
.tv__knob--big::after{content:"";position:absolute;top:5px;left:50%;width:2px;height:10px;background:#6f6650;transform:translateX(-50%);border-radius:2px}
.tv__knob--big:hover{transform:rotate(35deg)}
.tv__knob--sm{width:22px;height:22px}
.tv__led{width:8px;height:8px;border-radius:50%;background:var(--led);box-shadow:0 0 8px 1px var(--led);margin-top:14px;animation:blink 3s steps(1) infinite}
@keyframes blink{0%,92%{opacity:1}96%{opacity:.4}}
.tv__feet{position:absolute;bottom:-9px;left:0;right:0;display:flex;justify-content:space-between;padding:0 30px;z-index:-1}
.tv__feet span{width:40px;height:15px;background:linear-gradient(#9c9079,#7e745b);border-radius:0 0 8px 8px;box-shadow:0 3px 4px rgba(0,0,0,.3)}
.tv__shadow{width:min(58vw,520px);height:42px;margin-top:8px;border-radius:50%;background:radial-gradient(ellipse,rgba(40,36,28,.32),transparent 70%);filter:blur(7px)}

/* ---------- CAROUSEL ---------- */
.carousel{width:min(720px,92vw);text-align:center}
.car-viewport{overflow:hidden;min-height:130px}
.car-slide{display:flex;flex-direction:column;align-items:center;gap:10px;transition:opacity .35s var(--ease),transform .35s var(--ease)}
.car-slide.is-out{opacity:0;transform:translateY(10px)}
.car-ch{font-size:10px;letter-spacing:.18em;color:var(--accent)}
.car-title{font-family:var(--serif);font-weight:500;font-size:clamp(34px,5vw,56px);line-height:1;letter-spacing:0}
.car-desc{font-family:var(--sans);font-size:14px;color:#56514780;color:#5a554a;max-width:460px;line-height:1.5}
.ui-button{display:inline-flex;align-items:center;gap:8px;margin-top:6px;padding:11px 22px;border-radius:100px;
  background:var(--ink);color:#f4f2ee;border:none;cursor:pointer;font-size:11px;letter-spacing:.1em;transition:.25s var(--ease)}
.ui-button:hover{background:var(--accent);transform:translateY(-2px)}
.ui-button-ar{transition:transform .25s var(--ease)}
.ui-button:hover .ui-button-ar{transform:translateX(3px)}

.car-controls{display:flex;align-items:center;justify-content:center;gap:18px;margin-top:26px}
.car-arrow{width:34px;height:34px;border-radius:50%;border:1px solid var(--line);background:rgba(255,255,255,.4);
  color:var(--ink);font-size:18px;line-height:1;cursor:pointer;transition:.22s var(--ease)}
.car-arrow:hover{border-color:var(--ink);background:#fff;transform:scale(1.08)}
.car-dots{display:flex;align-items:center;gap:8px}
.dot{height:8px;width:8px;border-radius:100px;border:none;padding:0;cursor:pointer;background:var(--line);
  overflow:hidden;position:relative;transition:width .35s var(--ease),background .3s}
.dot:hover{background:var(--dim)}
.dot.is-active{width:46px;background:rgba(29,27,23,.18)}
.dot .fill{position:absolute;left:0;top:0;bottom:0;width:0;background:var(--ink);border-radius:100px}
.dot.is-active .fill{width:100%;transition:width var(--dur,6s) linear}

/* ---------- PAGE VIEWS (about/contact) ---------- */
.view--page{justify-content:center}
.page-inner{max-width:1000px;width:100%}
.page-inner--center{text-align:center}
.page-tag{font-size:11px;letter-spacing:.18em;color:var(--accent)}
.page-lead{font-family:var(--serif);font-size:clamp(28px,4.4vw,52px);line-height:1.2;margin:24px 0 56px;letter-spacing:0;max-width:920px}
.page-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:40px}
.page-grid h4{font-size:11px;letter-spacing:.12em;color:var(--dim);padding-bottom:12px;margin-bottom:14px;border-bottom:1px solid var(--line)}
.page-grid ul{list-style:none}.page-grid li{font-family:var(--sans);font-size:15px;color:#46423a;padding:6px 0}
.view--contact .contact-email{font-family:var(--serif);font-size:clamp(40px,9vw,110px);display:inline-block;margin:26px 0 38px;letter-spacing:-.01em;background-image:linear-gradient(var(--accent),var(--accent));background-size:0 2px;background-repeat:no-repeat;background-position:0 100%;transition:background-size .4s var(--ease)}
.view--contact .contact-email:hover{background-size:100% 2px}
.contact-socials{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}
.contact-socials a{font-size:11px;letter-spacing:.1em;border:1px solid var(--line);padding:9px 18px;border-radius:100px;color:var(--dim);transition:.25s}
.contact-socials a:hover{border-color:var(--ink);color:var(--ink)}

/* ---------- BOTTOM BAR ---------- */
.botbar{position:fixed;bottom:16px;left:0;right:0;z-index:40;display:flex;justify-content:space-between;
  padding:0 clamp(20px,4vw,40px);font-size:10px;letter-spacing:.1em;color:var(--dim)}
.bot-right{display:flex;align-items:center;gap:12px}
.scene-hint{opacity:.8}
.mini-btn{font-size:10px;letter-spacing:.08em;color:var(--dim);background:none;border:1px solid var(--line);border-radius:100px;padding:5px 10px;cursor:pointer;transition:.2s}
.mini-btn:hover,.mini-btn.is-on{color:var(--ink);border-color:var(--ink)}

/* ---------- TRANSITION SPINNER ---------- */
.transition{position:fixed;inset:0;z-index:900;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(180deg,var(--bg-top),var(--bg-bot));
  opacity:0;visibility:hidden;transition:opacity .35s var(--ease),visibility .35s}
.transition.is-on{opacity:1;visibility:visible}
.spinner{position:relative;width:120px;height:120px}
.spinner-ring{position:absolute;inset:34px;border-radius:50%;border:1.5px solid var(--line);border-top-color:var(--accent);animation:spin .9s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.text-ring{position:absolute;inset:0;animation:spin 7s linear infinite}
.text-ring span{position:absolute;left:50%;top:50%;font-size:11px;letter-spacing:.05em;color:var(--ink);
  transform-origin:0 0}

/* ---------- LIGHTBOX ---------- */
.lightbox{position:fixed;inset:0;z-index:1000;display:flex;align-items:center;justify-content:center;padding:clamp(16px,4vw,56px);background:rgba(18,15,10,.9);backdrop-filter:blur(8px);opacity:0;visibility:hidden;transition:opacity .4s var(--ease),visibility .4s}
.lightbox.is-open{opacity:1;visibility:visible}
.lightbox__stage{display:flex;flex-direction:column;align-items:center;gap:18px;max-width:100%;transform:scale(.96);transition:transform .45s var(--ease)}
.lightbox.is-open .lightbox__stage{transform:scale(1)}
.lightbox__video{max-width:100%;max-height:76vh;border-radius:8px;background:#000;box-shadow:0 30px 80px rgba(0,0,0,.5)}
.lightbox__meta{text-align:center;color:#f4f2ee;max-width:640px}
.lightbox__meta h3{font-family:var(--serif);font-weight:500;font-size:32px;margin-bottom:6px}
.lightbox__meta p{font-family:var(--sans);color:#c9c3b6;font-size:14px;line-height:1.5}
.lightbox__tags{display:inline-block;margin-top:12px;font-size:11px;letter-spacing:.1em;color:#8f897c}
.lightbox__close{position:absolute;top:22px;right:26px;width:44px;height:44px;border-radius:50%;background:rgba(255,255,255,.12);color:#fff;border:none;cursor:pointer;font-size:15px;transition:.3s var(--ease)}
.lightbox__close:hover{background:rgba(255,255,255,.24);transform:rotate(90deg)}

@media (prefers-reduced-motion:reduce){*{animation:none!important}.tv{animation:none}}

/* RESPONSIVE */
@media (max-width:760px){
  .topbar{grid-template-columns:1fr 1fr;gap:8px 0;font-size:10px}
  .topbar__col--end{display:none}
  .ticks{display:none}
  .tv__screen{width:74vw}
  .tv__panel{width:54px;margin-left:12px}.tv__grille{width:34px}
  .page-grid{grid-template-columns:1fr;gap:26px}
  .scene-hint{display:none}
}
