# visual-style.md Format Specification

**Version:** 1.0
**Status:** Draft

## Overview

A `visual-style.md` file is a Markdown document with YAML frontmatter that defines a complete visual design system. The format is designed to be:

- **Human-readable** — Understandable in any text editor
- **AI-consumable** — Every field directly usable by AI models
- **Portable** — Works across any tool that reads the format

## File Structure

```
---
[YAML frontmatter]
---

[Markdown body sections]
```

## Required Fields

| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Display name for the style |
| `version` | string | Spec version (currently `1.0`) |
| `style_prompt_short` | string | 1-2 sentence elevator pitch |
| `style_prompt_full` | string | Full natural language generation prompt — **the most important field** |
| `colors.primary` | array | At least 2 colors, each with `name`, `hex`, `role` |

## Optional Fields

### Metadata

| Field | Type | Description |
|-------|------|-------------|
| `tags` | array | Categorical tags (e.g., "iconic design", "retro tech") |
| `author` | string | Credit for the style creator |
| `source_url` | string | URL this style was extracted from |
| `created` | string | ISO date (YYYY-MM-DD) |

### Colors

| Field | Type | Description |
|-------|------|-------------|
| `colors.accent` | array | Accent colors with name/hex/role |
| `colors.neutral` | array | Neutral colors with name/hex/role |

**Color object schema:**
```yaml
- name: "Descriptive Name"
  hex: "#RRGGBB"
  role: "how this color is used in the system"
```

### Typography

| Field | Type | Description |
|-------|------|-------------|
| `typography.display` | object | Display/heading typography |
| `typography.body` | object | Body text typography |
| `typography.caption` | object | Caption/label typography |
| `typography.rules` | array | Typography rules and constraints |

**Typography object schema:**
```yaml
display:
  family: "Font Family Name"
  weight: "bold"
  style: "uppercase, tight tracking"
```

### Layout

| Field | Type | Description |
|-------|------|-------------|
| `layout.grid` | string | Grid system description |
| `layout.alignment` | string | Alignment approach |
| `layout.aspect_ratio` | string | Default aspect ratio (e.g., "16:9") |
| `layout.notes` | array | Additional layout guidelines |

### Motion

| Field | Type | Description |
|-------|------|-------------|
| `motion.transitions` | array | Transition types used |
| `motion.animation_style` | string | Overall animation approach |
| `motion.pacing` | string | Timing/rhythm description |
| `motion.audio_cues` | array | Sound design notes |

### Mood

| Field | Type | Description |
|-------|------|-------------|
| `mood.keywords` | array | Mood/feeling keywords |
| `mood.era` | string | Time period reference |
| `mood.cultural_reference` | string | Cultural/historical context |
| `mood.avoid` | array | **Anti-patterns** — things to explicitly avoid |

### Assets

| Field | Type | Description |
|-------|------|-------------|
| `assets.reference_images` | array | URLs to reference images |
| `assets.gsep_elements` | array | URLs to overlay/graphic elements |
| `assets.html_snippets` | array | URLs to HTML component examples |
| `assets.color_palette_image` | object | URL to color palette visualization |

**Important:** Assets are always URLs, never embedded binary data.

### Extensions

| Field | Type | Description |
|-------|------|-------------|
| `x_*` | object | Namespaced tool-specific extensions |

Example:
```yaml
x_heygen:
  video_id: "abc123"
  orientation: "landscape"

x_figma:
  library_id: "xyz789"
```

## Markdown Body Sections

After the YAML frontmatter, include these optional Markdown sections:

### `## Connectors`

Tool-specific translation notes:

```markdown
## Connectors

### HeyGen Video Agent
Feed `style_prompt_full` as the visual style block. Use `motion.transitions`
for scene cuts. Orientation: landscape.

### HTML Slides
Map colors to CSS variables. Use `typography.display` for h1-h3.
```

### `## Design Principles`

Freeform design philosophy:

```markdown
## Design Principles

Typography drives hierarchy. Color is used sparingly and intentionally.
Every element snaps to a baseline grid. White space is a feature.
```

### `## Extraction Notes`

Source documentation (when extracted):

```markdown
## Extraction Notes

Extracted from https://example.com on 2026-03-12.
Primary colors sampled from hero section.
Typography identified via browser dev tools.
```

## Complete Example

```yaml
---
name: "Josef Müller-Brockmann Swiss International Style"
version: "1.0"
tags:
  - iconic design
  - sleek minimal
author: "Bin"
source_url: ""
created: "2026-03-12"

style_prompt_short: >
  Grid-locked Swiss precision. Black and white base with electric blue
  accent. Helvetica only. Data visualizations as hero elements.

style_prompt_full: >
  Josef Müller-Brockmann Swiss International Style. Grid-locked layouts
  with mathematical precision. Black and white base with ONE accent color
  (electric blue #0066FF). Strong diagonal compositions. Helvetica
  typography only. Data visualizations are the hero — animated charts,
  counters, grids. Every frame snaps to a grid. Transitions are horizontal
  grid wipes. No organic shapes. No gradients. No stock photography.
  Everything is geometric, systematic, precise.

colors:
  primary:
    - name: "Pure Black"
      hex: "#000000"
      role: "dominant ground, text, structural elements"
    - name: "Pure White"
      hex: "#FFFFFF"
      role: "background fields, negative space"
  accent:
    - name: "Electric Blue"
      hex: "#0066FF"
      role: "the ONE accent — data highlights, key emphasis"
  neutral:
    - name: "Grid Gray"
      hex: "#CCCCCC"
      role: "grid lines, secondary structure"

typography:
  display:
    family: "Helvetica"
    weight: "bold"
    style: "uppercase or sentence case, tight tracking"
  body:
    family: "Helvetica"
    weight: "regular"
    style: "flush left, ragged right, generous leading"
  caption:
    family: "Helvetica"
    weight: "light"
    style: "small, uppercase, wide tracking"
  rules:
    - "Helvetica ONLY — no other typeface"
    - "Type sizes follow a mathematical scale"
    - "Always flush left — never centered"

layout:
  grid: "Strict modular grid — 12 columns"
  alignment: "Flush left, grid-snapped"
  aspect_ratio: "16:9"
  notes:
    - "Every element locked to the grid"
    - "Data visualizations are the hero elements"

motion:
  transitions:
    - "horizontal grid wipes"
    - "elements snapping to grid positions"
    - "clean hard cuts"
  animation_style: >
    Geometric precision. Elements snap to grid positions.
    Charts animate systematically. Nothing bounces.
  pacing: "Measured, confident, unhurried"

mood:
  keywords:
    - "precise"
    - "systematic"
    - "authoritative"
    - "geometric"
  era: "1950s–1970s (timeless)"
  cultural_reference: "Müller-Brockmann, Grid Systems in Graphic Design"
  avoid:
    - "organic or curved shapes"
    - "gradients"
    - "stock photography"
    - "centered text"
    - "decorative elements"

assets:
  reference_images: []
  gsep_elements: []
  html_snippets: []
  color_palette_image:
    url: ""
---

## Design Principles

Typography and the grid are the only design elements needed.
Mathematical relationships create visual harmony.
Restraint is the ultimate sophistication.

## Connectors

### HeyGen Video Agent
Use `style_prompt_full` verbatim. No avatar, no b-roll — pure motion graphics.
Hard cuts between scenes.

### HTML Slides
Map to CSS: `--color-bg: #000`, `--color-text: #FFF`, `--color-accent: #0066FF`.
Use Helvetica via system fonts or Google Fonts equivalent.
```

## Validation

A valid `visual-style.md` must have:

1. Valid YAML frontmatter between `---` delimiters
2. All required fields present
3. `colors.primary` with at least 2 color objects
4. Each color object with `name`, `hex`, and `role`
5. `version` set to `1.0`

## Versioning

The `version` field refers to the spec version, not the style version. When the spec changes:

- **Minor changes** (new optional fields): Version stays `1.0`
- **Breaking changes** (required field changes): Version increments to `2.0`

## Design Decisions

### Why `style_prompt_full` is required

Many AI tools only accept a text prompt. By requiring a complete, natural language description of the style, we ensure every `visual-style.md` file is immediately usable by any tool — even ones that don't parse the structured fields.

### Why no embedded binary data

URLs keep files small, versionable, and portable. Binary assets should be hosted externally and referenced by URL.

### Why `x_*` namespacing

Different tools have different capabilities. The `x_` prefix allows tool-specific configuration without polluting the core schema. Examples: `x_heygen`, `x_figma`, `x_paper`.

### Why `mood.avoid`

Negative constraints are as important as positive ones. Telling an AI what NOT to do is often more effective than telling it what to do.
