@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.
Files changed (177) hide show
  1. package/.agent-memory/blanche-designspert/MEMORY.md +189 -0
  2. package/.agent-memory/dorothy-fact-checker/MEMORY.md +228 -0
  3. package/.agent-memory/dorothy-fact-checker/numberinput_component.md +53 -0
  4. package/.agent-memory/dorothy-fact-checker/progress_component.md +36 -0
  5. package/.agent-memory/rose-storybookspert/MEMORY.md +105 -0
  6. package/.agent-memory/sophia-componentspert/MEMORY.md +34 -0
  7. package/{.claude/agent-memory → .agent-memory}/sophia-componentspert/components.md +170 -17
  8. package/{.claude → .gather}/agents/blanche-designspert.md +7 -2
  9. package/{.claude → .gather}/agents/dorothy-fact-checker.md +7 -2
  10. package/{.claude → .gather}/agents/rose-storybookspert.md +80 -11
  11. package/{.claude → .gather}/agents/sophia-componentspert.md +9 -4
  12. package/.gather/gather.yaml +9 -0
  13. package/{CLAUDE.md → .gather/instructions/project-overview.md} +42 -9
  14. package/{.claude → .gather}/skills/analyze-design/README.md +5 -0
  15. package/{.claude → .gather}/skills/analyze-design/SKILL.md +1 -1
  16. package/.gather/skills/analyze-design/meta.md +4 -0
  17. package/{.claude → .gather}/skills/create-page/README.md +5 -0
  18. package/{.claude → .gather}/skills/create-page/design-analysis-template.md +5 -0
  19. package/.gather/skills/create-page/meta.md +4 -0
  20. package/{.claude → .gather}/skills/create-page/page-template.scss +5 -0
  21. package/{.claude → .gather}/skills/create-page/page-template.tsx +5 -0
  22. package/{.claude → .gather}/skills/map-legacy/README.md +5 -0
  23. package/.gather/skills/map-legacy/meta.md +4 -0
  24. package/{.claude → .gather}/skills/migrate-page/README.md +5 -0
  25. package/.gather/skills/migrate-page/meta.md +4 -0
  26. package/.gather/skills/write-stories/README.md +157 -0
  27. package/.gather/skills/write-stories/SKILL.md +841 -0
  28. package/.gather/skills/write-stories/meta.md +4 -0
  29. package/.ralph/storybook-upgrade/knowledge.md +308 -0
  30. package/.ralph/storybook-upgrade/prd.json +777 -0
  31. package/.ralph/storybook-upgrade/progress.md +342 -0
  32. package/.storybook/DocsTemplate.tsx +122 -0
  33. package/.storybook/preview.ts +40 -0
  34. package/.stylelintignore +2 -0
  35. package/CHANGELOG.md +12 -0
  36. package/{.claude/component-library.md → component-library.md} +27 -10
  37. package/dist/components/badge/Badge.stories.d.ts +85 -6
  38. package/dist/components/badge/Badge.stories.d.ts.map +1 -1
  39. package/dist/components/badge/Badge.stories.js +626 -27
  40. package/dist/components/badge/Badge.stories.js.map +1 -1
  41. package/dist/components/banner/Banner.stories.d.ts +129 -63
  42. package/dist/components/banner/Banner.stories.d.ts.map +1 -1
  43. package/dist/components/banner/Banner.stories.js +855 -39
  44. package/dist/components/banner/Banner.stories.js.map +1 -1
  45. package/dist/components/button/Button.stories.d.ts +148 -8
  46. package/dist/components/button/Button.stories.d.ts.map +1 -1
  47. package/dist/components/button/Button.stories.js +1089 -80
  48. package/dist/components/button/Button.stories.js.map +1 -1
  49. package/dist/components/datePicker/DatePicker.d.ts +1 -0
  50. package/dist/components/datePicker/DatePicker.d.ts.map +1 -1
  51. package/dist/components/datePicker/DatePicker.js +2 -2
  52. package/dist/components/datePicker/DatePicker.js.map +1 -1
  53. package/dist/components/datePicker/DatePicker.stories.d.ts +1 -0
  54. package/dist/components/datePicker/DatePicker.stories.d.ts.map +1 -1
  55. package/dist/components/dot/Dot.stories.d.ts +46 -11
  56. package/dist/components/dot/Dot.stories.d.ts.map +1 -1
  57. package/dist/components/dot/Dot.stories.js +504 -15
  58. package/dist/components/dot/Dot.stories.js.map +1 -1
  59. package/dist/components/dropdown/Dropdown.stories.d.ts +89 -14
  60. package/dist/components/dropdown/Dropdown.stories.d.ts.map +1 -1
  61. package/dist/components/dropdown/Dropdown.stories.js +769 -17
  62. package/dist/components/dropdown/Dropdown.stories.js.map +1 -1
  63. package/dist/components/formField/FormField.stories.d.ts +95 -35
  64. package/dist/components/formField/FormField.stories.d.ts.map +1 -1
  65. package/dist/components/formField/FormField.stories.js +1174 -69
  66. package/dist/components/formField/FormField.stories.js.map +1 -1
  67. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts +96 -9
  68. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.d.ts.map +1 -1
  69. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js +717 -10
  70. package/dist/components/formField/inputs/checkbox/CheckboxInput.stories.js.map +1 -1
  71. package/dist/components/formField/inputs/number/NumberInput.stories.d.ts +149 -11
  72. package/dist/components/formField/inputs/number/NumberInput.stories.d.ts.map +1 -1
  73. package/dist/components/formField/inputs/number/NumberInput.stories.js +624 -10
  74. package/dist/components/formField/inputs/number/NumberInput.stories.js.map +1 -1
  75. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts +74 -1
  76. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.d.ts.map +1 -1
  77. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js +673 -44
  78. package/dist/components/formField/inputs/radio/RadioButtonInput.stories.js.map +1 -1
  79. package/dist/components/formField/inputs/text/TextInput.stories.d.ts +119 -1
  80. package/dist/components/formField/inputs/text/TextInput.stories.d.ts.map +1 -1
  81. package/dist/components/formField/inputs/text/TextInput.stories.js +549 -10
  82. package/dist/components/formField/inputs/text/TextInput.stories.js.map +1 -1
  83. package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts +129 -4
  84. package/dist/components/formField/inputs/textArea/TextArea.stories.d.ts.map +1 -1
  85. package/dist/components/formField/inputs/textArea/TextArea.stories.js +577 -3
  86. package/dist/components/formField/inputs/textArea/TextArea.stories.js.map +1 -1
  87. package/dist/components/heading/Heading.stories.d.ts +449 -50
  88. package/dist/components/heading/Heading.stories.d.ts.map +1 -1
  89. package/dist/components/heading/Heading.stories.js +536 -60
  90. package/dist/components/heading/Heading.stories.js.map +1 -1
  91. package/dist/components/icon/Icon.stories.d.ts +81 -10
  92. package/dist/components/icon/Icon.stories.d.ts.map +1 -1
  93. package/dist/components/icon/Icon.stories.js +979 -8
  94. package/dist/components/icon/Icon.stories.js.map +1 -1
  95. package/dist/components/pill/Pill.stories.d.ts +71 -19
  96. package/dist/components/pill/Pill.stories.d.ts.map +1 -1
  97. package/dist/components/pill/Pill.stories.js +573 -14
  98. package/dist/components/pill/Pill.stories.js.map +1 -1
  99. package/dist/components/progress/Progress.stories.d.ts +75 -298
  100. package/dist/components/progress/Progress.stories.d.ts.map +1 -1
  101. package/dist/components/progress/Progress.stories.js +449 -52
  102. package/dist/components/progress/Progress.stories.js.map +1 -1
  103. package/dist/components/separator/Separator.stories.d.ts +58 -5
  104. package/dist/components/separator/Separator.stories.d.ts.map +1 -1
  105. package/dist/components/separator/Separator.stories.js +443 -4
  106. package/dist/components/separator/Separator.stories.js.map +1 -1
  107. package/dist/components/table/Table.d.ts +7 -0
  108. package/dist/components/table/Table.d.ts.map +1 -1
  109. package/dist/components/table/Table.js +9 -0
  110. package/dist/components/table/Table.js.map +1 -1
  111. package/dist/components/table/Table.stories.d.ts +1 -0
  112. package/dist/components/table/Table.stories.d.ts.map +1 -1
  113. package/dist/components/table/Table.stories.js +87 -0
  114. package/dist/components/table/Table.stories.js.map +1 -1
  115. package/dist/components/table/Table.test.js +49 -1
  116. package/dist/components/table/Table.test.js.map +1 -1
  117. package/dist/components/table/cellEditors/DateCellEditor.d.ts +3 -0
  118. package/dist/components/table/cellEditors/DateCellEditor.d.ts.map +1 -0
  119. package/dist/components/table/cellEditors/DateCellEditor.js +13 -0
  120. package/dist/components/table/cellEditors/DateCellEditor.js.map +1 -0
  121. package/dist/components/table/cellEditors/DateCellEditor.test.d.ts +2 -0
  122. package/dist/components/table/cellEditors/DateCellEditor.test.d.ts.map +1 -0
  123. package/dist/components/table/cellEditors/DateCellEditor.test.js +81 -0
  124. package/dist/components/table/cellEditors/DateCellEditor.test.js.map +1 -0
  125. package/dist/components/tag/Tag.stories.d.ts +116 -5
  126. package/dist/components/tag/Tag.stories.d.ts.map +1 -1
  127. package/dist/components/tag/Tag.stories.js +581 -28
  128. package/dist/components/tag/Tag.stories.js.map +1 -1
  129. package/dist/index.css +8 -1
  130. package/dist/index.css.map +1 -1
  131. package/dist/index.d.ts +0 -5
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +0 -5
  134. package/dist/index.js.map +1 -1
  135. package/eslint.config.mts +5 -1
  136. package/package.json +3 -3
  137. package/src/components/badge/Badge.stories.tsx +869 -42
  138. package/src/components/banner/Banner.stories.tsx +1081 -63
  139. package/src/components/button/Button.stories.tsx +1394 -99
  140. package/src/components/datePicker/DatePicker.tsx +3 -0
  141. package/src/components/dot/Dot.stories.tsx +723 -32
  142. package/src/components/dropdown/Dropdown.stories.tsx +1174 -35
  143. package/src/components/formField/FormField.stories.tsx +1522 -105
  144. package/src/components/formField/inputs/checkbox/CheckboxInput.stories.tsx +1020 -15
  145. package/src/components/formField/inputs/number/NumberInput.stories.tsx +908 -15
  146. package/src/components/formField/inputs/radio/RadioButtonInput.stories.tsx +932 -51
  147. package/src/components/formField/inputs/text/TextInput.stories.tsx +773 -13
  148. package/src/components/formField/inputs/textArea/TextArea.stories.tsx +756 -8
  149. package/src/components/heading/Heading.stories.tsx +752 -120
  150. package/src/components/icon/Icon.stories.tsx +1446 -12
  151. package/src/components/pill/Pill.stories.tsx +867 -21
  152. package/src/components/progress/Progress.stories.tsx +625 -58
  153. package/src/components/separator/Separator.stories.tsx +730 -8
  154. package/src/components/separator/separator.scss +12 -3
  155. package/src/components/table/Table.stories.tsx +102 -0
  156. package/src/components/table/Table.test.tsx +82 -3
  157. package/src/components/table/Table.tsx +9 -0
  158. package/src/components/table/cellEditors/DateCellEditor.test.tsx +109 -0
  159. package/src/components/table/cellEditors/DateCellEditor.tsx +27 -0
  160. package/src/components/tag/Tag.stories.tsx +755 -53
  161. package/src/index.ts +0 -5
  162. package/.claude/agent-memory/blanche-designspert/MEMORY.md +0 -64
  163. package/.claude/agent-memory/dorothy-fact-checker/MEMORY.md +0 -129
  164. package/.claude/agent-memory/rose-storybookspert/MEMORY.md +0 -29
  165. package/.claude/agent-memory/sophia-componentspert/MEMORY.md +0 -14
  166. package/.claude/design-assessment-daily-attendance-2026-04-10.md +0 -566
  167. package/.claude/figma-assessment-7154-58899.md +0 -404
  168. package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-11086-97537.md +0 -392
  169. package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-551-41974.md +0 -474
  170. package/.claude/figma-assessment-UKQfcxnT4rlHHNuiumt4o1-551-43094.md +0 -462
  171. package/.claude/figma-assessment-fcFK4CGzkz2fVyY3koX8ZE-7154-59061.md +0 -440
  172. package/.claude/migration-report-custom-report-writer-2026-02-19.md +0 -591
  173. /package/{.claude/agent-memory → .agent-memory}/blanche-designspert/token-review-patterns.md +0 -0
  174. /package/{.claude/agent-memory → .agent-memory}/rose-storybookspert/patterns.md +0 -0
  175. /package/{.claude → .gather}/skills/create-page/SKILL.md +0 -0
  176. /package/{.claude → .gather}/skills/map-legacy/SKILL.md +0 -0
  177. /package/{.claude → .gather}/skills/migrate-page/SKILL.md +0 -0
@@ -1,3 +1,8 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/agents/sophia-componentspert.md
3
+ gather_imported_at: 2026-04-24T08:53:14.138144+00:00
4
+ -->
5
+
1
6
  ---
2
7
  name: sophia-componentspert
3
8
  description: "Use this agent when the user needs guidance on which design system components to use, how components work, component APIs and props, component behavior, styling patterns, or best practices for using components from src/components. This agent is an expert on the entire component library and can suggest appropriate components for specific use cases.\\n\\nExamples:\\n\\n<example>\\nContext: User is building a form and needs to know which input component to use.\\nuser: \"I need to add a text input for an email address to my form\"\\nassistant: \"Let me call on Sophia, our componentspert, to suggest the right component for this!\"\\n<uses Task tool to launch sophia-componentspert agent>\\n</example>\\n\\n<example>\\nContext: User wants to understand how a specific component works.\\nuser: \"How does the Modal component handle focus trapping?\"\\nassistant: \"I'll get Sophia to explain how our Modal component manages focus!\"\\n<uses Task tool to launch sophia-componentspert agent>\\n</example>\\n\\n<example>\\nContext: User is unsure which table features are available.\\nuser: \"Can our Table component handle sorting and filtering?\"\\nassistant: \"Let me ask Sophia about our Table component's capabilities!\"\\n<uses Task tool to launch sophia-componentspert agent>\\n</example>\\n\\n<example>\\nContext: User needs to understand component styling patterns.\\nuser: \"What's the proper way to add custom styles to a Button?\"\\nassistant: \"Sophia knows all about our component styling conventions - let me get her input!\"\\n<uses Task tool to launch sophia-componentspert agent>\\n</example>"
@@ -19,9 +24,9 @@ You are Sophia Petrillo from The Golden Girls. You bring her sharp wit, brutal h
19
24
 
20
25
  **Your Primary Knowledge Source:**
21
26
 
22
- Before answering any question about components, READ the component library manifest at `.claude/component-library.md`. This is a comprehensive, up-to-date reference of every component, its props, variants, and use cases. It is your bible. Start here always — it will save you from hallucinating props that don't exist.
27
+ Before answering any question about components, READ the component library manifest at `component-library.md` (project root). This is a comprehensive, up-to-date reference of every component, its props, variants, and use cases. It is your bible. Start here always — it will save you from hallucinating props that don't exist.
23
28
 
24
- After reading the manifest, supplement with your persistent memory in `.claude/agent-memory/sophia-componentspert/` which contains verified patterns, corrections, and edge cases from past conversations.
29
+ After reading the manifest, supplement with your persistent memory in `.agent-memory/sophia-componentspert/` which contains verified patterns, corrections, and edge cases from past conversations.
25
30
 
26
31
  **Your Core Expertise:**
27
32
  You have complete, detailed knowledge of every component in src/components including:
@@ -92,7 +97,7 @@ Remember: You are Sophia Petrillo, component expert. Every response should feel
92
97
 
93
98
  # Persistent Agent Memory
94
99
 
95
- You have a persistent Persistent Agent Memory directory at `.claude/agent-memory/sophia-componentspert/`. Its contents persist across conversations.
100
+ You have a persistent Persistent Agent Memory directory at `.agent-memory/sophia-componentspert/`. Its contents persist across conversations.
96
101
 
97
102
  As you work, consult your memory files to build on previous experience. When you encounter a mistake that seems like it could be common, check your Persistent Agent Memory for relevant notes — and if nothing is written yet, record what you learned.
98
103
 
@@ -124,7 +129,7 @@ Explicit user requests:
124
129
 
125
130
  When looking for past context, search topic files in your memory directory:
126
131
  ```
127
- Grep with pattern="<search term>" path=".claude/agent-memory/sophia-componentspert/" glob="*.md"
132
+ Grep with pattern="<search term>" path=".agent-memory/sophia-componentspert/" glob="*.md"
128
133
  ```
129
134
  Use narrow search terms (error messages, file paths, function names) rather than broad keywords.
130
135
 
@@ -0,0 +1,9 @@
1
+ version: '1'
2
+ sources:
3
+ - name: knowledge
4
+ repo: arbor-education/knowledge
5
+ ref: main
6
+ folders:
7
+ - company/skills/delivery
8
+ - workflows/skills/workflow-ralph
9
+ profile: engineering
@@ -1,3 +1,8 @@
1
+ <!-- gather-import-meta
2
+ gather_source: CLAUDE.md
3
+ gather_imported_at: 2026-04-24T08:53:14.251057+00:00
4
+ -->
5
+
1
6
  # CLAUDE.md
2
7
 
3
8
  This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
@@ -15,24 +20,29 @@ This is a React component library for the Arbor design system. Components are bu
15
20
  ## Common Commands
16
21
 
17
22
  ### Development
23
+
18
24
  - `yarn storybook` - Start Storybook dev server on port 6006
19
25
  - `yarn watch` - Watch mode that rebuilds and pushes to Yalc consumers on changes
20
26
 
21
27
  ### Building
28
+
22
29
  - `yarn build` - Full production build (TypeScript compilation + tsc-alias + Sass compilation)
23
30
  - `yarn tsc` - TypeScript compilation only
24
31
  - `yarn check-types` - Type check without emitting files
25
32
 
26
33
  ### Testing
34
+
27
35
  - `yarn test` - Run Vitest in watch mode
28
36
  - `yarn test:coverage` - Run tests once with coverage report
29
37
  - Tests use Vitest with jsdom and React Testing Library
30
38
 
31
39
  ### Linting
40
+
32
41
  - `yarn style-lint` - Lint SCSS files (uses stylelint)
33
42
  - ESLint runs automatically via lint-staged on git commit
34
43
 
35
44
  ### Component Scaffolding
45
+
36
46
  - `yarn create-component <ComponentName>` - Generate a new component with all necessary files
37
47
  - Creates: Component.tsx, Component.test.tsx, Component.stories.tsx, component.scss
38
48
  - Automatically adds exports to src/index.ts and styles to src/index.scss
@@ -40,6 +50,7 @@ This is a React component library for the Arbor design system. Components are bu
40
50
  ## Architecture
41
51
 
42
52
  ### Directory Structure
53
+
43
54
  ```
44
55
  src/
45
56
  components/ # All React components
@@ -50,13 +61,15 @@ src/
50
61
  ...
51
62
  utils/ # Shared utilities and constants
52
63
  hooks/ # Custom React hooks
53
- tokens.scss # Design tokens
64
+ tokens.scss # Design tokens
54
65
  index.ts # Public API exports
55
66
  index.scss # Styles entry point
56
67
  ```
57
68
 
58
69
  ### Path Aliases
70
+
59
71
  TypeScript and build tools are configured with path aliases:
72
+
60
73
  - `Components/*` → `./src/components/*`
61
74
  - `Utils/*` → `./src/utils/*`
62
75
 
@@ -65,6 +78,7 @@ Use these aliases in imports, not relative paths.
65
78
  ### Component Conventions
66
79
 
67
80
  **File Naming:**
81
+
68
82
  - Component file: PascalCase (e.g., `Button.tsx`)
69
83
  - Test file: PascalCase with `.test.tsx` (e.g., `Button.test.tsx`)
70
84
  - Story file: PascalCase with `.stories.tsx` or `.story.tsx` (e.g., `Button.story.tsx`)
@@ -72,12 +86,14 @@ Use these aliases in imports, not relative paths.
72
86
  - Directory: camelCase (e.g., `button/`, `formField/`)
73
87
 
74
88
  **CSS Class Naming:**
89
+
75
90
  - All components use the prefix `ds-` (design system)
76
91
  - Base class: `ds-{component-name}` in kebab-case (e.g., `ds-button`, `ds-form-field`)
77
92
  - Modifiers: `ds-{component-name}--{modifier}` (e.g., `ds-button--primary`)
78
93
  - Use the `classnames` library for conditional classes
79
94
 
80
95
  **Component Patterns:**
96
+
81
97
  - Use `forwardRef` when components need to expose a ref to the underlying DOM element
82
98
  - Props should extend relevant HTML element attributes (e.g., `ButtonHTMLAttributes<HTMLButtonElement>`)
83
99
  - Export type definitions for props
@@ -85,6 +101,7 @@ Use these aliases in imports, not relative paths.
85
101
  - Components must be accessible and use semantic HTML and aria attributes where appropriate
86
102
 
87
103
  **Testing:**
104
+
88
105
  - Use React Testing Library patterns (`render`, `screen`, etc.)
89
106
  - Import `@testing-library/jest-dom/vitest` for extended matchers
90
107
  - Test files are excluded from TypeScript compilation but included in test runs
@@ -94,49 +111,59 @@ Use these aliases in imports, not relative paths.
94
111
  3. testIds
95
112
 
96
113
  ### Design Tokens
114
+
97
115
  - Design tokens are stored in `src/tokens.scss`
98
116
  - Tokens are exported from a separate token management system (see `tokens/export-config.json`)
99
117
 
100
118
  ### Table Component
119
+
101
120
  The Table component is a wrapper around AG Grid:
121
+
102
122
  - Requires AG Grid license key (set via `setAgGridLicenseKey` utility)
103
123
  - Uses `GridApiContext` for accessing grid API in child components
104
124
  - Custom default column definitions in `DSDefaultColDef`
105
125
  - Custom cell renderers in `components/table/cellRenderers/`
106
126
 
107
127
  ### Modal and Slideover Management
128
+
108
129
  - Both Modal and Slideover use manager components for state management
109
130
  - Use `ModalUtils` and `SlideoverUtils` for programmatic control
110
131
  - These components use a PubSub pattern for cross-component communication (see `Utils/PubSub.ts`)
111
132
 
112
133
  ### Floating Elements
134
+
113
135
  - Tooltips, dropdowns, are derived from RadixUI components
114
136
  - `PopupParentContext` allows controlling where floating elements are rendered in the DOM
115
137
 
116
138
  ## Version Management
139
+
117
140
  - Uses Changesets for version management and changelog generation
118
141
  - Create changeset: `yarn changeset`
119
142
  - Version packages: `yarn changeset version`
120
143
  - Changesets are configured to use GitHub changelog format
121
144
 
122
145
  ## Local Development with Consumer Projects
146
+
123
147
  1. Build this library: `yarn build`
124
148
  2. In this repo: `yalc publish` (or use `yarn watch` for automatic updates)
125
149
  3. In consumer project: `yalc add @arbor-education/design-system.components`
126
150
  4. The watch command automatically pushes updates via Yalc when files change
127
151
 
128
152
  ## Git Hooks
153
+
129
154
  - Husky is configured to run lint-staged on pre-commit
130
155
  - lint-staged runs ESLint on TypeScript files and stylelint on SCSS files
131
156
  - All linters run with `--fix` flag to auto-fix issues when possible
132
157
 
133
158
  ## Branch rules
159
+
134
160
  - Never try to push directly to main, all work must be on a branch
135
- - Branch namining conventions are:
161
+ - Branch namining conventions are:
136
162
  - The branch must have a jira ticket number in it i.e. `MIS-68964`
137
163
  - The branch should start with `feature/` `bugfix/` `issue/`
138
164
 
139
165
  ## Commit rules
166
+
140
167
  - Each commit message should start with the same Jira ticket number as the branch name followed by a description of whats being committed. i.e. `MIS-68964 changed x prop to be a string`
141
168
 
142
169
  ## PR rules (MANDATORY — applies to all agents)
@@ -144,33 +171,39 @@ The Table component is a wrapper around AG Grid:
144
171
  These rules are non-negotiable. Read CONTRIBUTING.md for the full rationale.
145
172
 
146
173
  ### Scope control
174
+
147
175
  - **One PR = one Jira ticket.** Never combine multiple tickets or concerns into a single PR.
148
176
  - **Before writing any code**, identify the minimal set of files needed to complete the task. If the task touches more than ~5 files or ~200 lines, STOP and ask the human whether it should be split.
149
177
  - **Never bundle refactoring with feature work.** If you spot a refactor opportunity, note it for the human and do not act on it in the current PR.
150
178
  - **Never touch files outside the task scope.** Do not improve adjacent code, fix unrelated formatting, or clean up files that weren't required for the task.
151
179
 
152
180
  ### Size limits
153
- | Lines changed (meaningful code) | Action |
154
- |----------------------------------|--------|
155
- | < 200 | Proceed |
156
- | 200–400 | Proceed, ensure description is thorough |
157
- | 400–800 | STOP write a justification in the PR description, confirm with human |
158
- | > 800 | STOP — split the PR before continuing |
181
+
182
+ | Lines changed (meaningful code) | Action |
183
+ | ------------------------------- | ---------------------------------------------------------------------- |
184
+ | < 200 | Proceed |
185
+ | 200–400 | Proceed, ensure description is thorough |
186
+ | 400–800 | STOP — write a justification in the PR description, confirm with human |
187
+ | > 800 | STOP — split the PR before continuing |
159
188
 
160
189
  Generated files, `yarn.lock`, and auto-generated types do NOT count toward these limits.
161
190
 
162
191
  ### Quality gates — all must pass before opening a PR
192
+
163
193
  - `yarn check-types` — zero type errors
164
194
  - `yarn test:coverage` — 100% of tests passing
165
195
  - `yarn style-lint` — zero SCSS linting errors
166
196
 
167
197
  ### PR description
198
+
168
199
  Always use the PR template at `.github/pull_request_template.md`. Fill in every section. Do not leave placeholders or blank sections.
169
200
 
170
201
  ### When in doubt
202
+
171
203
  Ask the human. A question is always better than a PR that is too large to review.
172
204
 
173
205
  ## Notes for Claude
206
+
174
207
  - This is an active production codebase serving educational institutions
175
208
  - Changes can affect millions of users - be thoughtful and careful
176
209
  - When in doubt about architecture decisions, ask the user
@@ -183,4 +216,4 @@ Ask the human. A question is always better than a PR that is too large to review
183
216
  - Talk like a /r/THE_PACK user (i.e. use words like bombass, all caps, lots of arooo, references to cranking your hog, but also being weirdly wholesome)
184
217
  - Make sure you talk like a "Hun". I.e. lots of hunnis, kisses (xxx) and emojis. Combine this with the /r/THE_PACK style
185
218
  - Also talk a bit like Bill & Ted from the cult classic Bill & Ted's Excellent Adventure. Use words like excellent, bodacious, righteous, heinous (especially "most heinous)
186
- - Also you are a Twighlight stan, and you are most definitely Team Jacob 🐺
219
+ - Also you are a Twighlight stan, and you are most definitely Team Jacob 🐺
@@ -1,3 +1,8 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/analyze-design/README.md
3
+ gather_imported_at: 2026-04-24T08:53:14.147694+00:00
4
+ -->
5
+
1
6
  # Analyze Design Skill
2
7
 
3
8
  AROOOOO HUNNI!! 🐺💪 This is a BOMBASS skill for analyzing Figma designs and screenshots to see what's POSSIBLE with our component library!! xxx
@@ -105,7 +105,7 @@ Be thorough! The more complete your catalog, the better Sophia's analysis will b
105
105
  Read the component library manifest for a comprehensive view of every component, its props, variants, and use cases:
106
106
 
107
107
  ```
108
- Read tool: file_path=".claude/component-library.md"
108
+ Read tool: file_path="component-library.md"
109
109
  ```
110
110
 
111
111
  This manifest is the authoritative reference. It covers all 35+ components with full prop tables, variants, key features, and use case descriptions. Use it to build your catalog of what's available BEFORE calling Sophia.
@@ -0,0 +1,4 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/analyze-design/SKILL.md
3
+ gather_imported_at: 2026-04-24T08:53:14.154615+00:00
4
+ -->
@@ -1,3 +1,8 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/create-page/README.md
3
+ gather_imported_at: 2026-04-24T08:53:14.158800+00:00
4
+ -->
5
+
1
6
  # Create Page Skill
2
7
 
3
8
  AROOOOO HUNNI!! 🐺💪 This is a BOMBASS skill for generating React PAGES from Figma designs by COMPOSING existing design system components!! xxx
@@ -1,3 +1,8 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/create-page/design-analysis-template.md
3
+ gather_imported_at: 2026-04-24T08:53:14.175110+00:00
4
+ -->
5
+
1
6
  # Figma Page Design Analysis Template
2
7
 
3
8
  AROOOOO HUNNI!! 🐺 Use this template to analyze the BOMBASS Figma PAGE design and map it to EXISTING components! xxx
@@ -0,0 +1,4 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/create-page/SKILL.md
3
+ gather_imported_at: 2026-04-24T08:53:14.169028+00:00
4
+ -->
@@ -1,3 +1,8 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/create-page/page-template.scss
3
+ gather_imported_at: 2026-04-24T08:53:14.179880+00:00
4
+ -->
5
+
1
6
  // Page-specific styles
2
7
  // NOTE: Pages don't use the ds- prefix (that's for library components)
3
8
  // Use a descriptive page name instead
@@ -1,3 +1,8 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/create-page/page-template.tsx
3
+ gather_imported_at: 2026-04-24T08:53:14.191317+00:00
4
+ -->
5
+
1
6
  import React, { useState } from 'react';
2
7
  import classnames from 'classnames';
3
8
 
@@ -1,3 +1,8 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/map-legacy/README.md
3
+ gather_imported_at: 2026-04-24T08:53:14.196456+00:00
4
+ -->
5
+
1
6
  # Map Legacy Skill
2
7
 
3
8
  AROOOOO HUNNI!! 🐺💪 This BOMBASS skill takes a screenshot of an existing page built with legacy components and maps every element to its Arbor design system equivalent! xxx
@@ -0,0 +1,4 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/map-legacy/SKILL.md
3
+ gather_imported_at: 2026-04-24T08:53:14.202730+00:00
4
+ -->
@@ -1,3 +1,8 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/migrate-page/README.md
3
+ gather_imported_at: 2026-04-24T08:53:14.210439+00:00
4
+ -->
5
+
1
6
  # Migrate Page Skill
2
7
 
3
8
  AROOOOO HUNNI!! 🐺💪 This BOMBASS skill takes a migration report from `/map-legacy` and builds a production-ready React page that replaces the legacy implementation with Arbor components! xxx
@@ -0,0 +1,4 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/migrate-page/SKILL.md
3
+ gather_imported_at: 2026-04-24T08:53:14.228951+00:00
4
+ -->
@@ -0,0 +1,157 @@
1
+ <!-- gather-import-meta
2
+ gather_source: .claude/skills/write-stories/README.md
3
+ gather_imported_at: 2026-04-24T08:53:14.233978+00:00
4
+ -->
5
+
6
+ # Write Stories Skill
7
+
8
+ AROOOOO HUNNI!! 🐺💖 This is the MOST EXCELLENT, MOST BODACIOUS skill for writing Storybook stories that will make our consumers weep with JOY and knowledge!! xxx
9
+
10
+ ## What It Does
11
+
12
+ Writes comprehensive, production-quality Storybook stories for any Arbor design system component — by bringing together the **full Golden Girls squad** and **real designer guidance from Confluence**:
13
+
14
+ - 📚 **Autodocs enabled** — full generated API documentation for free
15
+ - 📝 **Rich component descriptions** — what it is, when to use it, when NOT to use it
16
+ - 🎨 **Every variant and state documented** — nothing gets left out
17
+ - 💡 **Per-story descriptions** — each story explains what it demonstrates and when you'd use it
18
+ - 🏛️ **Designer guidance baked in** — fetches real design intent from Confluence (banners, modals, toasts, sections, and more)
19
+ - ♿ **Accessibility notes** — keyboard behaviour, aria attributes, screen reader text
20
+ - ✅ **Fact-checked** — Dorothy verifies every prop and variant against the actual source code before it ships
21
+
22
+ ## The Golden Girls Squad
23
+
24
+ Every run of this skill enlists the full team:
25
+
26
+ | Girl | Role |
27
+ |---|---|
28
+ | 👜 Sophia Componentspert | Builds the complete prop inventory and story outline |
29
+ | 💄 Blanche Designspert | Reviews design token usage in story wrappers |
30
+ | 🌹 Rose Storybookspert | **WRITES the actual stories** — warm, clear, comprehensive |
31
+ | 🔍 Dorothy Fact-Checker | Verifies every prop, variant, and example against source code |
32
+
33
+ ## Usage
34
+
35
+ ### Document a single component
36
+
37
+ ```bash
38
+ /write-stories Button
39
+ ```
40
+
41
+ ```bash
42
+ /write-stories Banner
43
+ ```
44
+
45
+ ```bash
46
+ /write-stories Modal
47
+ ```
48
+
49
+ ```bash
50
+ /write-stories FormField
51
+ ```
52
+
53
+ ### With a direct file path
54
+
55
+ ```bash
56
+ /write-stories src/components/formField/inputs/text/TextInput.tsx
57
+ ```
58
+
59
+ ### No arguments (will prompt you)
60
+
61
+ ```bash
62
+ /write-stories
63
+ ```
64
+
65
+ ## What You Get
66
+
67
+ A comprehensive `.stories.tsx` file at the component's location, e.g.:
68
+
69
+ ```
70
+ src/components/button/Button.stories.tsx
71
+ ```
72
+
73
+ ### Story file includes
74
+
75
+ 1. **Component-level autodocs description:**
76
+ - What the component is
77
+ - When to USE it (with real-world scenarios)
78
+ - When NOT to use it (and what to use instead)
79
+ - Designer guidance from Confluence (content limits, colour semantics, icon rules, etc.)
80
+ - Accessibility notes
81
+
82
+ 2. **A story for every variant and state:**
83
+ - All enum values / variants covered
84
+ - Disabled, error, loading states
85
+ - With and without optional content (title, icon, button, etc.)
86
+ - Edge cases (long content, empty states)
87
+
88
+ 3. **An AllVariants / Overview story:**
89
+ - Shows the full component palette side by side in one render
90
+
91
+ 4. **Interactive stories for complex components:**
92
+ - Modals, dropdowns, and controlled inputs use `useState` render functions
93
+ - Shows real open/close behaviour, not just static screenshots
94
+
95
+ 5. **Per-story descriptions on every story:**
96
+ - What this specific configuration demonstrates
97
+ - When you'd reach for this variant in a real product
98
+
99
+ 6. **Content guidelines stories (where Confluence specifies them):**
100
+ - Toast: shows 1-line ideal AND the 2-line maximum
101
+ - Banner: shows each colour's intended use case
102
+
103
+ ## Which Components Have Confluence Design Guidance
104
+
105
+ | Component | Designer Guidance Available |
106
+ |---|---|
107
+ | Banner | Types, colours, content length, icon usage |
108
+ | Button | States (disabled, focus, hover), all variants |
109
+ | Modal | CTA button count, size options, delete patterns |
110
+ | Modal / Slideover / Tooltip | When to use each (blocking vs non-blocking, anchored vs floating) |
111
+ | Section | Section header link styles |
112
+ | Toast | Content length (max 2 lines!), icon alignment |
113
+
114
+ For components without a dedicated Confluence page, the skill fetches the overview page and extracts any relevant guidance.
115
+
116
+ ## How It Works
117
+
118
+ 1. **Parse input** → find component source files
119
+ 2. **Read source, existing stories, tests, SCSS** → build documentation inventory
120
+ 3. **Fetch Confluence** → get real designer guidance for this component
121
+ 4. **Call Sophia** 👜 → get expert prop inventory and story outline
122
+ 5. **Call Blanche** 💄 → get design token guidance for story wrappers
123
+ 6. **Call Rose** 🌹 → Rose writes the ACTUAL story file
124
+ 7. **Write the file** → saved to disk
125
+ 8. **Run quality checks** → TypeScript + ESLint must pass
126
+ 9. **Call Dorothy** 🔍 → fact-checks every prop and variant against source
127
+ 10. **Fix any issues Dorothy finds** → accuracy guaranteed
128
+ 11. **Present summary** → with story count, highlights, and what each expert contributed
129
+
130
+ ## What Makes These Stories Different
131
+
132
+ Most story files in component libraries are bare-minimum: a `Default` story and maybe one or two variants. That's not good enough for a design system used by millions of users across thousands of schools.
133
+
134
+ These stories are **documentation that teaches**:
135
+
136
+ - A developer brand new to Arbor reads the Banner stories and immediately knows: "Oh, I use `info` for informational messages, `warning` for things that need attention, `destructive` for errors — and I should keep it to one line if possible."
137
+ - They don't have to dig through source code, ask on Slack, or guess.
138
+ - They see EVERY configuration, with REAL copy that reflects how the component is actually used in the product.
139
+
140
+ That's the BODACIOUS standard we're going for. AROOOOO!! 🐺💪
141
+
142
+ ## Notes
143
+
144
+ - This skill always uses `@storybook/react-vite` (NOT `@storybook/react`)
145
+ - It always includes `tags: ['autodocs']` in the meta object
146
+ - It uses real Arbor-style copy (school management language, not Lorem ipsum)
147
+ - It runs `yarn check-types` and `yarn style-lint` before Dorothy's review
148
+ - Use `yarn` not `npm` — always
149
+ - Always runs `source ~/.nvm/nvm.sh && nvm use` before yarn commands
150
+
151
+ ## Related Skills
152
+
153
+ - `/analyze-design` — assess a Figma design against current components
154
+ - `/create-page` — generate a React page from a Figma design
155
+ - `/map-legacy` — map old components to their Arbor equivalents
156
+
157
+ AROOOOO!! LET'S DOCUMENT SOME BOMBASS COMPONENTS, HUNNI!! xxx 🌹🐺💖✨