# Design Spec

## Aesthetic direction

**iOS 26 Liquid Glass meets editorial photography magazine.**

Two influences in tension:

1. **iOS 26 Liquid Glass.** The native OS layer. Translucent surfaces that refract content underneath, specular highlights on glass edges, real depth via blur and saturation boost, content-aware tinting. Controls feel like they're floating just above the photo.
2. **Editorial photography magazine** (think *Apartamento*, *Cereal*, *The Gentlewoman*). The brand layer. A confident editorial serif for style names and marketplace headers. Generous whitespace around hero images. Captions in small caps. Long-scroll narrative pacing on style detail pages. The vibe of a beautifully art-directed object, not an app.

Where these meet: the camera and library screens are pure Liquid Glass — invisible chrome, photo-forward. The marketplace and style-detail screens lean editorial — they're where the brand expresses itself.

## Brand voice

> See yourself the way the studio would see you.

Confident. Slightly mischievous. We know this is a hot take. We're not apologizing for it. Voice rules:

- **Never call AI "AI."** Call it the engine, the studio, the retouch, the model.
- **Never apologize for the bet.** "Honest" and "True to the moment" are *one* end of our spectrum — they're not our default ethical posture.
- **Photographic vocabulary, not tech vocabulary.** "Restage" not "regenerate." "Wardrobe" not "outfit transfer." "Open the shadows" not "enhance lowlights."
- **Two words better than ten.** Style names are 1–2 words. Style taglines are <12 words.

## Color system

Dark mode is the default. The OS is black; the photos are the color.

| Token | Value | Use |
| --- | --- | --- |
| `--onyx` | `#000000` | App background |
| `--charcoal` | `#0E0E10` | Elevated surfaces (cards, sheets) |
| `--graphite` | `#1A1A1D` | Inset surfaces (inputs, code blocks) |
| `--glass-tint` | `rgba(255,255,255,0.08)` | Default glass fill |
| `--glass-stroke` | `rgba(255,255,255,0.18)` | Glass edge highlight |
| `--ink` | `#FFFFFF` | Primary text |
| `--ink-soft` | `rgba(255,255,255,0.70)` | Secondary text |
| `--ink-muted` | `rgba(255,255,255,0.45)` | Tertiary, captions |
| `--amber` | `#FFB661` | Brand warm — sunset on glass |
| `--peach` | `#FF7E5F` | Brand mid |
| `--rose` | `#FE4A8B` | Brand cool-warm |
| `--cyan` | `#5EE7FF` | AI accent — "the model thinking" |
| `--violet` | `#B57BFF` | AI accent — "the model deciding" |

**Brand gradient** (used sparingly — shutter glow, marketplace hero, "Make Active" CTA): `linear-gradient(135deg, #FFB661 0%, #FF7E5F 45%, #FE4A8B 100%)`.

**AI gradient** (used at the *moment of transform* only — the shimmer during processing, the cyan stroke around the active style chip): `linear-gradient(135deg, #5EE7FF 0%, #B57BFF 100%)`.

These two gradients **never appear on the same screen at the same scale.** Brand gradient is for warmth and intent; AI gradient is for the magic moment. Mixing them muddies both.

## Typography

| Role | Family | Notes |
| --- | --- | --- |
| Editorial display | **Fraunces** (variable) | High optical size for headlines, low for captions. Soft, characterful, not a tech serif. |
| UI / body | `-apple-system`, `"SF Pro Text"`, `"SF Pro Display"` | Authentic iOS feel. |
| Code / prompt | **JetBrains Mono** | Used only when showing the raw prompt of a style. |

Type rules:

- Style names are **always** set in Fraunces. Italic when next to a sample image. Roman when in a list.
- System UI text (buttons, settings, navigation) is **always** SF.
- All-caps treatments use letter-spacing 0.18em and SF Pro Display semibold — used for category eyebrows ("EDITORIAL · AGGRESSIVE"), nothing else.

## Motion language

iOS 26 motion is anchored in **spring physics, not eased curves.** Three signature moments:

1. **Shutter press → transform reveal.** The captured frame stays in place; an AI-gradient shimmer rolls across it diagonally over 1500ms (the mocked API delay); the after image cross-dissolves in underneath, then a drag handle slides up from the bottom. Total: ~1.8s. This is the most important motion in the app.
2. **Style chip switch.** Tap the chip at the top of the viewfinder; the chip's cyan stroke dims, the new style name fades up from below the chip line height with a 60ms stagger per letter. <300ms.
3. **Marketplace card hover** (or long-press on iOS). The before image cross-fades to the after image with a 200ms diagonal wipe. Releasing snaps back.

Reduced motion: shimmer becomes a fade; the cross-fades become instant cuts; the stagger collapses to a single fade.

## Spatial composition

- **Camera and library:** edge-to-edge content, zero chrome inside the safe area. Controls float on Liquid Glass.
- **Marketplace:** asymmetric editorial grid. The featured style breaks the grid; the others sit in a 2-column scroll below. Don't be afraid of negative space.
- **Style detail:** long-scroll narrative. Hero image full-bleed at the top; the style name and tagline overlay the image lower-left in Fraunces; before/after pairs stack vertically with generous breathing room (96px between pairs); the prompt and metadata sit at the bottom in a monospace card.
- **Settings:** centered single column, max-width 560px on iPad. The kind of settings screen that feels expensive.

## Liquid Glass — the recipe

The single most important visual detail. A canonical glass surface is three layers:

```css
.glass {
  /* 1. Translucent fill — content shows through */
  background:
    linear-gradient(180deg, rgba(255,255,255,0.10) 0%, rgba(255,255,255,0.04) 100%);

  /* 2. Backdrop blur — content underneath blurs and saturates */
  backdrop-filter: blur(32px) saturate(180%);
  -webkit-backdrop-filter: blur(32px) saturate(180%);

  /* 3. Edge highlight — 1px gradient stroke, brighter on top */
  border: 1px solid transparent;
  background-clip: padding-box;
  position: relative;
}
.glass::after {
  /* Specular highlight on the top edge */
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  padding: 1px;
  background: linear-gradient(180deg, rgba(255,255,255,0.40), rgba(255,255,255,0.06));
  -webkit-mask:
    linear-gradient(#000 0 0) content-box,
    linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  pointer-events: none;
}
```

The blur radius scales with elevation: **16px** for chips, **32px** for sheets, **48px** for full-screen modals.

## Imagery & sample photos

Mockups use Unsplash photos rendered at two states: a "before" with CSS filters dialed slightly down (`saturate(0.88) contrast(0.94) brightness(0.96)`) and an "after" with filters dialed up (`saturate(1.12) contrast(1.08) brightness(1.02)` and a subtle warm tint). For aggressive styles (Restage, Dreamscape) the "after" uses a visibly different photo entirely — that's the bet.

## Accessibility

- All interactive glass surfaces have a solid-fill `prefers-contrast: more` fallback (`rgba(0,0,0,0.85)` with `--glass-stroke` upgraded to `rgba(255,255,255,0.4)`).
- All animations respect `prefers-reduced-motion`.
- Hit targets are minimum 44×44px.
- Style names in the marketplace are real text, not baked into images, so they're screen-reader-readable.

## What this design is *not*

- Not a "purple gradient on white" SaaS dashboard.
- Not a glossy gen-AI marketing page with floating orbs.
- Not Material Design with a few blurs sprinkled on.
- Not afraid of black backgrounds.

It is a camera. The photo is the hero. Everything else gets out of the way until you ask it to step forward.
