Let's work together!
Built with Next.js & rocky's matcha lattes. ☕︎
CHANGELOG: ...
The site's neutral backbone (Tailwind zinc-*). Muted zinc-400 (#a1a1aa) is the single most-used color.
#18181btext-zinc-900★ Darkest canonical — headings, icons, --primary / --secondary-foreground / --accent-foreground / --sidebar-primary
#27272atext-zinc-800Modal tab labels, testimonial body, film timeline active
#3f3f46text-zinc-700Hero name, section headings, footer; CMS — Adobe highlightCard headlineColor
#52525btext-zinc-600Active nav, body copy, metadata, film info, library spinner
#71717atext-zinc-500Secondary body, tool lists, film loading hint, --muted-foreground; CMS — Adobe muted highlightColor
#a1a1aatext-zinc-400Muted labels, captions, placeholders, footer tagline (most common); CMS — NASA/Adobe sectionTitle numberColor, Roblox muted highlightColor, stats title default
#d4d4d8text-zinc-300Focus borders, quote underline, inactive badges, muted icons, scramble glyphs
#e4e4e7bg-zinc-200Shimmer base, card borders, spinners, film idle marks, lore card image fallback
#f4f4f5bg-zinc-100Pill borders, hover fills, dividers, modal hero bands
#fafafabg-zinc-50Button bg, section bg
#ffffffbg-whitePage & card surfaces
Blue-500 (#3b82f6) is the single accent for links, CTAs, active states, and text selection.
#2563ebtext-blue-600Ikigai link hover, CMS section title default
#3b82f6bg-blue-500Links, CTAs, active nav, selection
#60a5fabg-blue-400CTA hover fill / border, project links, CMS number default
#93c5fdborder-blue-300CTA hover border
#dbeafeText selection background
#eff6ffbg-blue-50Polaroid project card bg
Hexes from Sanity project content (published NASA, Adobe, Roblox, Apple) plus code defaults for CMS sections. Brand/project hues are one-offs; pink-50/500 stay canonical defaults. Surface neutrals already in Zinc are omitted.
#ec4899text-pink-500CMS default — TOC accent, section header text, stats, two-column highlight initial
#fdf2f8bg-pink-50CMS section header bar background default
#3b82f6text-blue-500CMS highlightColor default (mission / text / feature) — also under Blue
#F63768Adobe — highlightColor, Express card headlineColor
#DE3C82Adobe — sectionTitle titleColor, highlightColor
#F777B0Adobe — sectionTitle numberColor / titleColor
#FF8EABAdobe Express — highlightCard highlightColor
#FD9A00Adobe Express — highlightCard headlineColor
#FFB748Adobe Express — highlightCard highlightColor
#32A7F9Adobe Express — highlightCard headlineColor
#88CEFFAdobe Express — highlightCard highlightColor
#34A9F3Adobe — two-column / feature highlightColor
#828EE4NASA — sectionTitle numberColor
#5365DENASA — sectionTitle titleColor, highlightCard headlineColor
#335FFFRoblox — highlightColor
#7FA2FFRoblox — sectionTitle numberColor
#2E5EDERoblox — sectionTitle titleColor, highlightColor
#6FD8D2Roblox — sectionTitle numberColor
#38C4BCRoblox — sectionTitle titleColor
#B378DBRoblox — sectionTitle numberColor
#842CBFRoblox — sectionTitle titleColor
Emerald for availability, red for errors, green for the pulse ring.
#10b981Availability dot, submit button
#059669Changelog link hover
#ecfdf5Contact badge expanded bg
#bbf7d0Availability pulse ring
#ef4444Modal error state
#f87171Form error text / border
Multi-stop gradients for the animated header, gradient text, and social icon.
#D5E0FFheader-gradient stop
#E2EAFFheader-gradient stop
#F5E2FFheader-gradient stop
#FDE9FAheader-gradient stop
#FFF5FCheader-gradient stop
#FFD2F2gradient-text-animated stop
#ECCBFFgradient-text-animated stop
#AADBFDgradient-text-animated stop
#D79FE8Animated social icon
#4DACEAAnimated social icon
#13B2EBAnimated social icon
The 'Michelle' variable font covers weights 300–900, roman + italic.
'Michelle', sans-serifPrimary site font (Figtree variable, self-hosted, weights 300–900)'SF Pro', -apple-system, sans-serifLibrary UI, add-book modal, 404, Polaroid'Courier New', monospacePolaroid date + caption imprintui-monospace, 'SF Mono', Menlo, monospaceEntire Screentime page (forced monospace)Named Tailwind steps, grouped by role. text-lg is the boundary — used for subtitles, so it reads as supporting body text.
Body
text-xsFooter clock, film loading, skip-to-designs link
12pxtext-smCaptions, filters, errors, tooltips, contact badge
14pxtext-baseDefault body (--font-size), metadata / tool grids
16pxtext-lgHero subtitle, section subtitles, nav tab labels
18pxHeading
text-xlSection / community titles
20pxtext-2xlQuote cards, mission headers
24pxtext-3xlSection headings, library title, footer CTA
30pxtext-4xlProject hero, large display sizes (base size for Display name)
36pxDisplay nameHome hero name, Design System title
36pxtext-5xlStats, emoji blocks, 404 display code
48pxThe core site uses only the standard scale above. These pixel-exact sizes remain solely inside experiments (device-accurate / Figma-exported chrome).
text-[17px] / [22px]Polaroid / Screentime headings
17–22pxFigma sub-pxPolaroid share export sizes
10.959–16.949pxfont-normalBody default (--font-weight-normal), stats numerals
400font-mediumHeadings, labels, nav (--font-weight-medium)
500font-semiboldCTAs, filters, ikigai link, footer email arrow reveal
600tracking-[0.005em]CanonicalCore micro-tracking (nav, cards, about)
0.005emtracking-[0.01em]CanonicalMedia cards, library filter, social link labels
0.01emtracking-[0.0125em]CanonicalDisplay name (home hero name, Design System title)
0.0125emtracking-[-0.31px]CanonicalTool grid values
-0.31pxtracking-wideCanonicalSection subtitles, sidebar nav
0.025emtracking-widerOne-offFooter clock
0.05emtracking-[0.15em]ExperimentPolaroid stamp text
0.15emtracking-[0.75px]ExperimentScreentime GENERATE / UPLOAD CTAs
0.75pxleading-noneOne-off404 display
1leading-tightCanonicalCard descriptions, lore dates
1.25leading-snugCanonicalFilm captions, stats
1.375leading-normalCanonicalDefault headings / buttons
1.5leading-relaxedCanonicalAbout prose, book review
1.625leading-[1.4]CanonicalProject card text
1.4leading-5 / 6 / 7CanonicalMetadata, subtitle, quotes
20 / 24 / 28px0 2px 8px rgba(0, 0, 0, 0.06)Hairline lift — locks, pills, segmented thumbs, image rest state0px 4px 16px 0px rgba(212, 212, 216, 0.65)Zinc-tinted cards; pair with .shadow-default-hover on interactive cards0px 4px 16px 0px rgba(161, 161, 170, 0.4)Hover companion for .shadow-default cards0 4px 12px rgba(0, 0, 0, 0.1)Photos, book covers, device frames, Polaroids, community mats0 8px 24px rgba(0, 0, 0, 0.12)Modals, dropdowns, popovers, lightbox, deep floats0 2px 8px rgba(0, 0, 0, 0.06), inset 0 1px 1px rgba(255, 255, 255, 0.9), inset 0 -1px 1px rgba(0, 0, 0, 0.02)Frosted nav pill + liquid-glass controlsgap-1Nav tabs, tight rows
4pxgap-2Inline label + value
8pxgap-3Card internals
12pxgap-4Grid gaps
16pxgap-6Section internals
24pxgap-8Between blocks
32pxgap-12Project sections
48pxgap-16Major sections
64pxgap-20About page sections
80pxPage gutters and grid-based widths.
px-16 / max-md:px-6Canonical★ Primary page gutter (desktop → mobile)
64px → 24pxpx-8CanonicalSecondary mobile gutter
32pxpx-[175px] / md:px-[8%]One-offWide project gallery gutters
175px / 8%w-[calc(100%*10/12)]CanonicalProject modal width
10 of 12 colsw-[calc(100%*6/12)]One-offInfo modal width
6 of 12 colsw-[337px] / [402px]ExperimentScreentime phone widths
337 / 402pxWidth and color tokens used across cards, inputs, overlays, and chrome.
1px solidCards, images, modals (hairline)2pxLoading spinners#fafafaImage hairline overlays#f4f4f5Cards, dropdowns, community frames, project card framesrgba(255,255,255,0.5)Glass nav pill bordertransparentDefault / inactive pills & inputsGlobal :focus-visible and the interactive focus ring.
outline 2px #d4d4d8, offset 2pxring-2 ring-zinc-400 offset-2When a browser supports corner-shape: squircle, index.css applies it globally and compensates the border-radius ~1.7× so the perceived roundness stays constant (a full squircle visually shrinks corners). Circles and pills opt back into corner-shape: round. The samples below are squircled in supporting browsers.
2pxCommunity photos, book covers, film frames, Polaroid frame (mobile)6pxDropdown items, book covers, Polaroid frame & share export8px → 14px (tooltip) squircleTooltips, dropdowns, quote photos12px → 20px squircleGallery items, project cards16px → 27px squircleLore cards, book modal, video24px → 41px squircleInfo modal, media quote cards16px → 27px squircleVideo / image embeds24px → 41px squircleDevice mockup columns26px → 44px squircle★ Signature project & modal radius28px → 48px squircleLarge surfacesfully roundPills, avatars, CTAs, nav (stays round)Deliberately precise / odd radii from Figma exports and device mockups.
rounded-[7px]Screentime daily-tab segment
7pxrounded-[11px] / [12px]Screentime app icons (iOS-accurate)
11–12pxrounded-[100px]Screentime home indicator, segmented control
100pxLive loops — the demos below repeat continuously so you can see each curve.
fadeInCanonicalscaleInCanonicalfadeSlideUpCanonicalfadeSlideDownCanonicalmodalScaleInCanonicalmodalSlideInCanonicalshelfItemFadeUpCanonicalprojectCardEnterCanonicalscroll-revealCanonicalshimmerCanonicalpulse-ringCanonicalgradient-bgCanonicalblinkOne-offanimate-spinCanonicalfilm-dot-pulseExperimentduration-150Micro-interactions (glass button)
150msduration-200★ Default hover / color transitions
200msduration-300Cards, modals, nav slide
300msduration-500Experiment modal expand, book cover
500msSize ramp (iconSizes) — 12 meta · 16 inline · 20 toolbar/chevrons · 24 touch/Close · 32 hero. Chevrons sit one step below the paired Close.
Stroke affordances — text-zinc-500 · strokeWidth 1.5 · vector-effect non-scaling-stroke. Prefer size={iconSize(...)} over CSS size-*.
ArrowUpRight.tsxExternal / meta links, CTAs, email hover — stroke stays 1.5px at any sizeChevron.tsxNav, filters, breadcrumbs, carousels — one path, size prop; direction via rotate (right/down/left/up)library/icons.tsx · PlusIconAdd book / create actionsClose.tsxModals, lightboxes, menus — one path, size prop; stroke stays 1.5px at any sizeExpand.svg / ExperimentModalOpen experiment / project full pagelibrary/icons.tsx · SendIconLibrary add-book submitlibrary/icons.tsx · SmileyIconLibrary success stateArrow.tsxLibrary date ranges, password submit — one path, size prop; direction via rotate (right/down/left/up)LinkIcon.tsxExternal experiment links on homeProjectModalShow / hide passwordlucide-react (shadcn)Checkbox & menu selected statesInfoButton / ExperimentModalProject & experiment info triggersTouchIcon.tsxInteractive / in-site experiment linksSolid glyphs — stay filled (no strokeWidth rules). Same zinc-500 specimen color.
assets/HeartFill.svgAbout · communities subtitle accentassets/academic-cap.svgAbout · education meta rowassets/map-pin.svgAbout · location meta rowunicode ★Shelf section titles (★ Books) & book ratingsassets/lock.svgPassword-gated project contentFooterLocal time day / night indicatorFilmPageFilm page media controlsHomePageClientHome hero · “Previously at” markFooter · svg-2tsxp86msmFooter social row, community cardsFooter / View on X CTAFooter social, experiment CTAsFooter · svg-2tsxp86msmFooter social rowassets/LumaLogo.svgFooter social rowPolaroid • 2024
Polaroid • Try It Out!
Pill field shared by password gates, library modal, and mobile Filter. Leading/trailing icons use FieldLeadingIcon / FieldTrailingIcon (size-5) with FieldInput h-5 / leading-5 / p-0.
In use (not shown): Contact CTA · View on X · Skip link · Breadcrumb · Info · Modal close. Colors stay minimal (blue primary, zinc secondary); no destructive CTA on site.
Loading...
Multi-stop lavender→white, animated 8s (.header-gradient)
Page headers
PNG texture at opacity 0.8 over header gradient
Page header texture
bg-zinc-200/60 + backdrop-blur-md + shadow-glass
Active nav tab
backdrop-blur-sm / -md
Nav pill, project TOC overlay
backdrop-filter: blur(16px) saturate(180%) + shadow-glass
Art carousel arrows
Gradient #f4f4f5→#e4e4e7→#fafafa, 2s ease-in-out loop
Image / skeleton loading
violet/pink/blue/zinc stops, animated 6s
Intro accent text
color #3b82f6 on #dbeafe background
Global ::selection
#bbf7d0 ring, pulse-ring 2.3s infinite
Availability dot
#d4d4d8 2px line, 0.6s reveal
Media quote cards
Multi-stop white/#fafafa gradients (up to 11 stops)
Film & Art carousels, top scroll fade
bg-zinc-900/20
All modal overlays
filter blur(4px)→blur(0), 0.26s
Film captions focus-pull
Sampled-RGB dust, gravity 0.0012, drag 0.9986
Fading shatter effect
scale-[0.99] cards, scale-[1.005] link cards
Interactive lift