(function () { 'use strict'; function ready(fn) { document.readyState === 'loading' ? document.addEventListener('DOMContentLoaded', fn) : fn(); } ready(function () { var root = document.querySelector('.sw-portfolio'); if (!root) return; /* 1. Scroll animations */ var els = root.querySelectorAll('.sw-anim'); if ('IntersectionObserver' in window) { var io = new IntersectionObserver(function (entries) { entries.forEach(function (e) { if (e.isIntersecting) { e.target.classList.add('sw-in'); io.unobserve(e.target); } }); }, { threshold: 0.1, rootMargin: '0px 0px -32px 0px' }); els.forEach(function (el) { io.observe(el); }); } else { els.forEach(function (el) { el.classList.add('sw-in'); }); } /* 2. Smooth scroll for portfolio anchor links */ root.querySelectorAll('a[href^="#sw-"]').forEach(function (a) { a.addEventListener('click', function (e) { var target = document.getElementById(a.getAttribute('href').slice(1)); if (!target) return; e.preventDefault(); var drawer = root.querySelector('.sw-nav-drawer'); var toggle = root.querySelector('.sw-nav-toggle'); if (drawer) drawer.classList.remove('sw-open'); if (toggle) toggle.setAttribute('aria-expanded', 'false'); var navH = (root.querySelector('.sw-nav') || {}).offsetHeight || 0; window.scrollTo({ top: target.getBoundingClientRect().top + window.pageYOffset - navH - 10, behavior: 'smooth' }); }); }); /* 3. Mobile nav toggle */ var toggle = root.querySelector('.sw-nav-toggle'); var drawer = root.querySelector('.sw-nav-drawer'); if (toggle && drawer) { toggle.addEventListener('click', function () { var open = drawer.classList.toggle('sw-open'); toggle.setAttribute('aria-expanded', open ? 'true' : 'false'); toggle.textContent = open ? 'CLOSE' : 'MENU'; }); } /* 4. Card 3D tilt */ root.querySelectorAll('.sw-card').forEach(function (card) { card.addEventListener('mousemove', function (e) { var r = card.getBoundingClientRect(); var tX = ((e.clientY - r.top) / r.height - 0.5) * 4; var tY = ((e.clientX - r.left) / r.width - 0.5) * -4; card.style.transform = 'translate(-3px,-3px) perspective(700px) rotateX('+tX+'deg) rotateY('+tY+'deg)'; }); card.addEventListener('mouseleave', function () { card.style.transform = ''; }); }); /* 5. Active nav highlight on scroll */ var sectionIds = ['sw-about','sw-work','sw-writing','sw-contact']; var navAs = root.querySelectorAll('.sw-nav-links a, .sw-nav-drawer a'); function updateActive() { var mid = window.pageYOffset + window.innerHeight * 0.35; var cur = ''; sectionIds.forEach(function (id) { var el = document.getElementById(id); if (el && el.offsetTop <= mid) cur = id; }); navAs.forEach(function (a) { var isActive = a.getAttribute('href') === '#' + cur; a.style.background = isActive ? 'rgba(186,149,33,.18)' : ''; }); } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); }); })();

My Work

/* ============================================================= All selectors scoped to .sw-portfolio — zero theme bleed ============================================================= */ /* ── TOKENS ──────────────────────────────────────────────── */ .sw-portfolio { –sw-bg: #FBF5E8; /* warm parchment */ –sw-bg2: #F2E9D6; /* slightly deeper parchment */ –sw-ink: #111111; /* near-black */ –sw-gold: #BA9521; /* sugar-words.com primary */ –sw-pop: #D4A800; /* brighter pop accent */ –sw-rust: #B5451A; /* warm rust */ –sw-cream: #FFFEF8; /* card / about bg */ –sw-white: #FFFFFF; –sw-serif: ‘Playfair Display’, Georgia, serif; –sw-display:’Bebas Neue’, ‘Arial Black’, sans-serif; –sw-body: ‘Vollkorn’, Georgia, serif; –sw-border: 3px solid var(–sw-ink); –sw-shadow: 5px 5px 0 var(–sw-ink); –sw-ease: 0.24s cubic-bezier(.4,0,.2,1); } /* ── SCOPED RESET ────────────────────────────────────────── */ .sw-portfolio *, .sw-portfolio *::before, .sw-portfolio *::after { box-sizing: border-box; margin: 0; padding: 0; } .sw-portfolio { font-family: var(–sw-body); font-size: 16px; color: var(–sw-ink); background: var(–sw-bg); overflow-x: hidden; -webkit-font-smoothing: antialiased; } .sw-portfolio h1, .sw-portfolio h2, .sw-portfolio h3, .sw-portfolio h4 { font-family: var(–sw-serif); font-weight: 900; line-height: 1.05; color: var(–sw-ink); } .sw-portfolio p { line-height: 1.75; } .sw-portfolio a { color: var(–sw-gold); text-decoration: none; } .sw-portfolio a:hover { text-decoration: underline; } .sw-portfolio img { display: block; max-width: 100%; } .sw-portfolio ul { list-style: none; } /* ── LAYOUT ──────────────────────────────────────────────── */ .sw-wrap { max-width: 1160px; margin: 0 auto; padding: 0 24px; } .sw-rule { border: none; border-top: var(–sw-border); } .sw-rule-dot { border: none; border-top: 2px dotted var(–sw-gold); opacity: .45; } /* ── TAGS ─────────────────────────────────────────────────── */ .sw-tag { display: inline-block; background: var(–sw-ink); color: var(–sw-white); font-family: var(–sw-display); font-size: .68rem; letter-spacing: .12em; padding: 3px 10px 2px; margin: 2px 2px 2px 0; } .sw-tag-line { background: transparent; color: var(–sw-ink); border: 2px solid var(–sw-ink); } /* ── SCROLL ANIMATION ────────────────────────────────────── */ .sw-anim { opacity: 0; transform: translateY(24px); transition: opacity .6s var(–sw-ease), transform .6s var(–sw-ease); } .sw-anim.sw-in { opacity: 1; transform: none; } .sw-stagger > *:nth-child(1) { transition-delay: .05s; } .sw-stagger > *:nth-child(2) { transition-delay: .15s; } .sw-stagger > *:nth-child(3) { transition-delay: .25s; } .sw-stagger > *:nth-child(4) { transition-delay: .35s; } .sw-stagger > *:nth-child(5) { transition-delay: .45s; } /* ╔══════════════════════════════════════════════════════╗ ║ NAV ║ ╚══════════════════════════════════════════════════════╝ */ .sw-nav { position: sticky; top: 0; z-index: 300; background: var(–sw-ink); } .sw-nav-inner { display: flex; align-items: stretch; min-height: 52px; } .sw-nav-logo { display: flex; align-items: center; padding: 0 20px; font-family: var(–sw-serif); font-style: italic; font-size: 1.1rem; color: var(–sw-white) !important; text-decoration: none !important; border-right: 1px solid rgba(255,255,255,.12); white-space: nowrap; letter-spacing: -.01em; flex-shrink: 0; } .sw-nav-links { display: flex; margin-left: auto; } .sw-nav-links li { border-left: 1px solid rgba(255,255,255,.1); } .sw-nav-links a { display: flex; align-items: center; gap: 7px; padding: 0 20px; height: 100%; font-family: var(–sw-display); font-size: .9rem; letter-spacing: .12em; color: rgba(255,255,255,.65) !important; text-decoration: none !important; transition: background var(–sw-ease), color var(–sw-ease); position: relative; } .sw-nav-links a:hover { background: var(–sw-gold); color: var(–sw-white) !important; text-decoration: none !important; } .sw-nav-num { font-family: var(–sw-body); font-size: .6rem; color: var(–sw-gold); opacity: .8; line-height: 1; } .sw-nav-links a:hover .sw-nav-num { color: var(–sw-white); opacity: .6; } /* mobile nav */ .sw-nav-toggle { display: none; margin-left: auto; align-items: center; padding: 0 16px; background: none; border: none; cursor: pointer; color: var(–sw-white); font-family: var(–sw-display); font-size: 1rem; letter-spacing: .1em; } .sw-nav-drawer { display: none; flex-direction: column; background: var(–sw-ink); border-top: 1px solid rgba(255,255,255,.1); } .sw-nav-drawer.sw-open { display: flex; } .sw-nav-drawer a { display: flex; align-items: center; gap: 10px; padding: 14px 20px; font-family: var(–sw-display); font-size: 1.1rem; letter-spacing: .12em; color: rgba(255,255,255,.8) !important; text-decoration: none !important; border-bottom: 1px solid rgba(255,255,255,.08); transition: background var(–sw-ease); } .sw-nav-drawer a:hover { background: var(–sw-gold); color: var(–sw-white) !important; } /* ╔══════════════════════════════════════════════════════╗ ║ MARQUEE ANNOUNCEMENT STRIP ║ ╚══════════════════════════════════════════════════════╝ */ .sw-marquee-bar { background: var(–sw-gold); border-bottom: var(–sw-border); overflow: hidden; padding: 8px 0; white-space: nowrap; } .sw-marquee-track { display: inline-flex; gap: 0; animation: sw-marquee 22s linear infinite; will-change: transform; } .sw-marquee-bar:hover .sw-marquee-track { animation-play-state: paused; } .sw-marquee-item { display: inline-flex; align-items: center; gap: 16px; padding: 0 24px; font-family: var(–sw-display); font-size: .85rem; letter-spacing: .18em; color: var(–sw-white); } .sw-marquee-dot { width: 6px; height: 6px; border-radius: 50%; background: rgba(255,255,255,.55); flex-shrink: 0; display: inline-block; } @keyframes sw-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } } /* ╔══════════════════════════════════════════════════════╗ ║ HERO ║ ╚══════════════════════════════════════════════════════╝ */ .sw-hero { border-bottom: var(–sw-border); background: var(–sw-bg); position: relative; } /* ── headline banner ────────────────────────────────── */ .sw-hero-nameplate { border-bottom: var(–sw-border); padding: 28px 0 20px; display: flex; align-items: flex-end; gap: 16px; flex-wrap: wrap; } .sw-hero-name-first { font-family: var(–sw-serif); font-style: italic; font-weight: 900; font-size: clamp(2rem, 4.5vw, 4rem); line-height: .9; color: var(–sw-ink); letter-spacing: -.03em; } .sw-hero-name-last { font-family: var(–sw-display); font-size: clamp(2rem, 4.5vw, 4rem); line-height: .9; color: var(–sw-gold); letter-spacing: .06em; } .sw-hero-name-role { display: flex; flex-direction: column; gap: 4px; padding-bottom: 8px; margin-left: auto; text-align: right; } .sw-hero-name-role span { font-family: var(–sw-display); font-size: .78rem; letter-spacing: .22em; color: var(–sw-ink); opacity: .5; text-transform: uppercase; } /* ── two-column body ────────────────────────────────── */ .sw-hero-body { display: grid; grid-template-columns: 1fr 1fr; min-height: 480px; } /* left column */ .sw-hero-left { border-right: var(–sw-border); padding: 40px 36px 40px 0; display: flex; flex-direction: column; justify-content: space-between; } .sw-hero-tagline { font-family: var(–sw-serif); font-style: italic; font-size: clamp(1.6rem, 3vw, 2.6rem); line-height: 1.2; color: var(–sw-ink); max-width: 460px; } .sw-hero-tagline strong { font-style: normal; color: var(–sw-rust); } .sw-hero-sub { font-family: var(–sw-body); font-size: 1rem; line-height: 1.7; color: var(–sw-ink); opacity: .75; max-width: 380px; margin-top: 20px; } .sw-hero-disciplines { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 28px; } .sw-hero-cta { display: inline-flex; align-items: center; gap: 10px; background: var(–sw-ink); color: var(–sw-white) !important; text-decoration: none !important; padding: 14px 24px; font-family: var(–sw-display); font-size: .9rem; letter-spacing: .14em; border: var(–sw-border); box-shadow: var(–sw-shadow); transition: transform var(–sw-ease), box-shadow var(–sw-ease), background var(–sw-ease); margin-top: 32px; align-self: flex-start; } .sw-hero-cta:hover { transform: translate(-3px,-3px); box-shadow: 8px 8px 0 var(–sw-gold); background: var(–sw-rust); text-decoration: none !important; } /* right column */ .sw-hero-right { padding: 36px 0 36px 40px; position: relative; display: flex; flex-direction: column; align-items: flex-start; justify-content: center; gap: 28px; } /* pop art composition */ .sw-pop-stage { position: relative; width: 100%; max-width: 380px; } /* halftone backdrop */ .sw-halftone-bg { position: absolute; bottom: -16px; right: -16px; width: 200px; height: 200px; background-image: radial-gradient(circle, var(–sw-gold) 2px, transparent 2px); background-size: 14px 14px; opacity: .5; z-index: 0; pointer-events: none; } /* photo frame */ .sw-pop-frame { position: relative; z-index: 2; border: var(–sw-border); box-shadow: var(–sw-shadow); overflow: hidden; width: 220px; height: 280px; background: var(–sw-pop); /* duotone base color */ display: block; } .sw-pop-frame img { width: 100%; height: 100%; object-fit: cover; object-position: top center; filter: grayscale(1) contrast(1.5) brightness(1.15); mix-blend-mode: multiply; display: block; } /* starburst badges */ .sw-burst { position: absolute; z-index: 3; } .sw-burst-1 { top: -20px; right: 40px; } .sw-burst-2 { bottom: -20px; right: -20px; } /* speech bubble */ .sw-speech { position: relative; z-index: 4; background: var(–sw-cream); border: var(–sw-border); box-shadow: var(–sw-shadow); padding: 14px 16px; max-width: 240px; font-family: var(–sw-serif); font-style: italic; font-size: .88rem; color: var(–sw-rust); line-height: 1.55; animation: sw-float 3.8s ease-in-out infinite; } .sw-speech::before { content: ”; position: absolute; top: 100%; left: 20px; width: 0; height: 0; border-left: 10px solid transparent; border-right: 3px solid transparent; border-top: 12px solid var(–sw-ink); } .sw-speech::after { content: ”; position: absolute; top: calc(100% – 3px); left: 22px; width: 0; height: 0; border-left: 8px solid transparent; border-right: 2px solid transparent; border-top: 10px solid var(–sw-cream); } @keyframes sw-float { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-6px); } } /* hero icons strip */ .sw-hero-icons { display: flex; gap: 0; border-top: var(–sw-border); width: 100%; } .sw-hero-icon-item { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; padding: 16px 10px; border-right: var(–sw-border); transition: background var(–sw-ease); } .sw-hero-icon-item:last-child { border-right: none; } .sw-hero-icon-item:hover { background: var(–sw-gold); } .sw-hero-icon-item:hover svg { color: var(–sw-white); } .sw-hero-icon-item:hover .sw-icon-label { color: var(–sw-white); } .sw-hero-icon-item svg { color: var(–sw-gold); transition: color var(–sw-ease); } .sw-icon-label { font-family: var(–sw-display); font-size: .65rem; letter-spacing: .14em; color: var(–sw-ink); opacity: .55; text-transform: uppercase; transition: color var(–sw-ease), opacity var(–sw-ease); } .sw-hero-icon-item:hover .sw-icon-label { opacity: 1; } /* hero type block */ .sw-hero-type-block { position: relative; z-index: 2; border: var(–sw-border); box-shadow: var(–sw-shadow); background: var(–sw-ink); padding: 28px 32px 24px; width: 220px; display: flex; flex-direction: column; gap: 2px; } .sw-type-line { display: block; font-family: var(–sw-display); font-size: 2.8rem; letter-spacing: .06em; line-height: 1; color: var(–sw-white); } .sw-type-line-accent { color: var(–sw-gold); } .sw-type-op { display: block; font-family: var(–sw-body); font-style: italic; font-size: 1.4rem; color: rgba(255,255,255,.3); line-height: 1.2; } /* ╔══════════════════════════════════════════════════════╗ ║ ABOUT ║ ╚══════════════════════════════════════════════════════╝ */ .sw-about { background: var(–sw-cream); padding: 88px 0; position: relative; overflow: hidden; border-bottom: var(–sw-border); } .sw-about::before { content: ‘ABOUT’; position: absolute; right: -10px; top: 50%; transform: translateY(-50%); font-family: var(–sw-display); font-size: clamp(8rem, 18vw, 18rem); color: var(–sw-gold); opacity: .05; line-height: 1; user-select: none; pointer-events: none; white-space: nowrap; } .sw-about-inner { display: grid; grid-template-columns: 1fr 1.7fr; gap: 72px; align-items: center; } .sw-about-aside { position: relative; } .sw-about-img-frame { width: 100%; aspect-ratio: 4/5; border: var(–sw-border); box-shadow: var(–sw-shadow); overflow: hidden; background: var(–sw-pop); } .sw-about-img-frame img { width: 100%; height: 100%; object-fit: cover; object-position: top center; filter: grayscale(1) contrast(1.4) brightness(1.15); mix-blend-mode: multiply; } .sw-about-label { position: absolute; bottom: -14px; right: -14px; background: var(–sw-gold); border: var(–sw-border); padding: 10px 14px; font-family: var(–sw-display); font-size: .72rem; letter-spacing: .14em; color: var(–sw-white); box-shadow: 3px 3px 0 var(–sw-ink); } .sw-about-eyebrow { display: block; font-family: var(–sw-display); font-size: .72rem; letter-spacing: .2em; color: var(–sw-gold); margin-bottom: 12px; } .sw-about-body h2 { font-size: clamp(2.2rem, 4vw, 3.4rem); font-style: italic; margin-bottom: 24px; } .sw-about-body p { font-size: 1rem; color: var(–sw-ink); max-width: 520px; } .sw-about-body p + p { margin-top: 14px; } .sw-about-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; margin-top: 40px; border: var(–sw-border); } .sw-stat { padding: 18px 16px; border-right: var(–sw-border); text-align: center; } .sw-stat:last-child { border-right: none; } .sw-stat-num { display: block; font-family: var(–sw-display); font-size: 2.6rem; color: var(–sw-gold); line-height: 1; } .sw-stat-lbl { display: block; font-family: var(–sw-display); font-size: .6rem; letter-spacing: .12em; color: var(–sw-ink); opacity: .5; margin-top: 4px; } /* ╔══════════════════════════════════════════════════════╗ ║ WORK ║ ╚══════════════════════════════════════════════════════╝ */ .sw-work { padding: 88px 0; background: var(–sw-bg); border-bottom: var(–sw-border); } .sw-section-head { margin-bottom: 48px; } .sw-section-eye { display: block; font-family: var(–sw-display); font-size: .72rem; letter-spacing: .22em; color: var(–sw-gold); margin-bottom: 8px; } .sw-section-head h2 { font-size: clamp(2.6rem, 4.5vw, 4.2rem); font-style: italic; } .sw-work .sw-section-head h2 { font-size: clamp(3.8rem, 8vw, 8rem); } .sw-work-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(290px, 1fr)); gap: 24px; } .sw-card { background: var(–sw-cream); border: var(–sw-border); box-shadow: var(–sw-shadow); overflow: hidden; transition: transform var(–sw-ease), box-shadow var(–sw-ease); will-change: transform; } .sw-card:hover { transform: translate(-3px,-3px); box-shadow: 8px 8px 0 var(–sw-gold); } .sw-card-img { width: 100%; height: 200px; object-fit: cover; display: block; border-bottom: var(–sw-border); transition: filter var(–sw-ease); } .sw-card:hover .sw-card-img { filter: saturate(1.2); } .sw-card-body { padding: 20px 20px 22px; } .sw-card h3 { font-size: 1.15rem; font-style: italic; margin-bottom: 8px; } .sw-card p { font-size: .88rem; opacity: .8; margin-bottom: 14px; } .sw-card-tags { margin-bottom: 12px; } .sw-card-link { display: inline-flex; align-items: center; gap: 6px; font-family: var(–sw-display); font-size: .72rem; letter-spacing: .1em; color: var(–sw-ink) !important; text-decoration: none !important; padding: 7px 14px; border: 2px solid var(–sw-ink); transition: background var(–sw-ease), color var(–sw-ease); } .sw-card-link:hover { background: var(–sw-ink); color: var(–sw-white) !important; text-decoration: none !important; } .sw-card-link svg { transition: transform var(–sw-ease); } .sw-card-link:hover svg { transform: translateX(4px); } /* featured */ .sw-card-feat { grid-column: 1 / -1; display: grid; grid-template-columns: 1fr 1fr; } .sw-card-feat .sw-card-img { height: 100%; border-bottom: none; border-right: var(–sw-border); min-height: 260px; } /* ╔══════════════════════════════════════════════════════╗ ║ WRITING ║ ╚══════════════════════════════════════════════════════╝ */ .sw-writing { padding: 88px 0; background: var(–sw-bg2); border-bottom: var(–sw-border); } .sw-article-list { border-top: var(–sw-border); } .sw-article { display: grid; grid-template-columns: 64px 1fr auto; gap: 16px 28px; align-items: start; padding: 24px 0; border-bottom: var(–sw-border); } .sw-article-num { font-family: var(–sw-display); font-size: 3.2rem; color: var(–sw-gold); opacity: .25; line-height: 1; user-select: none; } .sw-article-meta { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; } .sw-article-date { font-family: var(–sw-display); font-size: .65rem; letter-spacing: .12em; color: var(–sw-ink); opacity: .4; } .sw-article h3 { font-size: 1.12rem; font-style: italic; margin-bottom: 6px; line-height: 1.25; } .sw-article p { font-size: .88rem; opacity: .72; } .sw-article-btn { display: inline-flex; align-items: center; gap: 6px; padding: 9px 16px; border: var(–sw-border); font-family: var(–sw-display); font-size: .72rem; letter-spacing: .12em; color: var(–sw-ink) !important; text-decoration: none !important; white-space: nowrap; margin-top: 2px; transition: background var(–sw-ease), color var(–sw-ease), box-shadow var(–sw-ease); } .sw-article-btn:hover { background: var(–sw-ink); color: var(–sw-white) !important; box-shadow: 3px 3px 0 var(–sw-gold); text-decoration: none !important; } /* ╔══════════════════════════════════════════════════════╗ ║ CONTACT ║ ╚══════════════════════════════════════════════════════╝ */ .sw-contact { padding: 96px 0 80px; background: var(–sw-ink); text-align: center; position: relative; overflow: hidden; } .sw-contact::before { content: ‘HELLO’; position: absolute; bottom: -30px; left: 50%; transform: translateX(-50%); font-family: var(–sw-display); font-size: clamp(6rem, 20vw, 18rem); color: rgba(186,149,33,.1); white-space: nowrap; pointer-events: none; line-height: 1; } .sw-contact h2 { font-size: clamp(2.8rem, 5.5vw, 5rem); font-style: italic; color: var(–sw-white); margin-bottom: 16px; } .sw-contact-sub { font-size: 1rem; color: var(–sw-white); opacity: .65; max-width: 420px; margin: 0 auto 44px; } .sw-contact-btns { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; margin-bottom: 52px; } .sw-btn-solid { display: inline-flex; align-items: center; gap: 8px; background: var(–sw-gold); color: var(–sw-white) !important; text-decoration: none !important; padding: 14px 28px; font-family: var(–sw-display); font-size: .88rem; letter-spacing: .12em; border: 2px solid var(–sw-gold); box-shadow: 4px 4px 0 rgba(186,149,33,.4); transition: transform var(–sw-ease), box-shadow var(–sw-ease); } .sw-btn-solid:hover { transform: translate(-2px,-2px); box-shadow: 6px 6px 0 rgba(186,149,33,.4); text-decoration: none !important; } .sw-btn-outline { display: inline-flex; align-items: center; gap: 8px; background: transparent; color: var(–sw-white) !important; text-decoration: none !important; padding: 14px 28px; font-family: var(–sw-display); font-size: .88rem; letter-spacing: .12em; border: 2px solid rgba(255,255,255,.3); transition: border-color var(–sw-ease), background var(–sw-ease); } .sw-btn-outline:hover { border-color: var(–sw-white); background: rgba(255,255,255,.08); text-decoration: none !important; } .sw-socials { display: flex; gap: 12px; justify-content: center; flex-wrap: wrap; } .sw-social { display: flex; align-items: center; justify-content: center; width: 46px; height: 46px; border: 2px solid rgba(186,149,33,.35); color: var(–sw-white) !important; text-decoration: none !important; transition: border-color var(–sw-ease), transform var(–sw-ease), background var(–sw-ease); } .sw-social:hover { border-color: var(–sw-gold); transform: translateY(-3px); background: rgba(186,149,33,.15); text-decoration: none !important; } /* ── FOOTER ───────────────────────────────────────────────── */ .sw-footer { background: #0A0A0A; padding: 20px 0; text-align: center; } .sw-footer p { font-family: var(–sw-display); font-size: .72rem; letter-spacing: .1em; color: var(–sw-cream); opacity: .3; } /* ── RESPONSIVE ───────────────────────────────────────────── */ @media (max-width: 860px) { .sw-nav-links { display: none; } .sw-nav-toggle { display: flex; } .sw-hero-nameplate { flex-direction: column; align-items: flex-start; } .sw-hero-body { grid-template-columns: 1fr; } .sw-hero-left { border-right: none; border-bottom: var(–sw-border); padding: 32px 0; } .sw-hero-right { padding: 32px 0; } .sw-about-inner { grid-template-columns: 1fr; } .sw-about-aside { max-width: 260px; } .sw-card-feat { grid-template-columns: 1fr; } .sw-card-feat .sw-card-img { height: 200px; border-right: none; border-bottom: var(–sw-border); } } @media (max-width: 580px) { .sw-hero-name-first, .sw-hero-name-last { font-size: clamp(3.2rem, 12vw, 4.5rem); } .sw-about-stats { grid-template-columns: 1fr; } .sw-stat { border-right: none; border-bottom: var(–sw-border); } .sw-stat:last-child { border-bottom: none; } .sw-article { grid-template-columns: 40px 1fr; grid-template-rows: auto auto; } .sw-article-num { font-size: 2.4rem; } .sw-article-btn { grid-column: 2; } }
Lipi Gandhi

Strategy and copy across six industries.

Website copy, B2B thought leadership, reportage, and essays for sectors that tend to overcomplicate things.

Website Copy Thought Leadership Reportage Creative Essays B2B Strategy
WORDS
STRATEGY × STORY
Most briefs ask for words. The useful ones ask for thinking.

Lipi Gandhi
HOUSTON, TX
ABOUT

A business person’s vision. A storyteller’s hand.

I work across industries that don’t usually share a masthead: scientific visualization, oil and gas AI, business education, legal tech, arts and culture. What connects them is the same thing that connects economics and poetry: someone is trying to convince someone else of something. My job is to make that argument land.

5+ Industries
100+ Published
4+ Years

SELECTED PROJECTS

My Work

Quorumetrix Studio website
Website Copy Science / Biotech

Quorumetrix Studio: Website Copy

Website copy for a scientific visualization studio. EM microscopy, connectomics, 3D rendering: translated into language that gets research scientists to book a discovery call.

Visit Site
Quantico Energy use cases document
Technical Writing Oil & Gas AI

ML Use Cases for Subsurface Teams

Content strategy and creation on machine learning applications in subsurface geoscience: pore pressure prediction, synthetic logs, and earth modeling. Written for audiences that range from reservoir engineers to C-suite.

Ask for Document
ISB India growth carousel
Infographic Higher Education

ISB: Riding the Wave

Multiple carousels for ISB Executive Education on research. Example: Why Indian subsidiaries outperform their parent companies on P/B ratios. Covers macro tailwinds, cost of capital, and middle-class growth.

View Carousel
Cacti Global legal tech content
Content Marketing Legal Tech

40+ Articles for Cacti Global

B2B content on CLM, contract abstraction, AI in legal, and Talent-as-a-Service. Written for Cacti Global before their acquisition by Execo in July 2024. Archived via Wayback Machine.

View Archive

PUBLISHED PIECES

Writing

What Leadership Really Looks Like: WILC 2026

Coverage of the 26th Women in Leadership Conference at Rice Business: 600 attendees, 15 sponsors. Published on the admissions blog for prospective MBA students.

Read

Is There Room for an Artist in the Boardroom?

An opinion piece for Rice Business School’s admissions blog. The argument: artistic thinking, specifically comfort with ambiguity and the lateral leap, strengthens business leadership.

Read

The Keepers of What Remains: Art Conservation

A field report from inside the MFAH conservation studio for Longitude. The work is part chemistry, part detective work.

Read

The Wisdom Is the Kid Who Asks Too Many Whys

A personal essay on the inner voice that never stops asking why. Published on Sugar Words. The argument is that it’s a feature, not a flaw.

Read

Let’s Make Something.

Whether you need strategy, copy, or a fresh read on your brand’s voice, I’d love to hear about the project.

© 2026 Sugar Words · All rights reserved

/* ================================================================ SUGAR-WORDS PORTFOLIO — All JS in IIFE. Zero globals. Vanilla only. ================================================================ */ (function () { ‘use strict’; function ready(fn) { document.readyState === ‘loading’ ? document.addEventListener(‘DOMContentLoaded’, fn) : fn(); } ready(function () { var root = document.querySelector(‘.sw-portfolio’); if (!root) return; /* 1. Scroll animations */ var els = root.querySelectorAll(‘.sw-anim’); if (‘IntersectionObserver’ in window) { var io = new IntersectionObserver(function (entries) { entries.forEach(function (e) { if (e.isIntersecting) { e.target.classList.add(‘sw-in’); io.unobserve(e.target); } }); }, { threshold: 0.1, rootMargin: ‘0px 0px -32px 0px’ }); els.forEach(function (el) { io.observe(el); }); } else { els.forEach(function (el) { el.classList.add(‘sw-in’); }); } /* 2. Smooth scroll for portfolio anchor links */ root.querySelectorAll(‘a[href^=”#sw-“]’).forEach(function (a) { a.addEventListener(‘click’, function (e) { var target = document.getElementById(a.getAttribute(‘href’).slice(1)); if (!target) return; e.preventDefault(); /* close mobile drawer if open */ var drawer = root.querySelector(‘.sw-nav-drawer’); var toggle = root.querySelector(‘.sw-nav-toggle’); if (drawer) drawer.classList.remove(‘sw-open’); if (toggle) toggle.setAttribute(‘aria-expanded’, ‘false’); var navH = (root.querySelector(‘.sw-nav’) || {}).offsetHeight || 0; window.scrollTo({ top: target.getBoundingClientRect().top + window.pageYOffset – navH – 10, behavior: ‘smooth’ }); }); }); /* 3. Mobile nav toggle */ var toggle = root.querySelector(‘.sw-nav-toggle’); var drawer = root.querySelector(‘.sw-nav-drawer’); if (toggle && drawer) { toggle.addEventListener(‘click’, function () { var open = drawer.classList.toggle(‘sw-open’); toggle.setAttribute(‘aria-expanded’, open ? ‘true’ : ‘false’); toggle.textContent = open ? ‘CLOSE’ : ‘MENU’; }); } /* 4. Card 3D tilt */ root.querySelectorAll(‘.sw-card’).forEach(function (card) { card.addEventListener(‘mousemove’, function (e) { var r = card.getBoundingClientRect(); var tX = ((e.clientY – r.top) / r.height – 0.5) * 4; var tY = ((e.clientX – r.left) / r.width – 0.5) * -4; card.style.transform = ‘translate(-3px,-3px) perspective(700px) rotateX(‘+tX+’deg) rotateY(‘+tY+’deg)’; }); card.addEventListener(‘mouseleave’, function () { card.style.transform = ”; }); }); /* 5. Active nav highlight on scroll */ var sectionIds = [‘sw-about’,’sw-work’,’sw-writing’,’sw-contact’]; var navAs = root.querySelectorAll(‘.sw-nav-links a, .sw-nav-drawer a’); function updateActive() { var mid = window.pageYOffset + window.innerHeight * 0.35; var cur = ”; sectionIds.forEach(function (id) { var el = document.getElementById(id); if (el && el.offsetTop <= mid) cur = id; }); navAs.forEach(function (a) { var isActive = a.getAttribute('href') === '#' + cur; a.style.color = isActive ? '' : ''; /* handled by hover CSS; clear any inline */ a.style.background = isActive ? 'rgba(186,149,33,.18)' : ''; }); } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); }); })();