@arbor-education/design-system.components 0.13.0 → 0.14.0
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 +14 -0
- package/{.claude/component-library.md → component-library.md} +27 -10
- package/dist/components/articleCard/ArticleCard.d.ts +30 -0
- package/dist/components/articleCard/ArticleCard.d.ts.map +1 -0
- package/dist/components/articleCard/ArticleCard.js +24 -0
- package/dist/components/articleCard/ArticleCard.js.map +1 -0
- package/dist/components/articleCard/ArticleCard.stories.d.ts +18 -0
- package/dist/components/articleCard/ArticleCard.stories.d.ts.map +1 -0
- package/dist/components/articleCard/ArticleCard.stories.js +112 -0
- package/dist/components/articleCard/ArticleCard.stories.js.map +1 -0
- package/dist/components/articleCard/ArticleCard.test.d.ts +2 -0
- package/dist/components/articleCard/ArticleCard.test.d.ts.map +1 -0
- package/dist/components/articleCard/ArticleCard.test.js +49 -0
- package/dist/components/articleCard/ArticleCard.test.js.map +1 -0
- 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/card/Card.d.ts +41 -12
- package/dist/components/card/Card.d.ts.map +1 -1
- package/dist/components/card/Card.js +46 -17
- package/dist/components/card/Card.js.map +1 -1
- package/dist/components/card/Card.stories.d.ts +9 -84
- package/dist/components/card/Card.stories.d.ts.map +1 -1
- package/dist/components/card/Card.stories.js +15 -73
- package/dist/components/card/Card.stories.js.map +1 -1
- package/dist/components/card/Card.test.js +50 -152
- package/dist/components/card/Card.test.js.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/formField/inputs/time/TimeInput.d.ts +1 -1
- package/dist/components/formField/inputs/time/TimeInput.stories.d.ts +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/icoText/IcoText.d.ts +37 -0
- package/dist/components/icoText/IcoText.d.ts.map +1 -0
- package/dist/components/icoText/IcoText.js +29 -0
- package/dist/components/icoText/IcoText.js.map +1 -0
- package/dist/components/icoText/IcoText.stories.d.ts +34 -0
- package/dist/components/icoText/IcoText.stories.d.ts.map +1 -0
- package/dist/components/icoText/IcoText.stories.js +24 -0
- package/dist/components/icoText/IcoText.stories.js.map +1 -0
- package/dist/components/icoText/IcoText.test.d.ts +2 -0
- package/dist/components/icoText/IcoText.test.d.ts.map +1 -0
- package/dist/components/icoText/IcoText.test.js +27 -0
- package/dist/components/icoText/IcoText.test.js.map +1 -0
- 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/kpiCard/KPICard.d.ts +13 -0
- package/dist/components/kpiCard/KPICard.d.ts.map +1 -0
- package/dist/components/kpiCard/KPICard.js +8 -0
- package/dist/components/kpiCard/KPICard.js.map +1 -0
- package/dist/components/kpiCard/KPICard.stories.d.ts +9 -0
- package/dist/components/kpiCard/KPICard.stories.d.ts.map +1 -0
- package/dist/components/kpiCard/KPICard.stories.js +18 -0
- package/dist/components/kpiCard/KPICard.stories.js.map +1 -0
- package/dist/components/kpiCard/KPICard.test.d.ts +2 -0
- package/dist/components/kpiCard/KPICard.test.d.ts.map +1 -0
- package/dist/components/kpiCard/KPICard.test.js +37 -0
- package/dist/components/kpiCard/KPICard.test.js.map +1 -0
- package/dist/components/kvpList/KVPList.d.ts +34 -0
- package/dist/components/kvpList/KVPList.d.ts.map +1 -0
- package/dist/components/kvpList/KVPList.js +20 -0
- package/dist/components/kvpList/KVPList.js.map +1 -0
- package/dist/components/kvpList/KVPList.stories.d.ts +27 -0
- package/dist/components/kvpList/KVPList.stories.d.ts.map +1 -0
- package/dist/components/kvpList/KVPList.stories.js +18 -0
- package/dist/components/kvpList/KVPList.stories.js.map +1 -0
- package/dist/components/kvpList/KVPList.test.d.ts +2 -0
- package/dist/components/kvpList/KVPList.test.d.ts.map +1 -0
- package/dist/components/kvpList/KVPList.test.js +29 -0
- package/dist/components/kvpList/KVPList.test.js.map +1 -0
- 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/singleUser/SingleUser.d.ts +1 -1
- package/dist/components/tabs/TabsItem.stories.d.ts +2 -2
- 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 +194 -23
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +13 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/eslint.config.mts +5 -1
- package/package.json +3 -3
- package/src/components/articleCard/ArticleCard.stories.tsx +132 -0
- package/src/components/articleCard/ArticleCard.test.tsx +121 -0
- package/src/components/articleCard/ArticleCard.tsx +100 -0
- package/src/components/articleCard/articleCard.scss +39 -0
- 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/card/Card.stories.tsx +35 -79
- package/src/components/card/Card.test.tsx +72 -190
- package/src/components/card/Card.tsx +117 -58
- package/src/components/card/card.scss +18 -31
- 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/icoText/IcoText.stories.tsx +47 -0
- package/src/components/icoText/IcoText.test.tsx +41 -0
- package/src/components/icoText/IcoText.tsx +93 -0
- package/src/components/icoText/icoText.scss +34 -0
- package/src/components/icon/Icon.stories.tsx +1446 -12
- package/src/components/kpiCard/KPICard.stories.tsx +47 -0
- package/src/components/kpiCard/KPICard.test.tsx +60 -0
- package/src/components/kpiCard/KPICard.tsx +45 -0
- package/src/components/kpiCard/kpiCard.scss +35 -0
- package/src/components/kvpList/KVPList.stories.tsx +51 -0
- package/src/components/kvpList/KVPList.test.tsx +66 -0
- package/src/components/kvpList/KVPList.tsx +109 -0
- package/src/components/kvpList/kvpList.scss +64 -0
- 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/tag/Tag.stories.tsx +755 -53
- package/src/index.scss +4 -0
- package/src/index.ts +13 -4
- package/src/tokens.scss +6 -0
- package/tokens/json/Arbor.json +30 -0
- 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
|
@@ -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 🐺*
|