/* Ethan Fernando — shared styles.
   Ported from the Claude Design build. Page-specific layout stays inline in
   each page, the same way the design was authored; everything shared lives here. */

:root{--bg:#060606;--fg:#f2f1ee;--dim:rgba(242,241,238,.55);--line:rgba(242,241,238,.2);--line-strong:rgba(242,241,238,.5);--stripe-b:#0c0c0b;--accent:#ffffff;--orange:#FF4D1D;--mono:'Source Code Pro',ui-monospace,SFMono-Regular,Menlo,monospace}
:root[data-theme="light"]{--bg:#f1efec;--fg:#0b0b0b;--dim:rgba(11,11,11,.58);--line:rgba(11,11,11,.2);--line-strong:rgba(11,11,11,.5);--stripe-b:#dcd8d2;--accent:#000000}
*{box-sizing:border-box}
html,body{margin:0;padding:0;background:var(--bg);color:var(--fg);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;text-wrap:pretty}
a{color:var(--fg);text-decoration:none;transition:color .25s ease,opacity .25s ease}
a:hover{color:var(--accent)}
::selection{background:var(--fg);color:var(--bg)}
.mono{font-family:var(--mono);letter-spacing:.14em;text-transform:uppercase}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ---- Header + nav ---- */
.site-header{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;gap:24px;padding:18px 26px;backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);background:color-mix(in oklab,var(--bg) 82%,transparent);border-bottom:1px solid var(--line)}
.site-header .logo{display:block}
.site-header .logo svg{height:40px;width:auto;display:block;fill:currentColor}
.nav-wrap{display:flex;align-items:center;gap:18px}
.nav-links{display:flex;gap:26px;align-items:center;font-family:var(--mono);font-size:13px;letter-spacing:.14em;text-transform:uppercase}
.nav-links a{padding:5px 0}
.nav-links a[aria-current="page"]{text-decoration:underline;text-underline-offset:6px;text-decoration-thickness:1px}
.burger{display:none;place-items:center;width:44px;height:44px;margin:-10px -10px -10px 0;border:0;background:transparent;padding:0;cursor:pointer;color:var(--fg)}
.burger .bars{display:flex;flex-direction:column;gap:6px;width:22px}
.burger .bars span{display:block;height:1.5px;background:currentColor}
.burger .x{display:none;width:22px;height:22px;stroke:currentColor;stroke-width:1.6;fill:none}
[data-menu-open="true"] .burger .bars{display:none}
[data-menu-open="true"] .burger .x{display:block}
.mobile-menu{display:none;position:absolute;top:100%;left:0;right:0;flex-direction:column;background:color-mix(in oklab,var(--bg) 96%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--line)}
[data-menu-open="true"] .mobile-menu{display:flex}
.mobile-menu a{padding:18px 26px;border-top:1px solid var(--line);font-family:var(--mono);font-size:15px;letter-spacing:.14em;text-transform:uppercase;color:var(--fg)}
@media (max-width:720px){.nav-links{display:none!important}.burger{display:grid!important}}

/* Home: header sits over the video, always light text */
.site-header.over-video{position:absolute;left:0;right:0;align-items:flex-start;padding:24px 26px;color:#f2f1ee;z-index:2;background:transparent;backdrop-filter:none;-webkit-backdrop-filter:none;border-bottom:0}
.site-header.over-video a,.site-header.over-video .burger{color:#f2f1ee}
.site-header.over-video .logo svg{height:46px}
.site-header.over-video[data-menu-open="true"]{background:rgba(6,6,6,.94);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}
.site-header.over-video .mobile-menu{background:rgba(6,6,6,.94);border-bottom-color:rgba(242,241,238,.2)}
.site-header.over-video .mobile-menu a{border-top-color:rgba(242,241,238,.2);color:#f2f1ee}

/* ---- Fixed bottom bar ---- */
.bottom-bar{position:fixed;bottom:0;left:0;right:0;z-index:5;display:grid;grid-template-columns:1fr auto;align-items:center;gap:22px;padding:12px 26px;background:color-mix(in oklab,var(--bg) 86%,transparent);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-top:1px solid var(--line);font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase}
.bottom-bar .clock{color:var(--dim);font-variant-numeric:tabular-nums;justify-self:start}
.bottom-bar .icons{display:flex;align-items:center;gap:20px;justify-self:end}
.bottom-bar .icons a,.bottom-bar .icons button{display:grid;place-items:center;color:var(--dim);border:0;background:transparent;padding:0;cursor:pointer;transition:color .2s ease}
.bottom-bar .icons a:hover,.bottom-bar .icons button:hover{color:var(--fg)}
.bottom-bar svg{width:15px;height:15px;display:block}
.bottom-bar .theme-toggle svg{width:16px;height:16px}
.icon-line{fill:none;stroke:currentColor;stroke-width:1.6}
.theme-toggle .sun{display:none}
:root[data-theme="light"] .theme-toggle .sun{display:block}
:root[data-theme="light"] .theme-toggle .moon{display:none}

/* Drawn arrow: the ↗ character renders as an emoji on iOS */
.arrow-ne{display:inline-block;width:.62em;height:.62em;margin-left:.08em;vertical-align:.02em;fill:none;stroke:currentColor;stroke-width:1.4;stroke-linecap:square}

/* ---- Scroll cue: tells people there's more below the fold ---- */
@keyframes efvDrip{0%{transform:scaleY(0);transform-origin:top}45%{transform:scaleY(1);transform-origin:top}55%{transform:scaleY(1);transform-origin:bottom}100%{transform:scaleY(0);transform-origin:bottom}}
.scroll-cue{position:fixed;left:50%;bottom:42px;z-index:4;transform:translateX(-50%);padding:0 0 10px;display:flex;flex-direction:column;align-items:center;gap:7px;font-family:var(--mono);font-size:9px;letter-spacing:.22em;text-transform:uppercase;color:var(--dim);pointer-events:none;opacity:0;transition:opacity .5s ease}
.scroll-cue.show{opacity:.7}
.scroll-cue .drip{display:block;width:1px;height:22px;background:var(--line);overflow:hidden;position:relative}
.scroll-cue .drip::after{content:"";position:absolute;inset:0;background:var(--fg);animation:efvDrip 1.8s cubic-bezier(.65,0,.35,1) infinite}
@media (min-width:721px){.scroll-cue{display:none}}
@media (prefers-reduced-motion:reduce){.scroll-cue .drip::after{animation:none}}

/* ---- Showreel "click for sound" tag ---- */
.sound-tag{position:absolute;top:14px;left:14px;z-index:2;display:flex;align-items:center;gap:9px;padding:9px 13px;border:1px solid rgba(242,241,238,.22);background:rgba(6,6,6,.55);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);color:#f2f1ee;font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;cursor:pointer;transition:opacity .4s ease,background .2s ease}
.sound-tag:hover{background:rgba(6,6,6,.75)}
.sound-tag svg{width:15px;height:15px;display:block;fill:none;stroke:currentColor;stroke-width:1.6;stroke-linejoin:round}
.sound-tag svg path:first-child{fill:currentColor}
.sound-tag.gone{opacity:0;pointer-events:none}

/* ---- Toast (email copied) ---- */
.toast{position:fixed;left:50%;bottom:64px;z-index:20;transform:translate(-50%,8px);opacity:0;pointer-events:none;padding:11px 16px;background:var(--fg);color:var(--bg);font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;white-space:nowrap;max-width:calc(100vw - 32px);overflow:hidden;text-overflow:ellipsis;transition:opacity .25s ease,transform .25s ease}
.toast.show{opacity:1;transform:translate(-50%,0)}

/* ---- Film grain ---- */
@keyframes efvGrain{0%{transform:translate(0,0)}10%{transform:translate(-2%,-3%)}20%{transform:translate(-8%,2%)}30%{transform:translate(4%,-5%)}40%{transform:translate(-3%,6%)}50%{transform:translate(-6%,-2%)}60%{transform:translate(5%,4%)}70%{transform:translate(-1%,-6%)}80%{transform:translate(3%,3%)}90%{transform:translate(-5%,1%)}100%{transform:translate(0,0)}}
.grain{position:absolute;inset:0;overflow:hidden;pointer-events:none;mix-blend-mode:soft-light;opacity:.34}
.grain>div{position:absolute;top:-15%;left:-15%;width:130%;height:130%;animation:efvGrain .9s steps(1,end) infinite;background-repeat:repeat;background-size:170px 170px;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxNzAnIGhlaWdodD0nMTcwJz48ZmlsdGVyIGlkPSduJyB4PScwJyB5PScwJyB3aWR0aD0nMTAwJScgaGVpZ2h0PScxMDAlJyBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9J3NSR0InPjxmZVR1cmJ1bGVuY2UgdHlwZT0nZnJhY3RhbE5vaXNlJyBiYXNlRnJlcXVlbmN5PScwLjcnIG51bU9jdGF2ZXM9JzInIHN0aXRjaFRpbGVzPSdzdGl0Y2gnLz48ZmVDb2xvck1hdHJpeCB0eXBlPSdtYXRyaXgnIHZhbHVlcz0nMC4zMyAwLjMzIDAuMzMgMCAwIDAuMzMgMC4zMyAwLjMzIDAgMCAwLjMzIDAuMzMgMC4zMyAwIDAgMCAwIDAgMCAxJy8+PGZlQ29tcG9uZW50VHJhbnNmZXI+PGZlRnVuY1IgdHlwZT0nbGluZWFyJyBzbG9wZT0nMS40JyBpbnRlcmNlcHQ9Jy0wLjInLz48ZmVGdW5jRyB0eXBlPSdsaW5lYXInIHNsb3BlPScxLjQnIGludGVyY2VwdD0nLTAuMicvPjxmZUZ1bmNCIHR5cGU9J2xpbmVhcicgc2xvcGU9JzEuNCcgaW50ZXJjZXB0PSctMC4yJy8+PGZlRnVuY0EgdHlwZT0nbGluZWFyJyBzbG9wZT0nMCcgaW50ZXJjZXB0PScxJy8+PC9mZUNvbXBvbmVudFRyYW5zZmVyPjwvZmlsdGVyPjxyZWN0IHdpZHRoPScxNzAnIGhlaWdodD0nMTcwJyBmaWx0ZXI9J3VybCgjbiknLz48L3N2Zz4=")}
@media (prefers-reduced-motion:reduce){.grain>div{animation:none!important}}

/* ---- Home: logo intro ---- */
@keyframes efvIn{0%{opacity:0}100%{opacity:1}}
@keyframes efvBar{0%,14%{transform:scaleX(1)}40%,52%{transform:scaleX(0)}76%,100%{transform:scaleX(.7212)}}
@keyframes efvOut{0%,90%{opacity:1;visibility:visible}100%{opacity:0;visibility:hidden}}
#efv-intro{position:fixed;inset:0;z-index:60;animation:efvOut 4.6s cubic-bezier(.6,0,.3,1) forwards;pointer-events:none}
.hero-video{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);pointer-events:none}
.hero-video iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block}
.hero-video.wide{width:100svw;height:56.25svw;min-width:177.78svh;min-height:100svh}
.hero-video.tall{display:none;width:100svw;height:177.78svw;min-width:56.25svh;min-height:100svh}
@media (max-width:720px){.hero-video.wide{display:none}.hero-video.tall{display:block}}

/* ---- Work grid ---- */
.tile{position:relative;margin:0;overflow:hidden;background:var(--stripe-b)}
.tile iframe,.tile img{position:absolute;inset:0;width:100%;height:100%;border:0;display:block;object-fit:cover}
.tile .cap{position:absolute;left:0;right:0;top:0;padding:12px 14px 30px;background:linear-gradient(to bottom,rgba(6,6,6,.8) 0%,rgba(6,6,6,.38) 55%,rgba(6,6,6,0) 100%);pointer-events:none;display:flex;flex-direction:column;gap:4px;font-family:var(--mono);font-size:11px;line-height:1.3;letter-spacing:.1em;text-transform:uppercase;color:#f2f1ee;opacity:0;transform:translateY(-4px);transition:opacity .32s ease,transform .32s ease}
.tile .cap .sub{color:rgba(242,241,238,.66)}
.tile:hover .cap{opacity:1;transform:none}
@media (hover:none){.tile .cap{opacity:1;transform:none}}
.mob-film{margin:0 0 14px;display:flex;flex-direction:column;gap:9px}
.mob-film .frame{position:relative;background:var(--stripe-b);overflow:hidden}
.mob-film .frame iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block}
.mob-film figcaption{display:flex;flex-direction:column;gap:3px;font-family:var(--mono);font-size:11px;line-height:1.35;letter-spacing:.1em;text-transform:uppercase}
.mob-film figcaption .sub{color:var(--dim)}
.mob-img{width:100%;object-fit:cover;display:block;background:var(--stripe-b)}

/* ---- Buttons ---- */
.btn-solid{display:inline-flex;align-items:center;gap:12px;border:1px solid var(--fg);background:var(--fg);color:var(--bg);font-family:var(--mono);text-transform:uppercase;cursor:pointer;transition:background .2s ease,color .2s ease}
.btn-solid:hover{background:var(--bg);color:var(--fg)}
.btn-solid:disabled{opacity:.6;cursor:progress}

/* ---- About: polaroids ---- */
@keyframes efvPolaroid{0%,26.9%{transform:translate(0,0) rotate(2deg);z-index:3}27%{z-index:4}30.5%{transform:translate(26%,-9%) rotate(11deg);z-index:4}31%{z-index:1}34.5%,60.3%{transform:translate(-15%,3%) rotate(-8deg);z-index:1}64.3%,93.6%{transform:translate(-8%,1.5%) rotate(-3.5deg);z-index:2}93.7%{z-index:3}97.7%,100%{transform:translate(0,0) rotate(2deg);z-index:3}}
@keyframes efvDevelop{0%{opacity:1}35%{opacity:.85}100%{opacity:0}}
@keyframes efvDevImg{0%{filter:grayscale(1) brightness(.55) contrast(.7) blur(2px)}60%{filter:grayscale(.6) brightness(.85) contrast(.85) blur(.6px)}100%{filter:none}}
.polaroid{position:absolute;inset:0;box-sizing:border-box;padding:4.5% 4.5% 17%;background:#f7f6f3;box-shadow:0 1px 2px rgba(0,0,0,.18),0 14px 34px rgba(0,0,0,.28);transform-origin:50% 60%;animation:efvPolaroid 12s cubic-bezier(.65,0,.35,1) 0s infinite both}
.polaroid:first-child{position:relative}
.polaroid:nth-child(2){animation-delay:-4s}
.polaroid:nth-child(3){animation-delay:-8s}
.polaroid .photo{position:relative;aspect-ratio:3/4;overflow:hidden;background:#1a1a1a}
.polaroid img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;animation:efvDevImg 2.8s cubic-bezier(.5,0,.3,1) .35s both}
.polaroid .develop{position:absolute;inset:0;pointer-events:none;background:#34352e;animation:efvDevelop 2.8s cubic-bezier(.5,0,.3,1) .35s both}
.polaroid:nth-child(2) img,.polaroid:nth-child(2) .develop{animation-delay:.75s}
.polaroid:nth-child(3) img,.polaroid:nth-child(3) .develop{animation-delay:.55s}
:root:not([data-dev-done]) .polaroid{animation-play-state:paused}
:root[data-dev-seen] .polaroid .develop{display:none}
:root[data-dev-seen] .polaroid img{animation:none}
@media (prefers-reduced-motion:reduce){.polaroid .develop{display:none}.polaroid img{animation:none}.polaroid{animation-play-state:paused!important}}
.about-copy p{margin:0;font-size:16px;line-height:1.55;color:var(--fg);opacity:.84}
@media (max-width:720px){#about-portrait-wrap{display:none!important}#about-portrait-m{display:flex!important;order:-1;margin-bottom:22px}#about-cta{justify-content:center;margin-top:4px;margin-bottom:22px}#about-text{gap:20px!important;padding-bottom:0!important}}
.other-project:hover{color:var(--orange)}
/* Pixelated "NICE TRY" in Other projects: text drawn tiny on a canvas, then scaled up in blocks */
.secret-project canvas{display:block;image-rendering:pixelated;image-rendering:crisp-edges}

/* Same orange sweep as the contact form labels */
.glint-text{background-image:linear-gradient(90deg,var(--fg) 0%,var(--fg) 40%,#FF4D1D 50%,var(--fg) 60%,var(--fg) 100%);background-size:300% 100%;background-position:100% 0;-webkit-background-clip:text;background-clip:text;color:transparent;animation:efvGlintText 3.8s cubic-bezier(.45,0,.25,1) infinite}
@media (prefers-reduced-motion:reduce){.glint-text{animation:none;background-image:none;color:var(--fg)}}

/* ---- Contact ---- */
.contact-form input,.contact-form textarea{font:inherit;background:transparent;border:0;border-bottom:1px solid var(--line-strong);border-radius:0;padding:12px 0;width:100%;font-size:17px;color:var(--fg);outline:none;resize:vertical;transition:border-color .25s ease;caret-color:var(--orange)}
.contact-form input:focus,.contact-form textarea:focus{border-bottom-color:var(--orange)!important;border-bottom-width:2px;padding-bottom:11px}
.contact-form ::placeholder{color:var(--dim);opacity:.85;font-size:15px}
.contact-form label{display:flex;flex-direction:column;gap:9px}
.contact-form label>span:first-child{font-family:var(--mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase}
@keyframes efvGlint{0%{background-position:-70% 100%}55%,100%{background-position:170% 100%}}
@keyframes efvGlintText{0%{background-position:100% 0}55%,100%{background-position:0% 0}}
.contact-form input:placeholder-shown,.contact-form textarea:placeholder-shown{background-image:linear-gradient(90deg,rgba(255,77,29,0),#FF4D1D 50%,rgba(255,77,29,0));background-size:40% 1px;background-repeat:no-repeat;background-position:-70% 100%;animation:efvGlint 3.8s cubic-bezier(.45,0,.25,1) infinite}
.contact-form input:focus,.contact-form textarea:focus{animation:none;background-image:none}
.contact-form label>span:first-child{background-image:linear-gradient(90deg,var(--fg) 0%,var(--fg) 40%,#FF4D1D 50%,var(--fg) 60%,var(--fg) 100%);background-size:300% 100%;background-position:100% 0;-webkit-background-clip:text;background-clip:text;color:transparent;animation:efvGlintText 3.8s cubic-bezier(.45,0,.25,1) infinite}
.contact-form label:nth-child(2) :is(input,textarea),.contact-form label:nth-child(2)>span:first-child{animation-delay:.3s}
.contact-form label:nth-child(3) :is(input,textarea),.contact-form label:nth-child(3)>span:first-child{animation-delay:.6s}
.contact-form label:nth-child(4) :is(input,textarea),.contact-form label:nth-child(4)>span:first-child{animation-delay:.9s}
.contact-form label:nth-child(5) :is(input,textarea),.contact-form label:nth-child(5)>span:first-child{animation-delay:1.2s}
.contact-form label:nth-child(6) :is(input,textarea),.contact-form label:nth-child(6)>span:first-child{animation-delay:1.5s}
.contact-form label:focus-within>span:first-child{animation:none;background-image:none;color:var(--orange)}
.contact-form label:has(input:not(:placeholder-shown),textarea:not(:placeholder-shown))>span:first-child{animation:none;background-image:none;color:var(--fg)}
.contact-form label:focus-within:has(input:not(:placeholder-shown),textarea:not(:placeholder-shown))>span:first-child{color:var(--orange)}
@media (prefers-reduced-motion:reduce){.contact-form label>span:first-child{animation:none!important;background-image:none!important;color:var(--fg)!important}.contact-form input,.contact-form textarea{animation:none!important;background-image:none!important}}
.field-msg{font-family:var(--mono);font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--orange);min-height:0}
.field-msg:empty{display:none}
.contact-form label[data-invalid] :is(input,textarea){border-bottom-color:var(--orange);animation:none;background-image:none}
.contact-form label[data-invalid]>span:first-child{animation:none;background-image:none;color:var(--orange)!important}
.form-error{margin:0;font-size:14px;line-height:1.5;color:var(--orange)}
.form-error a{color:var(--orange);text-decoration:underline}
.tz-list{display:flex;flex-direction:column;border-top:1px solid var(--line)}
.tz-list>div{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:11px 0;border-bottom:1px solid var(--line);font-family:var(--mono);font-size:12px;letter-spacing:.1em;text-transform:uppercase}
.tz-list .t{display:flex;align-items:baseline;gap:10px;font-variant-numeric:tabular-nums;color:var(--dim)}
.tz-list .day{font-size:.85em;opacity:.8}
.ig-link{font-size:16px;line-height:1.6;color:var(--fg);transition:color .2s ease}
.ig-link:hover{color:var(--dim)}
@keyframes efvLang{0%{opacity:0;transform:translateY(.35em)}14%,86%{opacity:1;transform:none}100%{opacity:0;transform:translateY(-.35em)}}
@keyframes efvFly{0%{left:-90px;top:62%;transform:rotate(-4deg)}45%{top:30%;transform:rotate(-10deg)}100%{left:calc(100% + 30px);top:-10%;transform:rotate(-16deg)}}
@keyframes efvFlap{0%,100%{transform:scaleY(1)}50%{transform:scaleY(-.55)}}
@keyframes efvBob{0%,100%{transform:translateY(0) rotate(0)}50%{transform:translateY(-4px) rotate(-3deg)}}
@keyframes efvLand{0%{opacity:0;transform:translateY(8px)}100%{opacity:1;transform:none}}
[data-lang]{display:block;animation:efvLang 3s cubic-bezier(.65,0,.35,1) both}
@media (prefers-reduced-motion:reduce){[data-lang]{animation:none!important}}
.pigeon{position:absolute;width:78px;animation:efvFly 2.2s cubic-bezier(.45,.05,.4,1) both}
.pigeon svg{width:100%;display:block;overflow:visible;animation:efvBob .52s ease-in-out infinite}
.pigeon .wing{transform-origin:30px 19px;animation:efvFlap .26s ease-in-out infinite}
@media (max-width:720px){#tz-desk,.ig-desk{display:none!important}#tz-mob{display:flex!important}#ig-mob{display:block!important}#cta-row{justify-content:center}#contact-intro{position:static!important;top:auto!important}#contact-section{padding-bottom:0!important}}
