@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,566 +0,0 @@
|
|
|
1
|
-
# Design Feasibility Assessment
|
|
2
|
-
## Design: Daily Attendance Page (1366px Desktop)
|
|
3
|
-
**Written by:** Sophia Petrillo, Componentspert, age none-of-your-business
|
|
4
|
-
**Fact-checked by:** Sophia herself, reading actual source files (Dorothy would be proud)
|
|
5
|
-
**Date:** 2026-04-10
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## What Is This Thing, Anyway?
|
|
10
|
-
|
|
11
|
-
Picture it: Sicily, 1961. My father kept a ledger of every student who showed up for morning mass at the village school. Every morning, same ritual. Tick the name, note the time, mark the absences. He did it with a pen and a ruled notebook. Now you want to do it on a 1366-pixel screen with a full AG Grid, a sidebar, a top navigation, filter bars, and pagination. Progress. Mostly.
|
|
12
|
-
|
|
13
|
-
This design is a **Daily Attendance data view** — a full application page for a school management system. It has a top navigation bar, a left sidebar with collapsible section navigation, a breadcrumb trail, a page heading with action button, a filter summary bar, and a full-featured data table with a toolbar, column headers, row data including attendance mark icons, and pagination.
|
|
14
|
-
|
|
15
|
-
Let me tell you exactly what we have, what needs a little work, and what you're going to have to build yourself. Sit down. This is going to take a minute.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Section 1: What We Already Have — Use These As-Is
|
|
20
|
-
|
|
21
|
-
### 1. Page Heading Row — `Heading` + `Heading.InnerContainer`
|
|
22
|
-
**File:** `src/components/heading/Heading.tsx`
|
|
23
|
-
|
|
24
|
-
The design shows "Daily Attendance" as an h1 heading on the left and a primary green action button on the right — exactly what `Heading.InnerContainer` was born for. Two `InnerContainer` children: left gets the title text, right gets the `Button`.
|
|
25
|
-
|
|
26
|
-
```tsx
|
|
27
|
-
<Heading level={1}>
|
|
28
|
-
<Heading.InnerContainer>Daily Attendance</Heading.InnerContainer>
|
|
29
|
-
<Heading.InnerContainer>
|
|
30
|
-
<Button variant="primary">Button Text</Button>
|
|
31
|
-
</Heading.InnerContainer>
|
|
32
|
-
</Heading>
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
No custom flex divs. No new wrappers. This is the supported pattern, and it works.
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
### 2. Primary Action Button — `Button`
|
|
40
|
-
**File:** `src/components/button/Button.tsx`
|
|
41
|
-
|
|
42
|
-
The design shows a primary green "Button Text" button top-right of the heading. Straightforward.
|
|
43
|
-
|
|
44
|
-
- `variant="primary"` — confirmed variant
|
|
45
|
-
- `size="M"` — default
|
|
46
|
-
|
|
47
|
-
Also used for the "Edit" button in the filter bar (`variant="secondary"`) and the "Expand table" button in the footer (`variant="secondary"` or `variant="tertiary"`).
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
### 3. Icon-Only Toolbar Buttons — `Button` (icon-only mode)
|
|
52
|
-
**File:** `src/components/button/Button.tsx`
|
|
53
|
-
|
|
54
|
-
The table toolbar (right side) shows: search icon, comment/message icon, download icon, fullscreen/expand icon. These are all icon-only buttons. Button auto-applies `ds-button--icon-only` when no `children` is passed but `iconLeftName` or `iconRightName` is set.
|
|
55
|
-
|
|
56
|
-
All required icons are confirmed in `allowedIcons.tsx`:
|
|
57
|
-
- Search: `'search'`
|
|
58
|
-
- Message/comment: `'message-square-more'`
|
|
59
|
-
- Download: `'download'`
|
|
60
|
-
- Fullscreen/expand: `'expand'`
|
|
61
|
-
|
|
62
|
-
```tsx
|
|
63
|
-
<Button variant="secondary" borderless iconLeftName="search" iconLeftScreenReaderText="Search table" />
|
|
64
|
-
<Button variant="secondary" borderless iconLeftName="message-square-more" iconLeftScreenReaderText="Comments" />
|
|
65
|
-
<Button variant="secondary" borderless iconLeftName="download" iconLeftScreenReaderText="Download" />
|
|
66
|
-
<Button variant="secondary" borderless iconLeftName="expand" iconLeftScreenReaderText="Fullscreen" />
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
The `borderless` prop removes borders — appropriate for inline toolbar icons.
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
### 4. Undo / Redo Toolbar Buttons — `Button`
|
|
74
|
-
**File:** `src/components/button/Button.tsx`
|
|
75
|
-
|
|
76
|
-
The left side of the table toolbar shows undo and redo icon buttons. Both icons confirmed in `allowedIcons.tsx`:
|
|
77
|
-
- `'undo'` — maps to `Undo2`
|
|
78
|
-
- `'redo'` — maps to `Redo2`
|
|
79
|
-
|
|
80
|
-
```tsx
|
|
81
|
-
<Button variant="secondary" borderless iconLeftName="undo" iconLeftScreenReaderText="Undo" />
|
|
82
|
-
<Button variant="secondary" borderless iconLeftName="redo" iconLeftScreenReaderText="Redo" />
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
### 5. Table — `Table` (AG Grid Enterprise wrapper)
|
|
88
|
-
**File:** `src/components/table/Table.tsx`
|
|
89
|
-
|
|
90
|
-
This is the centrepiece of the design and the `Table` component handles everything. The design shows:
|
|
91
|
-
- Checkbox column (AG Grid built-in `checkboxSelection` + `headerCheckboxSelection` on ColDef)
|
|
92
|
-
- Sortable column headers with column menu icons (AG Grid built-in)
|
|
93
|
-
- Time range hyperlink cells — use `dsButtonCellRenderer` with `variant="text-link"`
|
|
94
|
-
- Text content cells (Lesson/Event, Year Group, Event Type, Teacher) — standard AG Grid string cells
|
|
95
|
-
- Marks column with icon+count groups — **needs a custom cell renderer** (see Section 2)
|
|
96
|
-
- "(No Students)" text cells — standard string cell
|
|
97
|
-
|
|
98
|
-
Key `Table` props:
|
|
99
|
-
- `rowData` — your attendance records
|
|
100
|
-
- `columnDefs` — column config array (see Column config below)
|
|
101
|
-
- `headerContent` — ReactNode for the toolbar (BulkActionsDropdown + undo/redo left; HideColumns + icon buttons right)
|
|
102
|
-
- `footerContent` — ReactNode for pagination area
|
|
103
|
-
- `hasSearch={false}` — suppress the built-in SearchBar since the design uses a dedicated search icon button in the toolbar instead
|
|
104
|
-
|
|
105
|
-
**Column config sketch:**
|
|
106
|
-
```tsx
|
|
107
|
-
const columnDefs = [
|
|
108
|
-
{ checkboxSelection: true, headerCheckboxSelection: true, width: 40, suppressHeaderMenuButton: false },
|
|
109
|
-
{ field: 'time', headerName: 'Time', cellRenderer: 'dsButtonCellRenderer', cellRendererParams: { variant: 'text-link' } },
|
|
110
|
-
{ field: 'lesson', headerName: 'Lesson/Event' },
|
|
111
|
-
{ field: 'yearGroup', headerName: 'Year Group' },
|
|
112
|
-
{ field: 'eventType', headerName: 'Event Type' },
|
|
113
|
-
{ field: 'teacher', headerName: 'Teacher' },
|
|
114
|
-
{ field: 'marks', headerName: 'Marks', cellRenderer: AttendanceMarksCellRenderer }, // custom — see Section 2
|
|
115
|
-
];
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
**Important:** `setAgGridLicenseKey()` is called internally at module load — no need to call it in page components.
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
### 6. Table Toolbar (Actions Dropdown) — `Table.BulkActionsDropdown`
|
|
123
|
-
**File:** `src/components/table/BulkActionsDropdown.tsx`
|
|
124
|
-
|
|
125
|
-
The design shows "Actions (0)" as a dropdown button in the top-left of the table toolbar. This is `Table.BulkActionsDropdown` exactly.
|
|
126
|
-
|
|
127
|
-
```tsx
|
|
128
|
-
<Table.BulkActionsDropdown
|
|
129
|
-
actions={[
|
|
130
|
-
{ displayName: 'Export selected', callback: (api) => { /* ... */ } },
|
|
131
|
-
]}
|
|
132
|
-
/>
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
Note: the label renders as "Actions (N)" where N is `actions.length` — it counts the number of action options, not selected rows. If you want "Actions (0)" to reflect selected row count, you'd need to manage the actions array dynamically. That's an application concern, not a component limitation.
|
|
136
|
-
|
|
137
|
-
---
|
|
138
|
-
|
|
139
|
-
### 7. Hide Columns Dropdown — `Table.HideColumnsDropdown`
|
|
140
|
-
**File:** `src/components/table/HideColumnsDropdown.tsx`
|
|
141
|
-
|
|
142
|
-
The design shows "Hide (1)" dropdown button. This is `Table.HideColumnsDropdown`. It renders "Hide (N)" when columns are hidden or "Hide Columns" when none are hidden. It reads columns from `GridApiContext` automatically. Must be inside `Table` to access context.
|
|
143
|
-
|
|
144
|
-
```tsx
|
|
145
|
-
<Table.HideColumnsDropdown />
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
### 8. Table Settings Dropdown (Gear Icon) — `Table.TableSettingsDropdown`
|
|
151
|
-
**File:** `src/components/table/TableSettingsDropdown.tsx`
|
|
152
|
-
|
|
153
|
-
The design shows a gear/settings icon button in the table toolbar. This is `Table.TableSettingsDropdown` exactly — a `Button variant="secondary" borderless` with `iconRightName="settings"` that opens a dropdown with spacing/borders/cell colours controls. Confirmed in source.
|
|
154
|
-
|
|
155
|
-
```tsx
|
|
156
|
-
<Table.TableSettingsDropdown />
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
### 9. Table Pagination — `Table.PaginationControls` + `Table.RowCountInfo`
|
|
162
|
-
**Files:**
|
|
163
|
-
- `src/components/table/pagination/PaginationControls.tsx`
|
|
164
|
-
- `src/components/table/pagination/RowCountInfo.tsx`
|
|
165
|
-
|
|
166
|
-
The design's table footer shows:
|
|
167
|
-
- "Showing 100 of 664 results" — `Table.RowCountInfo` renders this exact format when totalRows differs from displayedRows, confirmed in source: `Showing ${displayedRowCount} of ${totalRows} results`
|
|
168
|
-
- Pagination: |< < [Page 1] of 7 > >| — `Table.PaginationControls` renders all five of these (first, prev, page-input, next, last)
|
|
169
|
-
- "Expand table" button — a `Button` in the footerContent slot
|
|
170
|
-
|
|
171
|
-
```tsx
|
|
172
|
-
footerContent={
|
|
173
|
-
<>
|
|
174
|
-
<div style={{ display: 'flex', gap: '1rem', alignItems: 'center' }}>
|
|
175
|
-
<Table.RowCountInfo totalRows={664} />
|
|
176
|
-
<Table.PaginationControls />
|
|
177
|
-
</div>
|
|
178
|
-
<Button variant="secondary" size="S" iconRightName="expand">Expand table</Button>
|
|
179
|
-
</>
|
|
180
|
-
}
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
---
|
|
184
|
-
|
|
185
|
-
### 10. Avatar (User Avatar in Top Nav) — `Avatar`
|
|
186
|
-
**File:** `src/components/avatar/Avatar.tsx`
|
|
187
|
-
|
|
188
|
-
The top nav shows a circular user photo with a chevron dropdown. `Avatar` handles image display with `src` and `alt` props. Wrap in `Dropdown.Trigger` for the chevron dropdown behaviour.
|
|
189
|
-
|
|
190
|
-
```tsx
|
|
191
|
-
<Dropdown>
|
|
192
|
-
<Dropdown.Trigger>
|
|
193
|
-
<button>
|
|
194
|
-
<Avatar src={userPhotoUrl} alt="User name" size="small" />
|
|
195
|
-
<Icon name="chevron-down" size={16} />
|
|
196
|
-
</button>
|
|
197
|
-
</Dropdown.Trigger>
|
|
198
|
-
<Dropdown.Content>...</Dropdown.Content>
|
|
199
|
-
</Dropdown>
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
Or use `UserDropdown` (see below) which handles the full avatar + dropdown pattern natively.
|
|
203
|
-
|
|
204
|
-
---
|
|
205
|
-
|
|
206
|
-
### 11. User Avatar + Dropdown — `UserDropdown`
|
|
207
|
-
**File:** `src/components/userDropdown/UserDropdown.tsx`
|
|
208
|
-
|
|
209
|
-
The top nav user avatar + chevron + dropdown menu maps to `UserDropdown` exactly. Props confirmed in source:
|
|
210
|
-
- `user: { name, subtitle?, avatarSrc?, avatarAlt?, avatarInitials? }`
|
|
211
|
-
- `sections?: UserDropdownSection[]` — for app switching sections
|
|
212
|
-
- `onSignOut: () => void`
|
|
213
|
-
- `variant?: 'dark' | 'light'` — use `'light'` for a light-coloured nav bar
|
|
214
|
-
|
|
215
|
-
The product logos (Arbor logo variants: ArborLogo, GovhubLogo, KeyLogo, etc.) are exported from `src/index.ts` as named exports alongside `UserDropdown`:
|
|
216
|
-
```ts
|
|
217
|
-
export { ArborLogo, GovhubLogo, KeyLogo, SampeopleLogo, RobinLogo, TimetablerLogo }
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
These can be passed as `logo` inside a `UserDropdownApp` for the product branding area.
|
|
221
|
-
|
|
222
|
-
---
|
|
223
|
-
|
|
224
|
-
### 12. Icon Component — `Icon`
|
|
225
|
-
**File:** `src/components/icon/Icon.tsx`
|
|
226
|
-
|
|
227
|
-
Used throughout. All icons needed for this design are confirmed present in `allowedIcons.tsx`:
|
|
228
|
-
- `'chevron-down'`, `'chevron-up'` — nav dropdowns and collapsibles
|
|
229
|
-
- `'favourite-outline'` — star icon on active nav item (maps to Lucide `Star`)
|
|
230
|
-
- `'menu'` — hamburger icon for sidebar collapse
|
|
231
|
-
- `'search'` — table toolbar search
|
|
232
|
-
- `'settings'` — gear icon (used by `Table.TableSettingsDropdown` internally)
|
|
233
|
-
- `'undo'`, `'redo'` — table toolbar
|
|
234
|
-
- `'message-square-more'` — comment/message icon
|
|
235
|
-
- `'download'` — download icon
|
|
236
|
-
- `'expand'` — fullscreen/expand icon
|
|
237
|
-
- `'check'`, `'x'`, `'circle-alert'` — for attendance mark indicators (green check, red X, warning)
|
|
238
|
-
- `'copy'` — link/copy icon in breadcrumbs
|
|
239
|
-
- `'grid-3x3'` — the green grid icon in the filter bar
|
|
240
|
-
- `'ask-arbor'` — custom AI icon for "Ask Arbor" button (confirmed custom icon)
|
|
241
|
-
- `'sparkles'` — sparkle icon on "Ask Arbor" button
|
|
242
|
-
|
|
243
|
-
Sizes available: 12, 16, 24 ONLY.
|
|
244
|
-
|
|
245
|
-
---
|
|
246
|
-
|
|
247
|
-
### 13. Separator — `Separator`
|
|
248
|
-
**File:** `src/components/separator/Separator.tsx`
|
|
249
|
-
|
|
250
|
-
Useful for visual dividers between nav sections, within dropdowns, and in the sidebar between sections. Confirmed exported.
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
### 14. Section (Page wrapper) — `Section`
|
|
255
|
-
**File:** `src/components/section/Section.tsx`
|
|
256
|
-
|
|
257
|
-
Wrap the Table in a `Section` for the white card background, border-radius, and padding that the design implies around the data table area.
|
|
258
|
-
|
|
259
|
-
```tsx
|
|
260
|
-
<Section>
|
|
261
|
-
<Table ... />
|
|
262
|
-
</Section>
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
`Section` does NOT accept arbitrary `headerContent` — that prop belongs to `Table`, not `Section`. `Section` has `title`, `collapsible`, `buttonText`/`buttonOnClick` for a single header button.
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
### 15. Tooltip — `Tooltip` / `TooltipWrapper`
|
|
270
|
-
**Files:** `src/components/tooltip/Tooltip.tsx`, `src/components/tooltip/TooltipWrapper.tsx`
|
|
271
|
-
|
|
272
|
-
Useful for the attendance mark icons in the Marks column — wrapping each icon+count group in a tooltip explaining what the icon means (e.g. "Present: 24", "Unauthorised: 1", "Absent: 3"). Radix UI based, so accessible by default.
|
|
273
|
-
|
|
274
|
-
---
|
|
275
|
-
|
|
276
|
-
### 16. Tag — `Tag`
|
|
277
|
-
**File:** `src/components/tag/Tag.tsx`
|
|
278
|
-
|
|
279
|
-
Not explicitly in this design's primary UI, but `Tag` with `color="green"` is close to the "active nav item" green highlight treatment. More likely just a CSS class concern on the nav item itself, but `Tag` is available if needed for labelling.
|
|
280
|
-
|
|
281
|
-
---
|
|
282
|
-
|
|
283
|
-
## Section 2: Almost There — Needs Modifications or Custom Work Within Existing Patterns
|
|
284
|
-
|
|
285
|
-
### 1. Attendance Marks Cell Renderer — Custom Cell Renderer (NOT a new component)
|
|
286
|
-
|
|
287
|
-
The Marks column is the trickiest cell in the table. It shows groups of: icon + count — specifically:
|
|
288
|
-
- Green check icon + count (e.g. "24")
|
|
289
|
-
- Orange warning/circle icon + count (e.g. "1")
|
|
290
|
-
- Red X icon + count (e.g. "3")
|
|
291
|
-
- Or the text "(No Students)"
|
|
292
|
-
|
|
293
|
-
**What we have:** `dsButtonCellRenderer`, `dsInlineTextCellRenderer`, `dsSelectDropdownCellRenderer` as built-in registered renderers. None of these handle the multi-icon-group pattern.
|
|
294
|
-
|
|
295
|
-
**What's needed:** A custom cell renderer component — `AttendanceMarksCellRenderer` — that uses `Icon` and inline text:
|
|
296
|
-
|
|
297
|
-
```tsx
|
|
298
|
-
const AttendanceMarksCellRenderer = ({ value }) => {
|
|
299
|
-
if (!value || value.length === 0) return <span>(No Students)</span>;
|
|
300
|
-
return (
|
|
301
|
-
<div className="ds-attendance-marks">
|
|
302
|
-
{value.map(({ icon, count, color }) => (
|
|
303
|
-
<span key={icon} className={`ds-attendance-marks__group ds-attendance-marks__group--${color}`}>
|
|
304
|
-
<Icon name={icon} size={16} />
|
|
305
|
-
<span>{count}</span>
|
|
306
|
-
</span>
|
|
307
|
-
))}
|
|
308
|
-
</div>
|
|
309
|
-
);
|
|
310
|
-
};
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
Then register it on the Table via the `components` prop:
|
|
314
|
-
```tsx
|
|
315
|
-
<Table
|
|
316
|
-
components={{ dsAttendanceMarksCellRenderer: AttendanceMarksCellRenderer }}
|
|
317
|
-
columnDefs={[
|
|
318
|
-
{ field: 'marks', cellRenderer: 'dsAttendanceMarksCellRenderer' }
|
|
319
|
-
]}
|
|
320
|
-
/>
|
|
321
|
-
```
|
|
322
|
-
|
|
323
|
-
**Effort:** Low. This is standard AG Grid cell renderer pattern. AG Grid's `components` prop on `Table` accepts custom renderers. No library changes required — this is application-level code.
|
|
324
|
-
|
|
325
|
-
---
|
|
326
|
-
|
|
327
|
-
### 2. Filter/Info Bar — Composed from Existing Components, No Standard Component
|
|
328
|
-
|
|
329
|
-
The design shows a green grid icon on the left, filter summary text in the middle, and an "Edit" secondary button on the right. There is no `FilterBar` component in the library.
|
|
330
|
-
|
|
331
|
-
**What we have:** `Icon`, `Button`, and `Heading.InnerContainer` for the layout. The filter text is just a string.
|
|
332
|
-
|
|
333
|
-
**What's needed:** Compose it yourself as a `<div>` with flex layout:
|
|
334
|
-
|
|
335
|
-
```tsx
|
|
336
|
-
<div className="ds-daily-attendance__filter-bar">
|
|
337
|
-
<div className="ds-daily-attendance__filter-bar-left">
|
|
338
|
-
<Icon name="grid-3x3" size={16} />
|
|
339
|
-
<span>Select Date Wed, 05 Feb 2025 AM Showing Attendance Registers...</span>
|
|
340
|
-
</div>
|
|
341
|
-
<Button variant="secondary" size="S">Edit</Button>
|
|
342
|
-
</div>
|
|
343
|
-
```
|
|
344
|
-
|
|
345
|
-
**Effort:** Low — this is page-level layout code, not a missing component. A reusable `FilterBar` component would be nice if this pattern repeats across many pages, but it doesn't need to live in the library to build this page.
|
|
346
|
-
|
|
347
|
-
---
|
|
348
|
-
|
|
349
|
-
### 3. Breadcrumbs — No Component, Composed from Primitives
|
|
350
|
-
|
|
351
|
-
**What we have:** No `Breadcrumbs` component exists (confirmed in library, confirmed in memory). The design shows "Students / Attendance / Registers / Daily Attendance" with a copy icon.
|
|
352
|
-
|
|
353
|
-
**What's needed:** Compose it:
|
|
354
|
-
|
|
355
|
-
```tsx
|
|
356
|
-
<nav aria-label="Breadcrumb">
|
|
357
|
-
<ol>
|
|
358
|
-
<li><a href="/students">Students</a></li>
|
|
359
|
-
<li aria-hidden>/</li>
|
|
360
|
-
<li><a href="/attendance">Attendance</a></li>
|
|
361
|
-
<li aria-hidden>/</li>
|
|
362
|
-
<li><a href="/registers">Registers</a></li>
|
|
363
|
-
<li aria-hidden>/</li>
|
|
364
|
-
<li aria-current="page">Daily Attendance</li>
|
|
365
|
-
</ol>
|
|
366
|
-
<Button variant="tertiary" borderless iconLeftName="copy" iconLeftScreenReaderText="Copy link" />
|
|
367
|
-
</nav>
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
**Effort:** Low for this page. Medium if you want a proper reusable `Breadcrumbs` component in the library. Given this design uses it, it may be worth a library ticket.
|
|
371
|
-
|
|
372
|
-
---
|
|
373
|
-
|
|
374
|
-
### 4. HideColumnsDropdown Label Behaviour
|
|
375
|
-
|
|
376
|
-
The design shows "Hide (1)" — meaning it shows the count of **hidden** columns. In the source, `HideColumnsDropdown` renders `Hide (${hiddenColumns.length})` where `hiddenColumns` is the array of column IDs passed to `handleVisibilityChange`. This means it shows the count of hidden columns, which is correct.
|
|
377
|
-
|
|
378
|
-
However, the initial state renders "Hide Columns" (not "Hide (0)"). If the design requires "Hide (1)" to appear from initial render with one column pre-hidden, you'd need to pre-populate the `hiddenColumns` state — or pass `columns` prop with one already hidden. This is a minor behavioural note, not a blocker.
|
|
379
|
-
|
|
380
|
-
---
|
|
381
|
-
|
|
382
|
-
### 5. BulkActionsDropdown — "Actions (0)" Label
|
|
383
|
-
|
|
384
|
-
As noted above, `Table.BulkActionsDropdown` shows `Actions (N)` where N is `actions.length`, not selected row count. The design shows "Actions (0)" implying zero selected rows, but the component counts action items. To show "(0 selected)" semantics, you'd need to filter `actions` based on `gridApi.getSelectedRows().length` or build a wrapper that adjusts the label. This may or may not matter depending on product requirements.
|
|
385
|
-
|
|
386
|
-
---
|
|
387
|
-
|
|
388
|
-
## Section 3: Build From Scratch — These Don't Exist Yet
|
|
389
|
-
|
|
390
|
-
### 1. Top Navigation Bar — NO EQUIVALENT
|
|
391
|
-
|
|
392
|
-
**The confirmed gap:** There is no `TopNav`, `AppHeader`, or navigation shell component in the library. The library note says explicitly: "No TopNav / application header component."
|
|
393
|
-
|
|
394
|
-
The top nav contains:
|
|
395
|
-
- Arbor logo (far left)
|
|
396
|
-
- Main nav links with chevron-down dropdowns (My Items, Students, School, Reporting, System)
|
|
397
|
-
- Search bar (centre-right)
|
|
398
|
-
- "Ask Arbor" AI button with sparkle icon
|
|
399
|
-
- User avatar + chevron dropdown (handled by `UserDropdown`)
|
|
400
|
-
- Product logos/branding (far right — handled by exported logo components)
|
|
401
|
-
|
|
402
|
-
**What we have:** `UserDropdown` handles the avatar section. `Icon` provides `'ask-arbor'` and `'sparkles'`. `Button` can render the "Ask Arbor" button. `Dropdown` + `Button` can handle each nav link item. `SearchBar` is now exported and could power the central search.
|
|
403
|
-
|
|
404
|
-
**What's needed:** An `AppTopNav` (or `TopNav`) component that composes all of this into an application-level navigation shell. This is a **high effort** new component — it needs responsive behaviour, keyboard navigation, proper ARIA roles (`role="navigation"`, `aria-label`), and likely a full design spec of its own.
|
|
405
|
-
|
|
406
|
-
**Workaround for this page:** Since this is an application page (not the shell itself), you may not be building the TopNav from this library at all — it may live in the host application. Clarify scope with the team.
|
|
407
|
-
|
|
408
|
-
---
|
|
409
|
-
|
|
410
|
-
### 2. Left Sidebar Navigation — NO EQUIVALENT
|
|
411
|
-
|
|
412
|
-
**The confirmed gap:** There is no `SideNav`, `Sidebar`, or application sidebar component in the library. Confirmed: "No SideNav / sidebar navigation component."
|
|
413
|
-
|
|
414
|
-
The sidebar contains:
|
|
415
|
-
- Hamburger collapse toggle
|
|
416
|
-
- Section labels (non-clickable headers like "Attendance")
|
|
417
|
-
- Collapsible sections (`Section` with `collapsible={true}` comes CLOSE but is not a nav element)
|
|
418
|
-
- Active nav item with green highlight and star icon
|
|
419
|
-
- Nested link lists
|
|
420
|
-
|
|
421
|
-
**What we have:** `Section` with `collapsible={true}` provides collapse/expand with chevron toggle. `Icon` provides the `'menu'`, `'chevron-down'`, `'chevron-up'`, `'favourite-outline'` (star) icons. `Button` with `variant="text-link"` can render nav links.
|
|
422
|
-
|
|
423
|
-
**What's needed:** A `SideNav` component with:
|
|
424
|
-
- `role="navigation"` with `aria-label`
|
|
425
|
-
- Collapsible section groups (could wrap `Section` internally)
|
|
426
|
-
- Active state highlighting
|
|
427
|
-
- Hamburger collapse mode (collapses to icons-only at narrow widths)
|
|
428
|
-
- `aria-current="page"` on active link
|
|
429
|
-
|
|
430
|
-
**Effort:** High. This is a structural shell component with complex state (which sections expanded, which item active, collapsed/expanded mode) and accessibility requirements.
|
|
431
|
-
|
|
432
|
-
**Workaround:** Like the TopNav, this likely lives in the host application, not the component library. Confirm with team.
|
|
433
|
-
|
|
434
|
-
---
|
|
435
|
-
|
|
436
|
-
### 3. Collapsible Sidebar Section Groups with Active States — Partially Covered
|
|
437
|
-
|
|
438
|
-
`Section` with `collapsible={true}` gives you the expand/collapse behaviour, but:
|
|
439
|
-
- `Section` is a page-level card with white background and padding — not a transparent nav section
|
|
440
|
-
- `Section` doesn't support active item highlighting
|
|
441
|
-
- `Section` doesn't render `<nav>`, `<ul>`, or `<li>` — it renders a card with a `<section>` element
|
|
442
|
-
|
|
443
|
-
So while the collapse mechanic exists, the visual and semantic treatment of a sidebar nav section is fundamentally different from what `Section` provides. You'd need custom composition for proper sidebar sections.
|
|
444
|
-
|
|
445
|
-
---
|
|
446
|
-
|
|
447
|
-
## Section 4: Tricky Bits — Pay Attention Here
|
|
448
|
-
|
|
449
|
-
### 1. Table Toolbar Layout (headerContent)
|
|
450
|
-
|
|
451
|
-
The table header has a **split left/right layout**: Actions + undo + redo on the left; Hide + search + comment + download + settings + fullscreen on the right. The `Table`'s `headerContent` and the `TableHeader` component use `display: flex; justify-content: space-between` internally. Pass two grouped `<div>` elements as children of `headerContent` and they'll auto-align left and right:
|
|
452
|
-
|
|
453
|
-
```tsx
|
|
454
|
-
headerContent={[
|
|
455
|
-
<div key="left" style={{ display: 'flex', gap: '0.5rem', alignItems: 'center' }}>
|
|
456
|
-
<Table.BulkActionsDropdown actions={bulkActions} />
|
|
457
|
-
<Button variant="secondary" borderless size="S" iconLeftName="undo" iconLeftScreenReaderText="Undo" />
|
|
458
|
-
<Button variant="secondary" borderless size="S" iconLeftName="redo" iconLeftScreenReaderText="Redo" />
|
|
459
|
-
</div>,
|
|
460
|
-
<div key="right" style={{ display: 'flex', gap: '0.5rem', alignItems: 'center' }}>
|
|
461
|
-
<Table.HideColumnsDropdown />
|
|
462
|
-
<Button variant="secondary" borderless iconLeftName="search" iconLeftScreenReaderText="Search" />
|
|
463
|
-
<Button variant="secondary" borderless iconLeftName="message-square-more" iconLeftScreenReaderText="Comments" />
|
|
464
|
-
<Button variant="secondary" borderless iconLeftName="download" iconLeftScreenReaderText="Download" />
|
|
465
|
-
<Table.TableSettingsDropdown />
|
|
466
|
-
<Button variant="secondary" borderless iconLeftName="expand" iconLeftScreenReaderText="Fullscreen" />
|
|
467
|
-
</div>,
|
|
468
|
-
]}
|
|
469
|
-
```
|
|
470
|
-
|
|
471
|
-
**Note:** Pass `hasSearch={false}` on the Table since you're managing search via the toolbar icon button yourself.
|
|
472
|
-
|
|
473
|
-
### 2. hasSearch and SearchBar Interaction
|
|
474
|
-
|
|
475
|
-
The design shows a search icon button in the toolbar, NOT the built-in SearchBar that `Table` renders by default. By default `hasSearch={true}`, which renders `SearchBar` below the `headerContent` children inside `TableHeader`. Set `hasSearch={false}` to suppress it, and manage your own search icon button behaviour.
|
|
476
|
-
|
|
477
|
-
### 3. GridApiContext Dependency for Table Sub-components
|
|
478
|
-
|
|
479
|
-
`Table.BulkActionsDropdown`, `Table.HideColumnsDropdown`, `Table.RowCountInfo`, `Table.PaginationControls`, and `Table.TableSettingsDropdown` ALL read from `GridApiContext` internally. They **must** be rendered inside the `Table` component tree to function — pass them via `headerContent` or `footerContent` props, not as siblings outside `<Table>`.
|
|
480
|
-
|
|
481
|
-
### 4. Attendance Marks Icons — Use Existing Icon Names
|
|
482
|
-
|
|
483
|
-
For the marks cell, the correct icon names from `allowedIcons.tsx` are:
|
|
484
|
-
- Green check: `'check'` or `'circle-check'` or `'circle-check-big'`
|
|
485
|
-
- Orange warning: `'circle-alert'` or `'triangle-alert'`
|
|
486
|
-
- Red X: `'x'` or `'circle-x'`
|
|
487
|
-
|
|
488
|
-
Do not invent icon names. Verify against `allowedIcons.tsx` before using.
|
|
489
|
-
|
|
490
|
-
---
|
|
491
|
-
|
|
492
|
-
## Section 5: The Verdict
|
|
493
|
-
|
|
494
|
-
Picture it: Sicily again, 1962. After my Uncle Nunzio finished his assessment of the village, he told my father: "Forty percent of the houses are perfect. Forty percent need new windows and a coat of paint. Twenty percent need to be knocked down and started over." My father nodded and said, "So we can start building?" Nunzio said, "The forty percent that's perfect? Start there."
|
|
495
|
-
|
|
496
|
-
That's where we are.
|
|
497
|
-
|
|
498
|
-
### Is It Buildable With Our Existing Components? **Mostly. Yes.**
|
|
499
|
-
|
|
500
|
-
The core of this page — the data table with all its toolbar sub-components, pagination, the heading, buttons, icons, and the user avatar dropdown — is all there. The library covers the data-dense heart of this screen completely and accurately.
|
|
501
|
-
|
|
502
|
-
What's missing is the **application chrome** (TopNav, SideNav). But those almost certainly live in the host application, not this library. If you're just building the page content area (which is likely what this assessment is actually for), you're in excellent shape.
|
|
503
|
-
|
|
504
|
-
### Summary Table
|
|
505
|
-
|
|
506
|
-
| Design Element | Library Component | Status |
|
|
507
|
-
|---|---|---|
|
|
508
|
-
| Page h1 heading + action button | `Heading` + `Heading.InnerContainer` + `Button` | Ready |
|
|
509
|
-
| Primary "Button Text" button | `Button variant="primary"` | Ready |
|
|
510
|
-
| Edit button | `Button variant="secondary"` | Ready |
|
|
511
|
-
| Data table (columns, sorting, checkboxes) | `Table` (AG Grid) | Ready |
|
|
512
|
-
| Actions (0) dropdown | `Table.BulkActionsDropdown` | Ready |
|
|
513
|
-
| Undo / Redo icon buttons | `Button` + `iconLeftName="undo/redo"` | Ready |
|
|
514
|
-
| Hide (1) dropdown | `Table.HideColumnsDropdown` | Ready |
|
|
515
|
-
| Search icon button | `Button` icon-only | Ready |
|
|
516
|
-
| Comment icon button | `Button` icon-only | Ready |
|
|
517
|
-
| Download icon button | `Button` icon-only | Ready |
|
|
518
|
-
| Settings (gear) dropdown | `Table.TableSettingsDropdown` | Ready |
|
|
519
|
-
| Fullscreen icon button | `Button` icon-only | Ready |
|
|
520
|
-
| "Showing 100 of 664 results" | `Table.RowCountInfo` | Ready |
|
|
521
|
-
| Pagination controls (|< < 1 of 7 > >|) | `Table.PaginationControls` | Ready |
|
|
522
|
-
| Expand table button | `Button variant="secondary"` | Ready |
|
|
523
|
-
| Time cell as hyperlink | `Button variant="text-link"` via `dsButtonCellRenderer` | Ready |
|
|
524
|
-
| Text cells (lesson, year, teacher etc) | AG Grid standard string cells | Ready |
|
|
525
|
-
| Attendance marks cell (icon+count groups) | Custom `AttendanceMarksCellRenderer` | App-level code needed |
|
|
526
|
-
| User avatar | `Avatar` or `UserDropdown` | Ready |
|
|
527
|
-
| Filter/info bar | Composed: `Icon` + text + `Button` | App-level layout needed |
|
|
528
|
-
| Breadcrumbs | Composed: links + `Separator` + `Button` | App-level layout needed |
|
|
529
|
-
| Icons (all toolbar/nav icons) | `Icon` + `allowedIcons.tsx` | Ready |
|
|
530
|
-
| Product logos (top nav far right) | Exported logo components | Ready |
|
|
531
|
-
| Top navigation bar | None | Missing — NEW component needed |
|
|
532
|
-
| Left sidebar navigation | None | Missing — NEW component needed |
|
|
533
|
-
|
|
534
|
-
### What Actually Needs Work
|
|
535
|
-
|
|
536
|
-
| Item | Where | Effort |
|
|
537
|
-
|---|---|---|
|
|
538
|
-
| `AttendanceMarksCellRenderer` | Application code (passed via `components` prop to Table) | Low |
|
|
539
|
-
| Filter/Info Bar layout | Application code (page-level CSS) | Low |
|
|
540
|
-
| Breadcrumbs composition | Application code | Low |
|
|
541
|
-
| `TopNav` component | New library component (or host application) | High |
|
|
542
|
-
| `SideNav` component | New library component (or host application) | High |
|
|
543
|
-
|
|
544
|
-
### Summary Verdict
|
|
545
|
-
|
|
546
|
-
The **page content area** (everything below the top nav and to the right of the sidebar) is **highly feasible** with existing components. You need one custom cell renderer for attendance marks, some page-level layout CSS for the filter bar and breadcrumbs, and you're building.
|
|
547
|
-
|
|
548
|
-
The **application chrome** (TopNav, SideNav) is missing from the library entirely, but the assumption is those live in the host application or are a separate initiative. If you do need to add them to the library, budget significant effort — these are complex shell components.
|
|
549
|
-
|
|
550
|
-
**Recommendation:** Start building. The table, toolbar, pagination, heading, and buttons are all ready. Do the custom marks renderer as application-level code. Come back to the library to discuss TopNav and SideNav as separate tickets.
|
|
551
|
-
|
|
552
|
-
---
|
|
553
|
-
|
|
554
|
-
## Appendix: Source Files Read to Verify This Assessment
|
|
555
|
-
|
|
556
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/src/index.ts`
|
|
557
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/src/components/table/Table.tsx`
|
|
558
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/src/components/table/BulkActionsDropdown.tsx`
|
|
559
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/src/components/table/HideColumnsDropdown.tsx`
|
|
560
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/src/components/table/TableSettingsDropdown.tsx`
|
|
561
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/src/components/table/pagination/PaginationControls.tsx`
|
|
562
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/src/components/table/pagination/RowCountInfo.tsx`
|
|
563
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/src/components/icon/allowedIcons.tsx`
|
|
564
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/src/components/userDropdown/UserDropdown.tsx`
|
|
565
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/.claude/agent-memory/sophia-componentspert/components.md`
|
|
566
|
-
- `/Users/ameemorris/dev/Arbor/design-system.components/.claude/component-library.md` (first 400 lines)
|