// home-mix.jsx — Direction D: the user's curated mix. // Foundation: A (Studio) — cream + sage + Instrument Serif italic. // Pulls in: B's hover-row index + verbatim testimonial cells, C's "designer + developer" about + winding-path process. const MIX_PALETTES = { "Bauhaus": ["#f5f1e8","#ffffff","#1a1a1a","#e63329","#1d4ed8","#fbbf24"], "Mondrian": ["#ffffff","#f5f5f0","#000000","#d40000","#0036b6","#ffd500"], "Pop Primary": ["#fff8e0","#ffffff","#0a0a0a","#ff2c2c","#1e40ff","#ffd60a"], "Citrus & Sky": ["#fff4d6","#fffaea","#1a3a5c","#ff6b3d","#4a90c2","#ffb8a8"], "Marigold & Pine": ["#ffe9b8","#fff3d4","#1f4d3a","#f57c2a","#2d7a52","#ff9a9a"], "Sunset Pop": ["#ffd9c4","#ffe8d8","#2b1f4a","#ff5e3a","#d63384","#ffc4a8"], "Lemon & Lavender": ["#fff5cc","#fffae0","#3d2a6e","#c850c8","#5a4ec4","#ffb0d4"], "Coral Garden": ["#ffd6cc","#ffe6dc","#1a4d4d","#ff5a5a","#2da89a","#ffd166"], "Tropical Cream": ["#fff4e0","#fff9ec","#2a1a3a","#ff3b8a","#6ac76a","#4a8eff"], }; const MIX_BANNERS = { "Sketch": "sketch", "Plants": "img/plants.jpg", "Desk": "img/desk.jpg", "Portrait": "img/maia.jpg", }; const MIX_DEFAULTS = /*EDITMODE-BEGIN*/{ "palette": ["#f5f1e8","#ffffff","#1a1a1a","#e63329","#1d4ed8","#fbbf24"], "banner": "sketch", "bannerHeight": 380 }/*EDITMODE-END*/; const MixCSS = ` .dirD{ --bg:#ecead8; --paper:#f3efe1; --ink:#2b3a2a; --ink-soft:rgba(43,58,42,.65); --rule:rgba(43,58,42,.18); --terra:#c98455; --olive:#7a8a55; --rose:#d8a89a; background:var(--bg); color:var(--ink); font-family:'Manrope',system-ui,sans-serif; font-size:17px; line-height:1.5; width:1280px; min-height:9000px; position:relative; overflow:hidden; } .dirD .banner{ margin:0 56px; position:relative; border-radius:6px; overflow:hidden; } .dirD .banner img{ width:100%; height:100%; object-fit:cover; display:block; filter:saturate(.92) contrast(1.02); } .dirD .banner .b-tag{ position:absolute; left:24px; bottom:20px; font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.16em; text-transform:uppercase; color:#fff; mix-blend-mode:difference; } .dirD .banner .b-corners{ position:absolute; inset:14px; border:1px solid rgba(255,255,255,.55); border-radius:3px; pointer-events:none; } .dirD .banner .b-stamp{ position:absolute; top:18px; right:22px; font-family:'Caveat',cursive; font-size:24px; color:#fff; transform:rotate(3deg); text-shadow:0 1px 2px rgba(0,0,0,.4); } .dirD .serif{ font-family:'Instrument Serif',serif; font-style:italic; font-weight:400; letter-spacing:-.01em; } .dirD .grot{ font-family:'Bricolage Grotesque',sans-serif; font-weight:300; letter-spacing:-.02em; } .dirD .mono{ font-family:'JetBrains Mono',monospace; } .dirD .hand{ font-family:'Caveat',cursive; } /* NAV — IDX-style */ .dirD .nav{ position:absolute; top:0; left:0; right:0; padding:24px 56px; display:flex; align-items:center; justify-content:space-between; z-index:5; } .dirD .nav .logo{ font-family:'JetBrains Mono',monospace; font-size:13px; letter-spacing:.06em; text-transform:uppercase; } .dirD .nav .logo .idx{ color:var(--terra); } .dirD .nav .links{ display:flex; gap:32px; align-items:center; font-size:14px; } .dirD .nav a{ color:var(--ink); text-decoration:none; padding:6px 0; } .dirD .nav a.on{ color:var(--terra); font-family:'Instrument Serif',serif; font-style:italic; font-size:18px; } .dirD .nav .group{ display:flex; align-items:center; gap:14px; } .dirD .nav .booking{ display:inline-flex; align-items:center; gap:10px; padding:9px 16px; border:1px solid var(--rule); border-radius:999px; font-family:'JetBrains Mono',monospace; font-size:11.5px; letter-spacing:.04em; } .dirD .nav .booking .dot{ width:8px; height:8px; border-radius:50%; background:var(--olive); box-shadow:0 0 0 3px color-mix(in srgb, var(--olive) 25%, transparent); } .dirD .nav .cta{ background:var(--ink); color:var(--bg); padding:11px 18px; border-radius:999px; border:0; font-family:'JetBrains Mono',monospace; font-size:11.5px; letter-spacing:.12em; text-transform:uppercase; cursor:pointer; } /* FILE TAG — left margin */ .dirD .filetag{ position:absolute; left:56px; top:280px; font-family:'JetBrains Mono',monospace; font-size:11.5px; letter-spacing:.04em; color:var(--ink-soft); line-height:1.7; max-width:160px; } .dirD .filetag .open, .dirD .filetag .close{ color:var(--ink-soft); } .dirD .filetag .row{ display:flex; gap:8px; } .dirD .filetag .row::before{ content:'·'; } /* HERO — IDX-style */ .dirD .hero{ padding:160px 56px 64px; position:relative; } .dirD .hero h1{ font-family:'Instrument Serif',serif; font-style:italic; font-weight:400; font-size:148px; line-height:.92; letter-spacing:-.02em; margin:0; max-width:1100px; text-wrap:balance; } .dirD .hero h1 .non-italic{ font-style:normal; font-family:'Bricolage Grotesque',sans-serif; font-weight:300; } .dirD .hero .sub{ display:flex; gap:64px; margin-top:64px; align-items:flex-end; justify-content:space-between; } .dirD .hero .sub p{ max-width:420px; font-size:18px; margin:0; } .dirD .hero .meta{ display:flex; gap:32px; font-size:13px; color:var(--ink-soft); } .dirD .hero .meta .dot{ display:inline-block; width:7px; height:7px; border-radius:50%; background:var(--olive); margin-right:8px; vertical-align:1px; } .dirD .hero-mark{ position:absolute; top:140px; right:80px; } .dirD .eyebrow{ font-family:'JetBrains Mono',monospace; font-size:12px; letter-spacing:.18em; text-transform:uppercase; color:var(--ink-soft); display:flex; align-items:center; gap:14px; } .dirD .eyebrow::before{ content:''; width:24px; height:1px; background:var(--ink-soft); } .dirD .sec-title{ font-family:'Instrument Serif',serif; font-style:italic; font-size:80px; line-height:1; margin:14px 0 0; letter-spacing:-.01em; } /* MARQUEE — from A */ .dirD .marq{ border-top:1px solid var(--rule); border-bottom:1px solid var(--rule); padding:22px 0; overflow:hidden; } .dirD .marq-track{ display:flex; gap:64px; white-space:nowrap; animation:dirD-scroll 38s linear infinite; } .dirD .marq-track > span{ font-family:'Instrument Serif',serif; font-style:italic; font-size:48px; line-height:1; display:inline-flex; align-items:center; gap:64px; } .dirD .marq-track .star{ font-family:'Bricolage Grotesque',sans-serif; font-style:normal; font-weight:300; color:var(--terra); } @keyframes dirD-scroll{ from{transform:translateX(0)} to{transform:translateX(-50%)} } /* WORK — tabular hover-preview from B, re-skinned to A's cream palette */ .dirD .work{ padding:120px 56px 60px; } .dirD .work .head{ display:flex; justify-content:space-between; align-items:end; margin-bottom:64px; } .dirD .filters{ display:flex; align-items:center; gap:8px; padding:24px 0; border-top:1px solid var(--rule); border-bottom:1px solid var(--rule); margin-bottom:0; } .dirD .filters .label{ font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.16em; text-transform:uppercase; color:var(--ink-soft); margin-right:12px; } .dirD .filters .chip{ padding:7px 14px; border:1px solid var(--rule); border-radius:999px; font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.08em; text-transform:uppercase; cursor:pointer; } .dirD .filters .chip.on{ background:var(--ink); color:var(--bg); border-color:var(--ink); } .dirD .ihead{ display:grid; grid-template-columns: 60px 2.4fr 1fr 1.4fr .8fr 90px; padding:14px 0; border-bottom:1px solid var(--rule); font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.16em; text-transform:uppercase; color:var(--ink-soft); } .dirD .irow{ display:grid; grid-template-columns: 60px 2.4fr 1fr 1.4fr .8fr 90px; padding:24px 0; border-bottom:1px solid var(--rule); align-items:center; transition:background .15s, padding .15s; cursor:pointer; position:relative; } .dirD .irow:hover{ background:var(--paper); padding-left:12px; padding-right:12px; } .dirD .irow .num{ font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-soft); } .dirD .irow .name{ font-family:'Instrument Serif',serif; font-style:italic; font-size:42px; line-height:1; letter-spacing:-.01em; } .dirD .irow .name em{ font-family:'Caveat',cursive; font-style:normal; font-size:22px; color:var(--terra); margin-left:14px; opacity:0; transform:translateX(-6px); transition:.18s; display:inline-block; } .dirD .irow:hover .name em{ opacity:1; transform:translateX(0); } .dirD .irow .platform{ font-family:'JetBrains Mono',monospace; font-size:12px; } .dirD .irow .platform .pdot{ display:inline-block; width:6px; height:6px; border-radius:50%; margin-right:8px; vertical-align:1px; } .dirD .irow .kind{ font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-soft); letter-spacing:.06em; } .dirD .irow .yr{ font-family:'JetBrains Mono',monospace; font-size:12px; color:var(--ink-soft); } .dirD .irow .arrow{ justify-self:end; font-family:'Instrument Serif',serif; font-style:italic; font-size:28px; } .dirD .irow .preview{ position:absolute; right:120px; top:50%; transform:translate(20px,-50%) rotate(-3deg) scale(.92); width:300px; aspect-ratio:4/3; pointer-events:none; opacity:0; transition:.22s; box-shadow:0 30px 60px -25px rgba(43,58,42,.4); border-radius:6px; overflow:hidden; z-index:2; } .dirD .irow .preview img{ width:100%; height:100%; object-fit:cover; display:block; } .dirD .irow:hover .preview{ opacity:1; transform:translate(0,-50%) rotate(-2deg) scale(1); } .dirD .all-work{ margin-top:60px; display:flex; justify-content:center; } .dirD .all-work a{ font-family:'Instrument Serif',serif; font-style:italic; font-size:34px; color:var(--ink); border-bottom:1px solid var(--ink); padding-bottom:6px; text-decoration:none; } /* SERVICES — from A */ .dirD .services{ background:var(--ink); color:var(--bg); padding:120px 56px; } .dirD .services .eyebrow{ color:rgba(236,234,216,.6); } .dirD .services .eyebrow::before{ background:rgba(236,234,216,.6); } .dirD .services .sec-title{ color:var(--bg); } .dirD .services-list{ margin-top:80px; } .dirD .srow{ display:grid; grid-template-columns: 90px 1fr 1.4fr; gap:48px; padding:32px 0; border-top:1px solid rgba(236,234,216,.18); align-items:baseline; } .dirD .srow:last-child{ border-bottom:1px solid rgba(236,234,216,.18); } .dirD .srow .num{ font-family:'JetBrains Mono',monospace; font-size:14px; color:rgba(236,234,216,.6); } .dirD .srow .name{ font-family:'Instrument Serif',serif; font-style:italic; font-size:42px; line-height:1; } .dirD .srow .desc{ font-size:16px; color:rgba(236,234,216,.85); } /* PACKAGES — three pricing cards (most-picked sticker on the middle one) */ .dirD .pkgs{ padding:140px 56px 80px; } .dirD .pkgs .head{ display:grid; grid-template-columns: 1.4fr 1fr; gap:64px; margin-bottom:64px; align-items:end; } .dirD .pkgs h2{ font-family:'Instrument Serif',serif; font-style:italic; font-size:96px; line-height:.95; margin:14px 0 0; letter-spacing:-.02em; } .dirD .pkgs h2 .non{ font-family:'Bricolage Grotesque',sans-serif; font-style:normal; font-weight:300; } .dirD .pkgs h2 .terra{ color:var(--terra); } .dirD .pkgs .lede{ font-size:16px; color:var(--ink-soft); max-width:380px; } .dirD .pkgs-grid{ display:grid; grid-template-columns: repeat(3, 1fr); gap:18px; align-items:start; } .dirD .pkg{ background:var(--paper); border-radius:8px; padding:32px 28px 28px; position:relative; } .dirD .pkg.dark{ background:var(--ink); color:var(--bg); transform:translateY(-22px); padding:40px 28px 32px; box-shadow:0 30px 60px -25px rgba(0,0,0,.45); } .dirD .pkg .ribbon{ position:absolute; top:-18px; right:24px; background:var(--terra); color:#fff7ec; font-family:'Caveat',cursive; font-size:22px; padding:6px 18px; border-radius:999px; transform:rotate(4deg); } .dirD .pkg .for{ font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.16em; text-transform:uppercase; opacity:.6; } .dirD .pkg.dark .for{ opacity:.55; } .dirD .pkg h3{ font-family:'Instrument Serif',serif; font-style:italic; font-size:46px; line-height:1; margin:14px 0 22px; letter-spacing:-.01em; } .dirD .pkg .price{ display:flex; align-items:baseline; gap:6px; margin-bottom:8px; } .dirD .pkg .price .from{ font-family:'Instrument Serif',serif; font-style:italic; font-size:18px; color:var(--terra); } .dirD .pkg .price .num{ font-family:'Bricolage Grotesque',sans-serif; font-weight:300; font-size:48px; letter-spacing:-.03em; } .dirD .pkg .price .ccy{ font-family:'Instrument Serif',serif; font-style:italic; font-size:18px; color:var(--terra); } .dirD .pkg .when{ font-family:'JetBrains Mono',monospace; font-size:11.5px; letter-spacing:.04em; opacity:.7; margin-bottom:24px; } .dirD .pkg ul{ list-style:none; padding:0; margin:0 0 28px; display:grid; gap:12px; } .dirD .pkg li{ display:flex; gap:10px; align-items:flex-start; font-size:14.5px; line-height:1.45; } .dirD .pkg li::before{ content:'✻'; color:var(--terra); font-size:14px; flex-shrink:0; line-height:1.45; } .dirD .pkg .btn{ display:flex; align-items:center; justify-content:center; padding:14px 18px; border-radius:999px; border:1px solid currentColor; font-size:13.5px; cursor:pointer; background:transparent; color:inherit; width:100%; } .dirD .pkg.dark .btn{ background:var(--rose); color:var(--ink); border-color:var(--rose); } .dirD .pkgs .also{ margin-top:60px; text-align:center; font-family:'JetBrains Mono',monospace; font-size:11.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--ink-soft); } .dirD .pkgs .also a{ color:var(--ink); text-decoration:underline; text-underline-offset:4px; margin-left:8px; } /* PROCESS — C's winding path, re-skinned cream */ .dirD .process{ padding:140px 56px; position:relative; background:var(--paper); } .dirD .process h2{ font-family:'Instrument Serif',serif; font-style:italic; font-size:88px; line-height:.95; margin:14px 0 64px; letter-spacing:-.02em; max-width:900px; } .dirD .process h2 .non{ font-family:'Bricolage Grotesque',sans-serif; font-style:normal; font-weight:300; color:var(--terra); } .dirD .ppath{ display:grid; grid-template-columns: repeat(5, 1fr); gap:18px; position:relative; } .dirD .ppath::before{ content:''; position:absolute; left:5%; right:5%; top:24px; height:2px; background:repeating-linear-gradient(90deg, var(--terra) 0 6px, transparent 6px 12px); } .dirD .pstep{ position:relative; } .dirD .pstep .dot{ width:48px; height:48px; border-radius:50%; background:var(--terra); color:#fff7ec; font-family:'Instrument Serif',serif; font-style:italic; font-size:22px; display:flex; align-items:center; justify-content:center; margin:0 auto 28px; position:relative; z-index:2; box-shadow:0 8px 18px -6px rgba(201,132,85,.5); } .dirD .pstep:nth-child(2) .dot{ background:var(--olive); } .dirD .pstep:nth-child(3) .dot{ background:var(--ink); } .dirD .pstep:nth-child(4) .dot{ background:var(--rose); color:var(--ink); } .dirD .pstep:nth-child(5) .dot{ background:var(--terra); } .dirD .pstep h4{ font-family:'Instrument Serif',serif; font-style:italic; font-size:32px; line-height:1; margin:0 0 10px; text-align:center; } .dirD .pstep p{ font-size:14.5px; text-align:center; max-width:200px; margin:0 auto; color:var(--ink-soft); } /* ABOUT — C's "designer AND developer in one tab", re-skinned cream */ .dirD .about{ padding:140px 56px; } .dirD .about-row{ display:grid; grid-template-columns: 1fr 1.1fr; gap:80px; align-items:center; } .dirD .about-portrait{ position:relative; } .dirD .about-portrait .frame{ aspect-ratio:4/5; background:var(--paper); border-radius:8px; overflow:hidden; transform:rotate(-2deg); box-shadow:0 30px 80px -30px rgba(43,58,42,.35); } .dirD .about-portrait .frame img{ width:100%; height:100%; object-fit:cover; } .dirD .about-portrait .stamp{ position:absolute; bottom:-44px; right:-44px; transform:rotate(8deg); z-index:4; } .dirD .about-portrait .corner{ position:absolute; top:-22px; left:-22px; width:80px; height:80px; background:var(--rose); border-radius:50% 0 50% 50%; transform:rotate(-30deg); z-index:-1; } .dirD .about-portrait .annot{ font-family:'Caveat',cursive; font-size:24px; color:var(--terra); position:absolute; top:-20px; left:30px; transform:rotate(-8deg); z-index:5; background:var(--bg); padding:2px 8px; } .dirD .about-portrait .tape{ position:absolute; width:120px; height:28px; background:color-mix(in srgb, var(--rose) 70%, transparent); border:1px dashed color-mix(in srgb, var(--ink) 25%, transparent); z-index:3; pointer-events:none; } .dirD .about-portrait .tape.t1{ top:-10px; left:30px; transform:rotate(-6deg); } .dirD .about-portrait .tape.t2{ bottom:-10px; left:50px; transform:rotate(4deg); width:90px; background:color-mix(in srgb, var(--olive) 60%, transparent); } .dirD .about h2{ font-family:'Instrument Serif',serif; font-style:italic; font-size:84px; line-height:.95; margin:14px 0 28px; letter-spacing:-.02em; } .dirD .about h2 .non{ font-family:'Bricolage Grotesque',sans-serif; font-style:normal; font-weight:300; } .dirD .about h2 em{ color:var(--terra); } .dirD .about p{ font-size:17px; max-width:520px; margin:0 0 16px; } .dirD .about .pills{ display:flex; flex-wrap:wrap; gap:10px; margin-top:28px; } .dirD .about .pills > span{ padding:9px 16px; border:1.5px solid var(--ink); border-radius:999px; font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.06em; background:var(--paper); cursor:default; transform-origin:center; transition:transform .25s cubic-bezier(.2,.8,.2,1), background .25s, color .25s, border-color .25s; animation:dirD-pill-float 6s ease-in-out infinite; } .dirD .about .pills > span:nth-child(1){ animation-delay:0s; } .dirD .about .pills > span:nth-child(2){ animation-delay:.6s; } .dirD .about .pills > span:nth-child(3){ animation-delay:1.2s; } .dirD .about .pills > span:nth-child(4){ animation-delay:1.8s; } .dirD .about .pills > span:nth-child(5){ animation-delay:2.4s; } .dirD .about .pills > span:hover{ transform:translateY(-3px) rotate(-3deg) scale(1.06); background:var(--terra); color:var(--bg); border-color:var(--terra); } .dirD .about .pills > span:nth-child(2):hover{ background:var(--olive); border-color:var(--olive); transform:translateY(-3px) rotate(3deg) scale(1.06); } .dirD .about .pills > span:nth-child(3):hover{ background:var(--rose); color:var(--ink); border-color:var(--rose); transform:translateY(-3px) rotate(-2deg) scale(1.06); } .dirD .about .pills > span:nth-child(4):hover{ background:var(--ink); color:var(--bg); border-color:var(--ink); transform:translateY(-3px) rotate(2deg) scale(1.06); } @keyframes dirD-pill-float{ 0%,100%{ transform:translateY(0) rotate(0deg) } 50%{ transform:translateY(-2px) rotate(.5deg) } } .dirD .about .more{ display:inline-block; margin-top:32px; padding:14px 24px; border-radius:999px; background:var(--ink); color:var(--bg); font-size:13.5px; text-decoration:none; } /* TESTIMONIALS — B's verbatim mono-dark cells */ .dirD .testi{ padding:120px 56px; background:var(--ink); color:var(--bg); } .dirD .testi .eyebrow{ color:rgba(236,234,216,.55); } .dirD .testi .eyebrow::before{ background:rgba(236,234,216,.55); } .dirD .testi h2{ font-family:'Instrument Serif',serif; font-style:italic; font-size:80px; line-height:.95; margin:14px 0 64px; letter-spacing:-.02em; max-width:1000px; color:var(--bg); } .dirD .testi h2 .non{ font-family:'Bricolage Grotesque',sans-serif; font-style:normal; font-weight:300; color:var(--rose); } .dirD .testi-grid{ display:grid; grid-template-columns: repeat(2, 1fr); gap:0; border-top:1px solid rgba(236,234,216,.18); border-left:1px solid rgba(236,234,216,.18); } .dirD .testi-cell{ border-right:1px solid rgba(236,234,216,.18); border-bottom:1px solid rgba(236,234,216,.18); padding:40px 36px; } .dirD .testi-cell q{ font-family:'Bricolage Grotesque',sans-serif; font-weight:300; font-size:24px; line-height:1.35; quotes:none; letter-spacing:-.01em; } .dirD .testi-cell .who{ margin-top:24px; font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.16em; text-transform:uppercase; color:rgba(236,234,216,.6); } /* CTA — from A */ .dirD .cta{ padding:160px 56px; text-align:center; position:relative; } .dirD .cta h2{ font-family:'Instrument Serif',serif; font-style:italic; font-size:140px; line-height:.95; margin:0; letter-spacing:-.02em; } .dirD .cta .terra{ color:var(--terra); } .dirD .cta p{ max-width:540px; margin:32px auto 40px; font-size:18px; } .dirD .cta .btn{ background:var(--ink); color:var(--bg); border:0; padding:20px 36px; border-radius:999px; font-size:16px; cursor:pointer; } /* INTERACTIONS — funky additions */ .dirD .pkg{ transition:transform .35s cubic-bezier(.2,.8,.2,1), box-shadow .35s; } .dirD .pkg:not(.dark):hover{ transform:translateY(-6px) rotate(-.6deg); box-shadow:0 30px 60px -30px color-mix(in srgb, var(--ink) 40%, transparent); } .dirD .pkg.dark:hover{ transform:translateY(-30px) rotate(.6deg); } .dirD .pkg .ribbon{ animation:dirD-wobble 4.2s ease-in-out infinite; transform-origin:center; } @keyframes dirD-wobble{ 0%,100%{transform:rotate(4deg)} 25%{transform:rotate(-3deg) translateY(-2px)} 50%{transform:rotate(6deg)} 75%{transform:rotate(-1deg) translateY(-1px)} } .dirD .hero h1 span[style*="--terra"], .dirD .hero h1 > span:nth-child(7){ display:inline-block; transition:transform .25s, color .25s; } .dirD .hero h1:hover span[style*="--terra"]{ transform:rotate(-2deg) scale(1.02); } .dirD .booking .dot{ animation:dirD-pulse 2.4s ease-in-out infinite; } @keyframes dirD-pulse{ 0%,100%{ box-shadow:0 0 0 3px color-mix(in srgb, var(--olive) 25%, transparent) } 50%{ box-shadow:0 0 0 6px color-mix(in srgb, var(--olive) 18%, transparent) } } /* PROCESS — lively animated steps */ .dirD .ppath::before{ background-size:12px 2px; animation:dirD-dash 3.6s linear infinite; } @keyframes dirD-dash{ from{ background-position:0 0 } to{ background-position:24px 0 } } .dirD .pstep{ animation:dirD-pstep-bob 4.6s ease-in-out infinite; } .dirD .pstep:nth-child(1){ animation-delay:.0s; } .dirD .pstep:nth-child(2){ animation-delay:.35s; } .dirD .pstep:nth-child(3){ animation-delay:.7s; } .dirD .pstep:nth-child(4){ animation-delay:1.05s; } .dirD .pstep:nth-child(5){ animation-delay:1.4s; } @keyframes dirD-pstep-bob{ 0%,100%{ transform:translateY(0) rotate(0) } 50%{ transform:translateY(-6px) rotate(.6deg) } } .dirD .pstep .dot{ transition:transform .4s cubic-bezier(.2,.8,.2,1), box-shadow .4s; animation:dirD-dot-spin 8s ease-in-out infinite; } .dirD .pstep:nth-child(odd) .dot{ animation-direction:reverse; } @keyframes dirD-dot-spin{ 0%,100%{ transform:rotate(-6deg) } 50%{ transform:rotate(6deg) } } .dirD .pstep:hover{ animation-play-state:paused; } .dirD .pstep:hover .dot{ animation:none; transform:rotate(-14deg) scale(1.22); box-shadow:0 8px 24px -6px rgba(43,58,42,.35); } .dirD .pstep::after{ content:''; position:absolute; left:50%; top:18px; width:14px; height:14px; border-top:2px solid var(--terra); border-right:2px solid var(--terra); transform:translate(40%,-2px) rotate(45deg); opacity:0; transition:opacity .3s, transform .3s; } .dirD .pstep:nth-child(5)::after{ display:none; } .dirD .pstep:hover::after{ opacity:1; transform:translate(60%,-2px) rotate(45deg); } .dirD .pstep h4{ transition:transform .3s, color .3s; } .dirD .pstep:hover h4{ transform:translateY(-2px); color:var(--terra); } .dirD .srow{ transition:padding-left .25s, background .25s; } .dirD .srow:hover{ padding-left:18px; background:rgba(255,255,255,.04); } .dirD .srow .num{ transition:color .25s; } .dirD .srow:hover .num{ color:var(--terra); } .dirD .all-work a{ position:relative; transition:letter-spacing .25s, color .25s; } .dirD .all-work a:hover{ letter-spacing:.04em; color:var(--terra); border-color:var(--terra); } .dirD .testi-cell{ transition:background .25s; cursor:default; } .dirD .testi-cell:hover{ background:rgba(255,255,255,.04); } .dirD .nav .cta{ transition:transform .25s, box-shadow .25s; } .dirD .nav .cta:hover{ transform:translateY(-2px) rotate(-1deg); box-shadow:0 10px 24px -10px var(--ink); } .dirD .pkg .btn{ transition:transform .2s; } .dirD .pkg .btn:hover{ transform:scale(1.03); } .dirD .about-portrait .frame{ transition:transform .5s cubic-bezier(.2,.8,.2,1); } .dirD .about-portrait:hover .frame{ transform:rotate(2deg) scale(1.02); } .dirD .about-portrait .stamp{ transition:transform .5s; animation:dirD-spin 22s linear infinite; } @keyframes dirD-spin{ to{ transform:rotate(360deg) } } .dirD .about-portrait .annot{ animation:dirD-bobble 5s ease-in-out infinite; } @keyframes dirD-bobble{ 0%,100%{ transform:rotate(-12deg) translateY(0) } 50%{ transform:rotate(-8deg) translateY(-4px) } } .dirD .hero{ cursor:default; } .dirD .blob{ position:fixed; pointer-events:none; transform:translate(-50%,-50%) rotate(-6deg); z-index:9999; font-family:'Caveat',cursive; font-size:22px; color:var(--terra); white-space:nowrap; padding:6px 14px; background:var(--paper); border:1px solid var(--ink); border-radius:999px; box-shadow:3px 3px 0 var(--ink); transition:transform .12s ease-out, opacity .2s; opacity:0; } .dirD .blob.show{ opacity:1; } .dirD .marq:hover .marq-track{ animation-duration:8s; } .dirD .marq-track{ transition:none; } .dirD .hero h1 .ltr{ display:inline-block; transition:transform .25s, color .25s; } .dirD .hero h1:hover .ltr{ animation:dirD-wave .8s ease-in-out; animation-delay:calc(var(--i,0) * 30ms); } @keyframes dirD-wave{ 0%,100%{transform:translateY(0)} 50%{transform:translateY(-12px) rotate(-4deg)} } .dirD .doodle{ position:absolute; pointer-events:none; font-family:'Caveat',cursive; color:var(--terra); } .dirD .doodle.d1{ top:18%; right:9%; transform:rotate(8deg); font-size:28px; animation:dirD-bobble 6s ease-in-out infinite; } .dirD .doodle.d2{ top:42%; left:4%; transform:rotate(-12deg); font-size:24px; animation:dirD-bobble 7s ease-in-out infinite reverse; } .dirD .sticker{ position:absolute; width:90px; height:90px; border-radius:50%; background:var(--rose); color:var(--ink); font-family:'Caveat',cursive; font-size:20px; display:flex; align-items:center; justify-content:center; text-align:center; line-height:1.1; transform:rotate(-8deg); cursor:grab; user-select:none; box-shadow:0 8px 18px -8px rgba(0,0,0,.3); animation:dirD-spin 30s linear infinite; } .dirD .sticker:active{ cursor:grabbing; animation-play-state:paused; } .dirD .sk1{ top:760px; right:80px; background:var(--paper); color:var(--terra); border:2px dashed var(--terra); width:104px; height:104px; box-shadow:4px 4px 0 var(--ink); } .dirD .sk2{ top:5400px; left:80px; background:var(--paper); color:var(--ink); border:2px dashed var(--ink); } .dirD .testi-cell q{ transition:transform .35s; display:inline-block; } .dirD .testi-cell:hover q{ transform:translateY(-3px); } .dirD .pkg h3{ transition:transform .3s; } .dirD .pkg:hover h3{ transform:translateX(4px); } .dirD .ihead, .dirD .filters{ transition:background .3s; } .dirD .work:hover .ihead{ background:color-mix(in srgb, var(--terra) 8%, transparent); } .dirD .nav .booking{ transition:transform .3s; } .dirD .nav .booking:hover{ transform:scale(1.04) rotate(-1.5deg); } .dirD .hero h1{ transition:letter-spacing .4s; } .dirD .hero h1:hover{ letter-spacing:-.025em; } .dirD .marq{ position:relative; } .dirD .marq::before{ content:'→ hover me'; position:absolute; top:50%; left:14px; transform:translateY(-50%); font-family:'Caveat',cursive; font-size:18px; color:var(--terra); pointer-events:none; opacity:.7; z-index:2; background:var(--bg); padding:4px 10px; } /* HANDWRITTEN NOTES — sprinkled throughout */ .dirD .note{ font-family:'Caveat',cursive; color:var(--terra); font-size:22px; line-height:1.1; pointer-events:none; } .dirD .note.abs{ position:absolute; } .dirD .note.n-hero{ top:230px; right:160px; transform:rotate(11deg); font-size:26px; } .dirD .note.n-marq{ position:relative; display:inline-block; transform:rotate(-7deg); margin-left:8px; } .dirD .note.n-work{ top:60px; right:140px; transform:rotate(-13deg); font-size:24px; } .dirD .note.n-srvc{ top:80px; right:240px; transform:rotate(8deg); color:var(--ink); font-size:24px; } .dirD .note.n-pkg{ top:120px; left:48%; transform:rotate(-14deg); font-size:24px; } .dirD .note.n-proc{ top:96px; right:120px; transform:rotate(9deg); font-size:24px; } .dirD .note.n-about{ top:90px; right:80px; transform:rotate(-12deg); font-size:26px; } .dirD .note.n-test{ top:90px; right:80px; transform:rotate(13deg); color:var(--ink); font-size:26px; } .dirD .note.n-cta{ top:80px; right:160px; transform:rotate(-9deg); font-size:26px; } .dirD .work, .dirD .services, .dirD .pkgs, .dirD .process, .dirD .about, .dirD .testi, .dirD .cta{ position:relative; } .dirD .note.bobble{ animation:none; } .dirD .note.n-hero.bobble{ animation:dirD-note-a 6.4s ease-in-out infinite; } .dirD .note.n-work.bobble{ animation:dirD-note-b 7.1s ease-in-out infinite; } .dirD .note.n-srvc.bobble{ animation:dirD-note-c 5.9s ease-in-out infinite; } .dirD .note.n-pkg.bobble{ animation:dirD-note-d 6.7s ease-in-out infinite; } .dirD .note.n-proc.bobble{ animation:dirD-note-e 5.6s ease-in-out infinite; } .dirD .note.n-about.bobble{ animation:dirD-note-f 7.3s ease-in-out infinite; } .dirD .note.n-test.bobble{ animation:dirD-note-g 6.1s ease-in-out infinite; } .dirD .note.n-cta.bobble{ animation:dirD-note-h 6.8s ease-in-out infinite; } @keyframes dirD-note-a{ 0%,100%{transform:rotate(11deg) translateY(0)} 50%{transform:rotate(14deg) translateY(-3px)} } @keyframes dirD-note-b{ 0%,100%{transform:rotate(-13deg) translateY(0)} 50%{transform:rotate(-10deg) translateY(-4px)} } @keyframes dirD-note-c{ 0%,100%{transform:rotate(8deg) translateY(0)} 50%{transform:rotate(5deg) translateY(-3px)} } @keyframes dirD-note-d{ 0%,100%{transform:rotate(-14deg) translateY(0)} 50%{transform:rotate(-11deg) translateY(-4px)} } @keyframes dirD-note-e{ 0%,100%{transform:rotate(9deg) translateY(0)} 50%{transform:rotate(12deg) translateY(-3px)} } @keyframes dirD-note-f{ 0%,100%{transform:rotate(-12deg) translateY(0)} 50%{transform:rotate(-9deg) translateY(-4px)} } @keyframes dirD-note-g{ 0%,100%{transform:rotate(13deg) translateY(0)} 50%{transform:rotate(16deg) translateY(-3px)} } @keyframes dirD-note-h{ 0%,100%{transform:rotate(-9deg) translateY(0)} 50%{transform:rotate(-6deg) translateY(-4px)} } /* FOOTER — from A */ .dirD footer{ background:var(--ink); color:var(--bg); padding:80px 56px 40px; } .dirD footer .top{ display:grid; grid-template-columns: 1.4fr 1fr 1fr; gap:48px; padding-bottom:64px; border-bottom:1px solid rgba(236,234,216,.18); } .dirD footer h5{ font-family:'JetBrains Mono',monospace; font-size:11px; letter-spacing:.16em; text-transform:uppercase; color:rgba(236,234,216,.55); margin:0 0 18px; font-weight:500; } .dirD footer ul{ list-style:none; padding:0; margin:0; display:grid; gap:10px; } .dirD footer a{ color:var(--bg); text-decoration:none; font-size:15px; } .dirD footer .word{ font-family:'Instrument Serif',serif; font-style:italic; font-size:160px; line-height:1; margin:48px 0 24px; letter-spacing:-.02em; opacity:.92; } .dirD footer .word .terra{ color:var(--terra); } .dirD footer .legal{ display:flex; justify-content:space-between; font-family:'JetBrains Mono',monospace; font-size:12px; letter-spacing:.06em; color:rgba(236,234,216,.5); } `; function SketchBanner(){ // Hand-drawn studio scene — chaotic and joyful: laptop with site preview, plants, mug, post-its, // calendar, pencil, scissors, paperclip, paper plane, stars, coffee rings, scribbles, smiley sun. return ( {/* faint grid paper */} {/* coffee ring stains */} {/* desk surface line */} {/* dashed second line under desk */} {/* smiley sun top-left */} {/* squiggly cloud */} {/* laptop center */} {/* squiggly site mockup inside laptop */} {/* heart on laptop lid */} {/* plant left */} {/* tea mug right */} tea ♥ {/* post-it stack right */} to do: {/* calendar */} SEPTEMBER MTWTF 23456 910111213 {/* paperclip */} {/* scissors */} {/* pencil */} {/* paper plane top-right */} {/* arrow scribble pointing at laptop */} {/* small notebook bottom-left */} {/* stars/sparkles scattered */} {/* squiggly underline scribbles */} {/* handwritten label */} ~ the studio, roughly ~ → keeps me going good morning ☀ ); } function HomeMix(){ const [t, setTweak] = useTweaks(MIX_DEFAULTS); const [filter, setFilter] = React.useState('All'); const blobRef = React.useRef(null); const [blobText, setBlobText] = React.useState('hi ✎'); React.useEffect(()=>{ const move = (e)=>{ if(!blobRef.current) return; blobRef.current.style.left = (e.clientX+18)+'px'; blobRef.current.style.top = (e.clientY+18)+'px'; blobRef.current.classList.add('show'); }; const over = (e)=>{ const tg = e.target; if (!tg || !tg.closest) return; if (tg.closest('a,button')) setBlobText('click ↗'); else if (tg.closest('.irow')) setBlobText('peek →'); else if (tg.closest('.pkg')) setBlobText('pick this!'); else if (tg.closest('.sticker')) setBlobText('drag me ✋'); else if (tg.closest('.testi-cell')) setBlobText('xo'); else if (tg.closest('.pstep')) setBlobText('step →'); else if (tg.closest('h1, h2')) setBlobText('hello ✨'); else setBlobText('hi ✎'); }; const leave = ()=>{ if(blobRef.current) blobRef.current.classList.remove('show'); }; window.addEventListener('mousemove', move); window.addEventListener('mouseover', over); document.addEventListener('mouseleave', leave); return ()=>{ window.removeEventListener('mousemove', move); window.removeEventListener('mouseover', over); document.removeEventListener('mouseleave', leave); }; },[]); const filters = ['All','Squarespace','Shopify','WordPress']; const filtered = filter==='All' ? PROJECTS : PROJECTS.filter(p=>p.platform===filter); const p = Array.isArray(t.palette) ? t.palette : MIX_DEFAULTS.palette; const platDot = (pl) => ({ Squarespace:p[4], Shopify:p[3], WordPress:p[2], Webflow:'#5b6cff' }[pl] || p[2]); const inkR = parseInt(p[2].slice(1,3),16), inkG = parseInt(p[2].slice(3,5),16), inkB = parseInt(p[2].slice(5,7),16); const paletteVars = { '--bg': p[0], '--paper': p[1], '--ink': p[2], '--ink-soft': `rgba(${inkR},${inkG},${inkB},.65)`, '--rule': `rgba(${inkR},${inkG},${inkB},.18)`, '--terra': p[3], '--olive': p[4], '--rose': p[5], }; return (
{blobText}
looks ~ nice ~ ↘
say hi!
(file 001
· /home
· last updated 10 May 2026)
{/* HERO */}
Independent web designer & developer · Los Angeles · 2015→

Custom websites
that make
small businesses
unmissable.

Independent web design & development for small businesses, studios, and the people behind them. Squarespace, Shopify, WordPress, Webflow.

Two slots open, June–July 2026
unique by design ↗
{/* MARQUEE */}
{Array.from({length:2}).map((_,k)=> ( Squarespace / Shopify / WordPress / Webflow / Brand identity / SEO / Migrations / ))}
{/* BANNER above the work index */}
{t.banner === 'sketch' ? : }
Selected work · 2015 — 2026
~ a quiet archive ~
{/* WORK — tabular hover-preview index */}
my favourite part ✨
Selected work · 2023–2026

A full index of recent sites.

Hover any row to peek at the site. Click to read the full case study.

Filter ↓ {filters.map(f => ( setFilter(f)}>{f} ))} Showing {filtered.length} of {PROJECTS.length}
No.
Project
Platform
Type
Year
{filtered.map((p,i) => (
{String(i+1).padStart(3,'0')}
{p.name}open case →
{p.platform}
{p.kind}
{p.year}
))}
See the full archive →
{/* SERVICES */}
pick yours ⤵
Services · {SERVICES.length} ways I can help

Pick the one that sounds like you.

{SERVICES.map(s => (
— {s.n}
{s.t}
{s.d}
))}
{/* PACKAGES */}
no surprises! ↓
Packages · Pricing · Timelines

Three ways to work together.

Fixed-price packages so you know exactly what you're getting before we start. No surprise invoices, no scope creep, no late-night emails about “one more thing.”

— For the speedy

One-Week Site

from$1,800
Live in 5 business days · Squarespace only
  • Up to 5 pages, designed in-platform
  • Brand styling using your existing identity
  • Mobile-responsive, basic SEO setup
  • 1 round of revisions
  • 30 days of post-launch support
most picked
— For the considered

Custom Build

from$5,400
5–7 weeks · any platform you like
  • Sitemap, content plan, and proposal
  • Custom design, no template feel
  • Squarespace, Shopify, WordPress, or Webflow
  • Full SEO setup & analytics
  • 2 rounds of revisions, Loom walkthrough
  • 60 days of post-launch care
— For the soup-to-nuts

Brand & Site

from$9,500
8–10 weeks · brand + custom build
  • Logo, type system, and color palette
  • Brand guidelines you can hand to anyone
  • Custom-built site on the platform of your choice
  • Brand photography art-direction support
  • 3 rounds of revisions, 90 days of care
Also available · Care plans from $240/mo · SEO audits from $900 · Migrations from $2,400 ·See full menu →
{/* PROCESS — winding path */}
it's actually fun →
How we'll work

A small, uncomplicated process — five steps from hello to launch.

{PROCESS.map(s => (
{s.n}

{s.t}

{s.d}

))}
{/* ABOUT — designer AND developer in one tab */}
that's me ⤵
Maia{e.currentTarget.style.display='none'}}/>
that's me, hi 👋
A little about me

Your designer, and your developer, in one tab.

I'm Maia, a one-person web studio in Los Angeles. I've spent the last 11 years quietly building beautiful, considered websites for small businesses and creative brands.

Because I do both the design and the build, you get a site that's pixel-tight on every breakpoint, and you only have one inbox to email when something needs fixing. (You'll like my inbox. I reply.)

I'm also somehow very organized — colour-coded Notion, named layers, tidy version history, briefs that come back when I said they would. Your project won't fall through the cracks.

Squarespace Circle since 2019 Shopify Partner Speaks 🇫🇷 / 🇬🇧 / 🇷🇺
More about me →
{/* TESTIMONIALS — verbatim cells */}
real humans, real words ✨
Reviews

What past clients have said, verbatim.

{TESTIMONIALS.map((t,i) => (
“{t.q}”
{t.who} · {t.role}
))}
{/* CTA */}
don't be shy ⤵
Ready when you are

Let's
get to work.

Free 30-minute intro call, no pitch deck required. We'll figure out whether we're a fit and what your project might actually look like.

setTweak('palette', v)} /> ({label:k, value:v}))} onChange={(v)=>setTweak('banner', v)} /> setTweak('bannerHeight', v)} /> {/* FOOTER */}
); } window.HomeMix = HomeMix;