Home / Admin / Untitled Snippet
Duplicate Snippet

Embed Snippet on Your Site

Untitled Snippet

Tim Austin PRO
<10
Code Preview
php
<?php
add_action('template_redirect', function () {
    if (! is_front_page()) {
        return;
    }
    echo <<<'COLABHTML'
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Colab — Preview</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400&display=swap">
<style>
:root {
  --bg:         transparent;
  --bg-surface: #2e2e2e;
  --line:       #dbdada;
  --text:       #f0ede6;
  --text-muted: #666666;
  --bg-light:   #EAEAEA;
  --accent:      #4a9e9e;
  --accent-dark: #2C6F6F;
  --font-display: 'Helvetica Neue', Helvetica, Arial, sans-serif;
  --font-body:    'Inter', sans-serif;
  --ease:      cubic-bezier(.19,1,.22,1);
  --pad-x:     clamp(16px, 5vw, 80px);
  --pad-y:     clamp(32px, 6vw, 80px);
  --radius-sm: 2px;
  --radius-md: 4px;
}
@media (prefers-color-scheme: light) {
  :root:not([data-theme]) {
    --bg:          transparent;
    --bg-2:        rgba(222,222,222,0.55);
    --bg-3:        rgba(212,212,212,0.6);
    --line:        #c0c0c0;
    --line-2:      #b0b0b0;
    --text:        #161412;
    --text-muted:  #c7c5c5;
    --text-dim:    #dbdada;
    --accent:      #2C6F6F;
    --accent-dark: #4a9e9e;
  }
}
[data-theme="dark"] {
  --bg:          transparent;
  --bg-2:        rgba(30,27,24,0.55);
  --bg-3:        rgba(46,46,46,0.6);
  --line:        #dbdada;
  --line-2:      #333333;
  --text:        #f0ede6;
  --text-muted:  #c7c5c5;
  --text-dim:    #FFFFFF;
  --accent:      #4a9e9e;
  --accent-dark: #2C6F6F;
}
[data-theme="light"] {
  --bg:          transparent;
  --bg-2:        rgba(222,222,222,0.55);
  --bg-3:        rgba(212,212,212,0.6);
  --line:        #c0c0c0;
  --line-2:      #b0b0b0;
  --text:        #161412;
  --text-muted:  #dbdada;
  --text-dim:    #c7c5c5;
  --accent:      #2C6F6F;
  --accent-dark: #4a9e9e;
}
[data-theme="light"] .form-field input,
[data-theme="light"] .form-field textarea { color: #161412; }
[data-theme="light"] .form-field input::placeholder,
[data-theme="light"] .form-field textarea::placeholder { color: #161412; }
[data-theme="light"] .form-field label { color: #161412; }
@media(prefers-color-scheme:light){
  :root:not([data-theme]) .form-field input,
  :root:not([data-theme]) .form-field textarea { color: #161412; }
  :root:not([data-theme]) .form-field input::placeholder,
  :root:not([data-theme]) .form-field textarea::placeholder { color: #161412; }
  :root:not([data-theme]) .form-field label { color: #161412; }
}
#gl-bg {
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
  display: block;
}
html { transition: color .35s; }
*, *::before, *::after { transition: background-color .35s, border-color .35s, color .3s; }
[data-theme="light"] .site-logo circle,
[data-theme="light"] #colab-logo circle { fill: #161412; }
@media (prefers-color-scheme: light) {
  :root:not([data-theme]) .site-logo circle,
  :root:not([data-theme]) #colab-logo circle { fill: #161412; }
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
html{font-size:16px;scroll-behavior:smooth;-webkit-font-smoothing:antialiased}
body{background:transparent;color:var(--text);font-family:var(--font-body);font-weight:300;line-height:1.6;overflow-x:hidden;cursor:none}
img,video{display:block;max-width:100%;height:auto}
a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:none;background:none;border:none}
ul,ol{list-style:none}
/* ── CURSOR ── */
.cursor{position:fixed;top:0;left:0;width:10px;height:10px;border-radius:50%;background:var(--text);pointer-events:none;z-index:9999;transform:translate(-50%,-50%);transition:width .3s var(--ease),height .3s var(--ease),background .3s,border .3s;will-change:transform}
.cursor.is-hovering{width:44px;height:44px;background:transparent;border:1px solid var(--text);mix-blend-mode:difference}
.cursor.is-link{width:52px;height:52px;background:transparent;border:1px solid var(--text)}
@media(max-width:768px){.cursor{display:none}}
/* ── TYPOGRAPHY ── */
.t-eyebrow{font-family:var(--font-body);font-size:11px;font-weight:400;letter-spacing:.12em;text-transform:uppercase;color:var(--text-dim)}
[data-theme="dark"]  .t-eyebrow { color: #f0ede6; }
[data-theme="light"] .t-eyebrow { color: #161412; }
@media(prefers-color-scheme:light){ :root:not([data-theme]) .t-eyebrow { color: #161412; } }
.t-display{font-family:var(--font-display);font-weight:800;line-height:.92;letter-spacing:-.03em;color:var(--text)}
.t-display--xl{font-size:clamp(44px,9vw,120px)}
.t-display--lg{font-size:clamp(32px,6vw,72px)}
.t-display--md{font-size:clamp(22px,4vw,48px)}
.t-body-lg{font-size:16px;color:var(--text-muted);line-height:1.8}
.t-body{font-size:14px;color:var(--text-muted);line-height:1.8}
.t-label{font-size:11px;color:var(--text-dim);letter-spacing:.1em;text-transform:uppercase}
.border-top{border-top:1px solid var(--line)}
.border-bottom{border-bottom:1px solid var(--line)}
/* ── HEADER ── */
.site-header{position:relative;z-index:100;display:flex;align-items:center;justify-content:space-between;padding:16px var(--pad-x);border-bottom:1px solid transparent;transition:border-color .4s,background .4s}
.site-header.is-scrolled{border-color:var(--line);background:rgba(22,20,18,.72);backdrop-filter:blur(16px)}
[data-theme="light"] .site-header.is-scrolled{background:rgba(234,234,234,.72)}
.site-logo{display:flex;align-items:center;width:36px;height:36px;cursor:pointer;flex-shrink:0}
.site-logo svg{overflow:visible}
.nav-primary{position:absolute;left:50%;transform:translateX(-50%);display:flex;gap:36px;align-items:center}
.nav-primary a{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--text-muted);position:relative;transition:color .25s;cursor:pointer}
.nav-primary a::after{content:'';position:absolute;bottom:-2px;left:0;width:0;height:1px;background:var(--accent);transition:width .3s var(--ease)}
.nav-primary a:hover,.nav-primary a.active{color:var(--text)}
.nav-primary a:hover::after,.nav-primary a.active::after{width:100%}
.nav-right{display:flex;align-items:center;gap:12px}
.nav-cta{font-size:12px;letter-spacing:.06em;text-transform:uppercase;border:1px solid var(--line);padding:9px 22px;border-radius:var(--radius-sm);transition:background .25s,color .25s,border-color .25s;cursor:pointer;color:var(--text)}
[data-theme="dark"]  .nav-cta{color:#f0ede6}
[data-theme="light"] .nav-cta{color:#161412}
@media(prefers-color-scheme:light){:root:not([data-theme]) .nav-cta{color:#161412}}
.nav-cta:hover{background:var(--text);color:var(--bg-surface,#1a1a1a);border-color:var(--text)}
[data-theme="light"] .nav-cta:hover{color:#f0ede6}
[data-theme="dark"]  .nav-cta:hover{color:#161412}
.theme-toggle{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--line);border-radius:50%;background:transparent;cursor:pointer;transition:border-color .25s,background .25s;position:relative;flex-shrink:0}
.theme-toggle:hover{border-color:var(--accent);background:var(--accent)}
.theme-toggle:hover .toggle-icon{color:var(--bg);transform:rotate(20deg)}
.toggle-icon{font-size:14px;color:var(--text-muted);transition:color .25s,transform .4s var(--ease);user-select:none;pointer-events:none;display:block}
.nav-toggle{display:none;flex-direction:column;gap:5px;padding:4px;cursor:pointer;flex-shrink:0}
.nav-toggle span{display:block;width:24px;height:1px;background:var(--text);transition:transform .3s,opacity .3s}
.nav-toggle.is-open span:nth-child(1){transform:translateY(6px) rotate(45deg)}
.nav-toggle.is-open span:nth-child(2){opacity:0}
.nav-toggle.is-open span:nth-child(3){transform:translateY(-6px) rotate(-45deg)}
.nav-mobile{display:none;position:fixed;inset:0;background:rgba(22,20,18,.96);backdrop-filter:blur(20px);z-index:99;flex-direction:column;justify-content:center;padding:var(--pad-x)}
.nav-mobile.is-open{display:flex}
.nav-mobile a{font-family:var(--font-display);font-size:clamp(36px,8vw,64px);font-weight:800;color:var(--text-dim);line-height:1.4;transition:color .2s;cursor:pointer}
.nav-mobile a:hover{color:var(--accent)}
/* ── PAGES ── */
.page{display:none;min-height:100vh}
.page.active{display:block}
/* ── HERO ── */
.hero{min-height:100svh;display:grid;grid-template-rows:1fr auto;border-bottom:1px solid var(--line)}
.hero__content{display:grid;grid-template-columns:1fr 1fr;align-items:end;padding:var(--pad-y) var(--pad-x);gap:40px}
.hero__title{margin-top:24px}
.hero__title em{font-style:italic;color:var(--accent)}
.hero__right{display:flex;flex-direction:column;justify-content:flex-end;gap:32px}
.hero__scroll{display:flex;align-items:center;gap:12px;font-size:11px;letter-spacing:.1em;text-transform:uppercase}
[data-theme="dark"]  .hero__scroll { color: #f0ede6; }
[data-theme="light"] .hero__scroll { color: #161412; }
@media(prefers-color-scheme:light){ :root:not([data-theme]) .hero__scroll { color: #161412; } }
.hero__scroll-line{flex:1;max-width:60px;height:1px;background:var(--line);transition:max-width .4s var(--ease),background .3s}
.hero__scroll:hover .hero__scroll-line{max-width:120px;background:var(--accent)}
.hero__reel{border-top:1px solid var(--line);overflow:hidden}
.hero__reel-ticker{white-space:nowrap;font-family:var(--font-display);font-size:clamp(28px,6vw,80px);font-weight:800;color:rgb(243,243,243);padding:16px 0;animation:ticker 18s linear infinite;cursor:default}
[data-theme="light"] .hero__reel-ticker{color:rgb(243,243,243)}
@keyframes ticker{from{transform:translateX(0)}to{transform:translateX(-50%)}}
/* ── FEATURED ── */
.featured{padding:var(--pad-y) var(--pad-x);border-bottom:1px solid var(--line)}
.featured__inner{position:relative;aspect-ratio:16/7;background:var(--bg-3);border-radius:var(--radius-md);overflow:hidden;cursor:pointer;display:flex;align-items:center;justify-content:center}
.featured__placeholder{font-family:var(--font-display);font-size:clamp(32px,8vw,100px);font-weight:800;color:rgba(240,237,230,0.5);pointer-events:none;user-select:none}
.featured__meta{position:absolute;inset:0;padding:20px 24px;display:flex;flex-direction:column;justify-content:space-between;background:linear-gradient(to top,rgba(0,0,0,0.65) 0%,rgba(0,0,0,0.1) 60%,transparent 100%)}
.featured__meta .t-label,.featured__meta .t-display{color:#f0ede6 !important}
.featured__meta .t-label{color:rgba(240,237,230,0.7) !important}
.featured__index{font-family:var(--font-display);font-size:clamp(40px,8vw,80px);font-weight:800;color:rgba(240,237,230,0.18);line-height:1}
.featured__bottom{display:flex;justify-content:space-between;align-items:flex-end;gap:12px}
.featured__progress{position:absolute;bottom:0;left:0;height:2px;background:var(--accent);width:0;transition:width 5s linear}
/* ── WORKS GRID ── */
.works-header{display:flex;justify-content:space-between;align-items:baseline;padding:32px var(--pad-x) 16px}
.works-grid{display:grid;gap:1px;background:var(--line);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.works-grid--cols-3{grid-template-columns:repeat(3,1fr)}
.works-grid--cols-2{grid-template-columns:repeat(2,1fr)}
.work-card{background:var(--bg-2);padding:24px var(--pad-x);position:relative;overflow:hidden;transition:background .3s;cursor:pointer}
.work-card::after{content:'';position:absolute;bottom:0;left:0;width:0;height:2px;background:var(--accent);transition:width .45s var(--ease)}
.work-card:hover{background:var(--bg-3)}
.work-card:hover::after{width:100%}
.work-card__img{aspect-ratio:4/3;background:var(--bg-3);border-radius:var(--radius-sm);margin-bottom:20px;overflow:hidden;display:flex;align-items:center;justify-content:center}
.work-card__img-placeholder{font-family:var(--font-display);font-size:32px;font-weight:800;color:rgba(240,237,230,0.5)}
[data-theme="light"] .work-card__img-placeholder{color:rgba(22,20,18,0.25)}
.work-card__cat{font-size:10px;color:var(--accent);letter-spacing:.1em;text-transform:uppercase;margin-bottom:10px}
.work-card__title{font-family:var(--font-display);font-size:clamp(16px,2.5vw,26px);font-weight:700;color:var(--text);line-height:1.1;margin-bottom:8px}
.work-card__year{font-size:11px;color:var(--text-dim)}
.work-card__arrow{position:absolute;bottom:24px;right:20px;font-size:18px;color:var(--line);transition:color .25s,transform .3s var(--ease)}
.work-card:hover .work-card__arrow{color:var(--accent);transform:translate(4px,-4px)}
/* ── WORK ROWS ── */
.work-row{display:grid;grid-template-columns:48px 1fr auto auto;align-items:center;gap:16px;padding:20px var(--pad-x);border-bottom:1px solid var(--line);transition:background .25s;cursor:pointer}
.work-row:hover{background:var(--bg-2)}
.work-row__num{font-size:12px;color:var(--text-dim);font-variant-numeric:tabular-nums}
.work-row__name{font-family:var(--font-display);font-size:clamp(16px,2.5vw,28px);font-weight:700}
.work-row:hover .work-row__name{color:var(--text)}
[data-theme="dark"] .work-row:hover .work-row__name{color:var(--accent)}
.work-row__cat{font-size:11px;color:var(--text-muted);text-align:right;letter-spacing:.06em}
.work-row__year{font-size:11px;color:var(--text-dim);width:40px;text-align:right}
[data-theme="light"] #works-list .work-row__num,
[data-theme="light"] #works-list .work-row__year,
[data-theme="light"] #works-list .work-row__cat { color: #ffffff; }
@media(prefers-color-scheme:light){
  :root:not([data-theme]) #works-list .work-row__num,
  :root:not([data-theme]) #works-list .work-row__year,
  :root:not([data-theme]) #works-list .work-row__cat { color: #ffffff; }
}
/* ── ABOUT STRIP ── */
.about-strip{display:grid;grid-template-columns:1fr 1fr;border-top:1px solid var(--line)}
.about-strip__col{padding:var(--pad-y) var(--pad-x)}
.about-strip__col:first-child{border-right:1px solid var(--line)}
/* ── STATS ── */
.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:1px;background:var(--line);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.stat{background:#0e0e0e;padding:40px var(--pad-x);text-align:center}
.stat__number{font-family:var(--font-display);font-size:clamp(36px,6vw,80px);font-weight:800;line-height:1;margin-bottom:8px;color:#f0ede6}
.stat .t-label{color:rgba(240,237,230,0.5)}
/* ── PROJECT ── */
.project-header{padding:var(--pad-y) var(--pad-x) 40px;display:grid;grid-template-columns:1fr 1fr;gap:40px;align-items:end;border-bottom:1px solid var(--line)}
.project-cover{width:100%;aspect-ratio:16/9;background:var(--bg-3);display:flex;align-items:center;justify-content:center}
.project-cover-placeholder{font-family:var(--font-display);font-size:clamp(28px,6vw,80px);font-weight:800;color:rgba(240,237,230,0.5)}
.project-meta-row{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);border-bottom:1px solid var(--line);padding:0 var(--pad-x)}
.project-meta-item{padding:24px 0;border-right:1px solid var(--line);padding-right:16px}
.project-meta-item:last-child{border-right:0}
.project-body{padding:var(--pad-y) var(--pad-x);display:grid;grid-template-columns:1fr 2fr;gap:60px}
.project-text{font-size:16px;color:var(--text-muted);line-height:1.9}
.project-gallery{display:grid;grid-template-columns:1fr 1fr;gap:2px;background:var(--line);margin:0 var(--pad-x) var(--pad-y)}
.project-gallery-img{aspect-ratio:4/3;background:var(--bg-3);display:flex;align-items:center;justify-content:center}
.project-next{padding:32px var(--pad-x);display:flex;justify-content:space-between;align-items:center;border-top:1px solid var(--line);cursor:pointer}
.project-next:hover .t-display{color:var(--accent)}
/* ── CONTACT ── */
.contact-section{display:grid;grid-template-columns:1fr 1fr;min-height:100svh;align-items:start}
.contact-info{padding:var(--pad-y) var(--pad-x);border-right:1px solid var(--line);display:flex;flex-direction:column;justify-content:space-between;min-height:100svh}
.contact-form-col{padding:var(--pad-y) var(--pad-x)}
.form-field{margin-bottom:28px}
.form-field label{display:block;font-size:10px;color:var(--text-dim);letter-spacing:.12em;text-transform:uppercase;margin-bottom:10px}
.form-field input,.form-field textarea{width:100%;background:transparent;border:0;border-bottom:1px solid var(--line);padding:8px 0 12px;font-family:var(--font-body);font-size:16px;color:var(--text);outline:none;transition:border-color .3s,color .3s;resize:none;letter-spacing:.01em}
.form-field input:focus,.form-field textarea:focus{border-color:var(--accent)}
.form-field input::placeholder,.form-field textarea::placeholder{color:var(--text-dim)}
.btn-submit{display:inline-flex;align-items:center;gap:10px;border:1px solid var(--accent);padding:14px 32px;border-radius:var(--radius-sm);font-family:var(--font-body);font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--accent);background:transparent;transition:background .25s,color .25s,border-color .25s;cursor:pointer}
.btn-submit:hover{background:var(--accent);color:#0e0e0e;border-color:var(--accent)}
/* ── FOOTER ── */
.site-footer{border-top:1px solid var(--line);padding:20px var(--pad-x);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px}
.footer-links{display:flex;gap:20px;flex-wrap:wrap}
.footer-links a{font-size:11px;color:var(--text-dim);letter-spacing:.06em;text-transform:uppercase;transition:color .2s;cursor:pointer}
.footer-links a:hover{color:var(--accent)}
/* ── FILTER BAR ── */
.filter-bar{display:flex;flex-wrap:wrap;gap:8px;padding:16px var(--pad-x);border-bottom:1px solid var(--line)}
.filter-btn{font-size:11px;padding:6px 14px;border:1px solid var(--line);border-radius:var(--radius-sm);background:transparent;color:var(--text-dim);letter-spacing:.06em;text-transform:uppercase;cursor:pointer;transition:border-color .2s,color .2s,background .2s}
.filter-btn.is-active{border-color:var(--accent);color:var(--accent)}
[data-theme="light"] .filter-btn { color: #161412; border-color: #161412; }
[data-theme="light"] .filter-btn.is-active { color: var(--accent); border-color: var(--accent); }
@media(prefers-color-scheme:light){
  :root:not([data-theme]) .filter-btn { color: #161412; border-color: #161412; }
  :root:not([data-theme]) .filter-btn.is-active { color: var(--accent); border-color: var(--accent); }
}
.filter-btn:hover:not(.is-active){border-color:var(--text-dim);color:var(--text)}
/* ── REVEAL ── */
.reveal{opacity:0;transform:translateY(28px);transition:opacity .8s var(--ease),transform .8s var(--ease)}
.reveal.is-visible{opacity:1;transform:none}
/* ── PREVIEW BAR ── */
.preview-bar{position:fixed;bottom:16px;left:50%;transform:translateX(-50%);display:flex;gap:4px;background:rgba(22,20,18,.95);border:1px solid transparent;border-radius:40px;padding:6px 12px;z-index:10000;backdrop-filter:blur(12px);opacity:0;pointer-events:none;transition:opacity .3s;white-space:nowrap}
.preview-bar.is-visible{opacity:1;pointer-events:auto}
.preview-btn{font-size:11px;padding:5px 12px;border-radius:30px;background:transparent;color:var(--text-dim);cursor:pointer;letter-spacing:.06em;text-transform:uppercase;transition:background .2s,color .2s;border:none;font-family:var(--font-body)}
.preview-btn.is-active{background:var(--accent);color:#FFFFFF}
/* ══════════════════════════════════════
   RESPONSIVE BREAKPOINTS
══════════════════════════════════════ */
/* ── TABLET (≤900px) ── */
@media(max-width:900px){
  .nav-primary,.nav-cta{display:none}
  .nav-toggle{display:flex}
  /* Hero */
  .hero__content{
    grid-template-columns:1fr;
    align-items:start;
    padding-top:clamp(32px,6vw,60px);
    gap:24px;
  }
  .hero__right{display:none}
  .hero__title{margin-top:16px}
  /* Featured */
  .featured{padding:24px var(--pad-x)}
  .featured__inner{aspect-ratio:4/3}
  .featured__bottom{flex-direction:column;align-items:flex-start;gap:8px}
  /* About strip */
  .about-strip{grid-template-columns:1fr}
  .about-strip__col:first-child{border-right:0;border-bottom:1px solid var(--line)}
  /* Works grid */
  .works-grid--cols-3{grid-template-columns:1fr 1fr}
  .works-grid--cols-2{grid-template-columns:1fr 1fr}
  /* Work rows */
  .work-row{grid-template-columns:1fr auto;gap:12px;padding:16px var(--pad-x)}
  .work-row__num,.work-row__year{display:none}
  .work-row__cat{font-size:10px}
  /* Contact */
  .contact-section{grid-template-columns:1fr}
  .contact-info{border-right:0;border-bottom:1px solid var(--line);min-height:auto}
  /* Stats */
  .stats{grid-template-columns:1fr 1fr}
  /* Project */
  .project-header{grid-template-columns:1fr}
  .project-body{grid-template-columns:1fr;gap:32px}
  .project-meta-row{grid-template-columns:1fr 1fr;padding:0 var(--pad-x)}
}
/* ── MOBILE (≤560px) ── */
@media(max-width:560px){
  :root{
    --pad-x: 16px;
    --pad-y: 32px;
  }
  /* Header */
  .site-header{padding:14px var(--pad-x)}
  /* Hero */
  .hero{min-height:100svh}
  .hero__content{padding:clamp(24px,5vw,40px) var(--pad-x);gap:20px}
  .hero__title{margin-top:12px}
  /* Featured */
  .featured{padding:20px var(--pad-x)}
  .featured__meta{padding:16px}
  .featured__inner{aspect-ratio:1/1}
  /* Works header */
  .works-header{padding:24px var(--pad-x) 12px;flex-wrap:wrap;gap:8px}
  /* Works grid – single column */
  .works-grid--cols-3,
  .works-grid--cols-2{grid-template-columns:1fr}
  /* Work card */
  .work-card{padding:20px var(--pad-x)}
  .work-card__arrow{bottom:20px;right:16px}
  /* Work rows */
  .work-row{padding:16px var(--pad-x);gap:8px}
  /* About strip */
  .about-strip__col{padding:var(--pad-y) var(--pad-x)}
  /* Stats – single column */
  .stats{grid-template-columns:1fr}
  .stat{padding:32px var(--pad-x)}
  /* Project */
  .project-header{padding:var(--pad-y) var(--pad-x) 24px;gap:24px}
  .project-meta-row{
    grid-template-columns:1fr 1fr;
    padding:0 var(--pad-x);
  }
  .project-meta-item{padding:16px 0;padding-right:12px}
  .project-body{padding:var(--pad-y) var(--pad-x);gap:24px}
  .project-gallery{grid-template-columns:1fr;margin:0 var(--pad-x) var(--pad-y)}
  .project-next{padding:24px var(--pad-x);flex-direction:column;align-items:flex-start;gap:8px}
  /* Contact */
  .contact-info{padding:var(--pad-y) var(--pad-x)}
  .contact-form-col{padding:var(--pad-y) var(--pad-x)}
  /* CTA strip */
  .works-cta-strip{flex-direction:column;align-items:flex-start;gap:20px}
  /* Footer */
  .site-footer{flex-direction:column;align-items:flex-start;gap:16px}
  .footer-links{gap:16px}
  /* Preview bar */
  .preview-bar{bottom:12px;padding:5px 10px}
  .preview-btn{font-size:10px;padding:4px 10px}
  /* Filter bar */
  .filter-bar{gap:6px;padding:14px var(--pad-x)}
}
/* ── VERY SMALL (≤380px) ── */
@media(max-width:380px){
  .works-grid--cols-3,
  .works-grid--cols-2{grid-template-columns:1fr}
  .project-meta-row{grid-template-columns:1fr}
  .project-meta-item{border-right:0;border-bottom:1px solid var(--line);padding:16px 0}
  .project-meta-item:last-child{border-bottom:0}
}
</style>
</head>
<body>
<canvas id="gl-bg"></canvas>
<div class="cursor" id="cursor"></div>
<header class="site-header" id="site-header">
  <div class="site-logo" onclick="goPage('home')">
    <svg id="colab-logo" viewBox="0 0 200 200" width="36" height="36" xmlns="http://www.w3.org/2000/svg" aria-label="Colab" style="overflow:visible">
      <circle id="c1" cx="100" cy="60"  r="18" fill="#f0ede6"/>
      <circle id="c2" cx="64"  cy="127" r="18" fill="#f0ede6"/>
      <circle id="c3" cx="136" cy="127" r="18" fill="#f0ede6"/>
    </svg>
  </div>
  <nav class="nav-primary">
    <a onclick="goPage('home')"    class="active" id="nav-home">Home</a>
    <a onclick="goPage('works')"   id="nav-works">Works</a>
    <a onclick="goPage('about')"   id="nav-about">About</a>
    <a onclick="goPage('contact')" id="nav-contact">Contact</a>
  </nav>
  <div class="nav-right">
    <div class="nav-cta" onclick="goPage('contact')">Get in touch</div>
    <button class="theme-toggle" id="theme-toggle" aria-label="Cambia tema">
      <span class="toggle-icon" id="toggle-icon">◐</span>
    </button>
  </div>
  <button class="nav-toggle" id="nav-toggle" aria-label="Menu">
    <span></span><span></span><span></span>
  </button>
</header>
<nav class="nav-mobile" id="nav-mobile">
  <a onclick="goPage('home');closeMobileNav()">Home</a>
  <a onclick="goPage('works');closeMobileNav()">Works</a>
  <a onclick="goPage('about');closeMobileNav()">About</a>
  <a onclick="goPage('contact');closeMobileNav()">Contact</a>
</nav>
<!-- HOME -->
<div class="page active" id="page-home">
  <section class="hero">
    <div class="hero__content">
      <div>
        <p class="t-eyebrow reveal">Multidisciplinary Design Studio — Lititz (PA) | Milan (IT)</p>
        <h1 class="t-display t-display--xl hero__title reveal">
          We shape<br><em style="font-style:italic;color:var(--accent)">space</em><br>and <em style="font-style:italic;color:var(--accent)">ideas</em>
        </h1>
      </div>
      <div class="hero__right reveal">
        <p class="t-body-lg">Colab is an organization of spirited people working at the intersection of architecture, design, and human experience.</p>
        <div class="hero__scroll">
          <span class="hero__scroll-line"></span>
          Scroll to explore
        </div>
      </div>
    </div>
    <div class="hero__reel">
      <div class="hero__reel-ticker">· Architecture · Design · People · Purpose · Projects · Colab · Architecture · Design · People · Purpose · Projects · Colab&nbsp;</div>
    </div>
  </section>
  <section class="featured reveal">
    <div class="featured__inner" onclick="goPage('project')">
      <div class="featured__placeholder">CLB</div>
      <div class="featured__meta">
        <div class="featured__index">01</div>
        <div class="featured__bottom">
          <div>
            <p class="t-label" style="margin-bottom:6px">Featured project</p>
            <h2 class="t-display t-display--md">Community Learning Block</h2>
          </div>
          <div class="t-label" style="text-align:right;white-space:nowrap">Architecture<br>2026</div>
        </div>
        <div class="featured__progress" id="fp"></div>
      </div>
    </div>
  </section>
  <div class="works-header">
    <span class="t-label">Selected works</span>
    <a onclick="goPage('works')" class="t-label" style="color:var(--accent);cursor:pointer">View all →</a>
  </div>
  <div class="works-grid works-grid--cols-2">
    <article class="work-card reveal" onclick="window.open('https://addvent.org/','_blank')">
      <div class="work-card__img"><span class="work-card__img-placeholder">ADD</span></div>
      <div class="work-card__cat">Design · from 2021</div>
      <h2 class="work-card__title">Addvent</h2>
      <div class="work-card__year">Worldwide</div>
      <div class="work-card__arrow">↗</div>
    </article>
    <article class="work-card reveal" onclick="window.open('https://italiafestpa.org/','_blank')">
      <div class="work-card__img"><span class="work-card__img-placeholder">IF</span></div>
      <div class="work-card__cat">Design · from 2023</div>
      <h2 class="work-card__title">Italia Festival</h2>
      <div class="work-card__year">Lititz</div>
      <div class="work-card__arrow">↗</div>
    </article>
    <article class="work-card reveal" onclick="window.open('https://logcabin1933.com/','_blank')">
      <div class="work-card__img"><span class="work-card__img-placeholder">LC</span></div>
      <div class="work-card__cat">Architecture | Design · from 2023</div>
      <h2 class="work-card__title">Log Cabin Restaurant</h2>
      <div class="work-card__year">Lititz</div>
      <div class="work-card__arrow">↗</div>
    </article>
    <article class="work-card reveal" onclick="window.open('https://shop.fondazionearnaldopomodoro.it/it/','_blank')">
      <div class="work-card__img"><span class="work-card__img-placeholder">FAP</span></div>
      <div class="work-card__cat">Design · 2022/2023</div>
      <h2 class="work-card__title">Fondazione Arnaldo Pomodoro</h2>
      <div class="work-card__year">Milan</div>
      <div class="work-card__arrow">↗</div>
    </article>
  </div>
  <div class="about-strip">
    <div class="about-strip__col reveal">
      <p class="t-label" style="margin-bottom:20px">About us</p>
      <h2 class="t-display t-display--md">Working together to give shape to a <em style="color:var(--accent);font-style:italic">better future</em></h2>
    </div>
    <div class="about-strip__col reveal">
      <p class="t-label" style="margin-bottom:20px">Our approach</p>
      <p class="t-body-lg">We believe that the best work happens at the intersection of disciplines. Our team brings together architects, designers, and makers — all driven by a shared curiosity about how space shapes human experience.</p>
      <a onclick="goPage('about')" class="t-label" style="display:inline-flex;align-items:center;gap:8px;margin-top:28px;color:var(--accent);cursor:pointer">Learn more →</a>
    </div>
  </div>
  <footer class="site-footer">
    <span class="t-label">© 2026 Colab — All rights reserved |<a style="color:#4e9595"> 17 North Lane, Suite A, Lititz PA 17543</a></span>
    <div class="footer-links">
      <a href="https://www.instagram.com/colab.xyz/" target="_blank">Instagram</a>
      <a href="https://www.linkedin.com/company/colab-xyz/" target="_blank">LinkedIn</a>
      <a href="mailto:[email protected]">[email protected]</a>
    </div>
  </footer>
</div>
<!-- WORKS -->
<div class="page" id="page-works">
  <div class="border-bottom" style="padding:var(--pad-y) var(--pad-x) 40px">
    <p class="t-eyebrow reveal" style="margin-bottom:16px">All projects</p>
    <h1 class="t-display t-display--xl reveal">Works</h1>
  </div>
  <div class="filter-bar">
    <button class="filter-btn is-active" data-filter="all">All</button>
    <button class="filter-btn" data-filter="architecture">Architecture</button>
    <button class="filter-btn" data-filter="design">Design</button>
    <button class="filter-btn" data-filter="design">Production</button>
  </div>
  <div id="works-list">
    <a class="work-row reveal" data-category="production" href="https://lancastercapitalday.org/" target="_blank" rel="noopener noreferrer"><span class="work-row__num">01</span><span class="work-row__name">Lancaster Capital Day</span><span class="work-row__cat">Production</span><span class="work-row__year">2026→</span></a>
    <a class="work-row reveal" data-category="design" href="https://addvent.org/" target="_blank" rel="noopener noreferrer"><span class="work-row__num">02</span><span class="work-row__name">Addvent</span><span class="work-row__cat">Design</span><span class="work-row__year">2021→</span></a>
    <a class="work-row reveal" data-category="architecture" href="https://logcabin1933.com/" target="_blank" rel="noopener noreferrer"><span class="work-row__num">03</span><span class="work-row__name">Log Cabin</span><span class="work-row__cat">Architecture | Design</span><span class="work-row__year">2023→</span></a>
    <a class="work-row reveal" data-category="design" href="https://shop.fondazionearnaldopomodoro.it/it/" target="_blank" rel="noopener noreferrer"><span class="work-row__num">04</span><span class="work-row__name">Fondazione Arnaldo Pomodoro</span><span class="work-row__cat">Design</span><span class="work-row__year">2022</span></a>
    <a class="work-row reveal" data-category="production" href="https://italiafestpa.org/" target="_blank" rel="noopener noreferrer"><span class="work-row__num">05</span><span class="work-row__name">L'Italia Festival</span><span class="work-row__cat">Production</span><span class="work-row__year">2023</span></a>
    <a class="work-row reveal" data-category="design" href="https://irex.com/" target="_blank" rel="noopener noreferrer"><span class="work-row__num">06</span><span class="work-row__name">Irex Contracting Group</span><span class="work-row__cat">Design</span><span class="work-row__year">2022</span></a>
    <a class="work-row reveal" data-category="design" href="https://www.newschool.net/" target="_blank" rel="noopener noreferrer"><span class="work-row__num">07</span><span class="work-row__name">New School Montessori</span><span class="work-row__cat">Design</span><span class="work-row__year">2020</span></a>
    <a class="work-row reveal" data-category="design" href="https://www.katiewatersyoga.com/" target="_blank" rel="noopener noreferrer"><span class="work-row__num">08</span><span class="work-row__name">Katie Waters Yoga</span><span class="work-row__cat">Design</span><span class="work-row__year">2026</span></a>
    <a class="work-row reveal" data-category="design" href="https://www.instagram.com/simbolimilanesi/" target="_blank" rel="noopener noreferrer"><span class="work-row__num">09</span><span class="work-row__name">Simboli Milanesi</span><span class="work-row__cat">Design</span><span class="work-row__year">2025</span></a>
  </div>
  <div style="padding:var(--pad-y) var(--pad-x);border-top:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:24px" class="works-cta-strip">
    <h2 class="t-display t-display--md">Let's work on your<br><em style="color:var(--accent);font-style:italic">next project</em></h2>
    <div onclick="goPage('contact')" class="nav-cta" style="cursor:pointer;padding:16px 36px;font-size:13px;flex-shrink:0">Get in touch →</div>
  </div>
  <footer class="site-footer">
    <span class="t-label">© 2026 Colab</span>
    <div class="footer-links"><a href="https://www.instagram.com/colab.xyz/" target="_blank">Instagram</a><a href="https://www.linkedin.com/company/colab-xyz/" target="_blank">LinkedIn</a><a href="mailto:[email protected]">[email protected]</a></div>
  </footer>
</div>
<!-- ABOUT -->
<div class="page" id="page-about">
  <div class="about-strip" style="border-top:none;border-bottom:none">
    <div class="about-strip__col reveal">
      <p class="t-eyebrow" style="margin-bottom:20px">About us</p>
      <h1 class="t-display t-display--lg">We are<br><em style="color:var(--accent);font-style:italic">Colab</em></h1>
    </div>
    <div class="about-strip__col reveal" style="display:flex;align-items:flex-end">
      <p class="t-body-lg" style="color:var(--text)">Colab is an organization of spirited people with expertise in architecture and design. We believe that working together with clients and contractors, we can give shape to a better future.</p>
    </div>
  </div>
  <div class="stats">
    <div class="stat reveal"><div class="stat__number">6<span style="font-size:.5em;color:rgba(240,237,230,.6)">+</span></div><p class="t-label">Years active</p></div>
    <div class="stat reveal"><div class="stat__number">2</div><p class="t-label">Continents</p></div>
    <div class="stat reveal"><div class="stat__number">6</div><p class="t-label">Core team members</p></div>
  </div>
  <div class="about-strip">
    <div class="about-strip__col reveal"><p class="t-label" style="margin-bottom:20px">People</p><p class="t-body-lg">Our team is made of architects, designers, makers and thinkers — each with a distinct background, united by a shared curiosity.</p></div>
    <div class="about-strip__col reveal"><p class="t-label" style="margin-bottom:20px">Purpose</p><p class="t-body-lg">We work with clients and contractors to create spaces and objects that are thoughtful, functional, and enduring. Every project starts with listening.</p></div>
  </div>
  <div style="padding:var(--pad-y) var(--pad-x);border-top:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:24px">
    <h2 class="t-display t-display--md">Discover our<br><em style="color:var(--accent);font-style:italic">projects</em></h2>
    <div onclick="goPage('works')" class="nav-cta" style="cursor:pointer;padding:16px 36px;font-size:13px;flex-shrink:0">View all works →</div>
  </div>
  <footer class="site-footer">
    <span class="t-label">© 2026 Colab</span>
    <div class="footer-links"><a href="https://www.instagram.com/colab.xyz/" target="_blank">Instagram</a><a href="https://www.linkedin.com/company/colab-xyz/" target="_blank">LinkedIn</a><a href="mailto:[email protected]">[email protected]</a></div>
  </footer>
</div>
<!-- PROJECT -->
<div class="page" id="page-project">
  <div class="border-bottom">
    <div class="project-header reveal">
      <div>
        <p class="t-eyebrow" style="margin-bottom:16px">Architecture · 2026</p>
        <h1 class="t-display t-display--lg">Community Learning Block</h1>
      </div>
      <div style="display:flex;align-items:flex-end">
        <p class="t-body-lg">A new typology for educational infrastructure — flexible, community-driven, and designed to evolve over time.</p>
      </div>
    </div>
    <div class="project-cover reveal">
      <div style="width:100%;aspect-ratio:16/9;background:var(--bg-3);display:flex;align-items:center;justify-content:center">
        <span class="project-cover-placeholder">CLB</span>
      </div>
    </div>
  </div>
  <div class="project-meta-row">
    <div class="project-meta-item reveal"><p class="t-label" style="margin-bottom:8px">Years</p><p style="font-size:14px">2021–2026</p></div>
    <div class="project-meta-item reveal"><p class="t-label" style="margin-bottom:8px">Clients</p><p style="font-size:14px">Fondazione Arnaldo Pomodoro, Log Cabin and more</p></div>
    <div class="project-meta-item reveal"><p class="t-label" style="margin-bottom:8px">Locations</p><p style="font-size:14px">USA | Italy | Worldwide</p></div>
    <div class="project-meta-item reveal"><p class="t-label" style="margin-bottom:8px">Scopes</p><p style="font-size:14px">Design | Architecture</p></div>
  </div>
  <div class="project-body">
    <aside class="reveal">
      <p class="t-label" style="color:var(--accent)">Architecture</p>
      <a onclick="goPage('works')" class="t-label" style="display:flex;align-items:center;gap:8px;margin-top:40px;color:var(--text-muted);cursor:pointer">← All projects</a>
    </aside>
    <div class="reveal">
      <p class="project-text">The Community Learning Block is a new typology for public educational infrastructure — designed around the idea that learning happens everywhere, not just in classrooms.</p>
      <p class="project-text" style="margin-top:24px">Working closely with local educators, parents, and students, we developed a program that balances structured learning spaces with informal gathering areas, outdoor classrooms, and flexible workshop zones.</p>
    </div>
  </div>
  <div class="project-gallery reveal">
    <div class="project-gallery-img"></div>
    <div class="project-gallery-img"></div>
    <div class="project-gallery-img"></div>
    <div class="project-gallery-img"></div>
  </div>
  <div class="project-next reveal" onclick="goPage('works')">
    <span class="t-label">Next project</span>
    <span class="t-display t-display--md" style="transition:color .2s">Addvent →</span>
  </div>
  <footer class="site-footer"><span class="t-label">© 2026 Colab</span><div class="footer-links"><a>Instagram</a><a>LinkedIn</a></div></footer>
</div>
<!-- CONTACT -->
<div class="page" id="page-contact">
  <div class="contact-section">
    <div class="contact-info">
      <div>
        <p class="t-eyebrow reveal" style="margin-bottom:20px">Get in touch</p>
        <h1 class="t-display t-display--lg reveal">Let's work<br><em style="color:var(--accent);font-style:italic">together</em></h1>
      </div>
      <div class="reveal" style="display:grid;gap:28px">
        <div><p class="t-label" style="margin-bottom:8px">Email</p><a href="mailto:[email protected]" style="font-size:15px;color:var(--text)">[email protected]</a></div>
        <div><p class="t-label" style="margin-bottom:8px">Location</p><p style="font-size:15px;color:var(--text)">Milano, Italy<br>Lititz, PA (USA)</p></div>
        <div>
          <p class="t-label" style="margin-bottom:12px">Follow</p>
          <div style="display:flex;gap:16px">
            <a href="https://www.instagram.com/colab.xyz/" target="_blank" class="t-label" style="color:var(--text);transition:color .2s">Instagram</a>
            <a href="https://www.linkedin.com/company/colab-xyz/" target="_blank" class="t-label" style="color:var(--text);transition:color .2s">LinkedIn</a>
          </div>
        </div>
      </div>
    </div>
    <div class="contact-form-col reveal">
      <form id="colab-contact-form" onsubmit="handleForm(event)">
        <div class="form-field"><label for="cf-name">Name</label><input type="text" id="cf-name" name="name" placeholder="Your full name" required></div>
        <div class="form-field"><label for="cf-email">Email</label><input type="email" id="cf-email" name="email" placeholder="[email protected]" required></div>
        <div class="form-field"><label for="cf-msg">Message</label><textarea id="cf-msg" name="message" rows="5" placeholder="Tell us about your project…" required></textarea></div>
        <div style="display:flex;align-items:center;gap:20px;flex-wrap:wrap">
          <button type="submit" class="btn-submit">Send message →</button>
          <span id="form-status" style="display:none;font-size:13px;color:var(--accent)"></span>
        </div>
      </form>
    </div>
  </div>
  <footer class="site-footer">
    <span class="t-label">© 2026 Colab</span>
    <div class="footer-links"><a href="https://www.instagram.com/colab.xyz/" target="_blank">Instagram</a><a href="https://www.linkedin.com/company/colab-xyz/" target="_blank">LinkedIn</a><a href="mailto:[email protected]">[email protected]</a></div>
  </footer>
</div>
<!-- PREVIEW BAR -->
<div class="preview-bar">
  <button class="preview-btn is-active" onclick="goPage('home')"    id="pb-home">Home</button>
  <button class="preview-btn"           onclick="goPage('works')"   id="pb-works">Works</button>
  <button class="preview-btn"           onclick="goPage('about')"   id="pb-about">About</button>
  <button class="preview-btn"           onclick="goPage('contact')" id="pb-contact">Contact</button>
</div>
<script>
/* ══════════════════════════════════════
   WEBGL GRADIENT BACKGROUND
══════════════════════════════════════ */
(function(){
  var canvas = document.getElementById('gl-bg');
  var gl = canvas.getContext('webgl');
  if(!gl){ canvas.style.display='none'; return; }
  var VERT = 'attribute vec2 a_pos;void main(){gl_Position=vec4(a_pos,0.,1.);}';
  var NOISE_FN = [
    'precision highp float;',
    'uniform float u_time;',
    'uniform vec2 u_res;',
    'vec3 mod289(vec3 x){return x-floor(x*(1./289.))*289.;}',
    'vec2 mod289(vec2 x){return x-floor(x*(1./289.))*289.;}',
    'vec3 permute(vec3 x){return mod289(((x*34.)+1.)*x);}',
    'float snoise(vec2 v){',
    '  const vec4 C=vec4(0.211324865405187,0.366025403784439,-0.577350269189626,0.024390243902439);',
    '  vec2 i=floor(v+dot(v,C.yy));',
    '  vec2 x0=v-i+dot(i,C.xx);',
    '  vec2 i1=(x0.x>x0.y)?vec2(1.,0.):vec2(0.,1.);',
    '  vec4 x12=x0.xyxy+C.xxzz;',
    '  x12.xy-=i1;',
    '  i=mod289(i);',
    '  vec3 p=permute(permute(i.y+vec3(0.,i1.y,1.))+i.x+vec3(0.,i1.x,1.));',
    '  vec3 m=max(.5-vec3(dot(x0,x0),dot(x12.xy,x12.xy),dot(x12.zw,x12.zw)),0.);',
    '  m=m*m;m=m*m;',
    '  vec3 x=2.*fract(p*C.www)-1.;',
    '  vec3 h=abs(x)-.5;',
    '  vec3 ox=floor(x+.5);',
    '  vec3 a0=x-ox;',
    '  m*=1.79284291400159-0.85373472095314*(a0*a0+h*h);',
    '  vec3 g;',
    '  g.x=a0.x*x0.x+h.x*x0.y;',
    '  g.yz=a0.yz*x12.xz+h.yz*x12.yw;',
    '  return 130.*dot(m,g);',
    '}'
  ].join('\n');
  var WAVE_BODY = [
    'void main(){',
    '  vec2 uv=gl_FragCoord.xy/u_res;',
    '  float t=u_time*0.00018;',
    '  float n1=snoise(vec2(uv.x*0.9-t*0.4,uv.y*1.1+t*0.2));',
    '  float n2=snoise(vec2(uv.x*0.6+t*0.3,uv.y*0.8-t*0.35));',
    '  float n3=snoise(vec2(uv.x*1.1-t*0.25,uv.y*0.6+t*0.15));',
    '  vec2 warp=vec2(snoise(vec2(uv.x*0.7+t*0.2,uv.y*0.9-t*0.1)),snoise(vec2(uv.x*0.8-t*0.15,uv.y*0.7+t*0.25)))*0.3;',
    '  vec2 uvw=uv+warp;',
    '  float nw=snoise(vec2(uvw.x*0.8+t*0.3,uvw.y*1.0-t*0.2));',
    '  float wave=(n1*0.35+n2*0.25+n3*0.2+nw*0.2)*0.5+0.5;'
  ].join('\n');
  var FRAG_LIGHT = NOISE_FN + '\n' + WAVE_BODY + [
    '  wave=0.2+wave*0.8;',
    '  vec3 deep=vec3(0.102,0.271,0.271);',
    '  vec3 teal=vec3(0.173,0.435,0.435);',
    '  vec3 silver=vec3(0.78,0.82,0.80);',
    '  vec3 white=vec3(0.90,0.93,0.91);',
    '  vec3 mint=vec3(0.522,0.839,0.714);',
    '  vec3 col;float w=wave;',
    '  if(w<0.38)col=mix(deep,teal,(w-0.2)/0.18);',
    '  else if(w<0.62)col=mix(teal,silver,(w-0.38)/0.24);',
    '  else if(w<0.85)col=mix(silver,white,(w-0.62)/0.23);',
    '  else if(w<0.97)col=mix(white,teal,(w-0.85)/0.12);',
    '  else col=mix(teal,mint,(w-0.97)/0.03);',
    '  float vign=uv.x*(1.-uv.x)*uv.y*(1.-uv.y)*14.0;',
    '  col*=(0.7+0.3*clamp(vign,0.,1.));',
    '  gl_FragColor=vec4(clamp(col,0.,1.),1.);',
    '}'
  ].join('\n');
  var FRAG_DARK = NOISE_FN + '\n' + WAVE_BODY + [
    '  vec3 black=vec3(0.086,0.078,0.071);',
    '  vec3 deep=vec3(0.102,0.271,0.271);',
    '  vec3 teal=vec3(0.173,0.435,0.435);',
    '  vec3 gray=vec3(0.36,0.38,0.37);',
    '  vec3 mint=vec3(0.522,0.839,0.714);',
    '  vec3 col;float w=wave;',
    '  if(w<0.28)col=black;',
    '  else if(w<0.52)col=mix(black,deep,(w-0.28)/0.24);',
    '  else if(w<0.74)col=mix(deep,teal,(w-0.52)/0.22);',
    '  else if(w<0.90)col=mix(teal,gray,(w-0.74)/0.16);',
    '  else if(w<0.97)col=mix(gray,deep,(w-0.90)/0.07);',
    '  else col=mix(deep,mint,(w-0.97)/0.03);',
    '  float vign=uv.x*(1.-uv.x)*uv.y*(1.-uv.y)*14.0;',
    '  col*=(0.6+0.4*clamp(vign,0.,1.));',
    '  gl_FragColor=vec4(clamp(col,0.,1.),1.);',
    '}'
  ].join('\n');
  function mkShader(type, src){
    var s = gl.createShader(type);
    gl.shaderSource(s, src);
    gl.compileShader(s);
    return s;
  }
  function mkProg(fragSrc){
    var p = gl.createProgram();
    gl.attachShader(p, mkShader(gl.VERTEX_SHADER, VERT));
    gl.attachShader(p, mkShader(gl.FRAGMENT_SHADER, fragSrc));
    gl.linkProgram(p);
    return p;
  }
  var progLight = mkProg(FRAG_LIGHT);
  var progDark  = mkProg(FRAG_DARK);
  var buf = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, buf);
  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1,1,-1,-1,1,1,1]), gl.STATIC_DRAW);
  function bindProg(p){
    gl.useProgram(p);
    var loc = gl.getAttribLocation(p, 'a_pos');
    gl.enableVertexAttribArray(loc);
    gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);
    return { uTime: gl.getUniformLocation(p,'u_time'), uRes: gl.getUniformLocation(p,'u_res') };
  }
  var unifLight = bindProg(progLight);
  var unifDark  = bindProg(progDark);
  var useDark = true, curProg = progDark, curUnif = unifDark;
  window.setGradientTheme = function(dark){
    if(dark === useDark) return;
    useDark = dark; curProg = dark ? progDark : progLight; curUnif = dark ? unifDark : unifLight;
    gl.useProgram(curProg);
    var loc = gl.getAttribLocation(curProg,'a_pos');
    gl.enableVertexAttribArray(loc);
    gl.vertexAttribPointer(loc, 2, gl.FLOAT, false, 0, 0);
  };
  function resize(){
    canvas.width  = window.innerWidth  * (window.devicePixelRatio||1);
    canvas.height = window.innerHeight * (window.devicePixelRatio||1);
    gl.viewport(0,0,canvas.width,canvas.height);
  }
  resize();
  window.addEventListener('resize', resize);
  function frame(t){ gl.uniform1f(curUnif.uTime,t); gl.uniform2f(curUnif.uRes,canvas.width,canvas.height); gl.drawArrays(gl.TRIANGLE_STRIP,0,4); requestAnimationFrame(frame); }
  requestAnimationFrame(frame);
})();
/* ══════════════════════════════════════
   THEME TOGGLE
══════════════════════════════════════ */
(function(){
  var html = document.documentElement;
  var btn  = document.getElementById('theme-toggle');
  var icon = document.getElementById('toggle-icon');
  var CYCLE = ['dark','light'];
  var ICONS  = { dark:'☀', light:'☾' };
  function applyTheme(mode){
    html.setAttribute('data-theme', mode);
    if(icon) icon.textContent = ICONS[mode];
    var dark = (mode === 'dark');
    document.querySelectorAll('#colab-logo circle').forEach(function(c){
      c.setAttribute('fill', dark ? '#f0ede6' : '#161412');
    });
    if(window.setGradientTheme) window.setGradientTheme(dark);
  }
  function stored(){ try{ return localStorage.getItem('colab-theme')||'dark'; }catch(e){ return 'dark'; } }
  var cur = stored();
  applyTheme(cur);
  if(btn){
    btn.addEventListener('click', function(){
      cur = CYCLE[(CYCLE.indexOf(cur)+1) % CYCLE.length];
      try{ localStorage.setItem('colab-theme', cur); }catch(e){}
      applyTheme(cur);
    });
  }
})();
/* ══════════════════════════════════════
   PAGE ROUTER
══════════════════════════════════════ */
var pages = ['home','works','about','project','contact'];
function goPage(id){
  pages.forEach(function(p){
    document.getElementById('page-'+p).classList.toggle('active', p===id);
    var pb = document.getElementById('pb-'+p); if(pb) pb.classList.toggle('is-active', p===id);
    var nv = document.getElementById('nav-'+p); if(nv) nv.classList.toggle('active', p===id);
  });
  window.scrollTo({top:0,behavior:'instant'});
  setTimeout(initReveal, 50);
}
/* ── CURSOR ── */
var cur2 = document.getElementById('cursor');
var mx=-100, my=-100, cx2=-100, cy2=-100;
document.addEventListener('mousemove', function(e){ mx=e.clientX; my=e.clientY; });
document.addEventListener('mouseleave', function(){ if(cur2) cur2.style.opacity='0'; });
document.addEventListener('mouseenter', function(){ if(cur2) cur2.style.opacity='1'; });
(function tick(){
  cx2+=(mx-cx2)*0.14; cy2+=(my-cy2)*0.14;
  if(cur2) cur2.style.transform='translate('+cx2+'px,'+cy2+'px) translate(-50%,-50%)';
  requestAnimationFrame(tick);
})();
setInterval(function(){
  var el = document.elementFromPoint(mx,my); if(!el) return;
  var isHover = el.closest('.work-card,.work-row,.featured__inner,.nav-cta,.project-next');
  var isLink  = el.closest('a,button,.preview-bar');
  if(cur2){ cur2.classList.toggle('is-hovering',!!isHover); cur2.classList.toggle('is-link',!!isLink&&!isHover); }
},60);
/* ── SCROLL NAV ── */
var hdr  = document.getElementById('site-header');
var pbar = document.querySelector('.preview-bar');
window.addEventListener('scroll', function(){
  hdr.classList.toggle('is-scrolled', window.scrollY > 40);
  pbar.classList.toggle('is-visible', window.scrollY > 80);
},{passive:true});
/* ── MOBILE NAV ── */
var tog  = document.getElementById('nav-toggle');
var mNav = document.getElementById('nav-mobile');
tog.addEventListener('click', function(){
  var open = tog.classList.toggle('is-open');
  mNav.classList.toggle('is-open', open);
  document.body.style.overflow = open ? 'hidden' : '';
});
function closeMobileNav(){ tog.classList.remove('is-open'); mNav.classList.remove('is-open'); document.body.style.overflow=''; }
/* ── SCROLL REVEAL ── */
function initReveal(){
  var els = document.querySelectorAll('.active .reveal:not(.is-visible)'); if(!els.length) return;
  var io = new IntersectionObserver(function(entries){
    entries.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add('is-visible'); io.unobserve(e.target); } });
  },{threshold:0.1,rootMargin:'0px 0px -30px 0px'});
  els.forEach(function(el,i){ el.style.transitionDelay=(i%4)*80+'ms'; io.observe(el); });
}
setTimeout(initReveal, 100);
/* ── FEATURED PROGRESS ── */
setTimeout(function(){ var fp=document.getElementById('fp'); if(fp) fp.style.width='100%'; },300);
/* ── WORKS FILTER ── */
document.querySelectorAll('.filter-btn').forEach(function(btn){
  btn.addEventListener('click', function(){
    document.querySelectorAll('.filter-btn').forEach(function(b){ b.classList.remove('is-active'); });
    btn.classList.add('is-active');
    var f = btn.dataset.filter;
    document.querySelectorAll('.work-row').forEach(function(row){
      row.style.display = (f==='all' || row.dataset.category===f) ? '' : 'none';
    });
  });
});
/* ── TICKER ── */
var ticker = document.querySelector('.hero__reel-ticker');
if(ticker){
  ticker.addEventListener('mouseenter', function(){ ticker.style.animationDuration='8s'; });
  ticker.addEventListener('mouseleave', function(){ ticker.style.animationDuration='18s'; });
}
/* ── CONTACT FORM ── */
function handleForm(e){
  e.preventDefault();
  var st = document.getElementById('form-status');
  st.textContent = '✓ Message sent! (demo)';
  st.style.display = 'block';
  e.target.reset();
}
/* ── LOGO ANIMATION ── */
(function(){
  var svg = document.getElementById('colab-logo'); if(!svg) return;
  var circles = ['c1','c2','c3'].map(function(id){ return document.getElementById(id); });
  var cxL=100, cyL=100;
  var baseAngles = [-90,150,30].map(function(d){ return d*Math.PI/180; });
  var radius=42, orbitAngle=0, orbitSpeed=0, floatAngle=0, hovered=false;
  function lerp(a,b,t){ return a+(b-a)*t; }
  function animate(){
    floatAngle+=0.012;
    orbitSpeed = lerp(orbitSpeed, hovered?0.018:0, hovered?0.035:0.025);
    orbitAngle += orbitSpeed;
    circles.forEach(function(c,i){
      if(!c) return;
      var angle = baseAngles[i]+orbitAngle;
      var x = cxL+Math.cos(angle)*radius;
      var y = cyL+Math.sin(angle)*radius;
      var fl = Math.sin(floatAngle+i*1.1)*1.8;
      c.setAttribute('cx',x); c.setAttribute('cy',y+fl);
    });
    requestAnimationFrame(animate);
  }
  svg.addEventListener('mouseenter', function(){ hovered=true; });
  svg.addEventListener('mouseleave', function(){ hovered=false; });
  animate();
})();
</script>
</body>
</html>COLABHTML;
    exit;
});
COLABHTML; exit; });

Comments

Add a Comment