BMAD-METHOD/docs/learn/module-11-conceptual-specif.../tutorial-11.md

510 lines
12 KiB
Markdown

# Tutorial 11: Write Your Specifications
**Hands-on guide to creating complete page specifications with Freya**
---
## Overview
This tutorial walks you through creating detailed specifications that developers can implement without asking questions.
**Time:** 45-60 minutes
**Prerequisites:** Sketches (Module 09) and Storyboards (Module 10) completed
**Agent:** Freya
**What you'll create:** Complete specification documents for each page
---
## Before You Start
**You'll need:**
- Your page sketches
- Your storyboard documentation
- Your Trigger Map for references
- Real content ideas (not lorem ipsum)
**Freya will help you:**
- Structure specifications consistently
- Catch missing states and edge cases
- Write real content
- Ensure completeness
---
## Step 1: Choose Your First Page (2 min)
### Start with a key page:
**You say:**
> "Let's create the specification for the signup form from S01-User-Registration. I have the sketch and storyboards ready."
**Freya acknowledges:**
> "Great. Let's build a complete specification. I'll guide you through each section to ensure nothing is missed."
---
## Step 2: Document Purpose and Connections (5 min)
### Freya asks about context:
> "First, let's establish why this page exists. What's its purpose?"
**You respond:**
> "Allow new users to create an account with minimal friction. Get them from curious visitor to registered user."
**Freya continues:**
> "Which persona and driving force does this serve?"
**You respond:**
> "Felix the Full-Stack. His driving force is 'Want to try before committing.' He fears complicated onboarding."
**Freya documents:**
```markdown
# P02: Signup Form Specification
## Purpose
Allow new users to create an account with minimal friction.
Transform curious visitors into registered users.
## Connects To
- Scenario: S01-User-Registration
- Persona: Felix the Full-Stack
- Driving Force: "Want to try before committing"
- Feature: F03-Quick-Signup
- Business Goal: User acquisition and activation
```
---
## Step 3: List All Elements (10 min)
### Freya guides element identification:
> "Looking at your sketch, let's identify every element on this page. What's visible?"
**Work through systematically:**
**You respond:**
> "Header with logo and back button. Main heading and subheading. Email field. Password field with strength indicator. Submit button. Terms text with link. Login link for existing users."
**Freya creates structure:**
```markdown
## Elements
### Header Section
- Logo (left)
- Back button (left of logo or top-left)
### Form Section
- Headline
- Subheadline
- Email field
- Password field
- Password strength indicator
- Submit button
### Footer Section
- Terms text with link
- Login link
```
### Detail each element:
**Freya:**
> "Let's specify each element. Starting with the email field — what are the details?"
**You respond:**
> "Text input, label says 'Email', placeholder 'you@example.com', validates email format, error message 'Please enter a valid email'."
**Freya documents:**
```markdown
### Email Field
- ID: signup-email-field
- Type: Text input (email)
- Label: "Email"
- Placeholder: "you@example.com"
- Validation: Valid email format (on blur)
- Error message: "Please enter a valid email"
- Required: Yes
```
### Continue for all elements...
---
## Step 4: Define All States (10 min)
### Freya ensures state coverage:
> "Now let's document all possible states for this page. What's the default state when someone arrives?"
**You respond:**
> "Empty form, submit button disabled, no validation messages, headline and subhead visible."
**Freya continues:**
> "What states does the form go through as the user interacts?"
**Work through:**
- Default (empty)
- Filling (typing)
- Partially valid
- All valid (submit enabled)
- Submitting
- Error (from server)
- Success
**Freya documents:**
```markdown
## Page States
### Default
- Form: Empty
- Email field: Placeholder visible
- Password field: Empty, strength indicator hidden
- Submit button: Disabled (grayed)
- Validation: None visible
### Filling
- Fields show user input
- Validation appears on blur
- Strength indicator shows as user types password
- Submit button: Disabled until all valid
### Ready to Submit
- All fields valid (no error messages)
- Password strength: Acceptable or better
- Submit button: Enabled (primary blue)
### Submitting
- All fields: Disabled (slightly grayed)
- Submit button: Loading spinner
- No new input allowed
### Server Error
- Fields: Re-enabled
- Error banner: Appears above form
- Submit button: Returns to enabled
- User input: Preserved
### Success
- Brief success state (1.5s)
- Then redirect to Welcome Screen
```
---
## Step 5: Write Real Content (10 min)
### Freya prompts for actual copy:
> "Let's write the real content. No lorem ipsum. What should the headline say?"
**You respond:**
> "Something like 'Create your account' — but that's boring. Maybe 'Start in 2 minutes' to emphasize speed?"
**Freya helps refine:**
> "Given Felix's fear of complexity, emphasizing speed is smart. What about the subheadline?"
**You respond:**
> "'No credit card required. Cancel anytime.'"
**Freya documents:**
```markdown
## Content
### Headlines
- Main: "Start in 2 minutes"
- Sub: "No credit card required. Cancel anytime."
### Form Labels
- Email: "Email"
- Password: "Password"
### Button Text
- Submit: "Create Free Account"
- Loading: [Spinner, no text]
### Helper Text
- Password requirements: "At least 8 characters"
- Strength indicators: "Weak" / "Fair" / "Strong"
### Links
- Terms: "By continuing, you agree to our Terms and Privacy Policy"
- Login: "Already have an account? Log in"
### Error Messages
| Condition | Message |
|-----------|---------|
| Email empty | "Email is required" |
| Email invalid | "Please enter a valid email" |
| Email exists | "This email is already registered. Log in instead →" |
| Password empty | "Password is required" |
| Password too short | "Password must be at least 8 characters" |
| Server error | "Something went wrong. Please try again." |
| Network error | "Connection lost. Please check your internet." |
```
---
## Step 6: Add Behavior Details (5 min)
### Include storyboard references:
**Freya:**
> "Let's link the behavioral details. You have storyboards for the submit button and password field, correct?"
**You respond:**
> "Yes, those are documented."
**Freya adds:**
```markdown
## Behavior
### Submit Button
See: [Submit Button Storyboard](./storyboards/submit-button.md)
Summary:
- Default → Hover (instant, darker)
- Click → Loading (100ms delay)
- Success → Checkmark, green (1.5s then redirect)
- Error → Return to default
### Password Field
See: [Password Field Storyboard](./storyboards/password-field.md)
Summary:
- Focus → Blue border
- Typing → Strength indicator appears
- Eye click → Toggle visibility
```
---
## Step 7: Edge Cases and Accessibility (5 min)
### Freya prompts for completeness:
> "A few more things to cover. What edge cases should we document?"
**You respond:**
> "User hitting back button during submit. User on slow connection. User with JavaScript disabled."
**Freya documents:**
```markdown
## Edge Cases
### Back Button During Submit
- Behavior: Cancel request, return to form
- Form state: Preserved (not lost)
### Slow Connection (>3s)
- After 3s: Show "Still working..." below spinner
- After 10s: Show retry option
### JavaScript Disabled
- Form still submits (progressive enhancement)
- No client-side validation (server handles)
- No password strength indicator
```
### Accessibility:
**Freya:**
> "Let's add accessibility notes for the form."
```markdown
## Accessibility
### Form
- Labels: Associated with inputs via htmlFor
- Required fields: aria-required="true"
- Errors: aria-describedby pointing to error message
### Submit Button
- Type: button (within form)
- Loading state: aria-busy="true"
- Disabled: aria-disabled="true"
### Focus Order
1. Back button
2. Email field
3. Password field
4. Show/hide password toggle
5. Submit button
6. Terms link
7. Login link
### Keyboard Navigation
- Tab: Moves through focusable elements
- Enter: Submits form (when on submit button or input)
- Escape: No action (modal not applicable)
```
---
## Step 8: Add Spacing Objects (5 min)
### Freya guides the invisible layer:
> "Now let's specify the spacing between sections. Every gap needs an ID."
**You work through the page sections:**
```markdown
## Spacing Objects
#### ↕ `signup-v-space-zero` — header sits flush against form section
#### ↕ `signup-v-space-xl` — comfortable gap between form and trust section
#### ↕ `signup-v-space-lg` — standard gap between trust section and footer
```
**Freya reminds:**
> "Zero spacing is a design decision too — document it so nobody 'fixes' it later."
### Typography tokens:
> "Let's also specify the heading sizes using tokens, not pixels."
```markdown
### Headline
| Property | Value |
|----------|-------|
| Tag | h1 |
| Visual size | heading-xl / heading-2xl / heading-3xl |
| Font weight | 900 |
```
**Freya explains:**
> "The semantic tag (h1) and the visual size (heading-xl) are independent. The h1 tells screen readers this is the page title. The token controls how big it looks."
---
## Step 9: Review Complete Specification (5 min)
### Freya presents the full document:
> "Here's the complete specification. Let's review for completeness."
### Checklist:
- [x] Purpose documented
- [x] Persona/Trigger Map connection
- [x] All elements listed with IDs
- [x] All states documented
- [x] Real content written
- [x] Error messages complete
- [x] Storyboards referenced
- [x] Edge cases covered
- [x] Accessibility included
### Ask the test question:
> "Can a developer build this from the spec alone, without asking questions?"
If yes, you're done. If not, identify what's missing.
---
## Step 10: Save and Organize (2 min)
### Save the specification:
```
C-UX-Scenarios/
└── S01-User-Registration/
└── P02-signup-form/
├── specification.md ← Complete specification
├── sketch.png
└── storyboards/
├── submit-button.md
└── password-field.md
```
### Move to next page:
Repeat for P01-landing-page, P03-welcome-screen, etc.
---
## What You've Created
### For each page:
A complete specification including:
- Purpose and context
- All elements with IDs
- All states
- Real content
- Behavior details
- Edge cases
- Accessibility
### The specification is:
- **Implementation-ready** — Developers can build it
- **Testable** — QA can verify every state
- **Traceable** — Every element has an ID
- **Connected** — Links to personas and features
---
## Tips for Success
**DO:**
- Write real content
- Document all states
- Include error messages
- Reference storyboards
- Cover accessibility
- Use consistent IDs
**DON'T:**
- Use lorem ipsum
- Skip edge cases
- Forget loading states
- Leave content TBD
- Ignore keyboard navigation
---
## Common Questions
**Q: How long should a specification be?**
A: As long as needed to be complete. A simple page might be 1 page; a complex form might be 5+ pages.
**Q: What if content isn't final?**
A: Write your best guess and mark it "[CONTENT TBD - awaiting copy review]". Something is better than lorem ipsum.
**Q: Do I need all the accessibility details?**
A: For critical interactive elements, yes. For simple text, standard HTML semantics suffice.
---
## You've Completed Module 11!
**Your specifications are complete.** You've documented:
- Every element
- Every state
- All content
- All behavior
This is the core deliverable of WDS.
---
## Next Module
**[Module 12: Functional Components →](../module-12-functional-components/module-12-functional-components-overview.md)**
Time to identify reusable patterns across your specifications.
---
[← Back to Lesson 3](lesson-03-element-state-specifications.md) | [Back to Module Overview](module-11-conceptual-specifications-overview.md)
*Part of Module 11: Conceptual Specifications*