437 lines
10 KiB
Markdown
437 lines
10 KiB
Markdown
|
|
# WDS Specification Pattern
|
|||
|
|
|
|||
|
|
**Complete specification format for Whiteport Design Studio projects**
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Overview
|
|||
|
|
|
|||
|
|
This document defines the **WDS Specification Pattern** used in Phase 4 (UX Design) for all WDS projects.
|
|||
|
|
|
|||
|
|
**Dog Week Start Page** is used as the example implementation to demonstrate the pattern in action.
|
|||
|
|
|
|||
|
|
**Related Documentation:**
|
|||
|
|
|
|||
|
|
- **`SKETCH-TEXT-ANALYSIS-GUIDE.md`** - How sketch analysis values are derived
|
|||
|
|
- **`HTML-VS-VISUAL-STYLES.md`** - HTML tags vs visual text styles
|
|||
|
|
- **`TRANSLATION-ORGANIZATION-GUIDE.md`** - Purpose-based text organization
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Key Principles
|
|||
|
|
|
|||
|
|
### 1. Purpose-Based Naming
|
|||
|
|
|
|||
|
|
Text objects are named by **function, not content**:
|
|||
|
|
|
|||
|
|
- ✅ `hero-headline` (describes purpose)
|
|||
|
|
- ❌ `welcome-message` (describes content)
|
|||
|
|
|
|||
|
|
### 2. Grouped Translations
|
|||
|
|
|
|||
|
|
All product languages grouped together per object for coherent review.
|
|||
|
|
|
|||
|
|
### 3. Estimated Values from Sketch Analysis
|
|||
|
|
|
|||
|
|
When text properties are estimated from sketch markers:
|
|||
|
|
|
|||
|
|
- **Spell out the values explicitly** (e.g., `42px (est. from 24px spacing)`)
|
|||
|
|
- **Mark with analysis note** to show reasoning
|
|||
|
|
- **Designer confirms or adjusts** during specification dialog
|
|||
|
|
- **Update with final values** once confirmed
|
|||
|
|
|
|||
|
|
**Analysis methodology:** See `SKETCH-TEXT-ANALYSIS-GUIDE.md` for complete rules on deriving font weight, font size, line-height, and alignment from sketch markers.
|
|||
|
|
|
|||
|
|
This ensures transparency about which values came from AI interpretation vs. designer specification.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## The Pattern in Action
|
|||
|
|
|
|||
|
|
### Hero Section Example
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
### Hero Object
|
|||
|
|
|
|||
|
|
**Purpose**: Primary value proposition and main conversion action
|
|||
|
|
|
|||
|
|
#### Primary Headline
|
|||
|
|
|
|||
|
|
**OBJECT ID**: `start-hero-headline`
|
|||
|
|
|
|||
|
|
**HTML Structure:**
|
|||
|
|
|
|||
|
|
- **Tag**: h1
|
|||
|
|
- **Semantic Purpose**: Main page heading for SEO and accessibility
|
|||
|
|
|
|||
|
|
**Visual Style:**
|
|||
|
|
|
|||
|
|
- **Style Name**: Hero headline
|
|||
|
|
- **Font weight**: Bold (from 3px thick line markers in sketch)
|
|||
|
|
- **Font size**: 56px (est. from 32px vertical spacing between line pairs)
|
|||
|
|
- **Line-height**: 1.1 (est. calculated as font-size × 1.1)
|
|||
|
|
- **Color**: #1a1a1a
|
|||
|
|
- **Letter spacing**: -0.02em
|
|||
|
|
|
|||
|
|
**Position**: Center of hero section, above supporting text
|
|||
|
|
**Alignment**: center
|
|||
|
|
|
|||
|
|
**Behavior**: Updates with language toggle
|
|||
|
|
|
|||
|
|
**Content**:
|
|||
|
|
|
|||
|
|
- EN: "Every walk. on time. Every time."
|
|||
|
|
- SE: "Varje promenad. i tid. Varje gång."
|
|||
|
|
|
|||
|
|
> **Sketch Analysis:** Line thickness (3px) → Bold weight. Line spacing (32px) → ~56px font size estimate. Designer should confirm these values.
|
|||
|
|
|
|||
|
|
#### Supporting Text
|
|||
|
|
|
|||
|
|
**OBJECT ID**: `start-hero-supporting`
|
|||
|
|
|
|||
|
|
**HTML Structure:**
|
|||
|
|
|
|||
|
|
- **Tag**: p
|
|||
|
|
- **Semantic Purpose**: Paragraph text providing additional context
|
|||
|
|
|
|||
|
|
**Visual Style:**
|
|||
|
|
|
|||
|
|
- **Style Name**: Body text large
|
|||
|
|
- **Font weight**: Regular (from 1px thin line markers in sketch)
|
|||
|
|
- **Font size**: 18px (est. from 14px vertical spacing between line pairs)
|
|||
|
|
- **Line-height**: 1.5 (est. calculated as font-size × 1.5)
|
|||
|
|
- **Color**: #4a4a4a
|
|||
|
|
|
|||
|
|
**Position**: Below headline, above CTA, center-aligned
|
|||
|
|
**Alignment**: center
|
|||
|
|
|
|||
|
|
**Behavior**: Updates with language toggle
|
|||
|
|
|
|||
|
|
**Content**:
|
|||
|
|
|
|||
|
|
- EN: "Organize your family around dog care. Never miss a walk again."
|
|||
|
|
- SE: "Organisera din familj kring hundvård. Missa aldrig en promenad igen."
|
|||
|
|
|
|||
|
|
> **Sketch Analysis:** Line thickness (1px) → Regular weight. Line spacing (14px) → ~18px font size estimate. Designer should confirm these values.
|
|||
|
|
|
|||
|
|
#### Primary CTA Button
|
|||
|
|
|
|||
|
|
**OBJECT ID**: `start-hero-cta`
|
|||
|
|
|
|||
|
|
- **Component**: [Button Primary Large](/docs/D-Design-System/.../Button-Primary.md)
|
|||
|
|
- **Position**: Center, below supporting text, 24px margin-top
|
|||
|
|
- **Behavior**: Navigate to /auth/signup
|
|||
|
|
- **States**: default, hover, active, loading
|
|||
|
|
- **Content**:
|
|||
|
|
- EN: "start planning - free forever"
|
|||
|
|
- SE: "börja planera - gratis för alltid"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Reading in English:**
|
|||
|
|
|
|||
|
|
> **Every walk. on time. Every time.**
|
|||
|
|
> Organize your family around dog care. Never miss a walk again.
|
|||
|
|
> [start planning - free forever]
|
|||
|
|
|
|||
|
|
**Reading in Swedish:**
|
|||
|
|
|
|||
|
|
> **Varje promenad. i tid. Varje gång.**
|
|||
|
|
> Organisera din familj kring hundvård. Missa aldrig en promenad igen.
|
|||
|
|
> [börja planera - gratis för alltid]
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## The Complete Process
|
|||
|
|
|
|||
|
|
### Step 1: Sketch Analysis (4B)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Agent sees sketch with horizontal lines:
|
|||
|
|
|
|||
|
|
═══════════════════════════════ ← Line 1 (thick, 3px)
|
|||
|
|
═══════════════════════════ ← Line 2 (thick, 3px)
|
|||
|
|
|
|||
|
|
───────────────────────────────────────── ← Line 3 (thin, 1px)
|
|||
|
|
───────────────────────────────────────── ← Line 4 (thin, 1px)
|
|||
|
|
|
|||
|
|
┌─────────────────────────────┐
|
|||
|
|
│ start planning │ ← Button
|
|||
|
|
└─────────────────────────────┘
|
|||
|
|
|
|||
|
|
Agent identifies:
|
|||
|
|
1. TEXT GROUP (2 thick lines) - Hero headline
|
|||
|
|
2. TEXT GROUP (2 thin lines) - Supporting text
|
|||
|
|
3. BUTTON - CTA
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Step 2: Object Detection (4C-03 + object-router)
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
For Object 1:
|
|||
|
|
→ Detects horizontal lines
|
|||
|
|
→ TEXT DETECTED
|
|||
|
|
→ Routes to heading-text.md
|
|||
|
|
|
|||
|
|
heading-text.md:
|
|||
|
|
→ Asks: "What's the PURPOSE?" → "Primary Headline"
|
|||
|
|
→ Object ID: `start-hero-headline`
|
|||
|
|
→ Sketch analysis: 2 lines, 3px thick, ~50-60 chars
|
|||
|
|
→ Content guidance: Brief heading, 2 short lines
|
|||
|
|
→ Requests content with length validation
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Step 3: Content with Grouped Translations
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Agent asks:
|
|||
|
|
|
|||
|
|
"What's the content for Primary Headline?
|
|||
|
|
|
|||
|
|
Based on sketch: 2 lines, ~50-60 characters total
|
|||
|
|
|
|||
|
|
I found text in your sketch: 'Every walk. on time. Every time.'
|
|||
|
|
|
|||
|
|
Let me suggest translations...
|
|||
|
|
|
|||
|
|
EN: Every walk. on time. Every time.
|
|||
|
|
SE: Varje promenad. i tid. Varje gång.
|
|||
|
|
|
|||
|
|
Do these work? [1] Use these [2] Adjust [3] Manual"
|
|||
|
|
|
|||
|
|
User provides:
|
|||
|
|
1 ← Accepts suggestions!
|
|||
|
|
|
|||
|
|
Agent validates:
|
|||
|
|
✅ EN: 37 chars (fits 60 capacity)
|
|||
|
|
✅ SE: 36 chars (fits 60 capacity)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Step 4: Generate Specification
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
#### Primary Headline
|
|||
|
|
|
|||
|
|
**OBJECT ID**: `start-hero-headline`
|
|||
|
|
|
|||
|
|
- **Component**: H1 heading
|
|||
|
|
- **Position**: Center of hero
|
|||
|
|
- **Style**: Bold, 42px, line-height 1.2
|
|||
|
|
- **Content**:
|
|||
|
|
- EN: "Every walk. on time. Every time."
|
|||
|
|
- SE: "Varje promenad. i tid. Varje gång."
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Key Advantages
|
|||
|
|
|
|||
|
|
### 1. Purpose-Based Object IDs
|
|||
|
|
|
|||
|
|
**Stable Naming:**
|
|||
|
|
|
|||
|
|
- Content changes don't affect Object IDs
|
|||
|
|
- IDs remain semantic and meaningful
|
|||
|
|
- Easy to find by function
|
|||
|
|
|
|||
|
|
**Examples:**
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
`start-hero-headline` ← Purpose clear
|
|||
|
|
`signin-form-email-label` ← Function clear
|
|||
|
|
`profile-success-message` ← Role clear
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. Separated Concerns
|
|||
|
|
|
|||
|
|
**Structure/Style** (rarely changes):
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
- **Component**: H1 heading
|
|||
|
|
- **Position**: Center of hero
|
|||
|
|
- **Style**: Bold, 42px
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Content** (often changes):
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
- **Content**:
|
|||
|
|
- EN: "..."
|
|||
|
|
- SE: "..."
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. Grouped Translations
|
|||
|
|
|
|||
|
|
**Benefits:**
|
|||
|
|
|
|||
|
|
- Each language reads as complete message
|
|||
|
|
- Translator sees full context
|
|||
|
|
- Natural language flow
|
|||
|
|
- Easy to verify coherence
|
|||
|
|
|
|||
|
|
**Format:**
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
### Text Group
|
|||
|
|
|
|||
|
|
#### Element 1
|
|||
|
|
|
|||
|
|
- EN: "..."
|
|||
|
|
- SE: "..."
|
|||
|
|
|
|||
|
|
#### Element 2
|
|||
|
|
|
|||
|
|
- EN: "..."
|
|||
|
|
- SE: "..."
|
|||
|
|
|
|||
|
|
#### Element 3
|
|||
|
|
|
|||
|
|
- EN: "..."
|
|||
|
|
- SE: "..."
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. Character Capacity Validation
|
|||
|
|
|
|||
|
|
**From Sketch Analysis:**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Agent: "Sketch shows 2 lines, ~50-60 chars capacity"
|
|||
|
|
|
|||
|
|
User provides: "Every walk. on time. Every time." (37 chars)
|
|||
|
|
|
|||
|
|
Agent: "✅ Content fits within sketch capacity!"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**If too long:**
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
Agent: "⚠️ Your content (85 chars) exceeds capacity (60 chars).
|
|||
|
|
Consider shortening or adjusting font size."
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Complete Workflow Integration
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
4B: Sketch Analysis
|
|||
|
|
↓
|
|||
|
|
Identifies text groups, estimates capacity
|
|||
|
|
↓
|
|||
|
|
4C-03: Components & Objects
|
|||
|
|
↓
|
|||
|
|
object-router.md
|
|||
|
|
↓
|
|||
|
|
STEP 1: TEXT DETECTION (checks horizontal lines)
|
|||
|
|
↓
|
|||
|
|
If text → heading-text.md
|
|||
|
|
↓
|
|||
|
|
1. Ask PURPOSE (not content)
|
|||
|
|
2. Generate Object ID from purpose
|
|||
|
|
3. Specify position/style
|
|||
|
|
4. Request content with grouped translations
|
|||
|
|
5. Validate against sketch capacity
|
|||
|
|
6. Generate specification (Dog Week format)
|
|||
|
|
↓
|
|||
|
|
Return to 4C-03
|
|||
|
|
↓
|
|||
|
|
4C-04: Content & Languages
|
|||
|
|
(Already captured in heading-text.md)
|
|||
|
|
↓
|
|||
|
|
4C-08: Generate Final Spec
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Template Structure
|
|||
|
|
|
|||
|
|
**Every text element follows this format:**
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
#### {{Purpose_Title}}
|
|||
|
|
|
|||
|
|
**OBJECT ID**: `{{page-section-purpose}}`
|
|||
|
|
|
|||
|
|
- **Component**: {{type}} ({{class_or_ref}})
|
|||
|
|
- **Position**: {{position_description}}
|
|||
|
|
{{#if has_behavior}}
|
|||
|
|
- **Behavior**: {{behavior_description}}
|
|||
|
|
{{/if}}
|
|||
|
|
{{#if has_style_details}}
|
|||
|
|
- **Style**: {{style_specifications}}
|
|||
|
|
{{/if}}
|
|||
|
|
{{#if links_to_input}}
|
|||
|
|
- **For**: {{input_object_id}}
|
|||
|
|
{{/if}}
|
|||
|
|
- **Content**:
|
|||
|
|
- EN: "{{english_text}}"
|
|||
|
|
- SE: "{{swedish_text}}"
|
|||
|
|
{{#each additional_language}}
|
|||
|
|
- {{code}}: "{{text}}"
|
|||
|
|
{{/each}}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Real Dog Week Specifications
|
|||
|
|
|
|||
|
|
These follow the exact pattern we're implementing:
|
|||
|
|
|
|||
|
|
**From 1.1-Start-Page.md:**
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
#### Primary Headline
|
|||
|
|
|
|||
|
|
**OBJECT ID**: `start-hero-headline`
|
|||
|
|
|
|||
|
|
- **Component**: H1 heading (`.text-heading-1`)
|
|||
|
|
- **Content**:
|
|||
|
|
- EN: "Every walk. on time. Every time."
|
|||
|
|
- SE: "Varje promenad. i tid. Varje gång."
|
|||
|
|
|
|||
|
|
#### Primary CTA Button
|
|||
|
|
|
|||
|
|
**OBJECT ID**: `start-hero-cta`
|
|||
|
|
|
|||
|
|
- **Component**: [Button Primary Large](/docs/D-Design-System/.../Button-Primary.md)
|
|||
|
|
- **Content**:
|
|||
|
|
- EN: "start planning - free forever"
|
|||
|
|
- SE: "börja planera - gratis för alltid"
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**From 1.2-Sign-In.md (Header example):**
|
|||
|
|
|
|||
|
|
```markdown
|
|||
|
|
#### Sign In Button
|
|||
|
|
|
|||
|
|
**OBJECT ID**: `start-header-signin`
|
|||
|
|
|
|||
|
|
- **Component**: [Button Secondary](/docs/D-Design-System/.../Button-Secondary.md)
|
|||
|
|
- **Content**:
|
|||
|
|
- EN: "Sign in"
|
|||
|
|
- SE: "Logga in"
|
|||
|
|
- **Behavior**: Navigate to sign-in page
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Specification Checklist
|
|||
|
|
|
|||
|
|
For each text element:
|
|||
|
|
|
|||
|
|
- [ ] **Purpose-based name** (not content-based)
|
|||
|
|
- [ ] **Object ID** from purpose: `{page}-{section}-{purpose}`
|
|||
|
|
- [ ] **Component** reference specified
|
|||
|
|
- [ ] **Position** clearly described
|
|||
|
|
- [ ] **Style** separated from content
|
|||
|
|
- [ ] **Behavior** specified if applicable
|
|||
|
|
- [ ] **Content** with grouped translations:
|
|||
|
|
- [ ] EN: "..."
|
|||
|
|
- [ ] SE: "..."
|
|||
|
|
- [ ] Additional languages if needed
|
|||
|
|
- [ ] **Character length** validated against sketch
|
|||
|
|
- [ ] **Part of text group** if applicable
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**This is the WDS standard for text specifications, proven by Dog Week!** 🎨🌍✨
|