← Work
Service Boutique·Digital Presence · Flagship

Lunar Drop

Signal-driven brand platform built ground-up — design systems over pages, scarcity encoded into the data layer, commerce-ready architecture without platform lock-in.

Live site ↗lunardrop.net

Brand platform UX — dark mode default, composable sections, drop-lifecycle-aware product grid, gesture-native on mobile.

0
CMS Dependencies
Typed local config as the single source of truth — no platform, no drift
3
Drop States
LIVE, COMING, ARCHIVED — scarcity encoded in the data layer, not in copy
2
Theme Modes
Dark + light via CSS variables — zero hydration mismatch, instant switch
< 200ms
TTFB Target
Edge-cached static delivery — sub-200ms time to first byte
The Challenge

A brand launch that needed architecture, not a template

Lunar Drop required a platform that could communicate identity and scarcity simultaneously — without relying on heavy copy or large product catalogs. The brand needed to feel deliberate and premium before a single drop went live, and be ready to scale into commerce without a rebuild.

Standard templates or CMS-based platforms would constrain the design system and introduce operational overhead the brand didn't need. The architecture had to own the brand's content model, control its own theme system, and be extensible into commerce on the brand's timeline.

Platform Architecture

Design systems over pages

Instead of designing pages, Lunar Drop was engineered as a system of composable sections. Each section is independently styled, reorderable, and reusable across future routes without side effects. The content layer is typed local configuration — version-controlled, build-time validated, and impossible to misconfigure through a third-party editor. The result is a platform that can add routes, drop pages, and story sections without touching the design system.

  • ✓Static-first — no runtime CMS, no client-side content fetching
  • ✓Composable sections — reorderable, no inter-section dependencies
  • ✓Typed config — content is version-controlled and build-validated
  • ✓Edge-cached delivery — consistent sub-200ms TTFB
  • ✓Zero content drift — no database, no editorial pipeline
Drop Lifecycle

Scarcity encoded in the system, not in copy

A formal drop state system drives UI behavior across every surface simultaneously. The state determines visual emphasis, purchase path availability, and content display — not the other way around. When a drop transitions states, every component that references it updates automatically.

LIVE

Active drop — full product visibility, purchase path enabled

COMING

Upcoming — teaser content, countdown, no purchase path

ARCHIVED

Closed drop — visible for brand history, marked sold out

This is the central architectural decision that separates a brand platform from a product catalog. Scarcity is a structural property of the system — not marketing language applied to a generic layout.

Theme System

Dark and light — one component system, two expressions

Both themes are implemented via CSS custom properties — no component duplication, no conditional class logic per theme, and no hydration mismatch on switch. The Lunar Drop mark functions as a reusable design primitive embedded across navigation, interaction states, and iconography. Every component works in both modes by design, not by override.

  • ✓CSS variable-driven — single component tree, two themes
  • ✓No hydration mismatch on client-side theme switch
  • ✓Brand mark as a reusable primitive across all surfaces
  • ✓Dark default — consistent with brand identity and drop context
Lunar Drop dark mode hero
Dark Mode
Identity-led hero — brand mark, scarcity signal, and drop status above the fold. No marketing copy competing with the brand statement.
Lunar Drop light mode hero
Light Mode
Same composable section system, alternate theme. CSS variable-driven — no component duplication, no hydration mismatch on switch.
Commerce Architecture

Ready to transact — without platform commitment

Structured product metadata, drop detail routes, and checkout extensibility are built in from the start. Transactions currently route through an external provider — but the brand owns its data model. When the business is ready for native commerce, the architecture adds a payment layer; it doesn't require a platform migration. No Shopify theme. No Webflow lock-in. No rebuild.

  • ✓Structured product metadata — typed, owned, portable
  • ✓Drop detail routes — each drop has its own URL and state
  • ✓Checkout extensibility — payment layer is additive, not structural
  • ✓No platform dependency — brand data model is not held by a SaaS
Lunar Drop product grid
Product Grid
Drop cards with lifecycle state driving visual emphasis — LIVE drops are featured, COMING are teased, ARCHIVED are preserved for brand history.
Decision Records

What was chosen — and what was ruled out

Typed local config as content source
Over: Headless CMS (Contentful, Sanity, etc.)

A brand platform built on scarcity and identity doesn't need editorial workflows — it needs performance, predictability, and zero drift. Typed local configuration means content is version-controlled, build-time validated, and impossible to accidentally misconfigure through a CMS UI. Adding a CMS buys you an editor and costs you a build dependency.

Drop lifecycle encoded as a formal type system
Over: Manually written status copy per product

State encoded in the system cannot contradict itself. A formal LIVE | COMING | ARCHIVED type drives UI state, visual emphasis, purchase path availability, and content rhythm simultaneously. Manual copy requires every surface to be updated in sync — and eventually, one gets missed.

Commerce-ready architecture without committing to a platform
Over: Shopify or similar embedded commerce

Premature platform decisions constrain brand architecture. Structured product metadata, drop detail routes, and checkout extensibility are designed in from the start — when the business is ready to transact natively, the architecture doesn't require a rebuild. The brand owns its data model regardless of which commerce layer is eventually added.