---
name: Picoko
tagline: Warm-white canvas, weight-900 Outfit, and one blazing pink — product photography reimagined in seconds.
updated_at: 2026-05-28T23:37:00.340Z
published_at: 2026-05-28T23:37:00.340Z
author: webdesignhot
source_url: https://www.picoko.com
spec: webdesignhot/0.1
quality: curated
featured: false
categories: [ai, saas, ecommerce]
tags: [ai, ecommerce, product-photography, saas, freemium, playful, warm, geometric, pill-cta]
preview_swatch: ['#fbfaf8', '#fe1c71', '#121110']
related: [krea]
description: 'Picoko is an AI product-photography and video SaaS for e-commerce sellers — generate studio-quality product shots, on-model images, and background-edited scenes in seconds, ready for Shopify, Amazon, and TikTok Shop. The canvas is a warm near-white `#fbfaf8`; the single chromatic signature is a blazing hot-magenta-pink `#fe1c71`, used for every primary CTA. Display type is **Outfit** at 72px / weight 900 — unapologetically heavy, instantly joyful. Radii run from 8px on nav chips to 32px pill CTAs, landing the brand in a playful-yet-confident SaaS register. Picoko ships a light + dark theme toggle; the default probed surface is light. The product is a sibling brand in the WebDesignHot portfolio.'


# Canonical 8-role aliases (bg / text / brand / border / accent / muted / surface / danger).
# Maps role names to this entry's actual token names so role-aware
# downstream tools resolve `theme.background` → entry's `bg`, etc.
# Auto-generated by scripts/add-aliases.mjs — do not edit manually;
# regenerate after changing color token names.
aliases:
  background: bg
  foreground: text
  primary: brand
  primary-foreground: on-brand
  muted: text-muted
  border: border
  ring: border-strong
themes:
  default: light
  available: [light, dark]
  switch-via: 'Toggle button in the nav persists preference to localStorage; OS prefers-color-scheme is the initial fallback. data-theme attribute on <html> drives all CSS custom property swaps.'

colors:
  light:
    bg: '#fbfaf8'                  # warm near-white canvas — live-probed authoritative
    bg-alt: '#f5f3f0'              # slightly deeper warm-white for inset zones
    surface: '#ffffff'             # pure white cards on warm-white ground
    surface-soft: '#f9f8f6'        # feather-light panel surface
    surface-elevated: '#ffffff'    # raised popover / modal
    text: '#121110'                # near-black — live-probed
    text-strong: '#0a0909'         # deepest black for hero display
    text-muted: '#6b6663'          # warm mid-grey captions
    text-soft: '#9c9793'           # quiet helper labels
    text-faint: '#c3bfbb'          # disabled, placeholder echo
    brand: '#fe1c71'               # hot magenta-pink — live-probed; THE signature CTA colour
    brand-deep: '#e5005c'          # pressed / active state — ~12% darker
    brand-soft: 'rgba(254, 28, 113, 0.10)' # pink wash for badges, hover tints
    on-brand: '#ffffff'            # white text on pink CTA
    link: '#121110'                # inline links stay near-black in light mode
    link-hover: '#fe1c71'          # brand pink on hover
    selected-bg: 'rgba(254, 28, 113, 0.08)' # selected nav / filter chip
    disabled: '#c3bfbb'            # faint warm-grey disabled
    border: 'rgba(18, 17, 16, 0.08)'       # 8% near-black hairline — warm tinted
    border-strong: 'rgba(18, 17, 16, 0.16)'
    border-subtle: 'rgba(18, 17, 16, 0.04)'
    border-brand: 'rgba(254, 28, 113, 0.30)' # pink ring on focused inputs
    success-bg: 'rgba(34, 197, 94, 0.10)'
    success-text: '#15803d'
    warning-bg: 'rgba(234, 179, 8, 0.12)'
    warning-text: '#a16207'
    danger-bg: 'rgba(239, 68, 68, 0.10)'
    danger-text: '#b91c1c'
    info-bg: 'rgba(254, 28, 113, 0.08)'
    info-text: '#c0004e'

  dark:
    # Derived inversion — Picoko's dark mode was not deep-probed; these are principled
    # counterparts: near-black warm canvas, near-white text, same #fe1c71 brand pink.
    bg: '#0d0c0b'                  # near-black warm canvas (derived)
    bg-alt: '#171614'              # slightly lighter alternative ground
    surface: '#1f1e1c'             # warm-dark raised card
    surface-soft: '#272523'        # panel surface
    surface-elevated: '#2e2c2a'    # popover / modal
    text: '#f5f4f2'                # near-white on dark (derived)
    text-strong: '#ffffff'
    text-muted: '#9c9793'          # warm mid-grey
    text-soft: '#6b6663'
    text-faint: '#3d3b39'          # disabled
    brand: '#fe1c71'               # same hot pink — invariant across themes
    brand-deep: '#e5005c'
    brand-soft: 'rgba(254, 28, 113, 0.15)'
    on-brand: '#ffffff'
    link: '#f5f4f2'
    link-hover: '#fe1c71'
    selected-bg: 'rgba(254, 28, 113, 0.12)'
    disabled: '#3d3b39'
    border: 'rgba(245, 244, 242, 0.08)'
    border-strong: 'rgba(245, 244, 242, 0.16)'
    border-subtle: 'rgba(245, 244, 242, 0.04)'
    border-brand: 'rgba(254, 28, 113, 0.40)'
    success-bg: 'rgba(34, 197, 94, 0.12)'
    success-text: '#86efac'
    warning-bg: 'rgba(234, 179, 8, 0.12)'
    warning-text: '#fde047'
    danger-bg: 'rgba(239, 68, 68, 0.12)'
    danger-text: '#fca5a5'
    info-bg: 'rgba(254, 28, 113, 0.10)'
    info-text: '#ff7aad'

typography:
  display:
    family: '"Outfit", ui-sans-serif, system-ui, -apple-system, sans-serif'
    weights: [400, 500, 600, 700, 800, 900]
    opentype-features: ['kern', 'liga']
  body:
    family: '"Outfit", ui-sans-serif, system-ui, -apple-system, sans-serif'
    weights: [400, 500, 600]
    opentype-features: ['kern']
  mono:
    family: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace'
    weights: [400, 500]
    opentype-features: ['tnum', 'zero']
  scale:
    display-hero:    { size: 72, weight: 900, lineHeight: 1.0,  tracking: '-0.03em',  family: display, opentype: 'kern liga', notes: 'Hero h1 — live-probed 72px / 900; "Get studio-quality product photos in seconds"' }
    display-lg:      { size: 56, weight: 800, lineHeight: 1.05, tracking: '-0.025em', family: display, opentype: 'kern liga' }
    h1:              { size: 48, weight: 800, lineHeight: 1.08, tracking: '-0.02em',  family: display }
    h2:              { size: 36, weight: 700, lineHeight: 1.15, tracking: '-0.015em', family: display }
    h3:              { size: 28, weight: 700, lineHeight: 1.2,  tracking: '-0.01em',  family: display }
    h4:              { size: 22, weight: 600, lineHeight: 1.3,  tracking: '-0.005em', family: display }
    h5:              { size: 18, weight: 600, lineHeight: 1.35, tracking: '0',        family: display }
    eyebrow:         { size: 12, weight: 600, lineHeight: 1.4,  tracking: '0.1em',   family: display, transform: uppercase }
    body-large:      { size: 18, weight: 400, lineHeight: 1.6,  tracking: '0',        family: body }
    body:            { size: 16, weight: 400, lineHeight: 1.55, tracking: '0',        family: body }
    body-medium:     { size: 16, weight: 500, lineHeight: 1.5,  tracking: '0',        family: body, notes: 'UI body emphasis — nav links, card labels' }
    body-small:      { size: 14, weight: 400, lineHeight: 1.5,  tracking: '0',        family: body }
    label:           { size: 13, weight: 500, lineHeight: 1.4,  tracking: '0',        family: body }
    caption:         { size: 12, weight: 500, lineHeight: 1.4,  tracking: '0.02em',  family: body }
    caption-tabular: { size: 12, weight: 500, lineHeight: 1.4,  tracking: '0',        family: mono, opentype: 'tnum' }
    code:            { size: 13, weight: 400, lineHeight: 1.55, tracking: '0',        family: mono, opentype: 'tnum zero' }

radius:
  micro: 2
  sm: 4
  md: 8
  lg: 16
  xl: 24
  card: 16
  modal: 16
  pill: 32
  full: 9999

spacing:
  base: 4
  scale: [0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 160]

layout:
  page-width: 1280
  prose-width: 720
  site-gutter: 'clamp(20px, 4vw, 56px)'
  header-height: 64
  grid-columns: 12
  hero-layout: 'left headline + right before-after image panel; split ~55/45 on desktop'
  section-rhythm: '80-128px'

components:
  button-primary:
    background: '#fe1c71'
    text: '#ffffff'
    padding: '12px 28px'
    radius: 32
    border: 'none'
    font: 'Outfit 600 / 16px'
    hover-bg: '#e5005c'
    active-bg: '#cc0052'
    focus-ring: '0 0 0 3px rgba(254, 28, 113, 0.35)'
    use: 'Primary CTA — pill shape 32px radius; "Get started", "Try for free", "Generate now".'
  button-secondary:
    background: 'transparent'
    text: '#121110'
    padding: '12px 28px'
    radius: 32
    border: '1.5px solid rgba(18, 17, 16, 0.20)'
    font: 'Outfit 600 / 16px'
    hover-bg: 'rgba(18, 17, 16, 0.05)'
    hover-border: 'rgba(18, 17, 16, 0.35)'
    use: 'Outline twin — pill shape, near-black border. "See how it works", "Compare plans".'
  button-ghost:
    background: 'transparent'
    text: '#121110'
    padding: '8px 16px'
    radius: 8
    font: 'Outfit 500 / 15px'
    hover-bg: 'rgba(18, 17, 16, 0.05)'
    use: 'Quiet utility — nav links, inline secondary actions, footer links.'
  button-icon:
    background: '#ffffff'
    text: '#121110'
    padding: '10px'
    radius: 8
    border: '1px solid rgba(18, 17, 16, 0.10)'
    font: 'Outfit 500 / 14px'
    hover-bg: '#f5f3f0'
    use: 'Icon-only trigger — zoom controls on before-after panels, social share.'
  card:
    background: '#ffffff'
    border: '1px solid rgba(18, 17, 16, 0.08)'
    radius: 16
    padding: '24px'
    shadow: 'rgba(18, 17, 16, 0.06) 0 2px 12px'
    use: 'Feature card, pricing tier, testimonial block — white lift on warm-white canvas.'
  card-before-after:
    background: '#ffffff'
    border: '1px solid rgba(18, 17, 16, 0.10)'
    radius: 16
    padding: '0'
    aspect-ratio: '1 / 1'
    use: 'Before / after image comparison panel — hero and feature sections; images bleed to radius.'
  input:
    background: '#ffffff'
    border: '1px solid rgba(18, 17, 16, 0.16)'
    radius: 8
    padding: '10px 14px'
    font: 'Outfit 400 / 16px'
    placeholder-color: '#9c9793'
    focus-ring: '0 0 0 3px rgba(254, 28, 113, 0.20)'
    focus-border: '#fe1c71'
    use: 'Sign up, onboarding, settings fields.'
  badge-pill:
    background: 'rgba(254, 28, 113, 0.10)'
    text: '#c0004e'
    padding: '4px 12px'
    radius: 9999
    font: 'Outfit 600 / 12px'
    use: '"Free plan", "New", "Beta" — brand-pink wash, dark-pink text.'
  badge-neutral:
    background: 'rgba(18, 17, 16, 0.06)'
    text: '#6b6663'
    padding: '4px 10px'
    radius: 9999
    font: 'Outfit 500 / 12px'
    use: 'Platform tag: "Shopify", "Amazon", "TikTok Shop".'
  nav-link:
    background: 'transparent'
    text: '#121110'
    padding: '6px 12px'
    radius: 8
    font: 'Outfit 500 / 15px'
    hover-bg: 'rgba(18, 17, 16, 0.05)'
    active-bg: 'rgba(254, 28, 113, 0.08)'
    active-text: '#fe1c71'

motion:
  ease-standard: 'cubic-bezier(0.4, 0, 0.2, 1)'
  ease-emphasized: 'cubic-bezier(0.2, 0, 0, 1)'
  ease-spring: 'cubic-bezier(0.34, 1.56, 0.64, 1)'
  duration-fast: 120
  duration-standard: 200
  duration-slow: 320
  duration-page: 400
  reduced-motion: 'respects prefers-reduced-motion: reduce — all transforms collapse to opacity-only; before-after drag disables animation; durations halve.'

breakpoints:
  mobile: 640
  tablet: 1024
  desktop: 1280
  wide: 1536

shadows:
  none: 'none'
  ambient: 'rgba(18, 17, 16, 0.05) 0 1px 3px'
  standard: 'rgba(18, 17, 16, 0.08) 0 4px 16px'
  elevated: 'rgba(18, 17, 16, 0.12) 0 8px 32px -4px'
  modal: 'rgba(18, 17, 16, 0.20) 0 20px 48px -8px'
  ring: '0 0 0 3px rgba(254, 28, 113, 0.25)'

accessibility:
  contrast-text-on-bg: 12.6       # #121110 on #fbfaf8 — AAA
  contrast-text-muted-on-bg: 5.1  # #6b6663 on #fbfaf8 — AA at body sizes
  contrast-brand-on-bg: 3.3       # #fe1c71 on #fbfaf8 — AA large / UI; FAIL at small body text
  contrast-white-on-brand: 3.3    # #ffffff on #fe1c71 — AA large only; use for CTAs ≥18px or bold ≥14px
  contrast-text-on-surface: 13.2  # #121110 on #ffffff — AAA
  focus-ring: '0 0 0 3px rgba(254, 28, 113, 0.35) — pink ring with 2px offset on all interactive elements'
  reduced-motion-honored: true
  keyboard-nav: 'tab order: skip-link → masthead → primary CTA → before-after panel controls → pricing → footer; Esc dismisses modals and dropdowns.'
  prose-line-length: 'capped at 720px on text pages.'

dark-mode: optional               # light is default; dark toggle ships in the nav.
colors-dark: see colors.dark      # derived inversion with invariant brand pink #fe1c71.

lineage:
  summary: 'Picoko inherits the joyful-SaaS playbook that Luma, Framer, and early Linear refined: geometric sans at maximum weight, a single electric brand colour reserved entirely for primary actions, and a warm near-white canvas that reads approachable rather than corporate. The 32px pill CTA is the same shape language used across modern B2C SaaS (Notion, Pitch, Framer). Outfit as the type system — Google Fonts'' rounded geometric grotesque — places Picoko closer to consumer fintech and lifestyle apps than to the austere design-tool register of Krea or Linear. The before-after image slider is lifted from photography and image-editing SaaS playbooks (Luminar, Canva). What Picoko rejects: dark canvases, monochrome restraint, editorial neutrality, and AI-tech purple gradients. It leans into warm, bright, and fast.'
  influences:
    - name: Krea
      role: AI image-generation SaaS peer; similar single-accent discipline applied to opposite palette (dark → light)
      url: https://krea.ai
    - name: Midjourney
      role: Reference for AI image-generation brand positioning and before-after showcase patterns
      url: https://www.midjourney.com
    - name: Shopify
      role: Primary distribution platform for Picoko''s end-customers; Polaris design language informs e-commerce UI conventions
      url: https://www.shopify.com
    - name: Outfit (Google Fonts)
      role: The display and body typeface — geometric grotesque with rounded stems; chosen for friendly-SaaS warmth at heavy weights
      url: https://fonts.google.com/specimen/Outfit
    - name: Framer
      role: Modern playful-SaaS aesthetic reference — pill CTAs, warm canvas, heavy geometric sans, freemium conversion UX
      url: https://www.framer.com
    - name: Canva
      role: Before-after image comparison interaction patterns; approachable creative-tool register for non-designer e-commerce sellers
      url: https://www.canva.com
---

## 1. Visual Theme & Atmosphere

Picoko opens on a warm near-white canvas — `#fbfaf8`, a shade of off-white with just enough warmth to avoid clinical sterility. Against that ground, pure white cards (`#ffffff`) feel slightly lifted rather than flat, the difference between a studio wall and a sheet of paper. The headline is set in **Outfit** at 72px / weight 900, tracking at -0.03em — unapologetically heavy, a shout not a whisper. "Get studio-quality product photos in seconds." The type doesn't hedge; neither does the product.

The single chromatic moment is `#fe1c71` — a blazing hot magenta-pink that reads like neon on warm white. It belongs exclusively to primary CTAs and brand marks. Nothing else on the page is pink. The discipline is intentional: by quarantining the colour, every appearance of `#fe1c71` reads as an invitation to act. Picoko is solving the e-commerce seller's oldest problem — product photography is slow, expensive, and requires equipment nobody has — so the brand needs to feel fast, confident, and slightly electric. The pink delivers that in a 50×50px swatch.

The hero layout is a split composition: a left column carries the headline, sub-headline, and a 32px pill primary CTA; the right side is a before-after image comparison panel with a 16px radius, showing the transformation from a snapshot to a polished studio shot. The before-after reveal is the product's thesis made visible in a single scroll-above-the-fold moment. Radii move from 8px on nav chips to 16px on cards and comparison panels, finally to 32px on pill CTAs — a deliberate escalation that maps visual importance to roundness.

The page flows through a series of clean white-card feature blocks sitting on the warm canvas, each section separated by generous vertical rhythm (80–128px). Platform badges — "Shopify", "Amazon", "TikTok Shop" — appear as neutral pill tags. Testimonial cards use the standard white-surface pattern. Pricing tiers sit on white cards with a brand-pink border on the featured tier. Throughout, the warm canvas does the connective tissue work; the white surfaces do the lifting.

Dark mode inverts the canvas to near-black (`#0d0c0b`, warm-tinted to match the light palette's temperature) and the body copy to near-white (`#f5f4f2`). The brand pink `#fe1c71` is invariant — it doesn't need to change, because the contrast ratio on both backgrounds is sufficient for CTAs (large text / UI) and the electric quality is the point regardless of theme.

**Key Characteristics**
- Warm near-white canvas `#fbfaf8` — not paper-white, not cold grey, a considered warmth
- Single brand accent `#fe1c71` — hot magenta-pink, reserved exclusively for primary CTAs and brand marks
- Outfit at 72px / weight 900 — heavy geometric grotesque; the loudest headline in the SaaS tier
- 32px pill primary CTAs — the signature shape, consumer-SaaS register
- 16px card and panel radius — before-after comparison panels, feature cards, pricing tiers
- 8px nav-chip radius — smaller, tighter, purposeful
- Before-after image slider hero — the product thesis demonstrated at first scroll
- White-surface cards on warm canvas — subtle lift without shadows at rest
- Light-first with a genuine dark mode toggle — both themes carry the brand pink
- Platform-badge vocabulary — "Shopify / Amazon / TikTok Shop" tags anchor the e-commerce context

## 2. Color Palette & Roles

### Primary

- **bg** `#fbfaf8` — warm near-white canvas; live-probed. The slightly warm tint — not `#ffffff`, not `#f5f5f5` — is the canvas temperature that makes pure white cards feel lifted without shadows.
- **text** `#121110` — near-black body copy; live-probed. Warm-shifted slightly from neutral `#111111`.
- **surface** `#ffffff` — pure white cards, panels, and comparison frame. Sits visibly above the `#fbfaf8` canvas.
- **bg-alt** `#f5f3f0` — slightly deeper warm-white for inset zones, footer bands, and subtle section dividers.

### Brand & Accent

- **brand** `#fe1c71` — hot magenta-pink; THE signature colour. Primary CTAs only. Do not use as a background fill larger than a button or badge.
- **brand-deep** `#e5005c` — pressed / active state; approximately 12% darker in perceived value, maintains the pink family.
- **brand-soft** `rgba(254, 28, 113, 0.10)` — pink wash for badge backgrounds, hover tints on selected nav items.
- **on-brand** `#ffffff` — white text on pink CTAs; 3.3:1 contrast (AA large / UI, flag for small text — see Section 9).

### Interactive

- **link** `#121110` — inline links match body copy in light mode; underlined for affordance.
- **link-hover** `#fe1c71` — brand pink on hover; the only chromatic shift in inline copy.
- **selected-bg** `rgba(254, 28, 113, 0.08)` — active nav state, selected filter chip.
- **disabled** `#c3bfbb` — faint warm-grey for disabled inputs and buttons.

### Neutral Scale (Warm-tinted)

- **#121110** — near-black body copy.
- **#6b6663** — warm mid-grey for captions, helper text.
- **#9c9793** — quiet labels, placeholder copy.
- **#c3bfbb** — disabled, faint echo text.
- **#e5e2de** — light warm-grey hairlines and dividers.
- **#f5f3f0** — alt canvas, inset zones.
- **#fbfaf8** — canvas ground.
- **#ffffff** — surface (card, panel).

All neutral steps are warm-tinted (red channel ≥ blue channel) to maintain palette cohesion with the warm canvas and the pink brand.

### Surface & Borders

- **surface-0 (canvas)** — `#fbfaf8` warm near-white.
- **surface-1 (card)** — `#ffffff` pure white.
- **surface-2 (elevated)** — `#ffffff` + `rgba(18, 17, 16, 0.08) 0 4px 16px` shadow.
- **border** — `rgba(18, 17, 16, 0.08)` — 8% near-black hairline, warm-tinted.
- **border-strong** — `rgba(18, 17, 16, 0.16)` — emphasized rule, inputs at rest.
- **border-brand** — `rgba(254, 28, 113, 0.30)` — focus ring on inputs.

### Shadow Colors

Picoko's shadows use warm near-black at low opacity. The warm canvas absorbs shadows gently, so elevation is read primarily as surface step (`#fbfaf8` → `#ffffff`) plus a subtle blur for floating elements. Brand-pink shadows are not used; the pink stays in fills.

### Semantic

- **success** — bg `rgba(34, 197, 94, 0.10)`, text `#15803d` (green-700 on light).
- **warning** — bg `rgba(234, 179, 8, 0.12)`, text `#a16207` (amber-700 on light).
- **danger** — bg `rgba(239, 68, 68, 0.10)`, text `#b91c1c` (red-700 on light).
- **info** — bg `rgba(254, 28, 113, 0.08)`, text `#c0004e` — borrows the brand pink at low saturation.

## 3. Typography Rules

### Font Family

- **Display & Body**: `"Outfit", ui-sans-serif, system-ui, -apple-system, sans-serif` — Google Fonts' geometric grotesque. Outfit has rounded stems and open apertures that read as friendly and confident; at weight 900 it is explosive; at 400 it is clean and legible. One family carries the entire system.
- **Mono**: `ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace` — for numeric data in pricing tables, file size stats, and rare inline code.
- **OpenType features**: `kern` and `liga` always enabled. `tnum` (tabular figures) and `zero` enabled in mono.

### Hierarchy

| Role | Font | Size | Weight | Line Height | Letter Spacing | Notes |
|---|---|---|---|---|---|---|
| Display Hero | Outfit | 72px | 900 | 1.0 | -0.03em | Live-probed hero h1; "in seconds" punchline |
| Display LG | Outfit | 56px | 800 | 1.05 | -0.025em | Section hero headlines |
| H1 | Outfit | 48px | 800 | 1.08 | -0.02em | Page-level title |
| H2 | Outfit | 36px | 700 | 1.15 | -0.015em | Major section heading |
| H3 | Outfit | 28px | 700 | 1.2 | -0.01em | Feature group heading |
| H4 | Outfit | 22px | 600 | 1.3 | -0.005em | Card heading, pricing tier name |
| H5 | Outfit | 18px | 600 | 1.35 | 0 | Sub-card heading, nav section label |
| Eyebrow | Outfit | 12px | 600 | 1.4 | 0.1em | Uppercase pre-label: "FOR SHOPIFY SELLERS" |
| Body Large | Outfit | 18px | 400 | 1.6 | 0 | Hero lede, feature sub-headline |
| Body | Outfit | 16px | 400 | 1.55 | 0 | Default body copy |
| Body Medium | Outfit | 16px | 500 | 1.5 | 0 | UI body — nav links, card labels |
| Body Small | Outfit | 14px | 400 | 1.5 | 0 | Compact UI, helper text |
| Label | Outfit | 13px | 500 | 1.4 | 0 | Form labels, table headers |
| Caption | Outfit | 12px | 500 | 1.4 | 0.02em | Image captions, footnotes |
| Caption Tabular | mono | 12px | 500 | 1.4 | 0 | Price numbers, credit counts |
| Code | mono | 13px | 400 | 1.55 | 0 | Rare inline code |

### Principles

- **Weight 900 at 72px is the brand's loudest statement.** Outfit at black weight is unusual in SaaS — most brands cap at 700. Picoko uses it to signal that the product does something dramatic (transforming amateur snaps into studio shots).
- **Single-family discipline.** Outfit from eyebrow to body caption — no mixing with a serif or secondary sans. Consistency is the brand's quiet confidence.
- **Negative tracking only at display sizes.** -0.03em at 72px, tapering to 0 by h4. Below h4, tracking is neutral or slightly open for captions.
- **Optical sizing matters at 900.** At maximum weight, letter spacing must be tighter than the font's default — the -0.03em on the hero prevents the glyphs from feeling crowded against the heavy strokes.
- **400 body, never lighter.** Outfit at 300 loses the brand's warmth and reads as generic. Body stays at 400; UI emphasis steps to 500.
- **Eyebrow at 0.1em tracking.** Wider than most SaaS peers (0.05–0.08em) — the extra air at 12px makes the all-caps label feel designed rather than defaulted.
- **Mono only for numeric data.** Credit counts, file sizes, pricing figures benefit from `tnum` (tabular figures) to align columns; body numbers use Outfit's default proportional figures.
- **No italics in display.** Italic weight is reserved for inline body emphasis and testimonial quotes. Never in headlines or CTAs.

## 4. Component Stylings

### Buttons

**Primary (Hot Pink Pill)**
- Background: `#fe1c71`. Text: `#ffffff`, Outfit 600 / 16px.
- Padding: `12px 28px`. Radius: `32px` (pill). No border.
- Hover: bg → `#e5005c`; transition `200ms ease-standard`.
- Active: bg → `#cc0052`.
- Focus: `0 0 0 3px rgba(254, 28, 113, 0.35)`.
- Use: Every primary CTA — *Get started, Try for free, Generate now, See plans.* The pill shape is non-negotiable.

**Secondary (Outline Pill)**
- Background: transparent. Text: `#121110`, Outfit 600 / 16px.
- Border: `1.5px solid rgba(18, 17, 16, 0.20)`.
- Padding: `12px 28px`. Radius: `32px` (pill).
- Hover: bg → `rgba(18, 17, 16, 0.05)`, border → `rgba(18, 17, 16, 0.35)`.
- Focus: `0 0 0 3px rgba(18, 17, 16, 0.15)`.
- Use: Twin to primary — *See how it works, Watch demo, Compare plans.*

**Ghost (Quiet)**
- Background: transparent. Text: `#121110`, Outfit 500 / 15px.
- Padding: `8px 16px`. Radius: `8px`. No border.
- Hover: bg → `rgba(18, 17, 16, 0.05)`.
- Use: Nav links, inline secondary actions, footer utility links.

**Icon Button**
- Background: `#ffffff`. Text/icon: `#121110`.
- Padding: `10px`. Radius: `8px`. Border: `1px solid rgba(18, 17, 16, 0.10)`.
- Hover: bg → `#f5f3f0`.
- Use: Before-after panel zoom, social share, copy, close.

### Cards

**Feature Card**
- Background: `#ffffff`. Border: `1px solid rgba(18, 17, 16, 0.08)`. Radius: `16px`. Padding: `24px`.
- Shadow: `rgba(18, 17, 16, 0.06) 0 2px 12px` at rest; `rgba(18, 17, 16, 0.10) 0 6px 24px` on hover.
- Use: Capability tiles, feature highlights, platform icons.

**Before-After Panel**
- Background: `#ffffff`. Border: `1px solid rgba(18, 17, 16, 0.10)`. Radius: `16px`. Padding: `0`.
- Aspect ratio: `1 / 1` on square product images; `4 / 3` on scene-mode wider shots.
- Images bleed to the 16px corner radius. Drag handle is brand pink.
- Use: Hero and feature-section image comparison — the product's primary demonstration.

**Pricing Card**
- Background: `#ffffff`. Radius: `16px`. Padding: `28px 24px`.
- Default: border `1px solid rgba(18, 17, 16, 0.08)`.
- Featured: border `2px solid #fe1c71`; optional brand-pink eyebrow "Most popular".
- Shadow on featured: `rgba(254, 28, 113, 0.12) 0 8px 32px -4px`.

**Testimonial Card**
- Background: `#ffffff`. Border: `1px solid rgba(18, 17, 16, 0.06)`. Radius: `16px`. Padding: `20px 24px`.
- Avatar: 40px circle. Quote text: Outfit 400 / 16px in `#121110`. Attribution: Outfit 500 / 13px in `#6b6663`.

### Badges, Tags, Pills

**Brand Badge** — bg `rgba(254, 28, 113, 0.10)`, text `#c0004e`, Outfit 600 / 12px, padding `4px 12px`, radius `9999`. Use: "Free plan", "New", "Beta".

**Neutral Tag** — bg `rgba(18, 17, 16, 0.06)`, text `#6b6663`, Outfit 500 / 12px, padding `4px 10px`, radius `9999`. Use: Platform names — "Shopify", "Amazon", "TikTok Shop".

**Eyebrow Label** — no chrome; Outfit 600 / 12px / uppercase / 0.1em tracking, colour `#9c9793`. Use: Section pre-label ("TRUSTED BY 10,000+ SELLERS").

### Inputs / Forms

**Text Input**
- Background: `#ffffff`. Border: `1px solid rgba(18, 17, 16, 0.16)`. Radius: `8px`. Padding: `10px 14px`.
- Font: Outfit 400 / 16px. Placeholder: `#9c9793`.
- Focus: `0 0 0 3px rgba(254, 28, 113, 0.20)` ring; border → `#fe1c71`.
- Error: border → `#b91c1c`, helper text in `#b91c1c` below.
- Use: Sign-up email, onboarding fields, settings.

**Select / Dropdown**
- Same appearance as text input at rest.
- Open: `#ffffff` bg, `1px solid rgba(18, 17, 16, 0.12)` border, `16px` radius on the dropdown panel.
- Option hover: bg → `rgba(254, 28, 113, 0.06)`.

### Navigation

- Header height `64px`. Background `rgba(251, 250, 248, 0.90)` with `backdrop-filter: blur(16px)` — lets the warm canvas bleed through on scroll.
- Logo: Picoko wordmark in `#121110`, Outfit 700.
- Nav links: Outfit 500 / 15px, colour `#121110`, padding `6px 12px`, radius `8px`. Hover: bg → `rgba(18, 17, 16, 0.05)`.
- Right-side: ghost "Sign in" + brand pink pill "Get started" (Outfit 600 / 15px).
- Mobile (<640px): hamburger collapses nav to a full-height sheet; links stack at 18px / 600. CTA remains visible at bottom of sheet.

### Optional Components

**Dropdown Menu** — bg `#ffffff`, border `1px solid rgba(18, 17, 16, 0.08)`, radius `12px`, shadow `rgba(18, 17, 16, 0.12) 0 8px 24px -4px`. Items: Outfit 400 / 15px, hover bg `rgba(254, 28, 113, 0.06)`.

**Tooltip** — bg `#121110`, text `#ffffff`, radius `6px`, padding `6px 10px`, font Outfit 500 / 12px.

**Toast** — bg `#ffffff`, border `1px solid rgba(18, 17, 16, 0.10)`, radius `10px`, padding `12px 16px`, shadow `rgba(18, 17, 16, 0.12) 0 6px 24px -4px`. Icon-left pattern: success green, warning amber, error red.

**Modal** — bg `#ffffff`, radius `16px`, shadow `rgba(18, 17, 16, 0.20) 0 20px 48px -8px`, max-width `540px`. Backdrop: `rgba(18, 17, 16, 0.50)`. Brand-pink close button on destructive actions.

## 5. Layout Principles

### Spacing System

- **Base unit**: 4px.
- **Scale**: 0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 160.
- **Density**: Chrome-level spacing is medium-dense (64–96px section rhythm); within-card spacing is tight (16–24px). The page reads approachable, not airy — a SaaS tool that respects the seller's time.

### Grid & Container

- **Page max width**: `1280px` — standard SaaS frame.
- **Site gutter**: `clamp(20px, 4vw, 56px)` — comfortable on all viewports.
- **Grid**: 12 columns with 24px gutters on desktop; collapses to 4 columns on tablet, 1 column on mobile.
- **Hero layout**: 55/45 left/right split — headline and CTA left, before-after panel right. Below tablet, stacks vertically: headline → CTA → comparison panel.
- **Prose width**: 720px maximum on text-heavy sections.

### Whitespace Philosophy

Picoko's whitespace is **purposeful but not sparing**. Section rhythm runs 80–128px between major blocks — generous enough to let each section breathe and register, tight enough to maintain urgency (the product is fast; the page should feel fast). Card padding is consistently 24px. Internal card spacing is 16px between elements. The warm canvas creates visual air even when spacing is moderate.

### Section Cadence

- Hero (split headline + before-after panel) → Platform logos band (Shopify, Amazon, TikTok Shop) → How it works (3-step feature ladder) → Before-after gallery grid → Testimonials (card strip) → Pricing (3-tier cards) → Final CTA band (pink-accented) → Footer.
- The page alternates between warm-canvas ground and white-card clusters. Section breaks use vertical space; no horizontal rules. The pink CTA band near the footer uses `#fe1c71` as a background — one of the rare instances where the brand colour fills a full-width surface (using `#ffffff` text above it).

## 6. Shapes & Radius Scale

| Tier | Value | Use |
|---|---|---|
| Micro | 2px | Decorative dividers, progress bar caps |
| Standard (sm) | 4px | Small badges, compact chips, tag inner radius |
| Comfortable (md) | 8px | Nav links, icon buttons, text inputs, dropdowns |
| Featured (lg) | 16px | Cards, comparison panels, pricing tiers, modals |
| Large (xl) | 24px | Hero panels on wide viewports, pricing featured highlight |
| Pill (CTAs) | 32px | Primary and secondary call-to-action buttons — the signature |
| Full | 9999px | Avatar circles, status dots, badge-neutral pills |

Picoko's signature shape tension is the **contrast between 8px utility elements and 32px pill CTAs**. The nav links and inputs sit at 8px — functional, unobtrusive. The moment you look at a CTA, the 32px pill asserts "this is the action." Cards at 16px sit in the middle register: friendly but structured. The before-after comparison panels also use 16px — the image content is editorial, not form-field utility.

There are no zero-radius surfaces at any user-visible level. Even progress bars cap their ends at `9999px`. The brand has committed to roundness as a signal of approachability — a deliberate contrast to the sharp-cornered default of Shopify admin and Amazon Seller Central, where Picoko's users spend their day.

## 7. Depth & Elevation

| Level | Treatment | Use |
|---|---|---|
| 0 | Flat — canvas `#fbfaf8` | Page background, hero ground |
| 1 | Surface step — `#ffffff` | Cards, comparison panels, nav bar (no shadow) |
| 2 | `rgba(18,17,16,0.06) 0 2px 12px` | Default card shadow at rest |
| 3 | `rgba(18,17,16,0.10) 0 6px 24px` | Hovered cards, sticky nav on scroll |
| 4 | `rgba(18,17,16,0.14) 0 8px 32px -4px` | Dropdowns, tooltips, toasts |
| 5 | `rgba(18,17,16,0.20) 0 20px 48px -8px` | Modals, overlays |

### Shadow Philosophy

Picoko's primary depth cue is **surface stepping** (`#fbfaf8` canvas → `#ffffff` card) — the same move as Krea's tonal stepping, but in the warm-light register. Shadows appear as a secondary reinforcement: cards carry a faint 2px / 12px shadow at rest to give a paper-on-paper lift. On hover, the shadow deepens rather than the card scaling. Brand-pink shadows are used sparingly and only on the featured pricing tier, where a subtle `rgba(254, 28, 113, 0.12)` glow reinforces the recommended-plan hierarchy.

## 8. Interaction & Motion

### Easing Curves

- **`ease-standard`**: `cubic-bezier(0.4, 0, 0.2, 1)` — default for hover, focus, colour transitions.
- **`ease-emphasized`**: `cubic-bezier(0.2, 0, 0, 1)` — modal entry, drawer slide.
- **`ease-spring`**: `cubic-bezier(0.34, 1.56, 0.64, 1)` — slight overshoot for the before-after drag handle snap; badge pop on first render.

### Duration Buckets

- **Fast (120ms)** — colour transitions, border-colour focus, link hover tint.
- **Standard (200ms)** — button hover (bg, border), card shadow deepening, nav backdrop.
- **Slow (320ms)** — modal enter/exit, drawer slide, page section fade-in.
- **Page (400ms)** — route transitions, hero section reveal on load.

### Per-Component Micro-States

- **Primary button hover**: bg `#fe1c71` → `#e5005c` over 200ms; no transform, no scale.
- **Secondary button hover**: border opacity 0.20 → 0.35; bg fills to 5% near-black — both over 200ms.
- **Card hover**: shadow `0 2px 12px` → `0 6px 24px` over 200ms; border opacity barely shifts.
- **Before-after drag**: drag handle snaps to position with `ease-spring`, 120ms. Image reveal is `clip-path: inset(0 X% 0 0)` updating on `pointermove` — no easing (direct tracking); snap to final position on release uses `ease-spring` 200ms.
- **Input focus**: pink ring fades in over 120ms; border shifts to `#fe1c71` simultaneously.
- **Badge pop**: on first appearance (New, Beta), badge scales `0.8 → 1.0` with `ease-spring` over 240ms.
- **Nav hover**: bg fill `0 → rgba(18,17,16,0.05)` over 120ms.

### Page Transitions

Below-fold sections use `IntersectionObserver` to fade in at 85% viewport, 320ms duration, 8px translate-up. No looping animations at rest. The before-after hero panel may auto-reveal on load (slides from 100% to 50% coverage) using `ease-emphasized` over 800ms — a one-shot demo of the product.

### Reduced Motion

`@media (prefers-reduced-motion: reduce)` — all transforms collapse to opacity-only; before-after auto-reveal skips the slide and cuts to final position; `ease-spring` replaced with `ease-standard`; durations halve.

## 9. Accessibility & A11y

### Contrast Pairs

- **`#121110` on `#fbfaf8`** (body text on canvas): ~12.6:1 — **AAA** at all sizes.
- **`#121110` on `#ffffff`** (body on card): ~13.2:1 — **AAA** at all sizes.
- **`#6b6663` on `#fbfaf8`** (muted captions on canvas): ~5.1:1 — **AA** at body sizes.
- **`#9c9793` on `#ffffff`** (soft helper on card): ~3.8:1 — **AA large** only; keep at 14px+ or not relied on for essential info.
- **`#ffffff` on `#fe1c71`** (on-brand text): ~3.3:1 — **AA large / UI** (passes for text ≥18px normal or ≥14px bold, and for UI components). **Fails for small body text (<18px / <14px bold)**. Use `#fe1c71` as a CTA fill with white text only at the button's `16px / 600` size or larger. Never as a background for small paragraph text.
- **`#fe1c71` on `#ffffff`** (pink text on white): ~3.3:1 — same caveat. Acceptable for large display labels and icon glyphs; not for 12px body copy.
- **`#c0004e` on `#ffffff`** (info-text on card): ~5.5:1 — **AA** at body sizes. Prefer `#c0004e` over `#fe1c71` wherever pink text appears at small sizes.

### Focus Indicators

- Default ring: `0 0 0 3px rgba(254, 28, 113, 0.35)` with 2px offset on all interactive elements.
- Inputs: ring expands from the border — border shifts to `#fe1c71`, ring adds at 3px / 20% opacity.
- All interactive surfaces show a visible focus state. The pink ring provides clear contrast on both the warm canvas and white card surfaces.

### ARIA Patterns

- **Navigation**: `<nav aria-label="Main">` with skip-link to `#main-content`.
- **Before-after slider**: `<div role="slider" aria-label="Before / after comparison" aria-valuemin="0" aria-valuemax="100" aria-valuenow="50">` — drag handle keyboard-operable with arrow keys.
- **Before image**: `<img alt="Product photo before: original smartphone snapshot on wooden table">`.
- **After image**: `<img alt="Product photo after: studio-quality white background with professional lighting">`.
- **Dialog**: `role="dialog" aria-modal="true" aria-labelledby` with focus trap and Esc-to-close.
- **Live regions**: `aria-live="polite"` for generation-complete status messages.

### Keyboard Navigation

- Tab order: skip-link → masthead nav → primary CTA → before-after panel drag handle → feature section → pricing → footer.
- Before-after slider: Left/Right arrow keys adjust reveal by 5%; Home/End go to 0%/100%.
- Esc closes dropdowns, modals, and the mobile nav sheet.

### Screen Reader Hints

- Before-after panels carry descriptive `alt` text on both images.
- Icon-only buttons carry `aria-label`.
- The brand-pink featured pricing badge carries `aria-label="Recommended plan"`.

### Reduced Motion

Honoured globally. Before-after auto-reveal skips animation; all translate-up fades collapse to opacity-only; badge pop removes the scale.

## 10. Responsive Behavior

### Breakpoints

| Name | Width | Use |
|---|---|---|
| Mobile | < 640px | Single-column stack; full-bleed comparison panels |
| Tablet | 640–1024px | 2-column feature grid; headline above panel stacked |
| Desktop | 1024–1280px | Full split hero; 3-column feature grid; full nav |
| Wide | > 1280px | Page locks at 1280px; gutters expand |

### Touch Targets

- Minimum tap target: 44×44px on all interactive elements.
- Primary pill CTAs on mobile: full-width (100%) at 48px height minimum.
- Before-after drag handle: 44px touch area regardless of visual handle size.
- Nav hamburger: 44×44px minimum.

### Collapsing Strategy

- **Header**: full nav at ≥1024px; hamburger sheet below. Primary CTA always visible — on mobile it migrates to the bottom of the hamburger sheet and bottom of the hero section.
- **Hero**: 55/45 split → headline-first stack (headline → CTA → comparison panel) on mobile.
- **Headline**: 72px → 52px → 40px across desktop / tablet / mobile.
- **Feature grid**: 3-up → 2-up → 1-up across breakpoints.
- **Section spacing**: 128px → 96px → 64px across sizes.
- **Card padding**: 24px → 20px on mobile.

### Image Behavior

- Before-after panels: serve `srcset` with 2× resolution assets for Retina; aspect ratio locked via CSS `aspect-ratio`. On mobile, height is capped at `100vw` (square).
- Feature images: native lazy-loading; descriptive `alt`.
- Hero panel: may use a static image on initial paint, swapping to interactive comparison on `load` event.

### Container Queries

Used inside feature cards to switch icon-top to icon-left layout when the card container width crosses 280px — allows the 3-column grid to reflow gracefully without global breakpoint coupling.

## 11. Content & Voice

### Tone

**Fast, confident, and seller-first.** Picoko writes for the Shopify merchant or Amazon seller who is juggling product launches with zero budget for a photographer. The copy is direct, quantified where possible ("studio-quality photos in seconds"), and never condescending. No AI hype jargon ("harness the power of…"); just the outcome the seller cares about.

### Microcopy Patterns

- **Button verbs**: "Get started," "Try for free," "Generate photos," "See plans," "Upload product." Never "Begin your journey" or "Unlock AI power."
- **Eyebrows / labels**: "FOR SHOPIFY SELLERS," "USED BY 10,000+ BRANDS," "NO PHOTOGRAPHER NEEDED." Plain, uppercase, factual.
- **Feature descriptions**: one sentence — the capability, then the benefit. "Remove backgrounds in one click — your product, ready for any platform."
- **Error messages**: "Couldn't generate that image. Try a different background or upload a clearer photo." — diagnose, suggest, move on.
- **Success confirmations**: "Photo generated. Download or edit." Brief, actionable.
- **Loading states**: "Generating…" with a subtle pink progress bar. No "Our AI is thinking magical thoughts…"

### Empty States

- *"Upload your first product photo to get started."* — clear invitation, no guilt.
- *"No generated photos yet. Try 'Studio background' to create your first batch."* — point to a specific action.
- Never uses "Oops!" Never implies the user did something wrong unless they actually did.

### CTA Verb Conventions

- Primary hero: "Get started free," "Generate photos now," "Try Picoko"
- Secondary hero: "See how it works," "Watch a demo"
- Pricing: "Start free," "Choose Pro," "Contact sales"
- Footer: "Pricing," "Integrations," "Blog," "Help"

The voice is **outcome-first**: tell the seller what they'll have (studio-quality photos, in seconds, for Shopify), not what Picoko is doing internally. The product is the magic; the copy is the shortcut to the result.

## 12. Dark Mode & Theming

Picoko ships a genuine light + dark theme toggle — a first-class UI element in the nav, not an afterthought. The live-probed default is **light** (the warm near-white canvas `#fbfaf8`). Dark mode inverts to a warm near-black canvas (`#0d0c0b`) with near-white body copy (`#f5f4f2`).

### What Changes in Dark Mode

- **Canvas**: `#fbfaf8` → `#0d0c0b`. Warm temperature maintained in the dark shift (warm near-black, not cool neutral).
- **Surface**: `#ffffff` → `#1f1e1c`. Cards remain visibly lighter than the canvas.
- **Text**: `#121110` → `#f5f4f2`. Body copy stays near-white, not full white, to avoid harshness.
- **Borders**: `rgba(18,17,16,0.08)` → `rgba(245,244,242,0.08)`. Same 8% opacity, flipped channel.
- **Shadows**: warm-dark at low opacity replace the warm-light versions.

### What Does Not Change

- **Brand pink** `#fe1c71` — invariant across both themes. The contrast ratio on dark canvas (`#0d0c0b`) is approximately 3.9:1 — slightly higher than on light, still AA-large for CTAs. The electric quality of the pink is maintained and arguably enhanced against the dark ground.
- **Radius scale** — unchanged.
- **Typography** — unchanged; Outfit at all weights and sizes is stable across themes.
- **Motion** — unchanged.

### Theme Persistence

Preference is written to `localStorage` under a key (e.g. `picoko-theme`). On next visit, the stored value is applied before first paint (inline script in `<head>`) to prevent flash of wrong theme. `data-theme="light"` or `data-theme="dark"` on `<html>` drives all CSS custom property swaps via `:root[data-theme="dark"] { ... }` blocks. `prefers-color-scheme` is the initial fallback when no localStorage key exists.

### Before-After Panels in Dark Mode

The comparison images themselves are unaffected by theme (they show the user's product). The panel frame — border, drag handle — flips to dark-theme tokens. The brand-pink drag handle remains `#fe1c71` in both themes.

## 13. Lineage & Influences

Picoko inherits the joyful-SaaS playbook refined by Framer, Luma, and modern freemium B2C tools: a geometric sans at maximum weight, a single electric accent colour quarantined to primary actions, and a warm canvas that reads approachable rather than corporate. The 32px pill CTA places Picoko in the same shape language as Notion, Pitch, and early Framer — a register that says "this is a tool people choose, not enterprise software people are assigned."

Outfit as the type system is the key differentiator from the design-tool SaaS tier (which defaults to Inter, Söhne, or Suisse Intl). Outfit's rounded stems and open apertures read as warm and friendly at 400; at 900 they become bold without feeling aggressive. The choice signals that Picoko's user is a Shopify merchant, not a design-system engineer.

The before-after comparison slider is a well-established pattern in image-editing SaaS — Luminar, Lightroom mobile, Canva's background remover — and Picoko uses it as the hero's primary product demonstration. It's a borrowed pattern, executed at 16px radius with a brand-pink drag handle to make it distinctly Picoko.

What Picoko rejects: dark canvases (Krea, Midjourney, Runway), monochrome restraint (Linear, Vercel), editorial neutrality (Stripe), and AI-purple gradients (every third AI startup). The brand wants to be unmistakably warm, bright, and fast — the opposite register from the creative-AI gallery aesthetic.

**Named influences:**

- **Krea** — AI image-generation SaaS peer; Picoko applies similar single-accent discipline to the opposite palette (warm light instead of absolute dark). *https://krea.ai*
- **Midjourney** — reference for AI image-generation brand positioning; Picoko explicitly differentiates by going warm/light where Midjourney goes dark/editorial. *https://www.midjourney.com*
- **Shopify** — primary distribution platform for Picoko's end-customers; Polaris design language informs e-commerce UI conventions that sellers already know. *https://www.shopify.com*
- **Outfit (Google Fonts)** — the typeface that carries the entire system; geometric grotesque with rounded stems chosen for friendly-SaaS warmth at heavy weights. *https://fonts.google.com/specimen/Outfit*
- **Framer** — modern playful-SaaS aesthetic reference: pill CTAs, warm canvas, heavy geometric sans, freemium conversion UX patterns. *https://www.framer.com*
- **Canva** — before-after image comparison patterns; approachable creative-tool register aimed at non-designer users. *https://www.canva.com*

## 14. Do's and Don'ts

### Do

- **Do** use `#fe1c71` for every primary CTA — and only for primary CTAs and brand marks. One use, one role, maximum impact.
- **Do** set hero headlines in Outfit weight 900 at 72px with -0.03em tracking. The heaviness is the brand's loudest signal.
- **Do** maintain the warm canvas temperature. `#fbfaf8` is not `#f5f5f5` or `#fafafa` — the warmth matters.
- **Do** use 32px pill shape for primary and secondary CTAs. Never 8px or straight-edge for a primary action.
- **Do** use 16px radius on cards and comparison panels — the brand's mid-tier signature shape.
- **Do** keep white cards (`#ffffff`) on the warm canvas (`#fbfaf8`) — the surface step is the primary depth cue.
- **Do** use `#c0004e` (darker pink) for small-size pink text where contrast matters — never `#fe1c71` at body size.
- **Do** show a before-after image comparison as the hero's right-column content — it demonstrates the product thesis in a single glance.
- **Do** add the `aria-label` and keyboard controls on the before-after slider — it's a non-standard interactive element.
- **Do** keep the brand pink invariant across light and dark themes.
- **Do** pace sections at 80–128px vertical rhythm. The page should feel fast but not anxious.
- **Do** write CTA verbs in outcome-first imperative: "Get studio-quality photos," "Generate now," "See plans."

### Don't

- **Don't** use `#fe1c71` as a background for a full-width section unless it is an intentional CTA band (bottom of page). A pink hero canvas would overwhelm.
- **Don't** use `#fe1c71` as body text at small sizes — the 3.3:1 contrast fails WCAG AA for text below 18px normal / 14px bold.
- **Don't** mix a second accent colour into the system. The pink's impact depends on isolation.
- **Don't** use weights below 600 for CTAs, or below 400 for body. Outfit at 300 loses brand warmth.
- **Don't** use a dark canvas for the marketing surface — the product's visual brand is warm, light, and fast.
- **Don't** use shadow-only depth — always pair with the surface step (`#fbfaf8` → `#ffffff`).
- **Don't** apply negative tracking below h4 — Outfit's openness at body sizes is part of its warmth; closing the tracking looks forced.
- **Don't** use sharp 0px or 4px radius on CTAs — pill shape is the non-negotiable signature.
- **Don't** use purple, indigo, or gradient-mesh AI aesthetics — Picoko differentiates by being the warm, fast, approachable tool in the category.
- **Don't** add exclamation marks or hyperbole to CTA copy. The product's value is self-evident; the copy just names the outcome.
- **Don't** use Outfit weight 900 below 36px — it becomes too heavy and loses legibility at body scales.
- **Don't** ignore the warm temperature shift in the dark palette. Dark mode uses warm near-black (`#0d0c0b`), not neutral cool dark (`#111111`).

## 15. Agent Prompt Guide

### Quick Color Reference

```
Light theme:
bg: #fbfaf8
bg-alt: #f5f3f0
surface: #ffffff
text: #121110
text-muted: #6b6663
text-soft: #9c9793
brand: #fe1c71
brand-deep: #e5005c
on-brand: #ffffff
border: rgba(18, 17, 16, 0.08)
border-strong: rgba(18, 17, 16, 0.16)

Dark theme (derived):
bg: #0d0c0b
surface: #1f1e1c
text: #f5f4f2
text-muted: #9c9793
brand: #fe1c71  ← same
border: rgba(245, 244, 242, 0.08)
```

### Example Component Prompts

1. **"Create a Picoko-style hero — warm near-white `#fbfaf8` canvas split 55/45. Left column: 72px headline in Outfit weight 900, tracking -0.03em, colour `#121110`; 18px / 400 sub-headline in `#6b6663`; one hot-pink `#fe1c71` pill CTA 'Get started free' at 32px radius / Outfit 600 / 16px / padding `12px 28px`. Right column: 1:1 before-after image comparison panel, white background, 16px radius, brand-pink drag handle at centre."**

2. **"Design a Picoko feature card — `#ffffff` background on `#fbfaf8` canvas, `1px solid rgba(18,17,16,0.08)` border, 16px radius, 24px padding, `rgba(18,17,16,0.06) 0 2px 12px` shadow. Icon at top (48px, brand-pink). Heading: Outfit 700 / 22px / `#121110`. Body: Outfit 400 / 16px / `#6b6663`. On hover, shadow deepens to `0 6px 24px`."**

3. **"Build a Picoko pricing tier — 3 cards in a row on `#fbfaf8` canvas. Default cards: `#ffffff`, 16px radius, `1px solid rgba(18,17,16,0.08)` border, 28px×24px padding. Featured (Pro) card: `2px solid #fe1c71` border, `rgba(254,28,113,0.12) 0 8px 32px -4px` shadow, pink eyebrow 'Most popular' at Outfit 600 / 12px / uppercase. Plan price: Outfit 800 / 48px. CTA: full-width pink pill 'Choose Pro' 32px radius."**

4. **"Compose a Picoko navigation — 64px header, `rgba(251,250,248,0.90)` background with `backdrop-filter: blur(16px)`. Wordmark left: Outfit 700 / `#121110`. Links centre: Outfit 500 / 15px / `#121110`, 8px radius hover fill `rgba(18,17,16,0.05)`. Right: ghost 'Sign in' + pink pill 'Get started' at `#fe1c71` / `#ffffff` / Outfit 600 / 15px / 32px radius / `12px 24px` padding."**

5. **"Render a Picoko before-after comparison panel — `#ffffff` surface, 16px radius, 1:1 aspect ratio, no padding (images bleed to radius). Left half shows original product snapshot; right half shows AI-generated studio shot on white background. Vertical drag handle at 50% position: 40px tall, `#fe1c71` pill-shaped bar, white arrow icons. Hover hint: 'Drag to compare' in Outfit 500 / 12px / `#9c9793` fading in at 500ms."**

6. **"Create a Picoko platform badge row — 3 neutral pill badges in a horizontal flex. Each: bg `rgba(18,17,16,0.06)`, text `#6b6663`, Outfit 500 / 12px, padding `6px 14px`, radius 9999. Labels: 'Shopify', 'Amazon', 'TikTok Shop'. Preceded by an eyebrow label 'WORKS WITH' in Outfit 600 / 12px / uppercase / 0.1em tracking / `#9c9793`."**

### Iteration Guide

1. **Start with the warm canvas.** If you're using `#f5f5f5` or `#fafafa`, it's cold. Picoko's `#fbfaf8` has a faint red-green warmth — run it through a colour picker and verify the R channel is ≥ the B channel.
2. **Brand pink once per visual unit.** In a hero, `#fe1c71` should appear once — the primary CTA. In a card grid, once per card at most (the CTA or a badge). The moment pink appears twice at similar visual weight, the hierarchy collapses.
3. **Weight 900 means weight 900.** If your Outfit headline is rendering at 800 or 700, the brand's signature loudness is gone. Confirm via DevTools computed styles that font-weight resolves to 900.
4. **32px radius on CTAs is non-negotiable.** An 8px or 12px radius on the primary CTA loses the consumer-SaaS register. If the design system forces a global radius, override it for CTAs specifically.
5. **Surface step before shadow.** Add the `#ffffff` card on `#fbfaf8` canvas first — that surface step delivers most of the depth. Add shadow (`0 2px 12px`) as a secondary reinforcer, not the primary depth cue.
6. **Keep `#c0004e` in your palette for pink text.** Whenever you need to write pink text at body size (12–16px), switch from `#fe1c71` to `#c0004e` — darker enough to pass WCAG AA on white while still clearly brand-adjacent.
7. **Dark mode: warm the near-black.** Don't use `#111111` or `#0f0f0f`. Picoko's dark canvas is `#0d0c0b` — the warmth matches the light palette's temperature. A cool dark ground creates a jarring inconsistency when the user toggles.
8. **CTA verbs: outcome, not process.** Replace "Try our AI" with "Generate photos." Replace "Sign up today" with "Start free." Every CTA should complete the sentence "I want to ___."

---

*Theme-toggle audit: score=7, signals=[theme-toggle-button-text, prefers-color-scheme-css, tailwind-dark-class]*
