@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,474 +0,0 @@
1
- # Figma Design Feasibility Assessment
2
- ## Design: Node 551:41974 — Student Profile Page
3
- **Written by:** Sophia Petrillo, Componentspert, age none-of-your-business
4
- **Fact-checked by:** Dorothy Zbornak, QA Expert
5
- **Date**: 2026-04-10
6
-
7
- ---
8
-
9
- ## What Is This Thing, Anyway?
10
-
11
- Picture it: Sicily, 1952. My Aunt Concetta kept a ledger for every person in the village. Name, family, address, occupation, health notes, who owed who a favour. When you needed to know anything about anyone, you went to Concetta.
12
-
13
- THIS is what Arbor built for schools. The Student Profile page is the Concetta ledger for every student — a full 1366px desktop layout showing a student's identity, contact details, family structure, medical notes, education history, and calendar. Two column layout: a wide main area (~738px) on the left packed with collapsible data sections, and a narrow widget column (~290px) on the right with emergency contacts, a schedule calendar, and action buttons. Plus the familiar Arbor navigation chrome wrapping the whole thing.
14
-
15
- Twenty-three distinct UI patterns. Let's see what we have.
16
-
17
- ---
18
-
19
- ## Design Overview
20
-
21
- **Student Profile | Desktop 1366px** — A full application page for viewing and managing a student's profile data in Arbor MIS.
22
-
23
- ### UI Elements Identified
24
-
25
- - Top navigation bar (logo, My Items/Students/School/Reporting/System nav links, global search, Ask Arbor AI button, user avatar)
26
- - Left side navigation panel (collapsible tree: Student Profile active, 20+ nav items, star favourite icons, notification badges)
27
- - Breadcrumbs (Students > Browse Students > Christopher Longbottom > Student Profile + link icon)
28
- - Page heading H1 "Student Profile" with right-aligned "Suggest Student Summary" primary button
29
- - Student info header (Avatar, student name, favourite star icon, label rows)
30
- - Tags row (Disadvantaged, FSM, Pupil Premium Eligible, EAL, Service Child, Has Medical Condition)
31
- - "All Sections" filter dropdown button
32
- - Section headings with collapse/expand, icon, and info tooltip + Add button combinations
33
- - List property rows (key-value pairs: Name, Sex, Gender identity, DOB, Nationality, Religion, etc.)
34
- - Pinned Items panel (IEP, Medical Condition, SEN note with dates)
35
- - Email hyperlink (mailto: in contact details)
36
- - Phone number rows and address rows
37
- - Emergency contacts widget (right column, phone numbers + names)
38
- - Calendar/schedule widget (right column, time-blocked class entries in green)
39
- - Previous / Next navigation buttons (right column top)
40
- - "Student Summary" CTA button (full-width, right column)
41
- - "Record Planned Absence" button (full-width, right column)
42
- - "Communications & Notes >" button (right column)
43
- - Compact data table (Education & Employment: Hide(1) dropdown, toolbar icons, Institution/Type columns, "Showing 1 result")
44
- - Separator/dividers between rows and sections
45
- - Tooltip info icons (ⓘ) beside section headings
46
- - "+ Add" buttons on section headings
47
-
48
- ---
49
-
50
- ## Section 1: What We Already Have — Use These As-Is, Don't Reinvent Them
51
-
52
- ### Page Heading + Right-Aligned Action Button (`src/components/heading/Heading.tsx`)
53
-
54
- The "Student Profile" H1 with "Suggest Student Summary" button on the right. `Heading` with two `Heading.InnerContainer` children — Dorothy confirmed all props.
55
-
56
- ```tsx
57
- <Heading level={1}>
58
- <Heading.InnerContainer>Student Profile</Heading.InnerContainer>
59
- <Heading.InnerContainer>
60
- <Button variant="primary">Suggest Student Summary</Button>
61
- </Heading.InnerContainer>
62
- </Heading>
63
- ```
64
-
65
- ---
66
-
67
- ### Student Avatar (`src/components/avatar/Avatar.tsx`)
68
-
69
- The small circle next to the student name. Dorothy verified: exported from `src/index.ts` (line 34), `size="small"` and `initials` props both confirmed.
70
-
71
- ```tsx
72
- <Avatar size="small" initials="CL" alt="Christopher Longbottom" />
73
- ```
74
-
75
- ---
76
-
77
- ### Tags Row (`src/components/tag/Tag.tsx`)
78
-
79
- The colored labels. Dorothy confirmed all 8 Tag colors: `neutral | orange | blue | green | purple | teal | salmon | yellow`. Wrap in a flex container.
80
-
81
- ```tsx
82
- <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--spacing-small)' }}>
83
- <Tag text="Disadvantaged" color="orange" />
84
- <Tag text="FSM" color="blue" />
85
- <Tag text="Pupil Premium Eligible" color="purple" />
86
- <Tag text="EAL" color="teal" />
87
- <Tag text="Service Child" color="salmon" />
88
- <Tag text="Has Medical Condition" color="yellow" />
89
- </div>
90
- ```
91
-
92
- ---
93
-
94
- ### Section Headings with Collapse (`src/components/section/Section.tsx`)
95
-
96
- Every named content block — Identity, Pinned Items, Education & Employment, Admin Functions. Dorothy verified ALL props:
97
-
98
- - `headingLevel` ✅ (line 11)
99
- - `collapsible` ✅ (line 15)
100
- - `collapsed` ✅ (line 16, initial collapsed state)
101
- - `buttonText` ✅ (line 17)
102
- - `buttonSize` ✅ (line 20)
103
- - `titleIconName` ✅ (line 12)
104
- - `titleIconColor` ✅ (line 13, typed as `string`)
105
-
106
- ```tsx
107
- <Section
108
- title="Identity"
109
- headingLevel={2}
110
- collapsible
111
- buttonText="Add"
112
- buttonSize="S"
113
- >
114
- {/* list property rows */}
115
- </Section>
116
-
117
- <Section
118
- title="Pinned Items"
119
- headingLevel={2}
120
- collapsible
121
- titleIconName="pin"
122
- titleIconColor="var(--color-salmon-500)"
123
- >
124
- {/* pinned items */}
125
- </Section>
126
- ```
127
-
128
- ---
129
-
130
- ### Separator / Dividers (`src/components/separator/Separator.tsx`)
131
-
132
- Horizontal dividers between every property row.
133
-
134
- ```tsx
135
- <Separator decorative />
136
- ```
137
-
138
- ---
139
-
140
- ### Icon Usage (`src/components/icon/Icon.tsx`)
141
-
142
- Dorothy verified all 8 icon names — 100% clean:
143
-
144
- | Design element | Icon name | Verified |
145
- |---|---|---|
146
- | Pin in "Pinned Items" heading | `'pin'` | ✅ line 173 |
147
- | Info tooltip icons on sections | `'info'` | ✅ line 151 |
148
- | Row drill-down arrows | `'chevron-right'` | ✅ line 114 |
149
- | Table toolbar search | `'search'` | ✅ line 178 |
150
- | Favourite star next to student name | `'favourite-filled'` | ✅ lines 204-206 |
151
- | Ask Arbor button | `'sparkles'` | ✅ line 187 |
152
- | "+ Add" buttons | `'plus'` | ✅ line 174 |
153
- | Previous/Next button icons | `'arrow-right'` / `'arrow-left'` | ✅ line 104 |
154
-
155
- ---
156
-
157
- ### Buttons — Full Variant Coverage (`src/components/button/Button.tsx`)
158
-
159
- Dorothy confirmed all 7 variants. Mapping to this design:
160
-
161
- ```tsx
162
- {/* Primary CTA */}
163
- <Button variant="primary">Suggest Student Summary</Button>
164
-
165
- {/* Navigation buttons */}
166
- <Button variant="secondary" size="S" iconLeftName="arrow-left">Previous</Button>
167
- <Button variant="secondary" size="S" iconRightName="arrow-right">Next</Button>
168
-
169
- {/* Widget column buttons */}
170
- <Button variant="secondary">Record Planned Absence</Button>
171
- <Button variant="secondary" iconRightName="chevron-right">Communications & Notes</Button>
172
-
173
- {/* Icon-only toolbar (ALWAYS wrap in TooltipWrapper — WCAG 2.1 AA) */}
174
- <TooltipWrapper tooltipContent="Search">
175
- <Button variant="tertiary" size="S" iconLeftName="search" iconLeftScreenReaderText="Search table" />
176
- </TooltipWrapper>
177
-
178
- {/* "All Sections" filter dropdown trigger */}
179
- <Button variant="dropdown" iconRightName="chevron-down">All Sections</Button>
180
- ```
181
-
182
- ---
183
-
184
- ### Tooltip Info Icons (`src/components/tooltip/TooltipWrapper.tsx`)
185
-
186
- The ⓘ icons next to "Student Contact Details", "Family, Guardians and Contacts", "Legal", "Parental Engagement".
187
-
188
- ```tsx
189
- <TooltipWrapper tooltipContent="Contact details can be managed in the family record">
190
- <button type="button" aria-label="More information">
191
- <Icon name="info" size={16} />
192
- </button>
193
- </TooltipWrapper>
194
- ```
195
-
196
- ---
197
-
198
- ### "All Sections" Filter Dropdown (`src/components/dropdown/Dropdown.tsx`)
199
-
200
- Use `Dropdown.SelectItem` with `closeAfterSelection={false}` for multi-toggle section visibility.
201
-
202
- ```tsx
203
- <Dropdown>
204
- <Dropdown.Trigger>
205
- <Button variant="dropdown" iconRightName="chevron-down">All Sections</Button>
206
- </Dropdown.Trigger>
207
- <Dropdown.Content>
208
- <Dropdown.SelectItem selected={true} onSelectChange={() => {}} closeAfterSelection={false}>
209
- Identity
210
- </Dropdown.SelectItem>
211
- <Dropdown.SelectItem selected={true} onSelectChange={() => {}} closeAfterSelection={false}>
212
- Student Contact Details
213
- </Dropdown.SelectItem>
214
- </Dropdown.Content>
215
- </Dropdown>
216
- ```
217
-
218
- ---
219
-
220
- ### Table — Education & Employment Section (`src/components/table/Table.tsx`)
221
-
222
- The compact data grid in the Education section. Dorothy confirmed `tableTheme="tidy"` (line 39 + line 114), `Table.HideColumnsDropdown` (line 218), `Table.RowCountInfo` (line 216).
223
-
224
- ```tsx
225
- <Table
226
- tableTheme="tidy"
227
- headerContent={
228
- <>
229
- <Table.HideColumnsDropdown />
230
- <TooltipWrapper tooltipContent="Search">
231
- <Button variant="tertiary" size="S" iconLeftName="search" iconLeftScreenReaderText="Search" />
232
- </TooltipWrapper>
233
- </>
234
- }
235
- footerContent={<Table.RowCountInfo />}
236
- columnDefs={[
237
- { field: 'institution', headerName: 'Institution' },
238
- { field: 'type', headerName: 'Type' },
239
- ]}
240
- />
241
- ```
242
-
243
- ⚠️ **GOTCHA**: `headerContent` must be TRUTHY for the header to render at all. `hasSearch={true}` alone does nothing without truthy `headerContent`.
244
-
245
- ---
246
-
247
- ### UserDropdown (`src/components/userDropdown/UserDropdown.tsx`)
248
-
249
- The user avatar in the top nav. `variant="dark"` for dark nav bar.
250
-
251
- ```tsx
252
- <UserDropdown
253
- variant="dark"
254
- user={{ name: 'Amee Morris', subtitle: 'Administrator' }}
255
- onSignOut={handleSignOut}
256
- />
257
- ```
258
-
259
- ---
260
-
261
- ### SearchBar (`src/components/searchBar/SearchBar.tsx`)
262
-
263
- The global search in the top nav. Dorothy confirmed exported at `src/index.ts` line 43.
264
-
265
- ```tsx
266
- <SearchBar placeholderText="Search" hoverText="Search" />
267
- ```
268
-
269
- ---
270
-
271
- ## Section 2: Almost There — Minor Issues or Gotchas
272
-
273
- ### Section — Cannot Combine Info Tooltip + Add Button Simultaneously
274
-
275
- **What exists:** `Section` has one button slot (`buttonText`/`buttonOnClick`), and `titleIconName` renders a non-interactive `<Icon>` only.
276
-
277
- **What's needed:** Multiple sections need the pattern: `Title [ⓘ tooltip] [+ Add button]`.
278
-
279
- **The gap:** Dorothy verified — `SectionProps` at lines 9–21 has **no `headerRightContent?: ReactNode` prop**. This is a genuine API gap, not Sophia guessing.
280
-
281
- **The fix:** Add `headerRightContent?: ReactNode` to `Section` as a fully backward-compatible new prop. **Effort: Low.**
282
-
283
- **Workaround:** Compose headings manually using `Heading` + `Heading.InnerContainer` + your own collapse state management.
284
-
285
- ---
286
-
287
- ### Table — No Link-Style Date Cell Renderer
288
-
289
- The "Education & Employment" table shows dates like "01 Sep 2018 – ongoing" in green text-link style. No `dsLinkCellRenderer` is registered.
290
-
291
- **The fix:** Use `cellRenderer: 'dsButtonCellRenderer'` with `variant: 'text-link'` params, or write a thin custom cell renderer for the Dates column.
292
-
293
- **Effort:** Low.
294
-
295
- ---
296
-
297
- ### Breadcrumbs — Must Be Composed from Primitives
298
-
299
- No `Breadcrumbs` component (already tracked in **MIS-69957** from Daily Attendance assessment).
300
-
301
- **Workaround:**
302
- ```tsx
303
- <nav aria-label="Breadcrumb">
304
- <ol className="ds-student-profile__breadcrumbs">
305
- <li><Button variant="text-link">Students</Button></li>
306
- <li aria-hidden="true"><Separator orientation="vertical" decorative /></li>
307
- <li><Button variant="text-link">Browse Students</Button></li>
308
- <li aria-hidden="true"><Separator orientation="vertical" decorative /></li>
309
- <li><Button variant="text-link">Christopher Longbottom</Button></li>
310
- <li aria-hidden="true"><Separator orientation="vertical" decorative /></li>
311
- <li>
312
- <span aria-current="page">Student Profile</span>
313
- <Icon name="arrow-up-right" size={12} />
314
- </li>
315
- </ol>
316
- </nav>
317
- ```
318
-
319
- ---
320
-
321
- ## Section 3: Build It From Scratch — These Don't Exist Yet
322
-
323
- ### PropertyRow / DescriptionList — HIGHEST PRIORITY MISSING COMPONENT
324
-
325
- Picture it: Sicily again. Every single room in my mother's house had furniture. But the DESK was missing. You cannot study in an empty room.
326
-
327
- The **entire main content area** of this page is built from "Label | Value >" rows. Without a `PropertyRow` component, every page consuming this pattern writes raw `<dl>/<dt>/<dd>` with custom CSS. This pattern appears on EVERY Arbor MIS profile and detail page.
328
-
329
- **What it needs:**
330
- - `label: string` — left column label
331
- - `value: ReactNode` — right column content (strings, links, addresses, tags)
332
- - `onClick?: () => void` — optional drill-down (renders `chevron-right` on right)
333
- - `rightLabel?: string` — optional date/meta far right (as in Pinned Items rows)
334
-
335
- **Effort:** Medium. Enormous ROI — unlocks every MIS profile page.
336
-
337
- ---
338
-
339
- ### Calendar / Schedule Widget
340
-
341
- The time-blocked class schedule in the right column. No `CalendarWidget` or `ScheduleList` exists. `DatePicker` is a form input — completely the wrong component class for a display schedule.
342
-
343
- **Effort:** Medium. Likely app-level rather than library.
344
-
345
- ---
346
-
347
- ### Top Navigation Bar
348
-
349
- Already tracked as **MIS-69959**. Individual primitives exist (`SearchBar`, `Button`, `UserDropdown`) but no container layout shell.
350
-
351
- ---
352
-
353
- ### Left Side Navigation Panel
354
-
355
- Already tracked as **MIS-69960**. Collapsible tree with 20+ items, active states, favourite toggles, notification badges.
356
-
357
- ---
358
-
359
- ### Notification Badge
360
-
361
- Already tracked as **MIS-69958**. Circular count overlay on nav items. `Tag` is rectangular — not suitable.
362
-
363
- ---
364
-
365
- ### Breadcrumbs (Library Component)
366
-
367
- Already tracked as **MIS-69957**. Per-page composition workaround works; library component needed for consistency.
368
-
369
- ---
370
-
371
- ## Section 4: Tricky Bits — Pay Attention Here
372
-
373
- ### 1. Section `headerRightContent` Gap — First Build Blocker You'll Hit
374
-
375
- Every section except Identity and Pinned Items needs an info tooltip AND an Add button in the header. Current `Section` supports one button slot. Either patch `Section` first, or compose all headings manually.
376
-
377
- ### 2. `favourite-filled` Must Have Accessible Context
378
-
379
- If the star next to the student name is interactive (toggle favourite), it must be a `<button>` with `aria-pressed`. If display-only, wrap with `aria-hidden`. A naked `<Icon>` with no accessible context fails WCAG.
380
-
381
- ### 3. `tableTheme` Is Typed as `string`
382
-
383
- Dorothy flagged: `tableTheme?: string` (line 39) accepts any string. Only `"tidy"` has a code path (line 114). Don't pass `tableTheme="compact"` and wonder why nothing changes.
384
-
385
- ### 4. `headerContent` Must Be Truthy for Table Header
386
-
387
- If you want the table header (Hide dropdown, toolbar icons), pass truthy `headerContent`. `hasSearch={true}` alone does nothing.
388
-
389
- ### 5. Tag Is Not Interactive
390
-
391
- If student labels (Disadvantaged, FSM, etc.) need to be clickable, `Tag` cannot do it — it's a presentational `<span>`. Use `Pill` for toggle/filter behavior, or a styled `Button` if navigation is needed.
392
-
393
- ---
394
-
395
- ## Section 5: The Verdict
396
-
397
- Picture it: Sicily, 1967. My mother finally finished furnishing that house. Sitting room? Perfect. Kitchen? Perfect. Bedrooms? Perfect. The only room missing furniture was the study — walls, floor, ceiling were there. But no desk, no shelves, no chair. You cannot study in an empty room.
398
-
399
- That is this page. The container is perfect. The primitives are all there. But the DESK — the `PropertyRow` component — is missing. Without it, you are building every data section by hand.
400
-
401
- ### Is It Buildable With Our Existing Components?
402
-
403
- **Mostly YES. High confidence for all interactive elements. One major composition gap (`PropertyRow`) and one Section API limitation to patch first.**
404
-
405
- ### Summary Table
406
-
407
- | Design Element | Library Component | Status |
408
- |---|---|---|
409
- | Page H1 + action button | `Heading` + `Heading.InnerContainer` + `Button` | ✅ Ready |
410
- | Student avatar | `Avatar size="small" initials="CL"` | ✅ Ready |
411
- | Tags row | `Tag` — 8 verified colors | ✅ Ready |
412
- | Section headings (simple) | `Section` — all props verified | ✅ Ready |
413
- | Separator / dividers | `Separator decorative` | ✅ Ready |
414
- | Icon usage (all 8 names) | `Icon` — all verified | ✅ Ready |
415
- | Buttons (all variants) | `Button` — all 7 verified | ✅ Ready |
416
- | Tooltip info icons | `TooltipWrapper` + `Icon name="info"` | ✅ Ready |
417
- | "All Sections" filter dropdown | `Dropdown` + `Dropdown.SelectItem` | ✅ Ready |
418
- | Compact data table | `Table tableTheme="tidy"` | ✅ Ready |
419
- | Table Hide dropdown | `Table.HideColumnsDropdown` | ✅ Ready |
420
- | Table row count | `Table.RowCountInfo` | ✅ Ready |
421
- | UserDropdown (nav bar) | `UserDropdown variant="dark"` | ✅ Ready |
422
- | Global search | `SearchBar` | ✅ Ready |
423
- | Breadcrumbs (this instance) | Compose: `Button text-link` + `Separator` | 🔧 Minor work |
424
- | Section: tooltip icon + Add button combo | Needs `headerRightContent` on Section | 🔧 Section patch needed |
425
- | Link-style date cell in table | Custom `cellRenderer` | 🔧 Minor work |
426
- | List property rows (entire page content) | `PropertyRow` — does not exist | 🆕 High priority |
427
- | Calendar/schedule widget | No equivalent | 🆕 New (app-level) |
428
- | Top navigation bar | MIS-69959 — existing ticket | 🆕 Existing ticket |
429
- | Left side navigation | MIS-69960 — existing ticket | 🆕 Existing ticket |
430
- | Notification badge | MIS-69958 — existing ticket | 🆕 Existing ticket |
431
- | Breadcrumbs library component | MIS-69957 — existing ticket | 🆕 Existing ticket |
432
-
433
- ### What Actually Needs Work
434
-
435
- | Item | Where It Lives | Effort |
436
- |---|---|---|
437
- | `Section` `headerRightContent` prop | `src/components/section/Section.tsx` | Low |
438
- | Link cell renderer for date column | Page-level custom renderer | Low |
439
- | Breadcrumbs (this page) | Page-level composition | Low |
440
- | `PropertyRow` component | New library component | Medium |
441
- | `CalendarWidget` | New library component (or app-level) | Medium |
442
- | Breadcrumbs library component | MIS-69957 | Medium |
443
- | Notification Badge | MIS-69958 | Low |
444
- | TopNavigationBar | MIS-69959 | High |
445
- | SideNavigation | MIS-69960 | High |
446
-
447
- ### Summary Verdict
448
-
449
- **14 out of 23 elements** can be built directly with current library components. 3 elements need minor composition or a small Section patch. 6 require new work — 4 already have Jira tickets.
450
-
451
- **New items unique to this page:**
452
- - `PropertyRow` — #1 priority new component, will unlock every MIS profile page
453
- - `CalendarWidget` — display-only schedule widget, likely app-level
454
-
455
- **Recommendation:** Patch `Section` (low effort, do it first). Plan `PropertyRow` as the next library component — enormous reuse value across the entire Arbor MIS product.
456
-
457
- ---
458
-
459
- ## Appendix: Files Referenced in This Assessment
460
-
461
- *Every file Dorothy read to verify claims. This assessment is grounded in actual source code.*
462
-
463
- - `src/index.ts`
464
- - `src/components/section/Section.tsx`
465
- - `src/components/icon/allowedIcons.tsx`
466
- - `src/components/avatar/Avatar.tsx`
467
- - `src/components/tag/Tag.tsx`
468
- - `src/components/button/Button.tsx`
469
- - `src/components/table/Table.tsx`
470
-
471
- ---
472
-
473
- *Analysis by Sophia Petrillo, Componentspert 👜, fact-checked by Dorothy Zbornak 🔍*
474
- *Powered by Claude Code 🐺*