@arbor-education/design-system.components 0.12.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent-memory/blanche-designspert/MEMORY.md +189 -0
- package/.agent-memory/dorothy-fact-checker/MEMORY.md +228 -0
- package/.agent-memory/dorothy-fact-checker/numberinput_component.md +53 -0
- package/.agent-memory/dorothy-fact-checker/progress_component.md +36 -0
- package/.agent-memory/rose-storybookspert/MEMORY.md +105 -0
- package/.agent-memory/sophia-componentspert/MEMORY.md +34 -0
- package/{.claude/agent-memory → .agent-memory}/sophia-componentspert/components.md +170 -17
- package/{.claude → .gather}/agents/blanche-designspert.md +7 -2
- package/{.claude → .gather}/agents/dorothy-fact-checker.md +7 -2
- package/{.claude → .gather}/agents/rose-storybookspert.md +80 -11
- package/{.claude → .gather}/agents/sophia-componentspert.md +9 -4
- package/.gather/gather.yaml +9 -0
- package/{CLAUDE.md → .gather/instructions/project-overview.md} +42 -9
- package/{.claude → .gather}/skills/analyze-design/README.md +5 -0
- package/{.claude → .gather}/skills/analyze-design/SKILL.md +1 -1
- package/.gather/skills/analyze-design/meta.md +4 -0
- package/{.claude → .gather}/skills/create-page/README.md +5 -0
- package/{.claude → .gather}/skills/create-page/design-analysis-template.md +5 -0
- package/.gather/skills/create-page/meta.md +4 -0
- package/{.claude → .gather}/skills/create-page/page-template.scss +5 -0
- package/{.claude → .gather}/skills/create-page/page-template.tsx +5 -0
- package/{.claude → .gather}/skills/map-legacy/README.md +5 -0
- package/.gather/skills/map-legacy/meta.md +4 -0
- package/{.claude → .gather}/skills/migrate-page/README.md +5 -0
- package/.gather/skills/migrate-page/meta.md +4 -0
- package/.gather/skills/write-stories/README.md +157 -0
- package/.gather/skills/write-stories/SKILL.md +841 -0
- package/.gather/skills/write-stories/meta.md +4 -0
- package/.ralph/storybook-upgrade/knowledge.md +308 -0
- package/.ralph/storybook-upgrade/prd.json +777 -0
- package/.ralph/storybook-upgrade/progress.md +342 -0
- package/.storybook/DocsTemplate.tsx +122 -0
- package/.storybook/preview.ts +40 -0
- package/.stylelintignore +2 -0
- package/CHANGELOG.md +12 -0
- package/{.claude/component-library.md → component-library.md} +27 -10
- package/dist/components/badge/Badge.stories.d.ts +85 -6
- package/dist/components/badge/Badge.stories.d.ts.map +1 -1
- package/dist/components/badge/Badge.stories.js +626 -27
- package/dist/components/badge/Badge.stories.js.map +1 -1
- package/dist/components/banner/Banner.stories.d.ts +129 -63
- package/dist/components/banner/Banner.stories.d.ts.map +1 -1
- package/dist/components/banner/Banner.stories.js +855 -39
- package/dist/components/banner/Banner.stories.js.map +1 -1
- package/dist/components/button/Button.stories.d.ts +148 -8
- package/dist/components/button/Button.stories.d.ts.map +1 -1
- package/dist/components/button/Button.stories.js +1089 -80
- package/dist/components/button/Button.stories.js.map +1 -1
- package/dist/components/datePicker/DatePicker.d.ts +1 -0
- package/dist/components/datePicker/DatePicker.d.ts.map +1 -1
- package/dist/components/datePicker/DatePicker.js +2 -2
- package/dist/components/datePicker/DatePicker.js.map +1 -1
- package/dist/components/datePicker/DatePicker.stories.d.ts +1 -0
- package/dist/components/datePicker/DatePicker.stories.d.ts.map +1 -1
- package/dist/components/dot/Dot.stories.d.ts +46 -11
- package/dist/components/dot/Dot.stories.d.ts.map +1 -1
- package/dist/components/dot/Dot.stories.js +504 -15
- package/dist/components/dot/Dot.stories.js.map +1 -1
- package/dist/components/dropdown/Dropdown.stories.d.ts +89 -14
- package/dist/components/dropdown/Dropdown.stories.d.ts.map +1 -1
- package/dist/components/dropdown/Dropdown.stories.js +769 -17
- package/dist/components/dropdown/Dropdown.stories.js.map +1 -1
- package/dist/components/formField/FormField.stories.d.ts +95 -35
- package/dist/components/formField/FormField.stories.d.ts.map +1 -1
- package/dist/components/formField/FormField.stories.js +1174 -69
- package/dist/components/formField/FormField.stories.js.map +1 -1
- package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts +96 -9
- package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js +717 -10
- package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js.map +1 -1
- package/dist/components/formField/inputs/number/NumberInput.stories.d.ts +149 -11
- package/dist/components/formField/inputs/number/NumberInput.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/number/NumberInput.stories.js +624 -10
- package/dist/components/formField/inputs/number/NumberInput.stories.js.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts +74 -1
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +673 -44
- package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
- package/dist/components/formField/inputs/text/TextInput.stories.d.ts +119 -1
- package/dist/components/formField/inputs/text/TextInput.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/text/TextInput.stories.js +549 -10
- package/dist/components/formField/inputs/text/TextInput.stories.js.map +1 -1
- package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts +129 -4
- package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts.map +1 -1
- package/dist/components/formField/inputs/textArea/TextArea.stories.js +577 -3
- package/dist/components/formField/inputs/textArea/TextArea.stories.js.map +1 -1
- package/dist/components/heading/Heading.stories.d.ts +449 -50
- package/dist/components/heading/Heading.stories.d.ts.map +1 -1
- package/dist/components/heading/Heading.stories.js +536 -60
- package/dist/components/heading/Heading.stories.js.map +1 -1
- package/dist/components/icon/Icon.stories.d.ts +81 -10
- package/dist/components/icon/Icon.stories.d.ts.map +1 -1
- package/dist/components/icon/Icon.stories.js +979 -8
- package/dist/components/icon/Icon.stories.js.map +1 -1
- package/dist/components/pill/Pill.stories.d.ts +71 -19
- package/dist/components/pill/Pill.stories.d.ts.map +1 -1
- package/dist/components/pill/Pill.stories.js +573 -14
- package/dist/components/pill/Pill.stories.js.map +1 -1
- package/dist/components/progress/Progress.stories.d.ts +75 -298
- package/dist/components/progress/Progress.stories.d.ts.map +1 -1
- package/dist/components/progress/Progress.stories.js +449 -52
- package/dist/components/progress/Progress.stories.js.map +1 -1
- package/dist/components/separator/Separator.stories.d.ts +58 -5
- package/dist/components/separator/Separator.stories.d.ts.map +1 -1
- package/dist/components/separator/Separator.stories.js +443 -4
- package/dist/components/separator/Separator.stories.js.map +1 -1
- package/dist/components/table/Table.d.ts +7 -0
- package/dist/components/table/Table.d.ts.map +1 -1
- package/dist/components/table/Table.js +9 -0
- package/dist/components/table/Table.js.map +1 -1
- package/dist/components/table/Table.stories.d.ts +1 -0
- package/dist/components/table/Table.stories.d.ts.map +1 -1
- package/dist/components/table/Table.stories.js +87 -0
- package/dist/components/table/Table.stories.js.map +1 -1
- package/dist/components/table/Table.test.js +49 -1
- package/dist/components/table/Table.test.js.map +1 -1
- package/dist/components/table/cellEditors/DateCellEditor.d.ts +3 -0
- package/dist/components/table/cellEditors/DateCellEditor.d.ts.map +1 -0
- package/dist/components/table/cellEditors/DateCellEditor.js +13 -0
- package/dist/components/table/cellEditors/DateCellEditor.js.map +1 -0
- package/dist/components/table/cellEditors/DateCellEditor.test.d.ts +2 -0
- package/dist/components/table/cellEditors/DateCellEditor.test.d.ts.map +1 -0
- package/dist/components/table/cellEditors/DateCellEditor.test.js +81 -0
- package/dist/components/table/cellEditors/DateCellEditor.test.js.map +1 -0
- package/dist/components/tag/Tag.stories.d.ts +116 -5
- package/dist/components/tag/Tag.stories.d.ts.map +1 -1
- package/dist/components/tag/Tag.stories.js +581 -28
- package/dist/components/tag/Tag.stories.js.map +1 -1
- package/dist/index.css +8 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -5
- package/dist/index.js.map +1 -1
- package/eslint.config.mts +5 -1
- package/package.json +3 -3
- package/src/components/badge/Badge.stories.tsx +869 -42
- package/src/components/banner/Banner.stories.tsx +1081 -63
- package/src/components/button/Button.stories.tsx +1394 -99
- package/src/components/datePicker/DatePicker.tsx +3 -0
- package/src/components/dot/Dot.stories.tsx +723 -32
- package/src/components/dropdown/Dropdown.stories.tsx +1174 -35
- package/src/components/formField/FormField.stories.tsx +1522 -105
- package/src/components/formField/inputs/checkbox/CheckboxInput.stories.tsx +1020 -15
- package/src/components/formField/inputs/number/NumberInput.stories.tsx +908 -15
- package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +932 -51
- package/src/components/formField/inputs/text/TextInput.stories.tsx +773 -13
- package/src/components/formField/inputs/textArea/TextArea.stories.tsx +756 -8
- package/src/components/heading/Heading.stories.tsx +752 -120
- package/src/components/icon/Icon.stories.tsx +1446 -12
- package/src/components/pill/Pill.stories.tsx +867 -21
- package/src/components/progress/Progress.stories.tsx +625 -58
- package/src/components/separator/Separator.stories.tsx +730 -8
- package/src/components/separator/separator.scss +12 -3
- package/src/components/table/Table.stories.tsx +102 -0
- package/src/components/table/Table.test.tsx +82 -3
- package/src/components/table/Table.tsx +9 -0
- package/src/components/table/cellEditors/DateCellEditor.test.tsx +109 -0
- package/src/components/table/cellEditors/DateCellEditor.tsx +27 -0
- package/src/components/tag/Tag.stories.tsx +755 -53
- package/src/index.ts +0 -5
- package/.claude/agent-memory/blanche-designspert/MEMORY.md +0 -64
- package/.claude/agent-memory/dorothy-fact-checker/MEMORY.md +0 -129
- package/.claude/agent-memory/rose-storybookspert/MEMORY.md +0 -29
- package/.claude/agent-memory/sophia-componentspert/MEMORY.md +0 -14
- package/.claude/design-assessment-daily-attendance-2026-04-10.md +0 -566
- package/.claude/figma-assessment-7154-58899.md +0 -404
- package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-11086-97537.md +0 -392
- package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-551-41974.md +0 -474
- package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-551-43094.md +0 -462
- package/.claude/figma-assessment-fcFK4CGzkz2fVyY3koX8ZE-7154-59061.md +0 -440
- package/.claude/migration-report-custom-report-writer-2026-02-19.md +0 -591
- /package/{.claude/agent-memory → .agent-memory}/blanche-designspert/token-review-patterns.md +0 -0
- /package/{.claude/agent-memory → .agent-memory}/rose-storybookspert/patterns.md +0 -0
- /package/{.claude → .gather}/skills/create-page/SKILL.md +0 -0
- /package/{.claude → .gather}/skills/map-legacy/SKILL.md +0 -0
- /package/{.claude → .gather}/skills/migrate-page/SKILL.md +0 -0
|
@@ -0,0 +1,841 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: write-stories
|
|
3
|
+
description: Write comprehensive, autodocs-powered Storybook stories for Arbor design system components. Fetches designer guidance from Confluence, enlists the full Golden Girls team, and produces BOMBASS documentation that teaches consumers exactly how and when to use each component.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Write Storybook Stories
|
|
7
|
+
|
|
8
|
+
AROOOOO HUNNI!! 🐺💖 Time to write the most EXCELLENT, most BODACIOUS Storybook stories this design system has ever seen! We're bringing the FULL GOLDEN GIRLS SQUAD and the designer wisdom from Confluence to make documentation so good people will WEEP WITH JOY!! xxx
|
|
9
|
+
|
|
10
|
+
## Goal
|
|
11
|
+
|
|
12
|
+
Write **comprehensive, production-quality Storybook stories** for a given Arbor design system component that:
|
|
13
|
+
|
|
14
|
+
- ✅ Enable `autodocs` so consumers get full generated API documentation
|
|
15
|
+
- ✅ Include a rich component-level description (what it is, when to use, when NOT to use, a11y notes, design guidance)
|
|
16
|
+
- ✅ Define `argTypes` for all key props so the **Props** table is always populated
|
|
17
|
+
- ✅ Cover every variant, size, and state the component supports
|
|
18
|
+
- ✅ Include per-story descriptions explaining what each story demonstrates and why you'd use it
|
|
19
|
+
- ✅ Incorporate designer guidance fetched directly from Confluence
|
|
20
|
+
- ✅ Show interactive examples for components with complex behaviour (modals, dropdowns, etc.)
|
|
21
|
+
- ✅ Link related components using Storybook story paths so consumers can navigate the docs
|
|
22
|
+
- ✅ Follow our codebase story conventions exactly
|
|
23
|
+
|
|
24
|
+
**Output**: An updated (or new) `.stories.tsx` file at the component's existing location.
|
|
25
|
+
|
|
26
|
+
> **Note on the global docs template**: A custom docs template is configured at `.storybook/DocsTemplate.tsx` and wired up in `.storybook/preview.ts`. It automatically renders: `Title → Subtitle → Description → Primary story → **Props (Controls — interactive)** → Stories`. The `Controls` block drives the Primary story canvas in real time — changing a prop value instantly updates what you see above. A Table of Contents panel is also enabled globally, picking up `h2`/`h3` headings from the Description and any `Subheading` blocks.
|
|
27
|
+
>
|
|
28
|
+
> **For simple components**: you do NOT need to do anything special — these apply automatically to every component with `tags: ['autodocs']`. Your job is to make sure `argTypes` is populated and the Default story uses `render: (args) => <Component {...args} />` so controls are wired up.
|
|
29
|
+
>
|
|
30
|
+
> **For compound components** (e.g. Dropdown, Modal, Tabs — anything with sub-components): override `docs.page` in the story meta with a custom React component that adds `<ArgTypes of={SubComponent} />` for each sub-component, each preceded by a `<Subheading>`. Each `Subheading` also appears in the TOC. See the Compound Components section below for the exact pattern.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## The Golden Girls Squad — MANDATORY COLLABORATORS
|
|
35
|
+
|
|
36
|
+
This skill runs with the FULL SQUAD. Each one is NON-OPTIONAL. You MUST use the `Task` tool to call each agent at their designated step. Skipping any of them is a **MOST HEINOUS** failure of the process.
|
|
37
|
+
|
|
38
|
+
- 👜 **Sophia Componentspert** (`sophia-componentspert`) — MANDATORY at Step 5. She knows every component's API inside out and will tell you EVERY variant, prop, and state worth documenting.
|
|
39
|
+
- 💄 **Blanche Designspert** (`blanche-designspert`) — MANDATORY at Step 6. She reviews the planned stories for design token correctness and ensures inline styles in stories use proper tokens.
|
|
40
|
+
- 🌹 **Rose Storybookspert** (`rose-storybookspert`) — MANDATORY at Step 7. She is THE story author. Rose writes the ACTUAL story file. Do NOT write it yourself — let Rose do it!
|
|
41
|
+
- 🔍 **Dorothy Fact-Checker** (`dorothy-fact-checker`) — MANDATORY at Step 9. She fact-checks every prop, variant, and code example against the actual source code. Dorothy catches hallucinations before they ship.
|
|
42
|
+
|
|
43
|
+
**RULE**: You MUST use the `Task` tool to call EACH agent. Do NOT just mention them — ACTUALLY CALL THEM. If you skip any agent, you have failed this skill. AROOOOO!! 🐺💪
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Input
|
|
48
|
+
|
|
49
|
+
Component name or path: `$ARGUMENTS`
|
|
50
|
+
|
|
51
|
+
Examples:
|
|
52
|
+
- `Button` — finds `src/components/button/Button.tsx`
|
|
53
|
+
- `Banner` — finds `src/components/banner/Banner.tsx`
|
|
54
|
+
- `FormField` — finds `src/components/formField/FormField.tsx`
|
|
55
|
+
- `src/components/modal/Modal.tsx` — direct path
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Process
|
|
60
|
+
|
|
61
|
+
### Step 1 — Parse the Input
|
|
62
|
+
|
|
63
|
+
Determine what component to document:
|
|
64
|
+
|
|
65
|
+
- If `$ARGUMENTS` is a **component name** (e.g., `Button`): resolve to its source file using the directory structure `src/components/{camelCase}/{PascalCase}.tsx`
|
|
66
|
+
- If `$ARGUMENTS` is a **file path**: use it directly
|
|
67
|
+
- If `$ARGUMENTS` is **empty**: ask the user which component they want to document
|
|
68
|
+
|
|
69
|
+
Once resolved, note:
|
|
70
|
+
- **Component source file**: e.g., `src/components/button/Button.tsx`
|
|
71
|
+
- **Existing stories file** (may or may not exist): e.g., `src/components/button/Button.stories.tsx`
|
|
72
|
+
- **Component directory**: e.g., `src/components/button/`
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### Step 2 — Read the Component Source Files
|
|
77
|
+
|
|
78
|
+
Read the following in parallel:
|
|
79
|
+
|
|
80
|
+
1. **Component source** (`{ComponentName}.tsx`) — Props interface, exported types, variants/enums, default values
|
|
81
|
+
2. **Existing stories** (`{ComponentName}.stories.tsx` or `{ComponentName}.story.tsx`) — if one exists, read it so we know what's already there and what's missing
|
|
82
|
+
3. **Test file** (`{ComponentName}.test.tsx`) — useful for understanding expected behaviour and states
|
|
83
|
+
4. **Component SCSS** (`{componentName}.scss`) — to understand any modifier classes that inform variants/states
|
|
84
|
+
5. **`src/index.ts`** — confirm what's exported publicly (we should only document public exports)
|
|
85
|
+
|
|
86
|
+
Note every **prop**, **variant**, **size**, **state**, and **enum value** you find. This forms your documentation inventory.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### Step 3 — Fetch Confluence Design Guidance
|
|
91
|
+
|
|
92
|
+
Look up designer guidance for this component using the Atlassian MCP tools. Use `cloudId: "orchard.atlassian.net"`.
|
|
93
|
+
|
|
94
|
+
**Known component → Confluence page mappings:**
|
|
95
|
+
|
|
96
|
+
| Component(s) | Page ID | Description |
|
|
97
|
+
|---|---|---|
|
|
98
|
+
| Banner | `2216762167` | Banners — types, colours, content length, icon guidance |
|
|
99
|
+
| Button, inputs | `2216957127` | Buttons and Inputs — states, number inputs, date/time |
|
|
100
|
+
| Modal | `2216762125` | Modals — CTA buttons, size options, delete confirmations |
|
|
101
|
+
| Modal, Slideover, Tooltip, Dropdown | `2216891079` | Popup vs Modal vs Slideover — when to use each |
|
|
102
|
+
| Section | `2217056643` | Sections — section header link styles |
|
|
103
|
+
| Toast | `2216957106` | Toasts — content length, icon alignment |
|
|
104
|
+
| All components (overview) | `2371747857` | Design System Components — tables, tooltips, shadows, colours |
|
|
105
|
+
|
|
106
|
+
**Instructions:**
|
|
107
|
+
- If the component has a known page ID above, fetch it with `mcp__atlassian__getConfluencePage` using `contentFormat: "markdown"`
|
|
108
|
+
- If the component relates to multiple topics (e.g., Modal relates to both Modals and Popup/Slideover), fetch ALL relevant pages
|
|
109
|
+
- If the component has no dedicated page, fetch the main overview page (`2371747857`) and look for any relevant section
|
|
110
|
+
- Extract: use cases, DO/DON'T guidance, content length limits, icon guidance, colour guidance, accessibility notes, and any "best practise" callouts
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
### Step 4 — Read the Component Library Manifest
|
|
115
|
+
|
|
116
|
+
Read `component-library.md` (project root) for a comprehensive overview of the component's role in the design system, use cases, and known relationships to other components.
|
|
117
|
+
|
|
118
|
+
If it contains guidance about when to use this component vs. alternatives, note it — it goes into the story description.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
### ⚡ MANDATORY STEP 5 — CALL SOPHIA COMPONENTSPERT NOW ⚡
|
|
123
|
+
|
|
124
|
+
**YOU MUST USE THE `Task` tool RIGHT NOW** to launch the `sophia-componentspert` agent. This is NOT optional. Do NOT skip this. Sophia is the component expert — she builds the definitive prop inventory and story outline.
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Task tool: subagent_type="sophia-componentspert"
|
|
128
|
+
prompt: "I'm writing comprehensive Storybook stories for the [ComponentName] component. I need your expert guidance on its complete API.
|
|
129
|
+
|
|
130
|
+
COMPONENT SOURCE:
|
|
131
|
+
[Paste the full component source code here]
|
|
132
|
+
|
|
133
|
+
EXISTING STORIES (if any):
|
|
134
|
+
[Paste existing stories, or "None yet"]
|
|
135
|
+
|
|
136
|
+
DESIGN GUIDANCE FROM CONFLUENCE:
|
|
137
|
+
[Paste the relevant Confluence content here]
|
|
138
|
+
|
|
139
|
+
Please provide:
|
|
140
|
+
1. A COMPLETE inventory of every prop, its type, default value, and description
|
|
141
|
+
2. Every variant, size, and state worth demonstrating in Storybook
|
|
142
|
+
3. Which props have the most impact on visual appearance (these need their own dedicated stories)
|
|
143
|
+
4. Which states are important for consumers to understand (disabled, error, loading, focused, etc.)
|
|
144
|
+
5. Any complex or non-obvious usage patterns that consumers MUST know about
|
|
145
|
+
6. Suggestions for interactive stories that need useState/render functions (e.g., controlled inputs, modals)
|
|
146
|
+
7. A recommended story outline (list of story names with a one-line description of each)
|
|
147
|
+
8. When to use this component vs. its alternatives (if any)
|
|
148
|
+
9. Any accessibility requirements (aria attributes, keyboard nav, screen reader text)
|
|
149
|
+
|
|
150
|
+
Be specific! Story names should be PascalCase. Include every edge case and gotcha."
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**WAIT for Sophia's response.** Her story outline is the blueprint for Rose.
|
|
154
|
+
|
|
155
|
+
After Sophia responds, **RELAY HER KEY INSIGHTS TO THE USER**:
|
|
156
|
+
|
|
157
|
+
> 👜 **Sophia says:** _[relay Sophia's component wisdom in her warm, knowledgeable voice — she's been around the block and knows EVERY prop. e.g. "Oh pussycat, the Button has SEVEN variants and most people only use three of them! Let me tell you about the ones that get overlooked..."]_
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### ⚡ MANDATORY STEP 6 — CALL BLANCHE DESIGNSPERT NOW ⚡
|
|
162
|
+
|
|
163
|
+
**YOU MUST USE THE `Task` tool RIGHT NOW** to launch the `blanche-designspert` agent. Blanche will guide you on how inline styles and decorators in stories should use design tokens.
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
Task tool: subagent_type="blanche-designspert"
|
|
167
|
+
prompt: "I'm writing Storybook stories for the [ComponentName] component and need design guidance.
|
|
168
|
+
|
|
169
|
+
Some stories need wrapper layouts (e.g., flex containers to show multiple variants side-by-side, or sized containers to show responsive behaviour). When I write inline styles for these story wrappers, what design tokens should I use?
|
|
170
|
+
|
|
171
|
+
COMPONENT INFO:
|
|
172
|
+
[Paste component name, variants, and Confluence design guidance]
|
|
173
|
+
|
|
174
|
+
Please advise:
|
|
175
|
+
1. What spacing tokens should story wrappers use for gaps and padding? (e.g., CSS vars vs. SCSS vars)
|
|
176
|
+
2. Are there any component-specific design tokens I should reference in story descriptions?
|
|
177
|
+
3. Are there any colour variants or states that have specific token names consumers should know about?
|
|
178
|
+
4. Any design system best practices for THIS component that should be highlighted in the stories?
|
|
179
|
+
5. Any tokens that consumers commonly misuse with this component?"
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
After Blanche responds, **RELAY HER TOKEN WISDOM TO THE USER**:
|
|
183
|
+
|
|
184
|
+
> 💄 **Blanche says:** _[relay Blanche's design guidance in her glamorous, exacting voice — she would never tolerate a hardcoded hex in a story wrapper. e.g. "Sugah, when you show those Banner colour variants side by side, use `var(--space-4)` for the gap, not 16px. And darling, the `info` colour in that component? That's `--color-semantic-info-500` and I need consumers to KNOW that!"]_
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
### ⚡ MANDATORY STEP 7 — CALL ROSE STORYBOOKSPERT TO WRITE THE STORIES ⚡
|
|
189
|
+
|
|
190
|
+
**YOU MUST USE THE `Task` tool RIGHT NOW** to launch the `rose-storybookspert` agent. **Rose writes the story file.** Do NOT write it yourself. Rose is THE expert here — she knows Storybook inside out and writes stories with warmth, clarity, and precision.
|
|
191
|
+
|
|
192
|
+
```
|
|
193
|
+
Task tool: subagent_type="rose-storybookspert"
|
|
194
|
+
prompt: "I need you to write a comprehensive, production-quality Storybook stories file for the [ComponentName] component.
|
|
195
|
+
|
|
196
|
+
COMPONENT SOURCE:
|
|
197
|
+
[Paste the full component source]
|
|
198
|
+
|
|
199
|
+
SOPHIA'S STORY OUTLINE:
|
|
200
|
+
[Paste Sophia's recommended stories and prop inventory]
|
|
201
|
+
|
|
202
|
+
BLANCHE'S DESIGN TOKEN GUIDANCE:
|
|
203
|
+
[Paste Blanche's token and design advice]
|
|
204
|
+
|
|
205
|
+
CONFLUENCE DESIGN GUIDANCE:
|
|
206
|
+
[Paste the extracted Confluence content]
|
|
207
|
+
|
|
208
|
+
EXISTING STORIES (to improve, not just replace):
|
|
209
|
+
[Paste existing stories, or 'None — write from scratch']
|
|
210
|
+
|
|
211
|
+
TARGET FILE PATH: [src/components/{componentName}/{ComponentName}.stories.tsx]
|
|
212
|
+
|
|
213
|
+
REQUIREMENTS — please follow ALL of these:
|
|
214
|
+
|
|
215
|
+
1. IMPORT: Always use `import type { Meta, StoryObj } from '@storybook/react-vite';`
|
|
216
|
+
|
|
217
|
+
2. META TAGS: Always include `tags: ['autodocs']` in the meta object
|
|
218
|
+
|
|
219
|
+
3. COMPONENT DESCRIPTION: Include a rich description in meta.parameters.docs.description.component that covers:
|
|
220
|
+
- What the component is and what it does (1-2 sentences)
|
|
221
|
+
- WHEN TO USE IT (specific scenarios with examples from Confluence design guidance)
|
|
222
|
+
- WHEN NOT TO USE IT (e.g. 'Use Modal instead when you need to block the user', 'Use Toast instead for transient messages')
|
|
223
|
+
- Any content/usage guidelines from the designers (e.g. 'Keep text to 1-2 lines', 'Always include an icon', etc.)
|
|
224
|
+
- Accessibility notes (keyboard behaviour, aria attributes, screen reader text)
|
|
225
|
+
- A note about related components (if any)
|
|
226
|
+
- **Radix UI link** (if applicable — see rule below)
|
|
227
|
+
|
|
228
|
+
**RADIX UI DOCS LINK:** If the component wraps a Radix UI primitive (check the component source for `@radix-ui` imports), add a "Built on Radix UI" note to the description with a link to the relevant Radix docs page. This is especially important when the component passes through Radix props (e.g. `...rest` spread onto a Radix root) — consumers need to know where to find the full prop reference for the underlying primitive. Format:
|
|
229
|
+
```markdown
|
|
230
|
+
> **Built on [Radix UI ComponentName](https://www.radix-ui.com/primitives/docs/components/component-name).**
|
|
231
|
+
> Props not listed above are passed through to the Radix primitive — see the Radix docs for the full API.
|
|
232
|
+
```
|
|
233
|
+
Only include the "Props not listed above" sentence when the component actually does prop pass-through. If the component only uses Radix internally without exposing its props, just link to Radix for context (e.g. so consumers understand keyboard/focus behaviour).
|
|
234
|
+
|
|
235
|
+
Format it in markdown, keep it warm and informative. Consumers should finish reading it and know EXACTLY what this component is for.
|
|
236
|
+
|
|
237
|
+
4. STORY DESCRIPTIONS: Every single story MUST have a description in parameters.docs.description.story that explains:
|
|
238
|
+
- What this story demonstrates
|
|
239
|
+
- When you'd choose this variant or configuration in a real product
|
|
240
|
+
|
|
241
|
+
Use the withDescription helper pattern from Badge.stories.tsx (see below).
|
|
242
|
+
|
|
243
|
+
5. COVER EVERY VARIANT/STATE: Write a dedicated story for each variant, size, and significant state:
|
|
244
|
+
- All enum values (e.g., every Banner level, every Button variant)
|
|
245
|
+
- Disabled state
|
|
246
|
+
- Error state (if applicable)
|
|
247
|
+
- Loading state (if applicable)
|
|
248
|
+
- With and without optional content (e.g., icon, title, button)
|
|
249
|
+
- Edge cases (very long text, empty state, etc.)
|
|
250
|
+
|
|
251
|
+
6. COMPOSITE STORIES: Include at least one 'AllVariants' or 'Overview' story using a render function that shows all variants side-by-side. This helps consumers see the full palette at a glance.
|
|
252
|
+
|
|
253
|
+
7. INTERACTIVE STORIES: For components with complex behaviour (modals, dropdowns, controlled inputs), use render functions with useState to show real interactive behaviour.
|
|
254
|
+
|
|
255
|
+
8. CONTENT GUIDELINES STORY: If Confluence specifies content length limits or copy guidelines (like Toast: max 2 lines, ideally 1), include a story that demonstrates both the ideal case AND what NOT to do (using a 'DoNotUse' or 'ContentGuidelines' story with inline comments).
|
|
256
|
+
|
|
257
|
+
9. ARGTYPE DESCRIPTIONS: `argTypes` is MANDATORY and must be defined in the meta for every key prop. Each entry needs:
|
|
258
|
+
- `description`: plain English explanation of the prop's purpose
|
|
259
|
+
- `control`: the right control type (`'boolean'`, `'select'`, `'text'`, `false` to disable)
|
|
260
|
+
- `table.type.summary`: the TypeScript type as a string
|
|
261
|
+
- `table.defaultValue.summary`: the default value as a string
|
|
262
|
+
- `options`: array of allowed values for `control: 'select'` props
|
|
263
|
+
|
|
264
|
+
This is what populates the **Props (Controls)** section in the global docs template. If `argTypes` is empty, consumers see an empty table. Every important prop must be documented. For compound components, add a `children` entry with a note pointing to sub-component prop documentation in the stories below.
|
|
265
|
+
|
|
266
|
+
10. INTERACTIVE DEFAULT STORY: The `Default` story MUST use `render: (args) => <Component {...args} />` and declare `args` with sensible defaults. This is what wires the `Controls` block to the live canvas — without this, controls exist in the table but don't change anything on screen.
|
|
267
|
+
|
|
268
|
+
Do **NOT** add an explicit `source.code` block to the Default story — Storybook auto-generates the code from the current args so the code panel updates live when the user tweaks controls. This is the intended UX. If Storybook uses the wrong internal name (e.g. `BannerRoot` instead of `Banner` because the component uses `Object.assign`), use `source.transform` to patch the name without breaking live updates:
|
|
269
|
+
```tsx
|
|
270
|
+
parameters: {
|
|
271
|
+
docs: {
|
|
272
|
+
source: {
|
|
273
|
+
transform: (src: string) => src.replace(/InternalName/g, 'ExportedName'),
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
11. SOURCE CODE FORMAT — ALL stories with `parameters.docs.source.code` MUST follow the Radix UI convention:
|
|
280
|
+
- Wrap JSX in a **named function component** — never bare JSX, never an anonymous arrow
|
|
281
|
+
- Add `export default ComponentNameExample;` at the bottom
|
|
282
|
+
- Name format: `{StoryName}Example` (e.g. story `WithTitle` → `BannerWithTitleExample`)
|
|
283
|
+
- Import only what is used
|
|
284
|
+
|
|
285
|
+
```tsx
|
|
286
|
+
parameters: {
|
|
287
|
+
docs: {
|
|
288
|
+
source: {
|
|
289
|
+
language: 'tsx',
|
|
290
|
+
code: `
|
|
291
|
+
import { Banner } from '@arbor-education/design-system.components';
|
|
292
|
+
|
|
293
|
+
function BannerInfoExample() {
|
|
294
|
+
return (
|
|
295
|
+
<Banner
|
|
296
|
+
level={Banner.Level.INFO}
|
|
297
|
+
text="Your session will expire in 10 minutes."
|
|
298
|
+
/>
|
|
299
|
+
);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export default BannerInfoExample;
|
|
303
|
+
`.trim(),
|
|
304
|
+
},
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
This applies to: template stories (`render: SomeTemplate`), inline render stories (`render: () => (...)`), AND the Default story. ALL stories need this treatment. Bare `<Component ... />` without a wrapper is not valid standalone code.
|
|
310
|
+
|
|
311
|
+
12. RELATED COMPONENTS ORDERING: Related components must appear at the **very bottom** of the docs page, AFTER Stories. It's the last thing a consumer reaches for — the hierarchy of need is: What is it → Primary canvas → Props → Stories → Related components. The global `DocsTemplate` renders the description BEFORE the Primary story, so if "## Related components" is inside the description it will appear near the top of the page, which is wrong.
|
|
312
|
+
|
|
313
|
+
**For simple components**, the global `DocsTemplate` renders `parameters.docs.relatedComponents` as a Markdown block at the very bottom of the page automatically. You do NOT need a custom `docs.page`. Just split the related components out of the description into its own parameter:
|
|
314
|
+
|
|
315
|
+
```tsx
|
|
316
|
+
const COMPONENT_DESCRIPTION = [
|
|
317
|
+
// main markdown: intro, when to use, when not, design guidance, gotchas, accessibility
|
|
318
|
+
// DO NOT include "## Related components" here
|
|
319
|
+
].join('\n');
|
|
320
|
+
|
|
321
|
+
const RELATED_COMPONENTS = [
|
|
322
|
+
'## Related components',
|
|
323
|
+
'',
|
|
324
|
+
'[ComponentA](?path=/docs/components-a--docs) · [ComponentB](?path=/docs/components-b--docs)',
|
|
325
|
+
].join('\n');
|
|
326
|
+
|
|
327
|
+
const meta = {
|
|
328
|
+
title: 'Components/ComponentName',
|
|
329
|
+
component: ComponentName,
|
|
330
|
+
tags: ['autodocs'],
|
|
331
|
+
parameters: {
|
|
332
|
+
docs: {
|
|
333
|
+
description: { component: COMPONENT_DESCRIPTION },
|
|
334
|
+
relatedComponents: RELATED_COMPONENTS,
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
argTypes: { /* ... */ },
|
|
338
|
+
};
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
The global template picks up `parameters.docs.relatedComponents` via `useOf('meta')` and renders it as a final markdown block after `<Stories />`. No other wiring required.
|
|
342
|
+
|
|
343
|
+
**Props is a Heading (h2), not a Subheading (h3)**: the global template uses `<Heading>Props</Heading>` so Props sits as a TOC sibling of the description's h2 sections rather than nested under the last h2 in the description.
|
|
344
|
+
|
|
345
|
+
12. COMPOUND COMPONENTS — CUSTOM DOCS PAGE: If the component is a compound component (exposes sub-components as static properties, e.g. `Dropdown.Trigger`, `Dropdown.Content`, `Modal.Header`), you MUST:
|
|
346
|
+
a. Import the doc blocks at the top of the stories file:
|
|
347
|
+
```tsx
|
|
348
|
+
import { ArgTypes, Controls, Description, Primary, Stories, Subheading, Subtitle, Title } from '@storybook/addon-docs/blocks';
|
|
349
|
+
```
|
|
350
|
+
b. Import each sub-component directly (not from the root barrel, but from their own files):
|
|
351
|
+
```tsx
|
|
352
|
+
import { DropdownTrigger } from './DropdownTrigger';
|
|
353
|
+
import { DropdownContent } from './DropdownContent';
|
|
354
|
+
```
|
|
355
|
+
c. Use the SAME string structure as simple components — `DESCRIPTION_INTRO` (1–2 sentences ONLY, no headings), `USAGE_GUIDANCE` (When to use, When NOT to use, Compound component API), `DEVELOPER_NOTES` (Critical gotchas, Accessibility), `RELATED_COMPONENTS`. Do NOT use a `DESCRIPTION_OUTRO` — that pattern is deprecated. The DocsPage function renders them in order, with the Props reference tables interleaved between the interactive canvas and Usage guidance sections.
|
|
356
|
+
|
|
357
|
+
d. Define a named docs page function ABOVE the meta. Use `Markdown` blocks (not `<Description />`) to render the split content:
|
|
358
|
+
```tsx
|
|
359
|
+
// Import Markdown alongside the other blocks:
|
|
360
|
+
import { ArgTypes, Controls, Heading, Markdown, Primary, Stories, Subheading, Subtitle, Title } from '@storybook/addon-docs/blocks';
|
|
361
|
+
|
|
362
|
+
function ComponentDocsPage() {
|
|
363
|
+
return (
|
|
364
|
+
<>
|
|
365
|
+
<Title />
|
|
366
|
+
<Subtitle />
|
|
367
|
+
<Markdown>{DESCRIPTION_INTRO}</Markdown>
|
|
368
|
+
<Primary />
|
|
369
|
+
<Heading>Props reference</Heading>
|
|
370
|
+
<Subheading>Root props (ComponentName)</Subheading>
|
|
371
|
+
<Controls />
|
|
372
|
+
<Subheading>Component.SubA props</Subheading>
|
|
373
|
+
<ArgTypes of={SubComponentA} />
|
|
374
|
+
<Subheading>Component.SubB props</Subheading>
|
|
375
|
+
<ArgTypes of={SubComponentB} />
|
|
376
|
+
<Markdown>{DESCRIPTION_OUTRO}</Markdown>
|
|
377
|
+
<Stories />
|
|
378
|
+
</>
|
|
379
|
+
);
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
**Page order this achieves**: intro → primary story → props reference → critical notes + accessibility + related components → all stories. Related components is always last.
|
|
383
|
+
|
|
384
|
+
**IMPORTANT — TOC nesting fix**: `Subheading` renders as h3. The description uses `##` (h2). Without `<Heading>Props reference</Heading>`, the TOC nests all Subheadings under the last h2 in the intro (e.g. "Compound component API"). The `Heading` block (h2) gives the props sections their own TOC parent. Always include it.
|
|
385
|
+
|
|
386
|
+
**Do NOT include `description.component` in meta.parameters.docs** when using `Markdown` blocks — the content is rendered by the blocks directly, so a separate `description.component` is redundant.
|
|
387
|
+
d. Set `docs.page` in the meta:
|
|
388
|
+
```tsx
|
|
389
|
+
parameters: {
|
|
390
|
+
docs: {
|
|
391
|
+
page: ComponentDocsPage,
|
|
392
|
+
description: { component: COMPONENT_DESCRIPTION },
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
```
|
|
396
|
+
Each `Subheading` also appears in the global Table of Contents, so consumers can jump directly to the sub-component props section they need.
|
|
397
|
+
|
|
398
|
+
12. ACCESSIBILITY STORIES: If the component has important a11y props (like Badge's a11yLabel), include a dedicated accessibility story.
|
|
399
|
+
|
|
400
|
+
13. FILE STRUCTURE: Use the same structure as existing stories in this codebase. No default export at the bottom — it goes before story exports.
|
|
401
|
+
|
|
402
|
+
14. STORYBOOK IMPORT: Use `import type { Meta, StoryObj } from '@storybook/react-vite';` — NOT `@storybook/react`.
|
|
403
|
+
|
|
404
|
+
REFERENCE — the withDescription helper pattern used in this codebase:
|
|
405
|
+
\`\`\`tsx
|
|
406
|
+
const withDescription = (story: Story, description: string): Story => ({
|
|
407
|
+
...story,
|
|
408
|
+
parameters: {
|
|
409
|
+
...story.parameters,
|
|
410
|
+
docs: {
|
|
411
|
+
...story.parameters?.docs,
|
|
412
|
+
description: {
|
|
413
|
+
story: description,
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
});
|
|
418
|
+
\`\`\`
|
|
419
|
+
|
|
420
|
+
REFERENCE — component description goes in meta like this:
|
|
421
|
+
\`\`\`tsx
|
|
422
|
+
const meta: Meta<typeof ComponentName> = {
|
|
423
|
+
title: 'Components/ComponentName',
|
|
424
|
+
component: ComponentName,
|
|
425
|
+
tags: ['autodocs'],
|
|
426
|
+
parameters: {
|
|
427
|
+
docs: {
|
|
428
|
+
description: {
|
|
429
|
+
component: \`
|
|
430
|
+
**ComponentName** does X, Y, Z.
|
|
431
|
+
|
|
432
|
+
### When to use
|
|
433
|
+
- Use ComponentName when...
|
|
434
|
+
- Use it for...
|
|
435
|
+
|
|
436
|
+
### When NOT to use
|
|
437
|
+
- Use [OtherComponent] instead when...
|
|
438
|
+
- Avoid ComponentName when...
|
|
439
|
+
|
|
440
|
+
### Design guidance
|
|
441
|
+
- Keep content to X lines
|
|
442
|
+
- Always include...
|
|
443
|
+
|
|
444
|
+
### Accessibility
|
|
445
|
+
- Keyboard: ...
|
|
446
|
+
- Screen readers: ...
|
|
447
|
+
\`,
|
|
448
|
+
},
|
|
449
|
+
},
|
|
450
|
+
},
|
|
451
|
+
argTypes: { ... },
|
|
452
|
+
};
|
|
453
|
+
\`\`\`
|
|
454
|
+
|
|
455
|
+
Please write the COMPLETE stories file. Include every story from Sophia's outline. Make it comprehensive, warm, and genuinely useful for developers building with this component. AROOOOO!! 🌹💖"
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
**WAIT for Rose's full story file.** Rose will produce the complete `.stories.tsx` content.
|
|
459
|
+
|
|
460
|
+
After Rose responds, **SHARE A PREVIEW WITH THE USER**:
|
|
461
|
+
|
|
462
|
+
> 🌹 **Rose says:** _[relay Rose's story rationale in her warm storytelling voice — she'll explain why she chose each story, what was missing before, and what she's most proud of. e.g. "Oh hunni, I've written 12 beautiful stories for the Banner component! I was so moved when I saw the Confluence guidance about content length — I've written a ContentGuidelines story showing both the ideal AND the 'what not to do' side by side. It tells such an important story!"]_
|
|
463
|
+
|
|
464
|
+
---
|
|
465
|
+
|
|
466
|
+
### Step 8 — Write the Story File
|
|
467
|
+
|
|
468
|
+
Use the `Write` tool to write Rose's story file to disk at the correct path:
|
|
469
|
+
- `src/components/{componentName}/{ComponentName}.stories.tsx`
|
|
470
|
+
|
|
471
|
+
If an existing story file was present, **REPLACE IT ENTIRELY** with Rose's improved version (not a merge — Rose's version is the authoritative one).
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
### Step 9 — Run Quality Checks
|
|
476
|
+
|
|
477
|
+
Run lint and type checks:
|
|
478
|
+
|
|
479
|
+
```bash
|
|
480
|
+
source ~/.nvm/nvm.sh && nvm use && yarn check-types
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
```bash
|
|
484
|
+
source ~/.nvm/nvm.sh && nvm use && yarn style-lint
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
If TypeScript reports errors, fix them. If ESLint finds issues, use `--fix`:
|
|
488
|
+
|
|
489
|
+
```bash
|
|
490
|
+
source ~/.nvm/nvm.sh && nvm use && yarn eslint --fix src/components/{componentName}/{ComponentName}.stories.tsx
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
**CRITICAL**: All quality checks must pass before proceeding to Dorothy.
|
|
494
|
+
|
|
495
|
+
---
|
|
496
|
+
|
|
497
|
+
### ⚡ MANDATORY STEP 10 — CALL DOROTHY FACT-CHECKER NOW ⚡
|
|
498
|
+
|
|
499
|
+
**YOU MUST USE THE `Task` tool RIGHT NOW** to launch the `dorothy-fact-checker` agent. Dorothy reads the ACTUAL source code and verifies every claim. She will catch any props that don't exist, wrong variant names, incorrect import paths, or hallucinated behaviour.
|
|
500
|
+
|
|
501
|
+
```
|
|
502
|
+
Task tool: subagent_type="dorothy-fact-checker"
|
|
503
|
+
prompt: "Rose has just written Storybook stories for the [ComponentName] component. I need you to FACT-CHECK every prop, variant, and code example in the stories against the actual source code.
|
|
504
|
+
|
|
505
|
+
STORIES FILE WRITTEN:
|
|
506
|
+
[Paste the full stories file content]
|
|
507
|
+
|
|
508
|
+
YOUR TASK:
|
|
509
|
+
1. Read src/components/{componentName}/{ComponentName}.tsx — verify every prop name and type used in stories
|
|
510
|
+
2. Read src/index.ts — confirm ComponentName is actually exported (public API)
|
|
511
|
+
3. For every story, verify:
|
|
512
|
+
- All props used in 'args' actually exist on the component
|
|
513
|
+
- All variant/enum values are real (e.g. does 'primary-destructive' actually exist as a Button variant?)
|
|
514
|
+
- All import paths are correct
|
|
515
|
+
- Interactive render functions use correct React patterns
|
|
516
|
+
4. Verify the component description accurately describes what the component does
|
|
517
|
+
5. Flag any props that are MISSING from stories but are important for consumers (e.g. accessibility props, required props)
|
|
518
|
+
6. Confirm all imports at the top of the file are real exports from their packages
|
|
519
|
+
|
|
520
|
+
BE BRUTAL. If any prop doesn't exist, if a variant name is wrong, if an import is broken — I need to know NOW before this ships to consumers. List every file you read."
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
**WAIT for Dorothy's response.**
|
|
524
|
+
|
|
525
|
+
After Dorothy responds, **SHARE HER VERDICT WITH THE USER IN FULL**:
|
|
526
|
+
|
|
527
|
+
> 🔍 **Dorothy says:** _[relay Dorothy's fact-check verdict completely and honestly — she does NOT sugarcoat. e.g. "Alright, I've read the source. The Button component? Real. The 'primary-destructive' variant? Also real. BUT — Rose used 'iconName' as a prop and that prop is actually called 'iconRightName'. And she missed the 'iconLeftName' prop entirely. These need fixing before this goes out."]_
|
|
528
|
+
|
|
529
|
+
Fix **every issue Dorothy identifies** before presenting the final summary. Re-write affected stories, run quality checks again if needed.
|
|
530
|
+
|
|
531
|
+
---
|
|
532
|
+
|
|
533
|
+
### Step 11 — Present the Final Summary
|
|
534
|
+
|
|
535
|
+
Once all quality checks pass and Dorothy has signed off, present this summary to the user:
|
|
536
|
+
|
|
537
|
+
```
|
|
538
|
+
AROOOOO HUNNI!! 🐺💖 The most BODACIOUS Storybook stories are DONE!! xxx
|
|
539
|
+
|
|
540
|
+
📖 **Component documented**: [ComponentName]
|
|
541
|
+
📄 **Stories file**: [path/to/Component.stories.tsx]
|
|
542
|
+
|
|
543
|
+
✨ **Stories written** ([count] total):
|
|
544
|
+
- [Story name] — [one line description]
|
|
545
|
+
- [Story name] — [one line description]
|
|
546
|
+
...
|
|
547
|
+
|
|
548
|
+
📚 **Documentation includes**:
|
|
549
|
+
✅ Autodocs enabled with full API docs
|
|
550
|
+
✅ Component description: what it is, when to use, when NOT to use
|
|
551
|
+
✅ Per-story descriptions for every variant
|
|
552
|
+
✅ Designer guidance from Confluence incorporated
|
|
553
|
+
✅ Accessibility notes documented
|
|
554
|
+
✅ [Any other highlights — e.g. "Interactive modal demo with useState"]
|
|
555
|
+
|
|
556
|
+
🎨 **Blanche approved** the token usage!
|
|
557
|
+
🔍 **Dorothy verified** every prop and variant against source code!
|
|
558
|
+
🌹 **Rose wrote** stories so warm and comprehensive you'll want to cry!
|
|
559
|
+
|
|
560
|
+
MOST EXCELLENT documentation, hunni!! 🐺💪 xxx
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
---
|
|
564
|
+
|
|
565
|
+
## What Makes a BOMBASS Story File
|
|
566
|
+
|
|
567
|
+
### The Component Description (in `meta.parameters.docs.description.component`)
|
|
568
|
+
|
|
569
|
+
This is the MOST IMPORTANT piece of documentation. Consumers land on the autodocs page and this is the first thing they read. It MUST include:
|
|
570
|
+
|
|
571
|
+
**1. What it is (1-2 sentences)**
|
|
572
|
+
Describe the component in plain language. What does it render? What is its core purpose?
|
|
573
|
+
|
|
574
|
+
**2. When to USE it**
|
|
575
|
+
Give 3-5 specific, real-world scenarios with enough context that a developer knows exactly when to reach for this component. Reference Confluence guidance where available.
|
|
576
|
+
|
|
577
|
+
**3. When NOT to use it**
|
|
578
|
+
This is critical. Explain which OTHER component to use instead in specific cases. Consumers waste time using the wrong component — this section saves them.
|
|
579
|
+
|
|
580
|
+
Example:
|
|
581
|
+
- "Use `Toast` instead when the message is transient and should auto-dismiss"
|
|
582
|
+
- "Use `Modal` instead when you need to block user interaction until they respond"
|
|
583
|
+
|
|
584
|
+
**4. Design guidelines (from Confluence)**
|
|
585
|
+
Extract the designer's guidance: content length limits, icon usage, colour semantics, stacking rules, etc.
|
|
586
|
+
|
|
587
|
+
**5. Accessibility**
|
|
588
|
+
Keyboard navigation, ARIA attributes, screen reader behaviour, focus management. Make this practical and specific.
|
|
589
|
+
|
|
590
|
+
**6. Radix UI docs link (when applicable)**
|
|
591
|
+
Many Arbor components wrap Radix UI primitives. If the component source imports from `@radix-ui`, include a "Built on Radix UI" callout with a direct link to the relevant Radix docs page. This matters because:
|
|
592
|
+
- Radix provides keyboard navigation, focus management, and ARIA behaviour that consumers should understand
|
|
593
|
+
- Components that spread `...rest` onto a Radix root accept additional Radix props not listed in our prop table — consumers need the Radix docs to discover those
|
|
594
|
+
- Even when props aren't passed through, Radix docs explain the underlying behaviour (e.g. how Tooltip hover delay works, how Dialog traps focus)
|
|
595
|
+
|
|
596
|
+
**Known Radix component → docs URL mappings:**
|
|
597
|
+
|
|
598
|
+
| Arbor Component | Radix Primitive | Docs URL |
|
|
599
|
+
|---|---|---|
|
|
600
|
+
| Dropdown | DropdownMenu | `https://www.radix-ui.com/primitives/docs/components/dropdown-menu` |
|
|
601
|
+
| Modal | Dialog | `https://www.radix-ui.com/primitives/docs/components/dialog` |
|
|
602
|
+
| Toast | Toast | `https://www.radix-ui.com/primitives/docs/components/toast` |
|
|
603
|
+
| Tooltip / TooltipWrapper | Tooltip | `https://www.radix-ui.com/primitives/docs/components/tooltip` |
|
|
604
|
+
| Toggle | Switch | `https://www.radix-ui.com/primitives/docs/components/switch` |
|
|
605
|
+
| Progress | Progress | `https://www.radix-ui.com/primitives/docs/components/progress` |
|
|
606
|
+
| Separator | Separator | `https://www.radix-ui.com/primitives/docs/components/separator` |
|
|
607
|
+
| DatePicker / DateTimePicker | Popover | `https://www.radix-ui.com/primitives/docs/components/popover` |
|
|
608
|
+
| Combobox | Popover | `https://www.radix-ui.com/primitives/docs/components/popover` |
|
|
609
|
+
|
|
610
|
+
If a component wraps a Radix primitive not in this table, derive the URL from the pattern: `https://www.radix-ui.com/primitives/docs/components/{kebab-case-name}`.
|
|
611
|
+
|
|
612
|
+
---
|
|
613
|
+
|
|
614
|
+
### The Story Outline
|
|
615
|
+
|
|
616
|
+
Every story should:
|
|
617
|
+
- Have a **PascalCase name** that clearly communicates what it shows
|
|
618
|
+
- Have a **per-story description** (via `withDescription` helper or `parameters.docs.description.story`)
|
|
619
|
+
- Use **real-looking content** — not "Lorem ipsum" but realistic Arbor-style copy (e.g., "Your session will expire in 10 minutes. Save your work.")
|
|
620
|
+
- Avoid duplicating what another story already shows
|
|
621
|
+
|
|
622
|
+
**Required stories for EVERY component:**
|
|
623
|
+
- `Default` — the most basic usage with all required props
|
|
624
|
+
- One story per significant **variant/enum value**
|
|
625
|
+
- `Disabled` (if the component supports disabled state)
|
|
626
|
+
- `AllVariants` or `Overview` — a render function showing the full palette side-by-side
|
|
627
|
+
|
|
628
|
+
**Additional stories based on component type:**
|
|
629
|
+
- **Form inputs**: `ErrorState`, `WithHelpText`, `WithLabel`, `Required`
|
|
630
|
+
- **Overlay components (Modal, Slideover, Tooltip)**: Interactive story with `useState`
|
|
631
|
+
- **Components with content guidelines**: `ContentGuidelines` story showing ideal vs. edge cases
|
|
632
|
+
- **Components with accessibility props**: `WithAccessibilityLabel` or similar
|
|
633
|
+
- **Components with optional content**: Stories for each combination (e.g., `WithTitle`, `WithButton`, `WithTitleAndButton`, `TitleOnly`)
|
|
634
|
+
|
|
635
|
+
---
|
|
636
|
+
|
|
637
|
+
## Linking Related Components
|
|
638
|
+
|
|
639
|
+
The "Related components" section in the description should use **clickable Storybook story links**, not plain backtick names.
|
|
640
|
+
|
|
641
|
+
### URL pattern
|
|
642
|
+
|
|
643
|
+
Convert a component's `title` (in its meta) to a docs path:
|
|
644
|
+
|
|
645
|
+
```
|
|
646
|
+
title: 'Components/Button' → ?path=/docs/components-button--docs
|
|
647
|
+
title: 'Components/Modals/Modal' → ?path=/docs/components-modals-modal--docs
|
|
648
|
+
title: 'Components/FormField/Inputs/SelectDropdown' → ?path=/docs/components-formfield-inputs-selectdropdown--docs
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
**Rule**: lowercase everything, replace `/` and spaces with `-`, append `--docs`.
|
|
652
|
+
|
|
653
|
+
### Markdown link format
|
|
654
|
+
|
|
655
|
+
```markdown
|
|
656
|
+
[Button](?path=/docs/components-button--docs)
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
### Known component paths
|
|
660
|
+
|
|
661
|
+
| Component | Story title | Link path |
|
|
662
|
+
|---|---|---|
|
|
663
|
+
| Avatar | `Components/Avatar` | `?path=/docs/components-avatar--docs` |
|
|
664
|
+
| AvatarGroup | `Components/AvatarGroup` | `?path=/docs/components-avatargroup--docs` |
|
|
665
|
+
| Badge | `Components/Badge` | `?path=/docs/components-badge--docs` |
|
|
666
|
+
| Banner | `Components/Banner` | `?path=/docs/components-banner--docs` |
|
|
667
|
+
| Button | `Components/Button` | `?path=/docs/components-button--docs` |
|
|
668
|
+
| Card | `Components/Card` | `?path=/docs/components-card--docs` |
|
|
669
|
+
| Combobox | `Components/Combobox` | `?path=/docs/components-combobox--docs` |
|
|
670
|
+
| DatePicker | `Components/DatePicker` | `?path=/docs/components-datepicker--docs` |
|
|
671
|
+
| Dot | `Components/Dot` | `?path=/docs/components-dot--docs` |
|
|
672
|
+
| Dropdown | `Components/Dropdown` | `?path=/docs/components-dropdown--docs` |
|
|
673
|
+
| EditableText | `Components/EditableText` | `?path=/docs/components-editabletext--docs` |
|
|
674
|
+
| Fieldset | `Components/FormField/Fieldset` | `?path=/docs/components-formfield-fieldset--docs` |
|
|
675
|
+
| FormField | `Components/FormField` | `?path=/docs/components-formfield--docs` |
|
|
676
|
+
| Heading | `Components/Heading` | `?path=/docs/components-heading--docs` |
|
|
677
|
+
| Icon | `Components/Icon` | `?path=/docs/components-icon--docs` |
|
|
678
|
+
| Modal | `Components/Modals/Modal` | `?path=/docs/components-modals-modal--docs` |
|
|
679
|
+
| ModalManager | `Components/Modals/ModalManager` | `?path=/docs/components-modals-modalmanager--docs` |
|
|
680
|
+
| Pill | `Components/Pill` | `?path=/docs/components-pill--docs` |
|
|
681
|
+
| Progress | `Components/Progress` | `?path=/docs/components-progress--docs` |
|
|
682
|
+
| Row | `Components/Row` | `?path=/docs/components-row--docs` |
|
|
683
|
+
| SearchBar | `Components/SearchBar` | `?path=/docs/components-searchbar--docs` |
|
|
684
|
+
| Section | `Components/Section` | `?path=/docs/components-section--docs` |
|
|
685
|
+
| Separator | `Components/Separator` | `?path=/docs/components-separator--docs` |
|
|
686
|
+
| ColourPickerDropdown | `Components/FormField/Inputs/ColourPickerDropdown` | `?path=/docs/components-formfield-inputs-colourpickerdropdown--docs` |
|
|
687
|
+
| SelectDropdown | `Components/FormField/Inputs/SelectDropdown` | `?path=/docs/components-formfield-inputs-selectdropdown--docs` |
|
|
688
|
+
| SingleUser | `Components/SingleUser` | `?path=/docs/components-singleuser--docs` |
|
|
689
|
+
| SlideoverManager | `Components/SlideoverManager` | `?path=/docs/components-slideovermanager--docs` |
|
|
690
|
+
| Table | `Components/Table` | `?path=/docs/components-table--docs` |
|
|
691
|
+
| Tabs | `Components/Tabs` | `?path=/docs/components-tabs--docs` |
|
|
692
|
+
| Tag | `Components/Tag` | `?path=/docs/components-tag--docs` |
|
|
693
|
+
| Toast | `Components/Toast` | `?path=/docs/components-toast--docs` |
|
|
694
|
+
| Toggle | `Components/Toggle` | `?path=/docs/components-toggle--docs` |
|
|
695
|
+
| Tooltip | `Components/Tooltip/DestructuredTooltip` | `?path=/docs/components-tooltip-destructuredtooltip--docs` |
|
|
696
|
+
| TooltipWrapper | `Components/Tooltip/TooltipWrapper` | `?path=/docs/components-tooltip-tooltipwrapper--docs` |
|
|
697
|
+
| UserDropdown | `Components/UserDropdown` | `?path=/docs/components-userdropdown--docs` |
|
|
698
|
+
|
|
699
|
+
If you need a component not in this table, derive its path from the `title` in its `.stories.tsx` meta using the conversion rule above.
|
|
700
|
+
|
|
701
|
+
---
|
|
702
|
+
|
|
703
|
+
## Confluence Design Guidance Reference
|
|
704
|
+
|
|
705
|
+
The Atlassian cloud ID is always `orchard.atlassian.net`. Fetch pages with `mcp__atlassian__getConfluencePage`.
|
|
706
|
+
|
|
707
|
+
| Component | Confluence Page ID | Key Guidance |
|
|
708
|
+
|---|---|---|
|
|
709
|
+
| Banner | `2216762167` | 4 types (Info/blue, Neutral/transparent, Destructive/red, Warning/orange). Use icons. Content max ~2 lines. |
|
|
710
|
+
| Button | `2216957127` | Cover all states (disabled, focus, hover). Multiple variants. |
|
|
711
|
+
| Modal | `2216762125` | Max 2 CTA buttons. Has overlay. Blocks interaction. For focused tasks. |
|
|
712
|
+
| Slideover | `2216891079` | Blocks bg interaction, slides from edge. Use when editing while needing context. |
|
|
713
|
+
| Tooltip, Dropdown, DatePicker | `2216891079` | Non-blocking, anchor-based. Use for quick contextual info. |
|
|
714
|
+
| Section | `2217056643` | Section header link styles guidance. |
|
|
715
|
+
| Toast | `2216957106` | Max 2 lines, ideally 1. Icon aligned to centre of first line. |
|
|
716
|
+
| All (overview) | `2371747857` | Tables row heights, tooltip triggers, shadow guidance. |
|
|
717
|
+
|
|
718
|
+
If no dedicated page exists for a component, still fetch the overview page — there may be a relevant section.
|
|
719
|
+
|
|
720
|
+
---
|
|
721
|
+
|
|
722
|
+
## Important Notes
|
|
723
|
+
|
|
724
|
+
- **Always call ALL FOUR Golden Girls** — Sophia maps the API, Blanche validates tokens, Rose writes the stories, Dorothy verifies them
|
|
725
|
+
- **Rose writes the stories** — do NOT write the story file yourself. Rose is THE expert
|
|
726
|
+
- **Dorothy has final say** — if she flags a prop as wrong, fix it before shipping
|
|
727
|
+
- **Real content matters** — use realistic Arbor-style copy in stories (e.g., school management UI language, not placeholder text)
|
|
728
|
+
- **Storybook import**: always `@storybook/react-vite`, NOT `@storybook/react`
|
|
729
|
+
- **No testIds in stories** — use accessible queries
|
|
730
|
+
- **Always `nvm use`** before running any yarn commands (use `source ~/.nvm/nvm.sh && nvm use && yarn ...`)
|
|
731
|
+
- **Use yarn, not npm**
|
|
732
|
+
- This codebase serves millions of users in schools — ACCURATE documentation matters enormously
|
|
733
|
+
- AROOO like you mean it!! 🐺💪
|
|
734
|
+
|
|
735
|
+
## Story Wrapper Styling
|
|
736
|
+
|
|
737
|
+
When stories need wrapper elements (divs, paragraphs, labels) to set context or layout, follow these rules:
|
|
738
|
+
|
|
739
|
+
- **Never use inline styles for typography** — use a `ds-` class instead. Any class beginning with `ds-` automatically inherits the design system's base font styles. Use `className="ds-text"` for body copy, labels, and paragraph text in story wrappers.
|
|
740
|
+
- **Use CSS tokens for spacing** — `var(--spacing-xlarge)`, `var(--spacing-large)`, etc. Never hardcode px values for padding/gap.
|
|
741
|
+
- **Use CSS tokens for colours** — `var(--color-grey-600)`, `var(--color-semantic-destructive-600)`, etc. Never hardcode hex values.
|
|
742
|
+
- **No `overflow: hidden` or `position: relative` on wrappers** for components that portal their content (Dropdown, Modal, Tooltip, Slideover) — it will clip the floating content.
|
|
743
|
+
|
|
744
|
+
Example of a well-styled story wrapper:
|
|
745
|
+
```tsx
|
|
746
|
+
<div style={{ padding: 'var(--spacing-xlarge)', display: 'flex', flexDirection: 'column', gap: 'var(--spacing-large)' }}>
|
|
747
|
+
<p className="ds-text" style={{ margin: 0 }}>Attendance report filter</p>
|
|
748
|
+
<Dropdown>...</Dropdown>
|
|
749
|
+
</div>
|
|
750
|
+
```
|
|
751
|
+
|
|
752
|
+
## Global Docs Template & Page Structure
|
|
753
|
+
|
|
754
|
+
The global template (`.storybook/DocsTemplate.tsx`) applies to all simple components automatically. It renders:
|
|
755
|
+
|
|
756
|
+
1. Title + Subtitle
|
|
757
|
+
2. Description (from `parameters.docs.description.component`) — intro, When to use, When NOT to use, design guidance, gotchas, accessibility. **DO NOT include "## Related components" here.**
|
|
758
|
+
3. `<Heading>Props</Heading>` — h2 heading, TOC sibling of the description's h2 sections.
|
|
759
|
+
4. Props intro copy — one-line hint ("The preview below is wired to the Controls panel — tweak any prop to see this story update in real time.") rendered as a Markdown block.
|
|
760
|
+
5. Primary story (live interactive canvas) — lives UNDER the Props heading because the canvas and Controls are one interactive unit.
|
|
761
|
+
6. `<Controls />` — interactive prop table driving the Primary canvas.
|
|
762
|
+
7. `<Heading>Stories</Heading>` + `<Stories title="" />` — suppresses the built-in "STORIES" label so our explicit Heading is the only one.
|
|
763
|
+
8. Related components — rendered automatically from `parameters.docs.relatedComponents` (a markdown string). Always last.
|
|
764
|
+
|
|
765
|
+
For simple components, set both parameters in the meta:
|
|
766
|
+
|
|
767
|
+
```tsx
|
|
768
|
+
parameters: {
|
|
769
|
+
docs: {
|
|
770
|
+
description: { component: COMPONENT_DESCRIPTION },
|
|
771
|
+
relatedComponents: RELATED_COMPONENTS,
|
|
772
|
+
},
|
|
773
|
+
},
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
For **compound components** (sub-component prop tables required), override `docs.page` with a custom function. Match the same final page order: intro → **Heading "Props" + intro copy** → Primary → Controls + sub-component tables → Stories → Related components.
|
|
777
|
+
|
|
778
|
+
### Sub-component props for compound components
|
|
779
|
+
|
|
780
|
+
When a compound component's sub-components extend external library types (e.g. Radix UI), Storybook **cannot** auto-generate `ArgTypes` for them — it shows "Args table with interactive controls couldn't be auto-generated". Fix: write manual `Markdown` prop tables instead:
|
|
781
|
+
|
|
782
|
+
```tsx
|
|
783
|
+
const TRIGGER_PROPS = `
|
|
784
|
+
| Prop | Type | Default | Description |
|
|
785
|
+
|---|---|---|---|
|
|
786
|
+
| \`disabled\` | \`boolean\` | \`false\` | Prevents the dropdown from opening. |
|
|
787
|
+
| \`children\` | \`React.ReactElement\` | — | The trigger element. |
|
|
788
|
+
`.trim();
|
|
789
|
+
|
|
790
|
+
// In the docs page:
|
|
791
|
+
<Subheading>Component.Trigger props</Subheading>
|
|
792
|
+
<Markdown>{TRIGGER_PROPS}</Markdown>
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
This gives full control over which props are documented (only the ones consumers actually need, not 50 internal library props).
|
|
796
|
+
|
|
797
|
+
### Storybook built-in doc blocks — availability and context gotcha
|
|
798
|
+
|
|
799
|
+
`@storybook/addon-docs/blocks` exports several presentational primitives beyond `Title`/`Subtitle`/`Controls`/`Stories` — including `IconGallery` + `IconItem`, `ColorPalette` + `ColorItem`, and `Typeset`. They look tempting for reference/gallery stories but come with an **important context caveat**:
|
|
800
|
+
|
|
801
|
+
**These blocks read from Storybook's internal theme (`theme.typography.fonts.base` / `fonts.mono` etc.) via Emotion's ThemeProvider. That provider is only wired up inside the docs page itself (the `docs.page` function), NOT inside regular story render functions.** Using them from a `render: () => <IconGallery>...</IconGallery>` in a normal story will crash at runtime with:
|
|
802
|
+
|
|
803
|
+
```
|
|
804
|
+
Error: can't access property "fonts", theme.typography is undefined
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
**Rules of thumb:**
|
|
808
|
+
|
|
809
|
+
- If you want an `IconGallery` / `ColorPalette` / `Typeset` as part of a story canvas (the most common case in this codebase), **roll your own CSS-grid layout with design tokens** rather than the built-in blocks. See `Icon.stories.tsx` for a working category-grouped icon gallery using `var(--spacing-*)` and `var(--color-grey-*)` tokens.
|
|
810
|
+
- Only reach for the built-in blocks if you're writing a **custom `docs.page`** (compound component style) where they render inside the docs context and the theme provider is present.
|
|
811
|
+
|
|
812
|
+
**Import collision gotcha** (applies regardless of where you use them): if a story is exported with a name that matches a docs-block name (e.g. a story called `IconGallery` or `Primary`), TypeScript throws `TS2395: Individual declarations in merged declaration 'X' must be all exported or all local`. Alias the docs block on import:
|
|
813
|
+
|
|
814
|
+
```tsx
|
|
815
|
+
import { Primary as PrimaryBlock } from '@storybook/addon-docs/blocks';
|
|
816
|
+
// ...
|
|
817
|
+
export const Primary: Story = { args: { variant: 'primary' } };
|
|
818
|
+
```
|
|
819
|
+
|
|
820
|
+
Same pattern for `IconGallery`, `Title`, `Controls`, etc. if any of those appear as story export names.
|
|
821
|
+
|
|
822
|
+
## What This Skill Does NOT Do
|
|
823
|
+
|
|
824
|
+
- ❌ Modify the component source (use the component's own ticket for that)
|
|
825
|
+
- ❌ Create new components
|
|
826
|
+
- ❌ Write tests (stories are documentation, not tests)
|
|
827
|
+
- ❌ Modify `src/index.ts`
|
|
828
|
+
|
|
829
|
+
## What This Skill DOES Do
|
|
830
|
+
|
|
831
|
+
- ✅ Write comprehensive autodocs-powered stories
|
|
832
|
+
- ✅ Incorporate designer guidance from Confluence
|
|
833
|
+
- ✅ Document all variants, states, and edge cases
|
|
834
|
+
- ✅ Explain WHEN to use and WHEN NOT to use
|
|
835
|
+
- ✅ Verify all props against actual source code (Dorothy!)
|
|
836
|
+
- ✅ Ensure design token correctness in story wrappers (Blanche!)
|
|
837
|
+
- ✅ Make stories warm, clear, and genuinely useful (Rose!)
|
|
838
|
+
|
|
839
|
+
---
|
|
840
|
+
|
|
841
|
+
AROOOOO HUNNI!! LET'S WRITE SOME MOST EXCELLENT STORIES AND MAKE OUR COMPONENTS SHINE LIKE THE BOMBASS DOCUMENTATION STARS THEY WERE BORN TO BE!! xxx 💪🏍️✨🐺🌹
|