eha-design-system-ai 0.1.0 → 0.3.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/EHA_RULES.md +4 -4
- package/README.md +33 -13
- package/dist/{chunk-TOWRWUJK.js → chunk-LMSDRJHS.js} +43 -4
- package/dist/chunk-LMSDRJHS.js.map +1 -0
- package/dist/{chunk-43DPD5CQ.js → chunk-QID5XXWN.js} +25 -6
- package/dist/chunk-QID5XXWN.js.map +1 -0
- package/dist/chunk-QYLQDNOW.js +124 -0
- package/dist/chunk-QYLQDNOW.js.map +1 -0
- package/dist/index.cjs +225 -244
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +33 -11
- package/dist/index.js.map +1 -1
- package/dist/manifests/index.cjs +47 -4
- package/dist/manifests/index.cjs.map +1 -1
- package/dist/manifests/index.d.cts +12 -4
- package/dist/manifests/index.d.ts +12 -4
- package/dist/manifests/index.js +11 -3
- package/dist/mcp/server.cjs +492 -222
- package/dist/mcp/server.cjs.map +1 -1
- package/dist/mcp/server.d.cts +1 -6
- package/dist/mcp/server.d.ts +1 -6
- package/dist/mcp/server.js +383 -10
- package/dist/mcp/server.js.map +1 -1
- package/dist/recipes/index.cjs +24 -4
- package/dist/recipes/index.cjs.map +1 -1
- package/dist/recipes/index.d.cts +7 -2
- package/dist/recipes/index.d.ts +7 -2
- package/dist/recipes/index.js +3 -1
- package/dist/tokens/index.cjs +119 -97
- package/dist/tokens/index.cjs.map +1 -1
- package/dist/tokens/index.d.cts +247 -78
- package/dist/tokens/index.d.ts +247 -78
- package/dist/tokens/index.js +9 -19
- package/package.json +71 -6
- package/dist/chunk-43DPD5CQ.js.map +0 -1
- package/dist/chunk-BENZVDE6.js +0 -176
- package/dist/chunk-BENZVDE6.js.map +0 -1
- package/dist/chunk-TGIKADVU.js +0 -97
- package/dist/chunk-TGIKADVU.js.map +0 -1
- package/dist/chunk-TOWRWUJK.js.map +0 -1
- package/scripts/sync-manifest.ts +0 -34
- package/src/index.ts +0 -6
- package/src/manifests/components.ts +0 -185
- package/src/mcp/server.ts +0 -163
- package/src/recipes/index.ts +0 -178
- package/src/tokens/index.ts +0 -75
- package/tsconfig.json +0 -14
- package/tsup.config.ts +0 -17
package/EHA_RULES.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# EHA Design System — AI Rules
|
|
2
2
|
|
|
3
|
-
These rules apply to any AI agent using the `eha-ai` MCP server.
|
|
3
|
+
These rules apply to any AI agent using the `eha-design-system-ai` MCP server.
|
|
4
4
|
|
|
5
5
|
## Non-Negotiable
|
|
6
6
|
|
|
7
7
|
1. All component imports from `eha-design-system` — never from `rsuite` directly
|
|
8
8
|
2. Button always uses `variant` prop — `'primary' | 'secondary' | 'tertiary' | 'ghost'`
|
|
9
|
-
3. `ThemeProvider` with correct `
|
|
10
|
-
4. Missing components
|
|
9
|
+
3. `ThemeProvider` with the correct `brandId` prop always wraps the app root
|
|
10
|
+
4. Missing components -> output comment, never build custom: `// MISSING: [Name] — not in EHA DS`
|
|
11
11
|
5. Never hardcode brand colours — resolve via `brands[brandId].colorPrimitives.*`
|
|
12
12
|
6. Logo assets must be static files at `/public/brands/[brand]/logo.svg` — never remote URLs
|
|
13
13
|
|
|
@@ -29,6 +29,6 @@ import { designTokens } from 'eha-design-system';
|
|
|
29
29
|
|
|
30
30
|
## Figma Workflow
|
|
31
31
|
|
|
32
|
-
1. Map
|
|
32
|
+
1. Map all Figma node names with `resolve_figma`
|
|
33
33
|
2. Report MISSING items before generating code
|
|
34
34
|
3. Generate code using only resolved components
|
package/README.md
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
|
-
# eha-ai
|
|
1
|
+
# eha-design-system-ai
|
|
2
2
|
|
|
3
|
-
MCP server for the EHA Design System.
|
|
3
|
+
MCP server for the EHA Design System. It exposes components, design tokens, recipes, and brand-specific setup data to AI agents through the Model Context Protocol.
|
|
4
4
|
|
|
5
5
|
## Tools
|
|
6
6
|
|
|
7
7
|
| Tool | Description |
|
|
8
8
|
|------|-------------|
|
|
9
|
-
| `
|
|
10
|
-
| `
|
|
11
|
-
| `
|
|
12
|
-
| `
|
|
13
|
-
| `
|
|
14
|
-
| `
|
|
9
|
+
| `get_brand` | Returns brand setup (`ThemeProvider`, CSS import), brand color scales, and key brand differences |
|
|
10
|
+
| `get_components` | Lists available DS components, optionally filtered by category or search |
|
|
11
|
+
| `get_component` | Returns full component details (props, usage, notes, Figma aliases) |
|
|
12
|
+
| `resolve_figma` | Maps Figma node names to DS components and flags missing items |
|
|
13
|
+
| `get_tokens` | Returns token data by category, with optional brand-specific colors |
|
|
14
|
+
| `get_recipe` | Returns recipe code by id, or lists recipes by category |
|
|
15
|
+
| `get_rules` | Returns AI guardrails and do/don't implementation rules |
|
|
15
16
|
|
|
16
17
|
## Setup
|
|
17
18
|
|
|
@@ -20,23 +21,42 @@ npm install
|
|
|
20
21
|
npm run build
|
|
21
22
|
```
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
## Run Locally
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm run start
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## MCP Config (Local Build)
|
|
24
31
|
|
|
25
32
|
```json
|
|
26
33
|
{
|
|
27
34
|
"mcpServers": {
|
|
28
|
-
"eha-
|
|
35
|
+
"eha-design-system": {
|
|
29
36
|
"command": "node",
|
|
30
|
-
"args": ["/path/to/eha-ai/dist/
|
|
37
|
+
"args": ["/absolute/path/to/eha-ai/dist/mcp/server.js"]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## MCP Config (Published Package)
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"mcpServers": {
|
|
48
|
+
"eha-design-system": {
|
|
49
|
+
"command": "npx",
|
|
50
|
+
"args": ["eha-design-system-ai"]
|
|
31
51
|
}
|
|
32
52
|
}
|
|
33
53
|
}
|
|
34
54
|
```
|
|
35
55
|
|
|
36
|
-
## Sync
|
|
56
|
+
## Sync Version Marker From DS
|
|
37
57
|
|
|
38
58
|
```bash
|
|
39
59
|
npm run sync
|
|
40
60
|
```
|
|
41
61
|
|
|
42
|
-
This
|
|
62
|
+
This updates the `eha-design-system@x.y.z` version reference in the token source file to match the installed package version.
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
var components = [
|
|
3
3
|
{
|
|
4
4
|
name: "Button",
|
|
5
|
+
category: "input",
|
|
6
|
+
description: "Brand-aware action trigger with required variant styling.",
|
|
5
7
|
import: "import { Button } from 'eha-design-system'",
|
|
6
8
|
figmaNodeNames: ["Button", "Primary Button", "Secondary Button", "Ghost Button", "Tertiary Button", "CTA", "Action Button"],
|
|
7
9
|
cssClass: "ds-button",
|
|
@@ -19,6 +21,8 @@ var components = [
|
|
|
19
21
|
},
|
|
20
22
|
{
|
|
21
23
|
name: "Sidenav",
|
|
24
|
+
category: "navigation",
|
|
25
|
+
description: "Primary side navigation shell with brand logo and expandable state.",
|
|
22
26
|
import: "import { Sidenav } from 'eha-design-system'",
|
|
23
27
|
figmaNodeNames: ["Sidenav", "Sidebar", "Side Navigation", "Navigation Menu", "Nav Menu", "Side Menu"],
|
|
24
28
|
cssClass: "ds-sidenav",
|
|
@@ -38,13 +42,15 @@ var components = [
|
|
|
38
42
|
},
|
|
39
43
|
{
|
|
40
44
|
name: "MetricCard",
|
|
45
|
+
category: "display",
|
|
46
|
+
description: "KPI card for numeric summaries with optional icon and breakdown.",
|
|
41
47
|
import: "import { MetricCard } from 'eha-design-system'",
|
|
42
48
|
figmaNodeNames: ["Metric Card", "Metric item", "KPI Card", "Stats Card", "Dashboard Card", "Data Card", "Stat Card"],
|
|
43
49
|
cssClass: "ds-metric-card",
|
|
44
50
|
props: {
|
|
45
51
|
value: "string | number (required)",
|
|
46
52
|
label: "string (required)",
|
|
47
|
-
icon: "ReactElement \u2014 optional, renders in
|
|
53
|
+
icon: "ReactElement \u2014 optional, renders in 64x64px circle",
|
|
48
54
|
variant: "'compact' | 'detailed' \u2014 default 'compact'",
|
|
49
55
|
breakdown: "Array<{ label: string; value: string }> \u2014 detailed variant only"
|
|
50
56
|
},
|
|
@@ -53,6 +59,8 @@ var components = [
|
|
|
53
59
|
},
|
|
54
60
|
{
|
|
55
61
|
name: "PageHeader",
|
|
62
|
+
category: "layout",
|
|
63
|
+
description: "Top page header with title, subtitle, and user/notification actions.",
|
|
56
64
|
import: "import { PageHeader } from 'eha-design-system'",
|
|
57
65
|
figmaNodeNames: ["Page Header", "Top Bar", "Header", "App Header", "Dashboard Header", "Page Title"],
|
|
58
66
|
cssClass: "ds-page-header",
|
|
@@ -63,10 +71,12 @@ var components = [
|
|
|
63
71
|
onUserSelect: "(eventKey: string, event) => void \u2014 built-in keys: 'profile', 'settings', 'logout'",
|
|
64
72
|
onNotificationClick: "() => void"
|
|
65
73
|
},
|
|
66
|
-
usage:
|
|
74
|
+
usage: '<PageHeader title="Dashboard" subtitle="Overview" user={{ name: "John", initials: "JD" }} />'
|
|
67
75
|
},
|
|
68
76
|
{
|
|
69
77
|
name: "Input",
|
|
78
|
+
category: "input",
|
|
79
|
+
description: "Standard text input with label, helper text, and validation error support.",
|
|
70
80
|
import: "import { Input } from 'eha-design-system'",
|
|
71
81
|
figmaNodeNames: ["Input", "Text Input", "Text Field", "Form Input", "Search Input", "Text Box"],
|
|
72
82
|
cssClass: "ds-input",
|
|
@@ -84,6 +94,8 @@ var components = [
|
|
|
84
94
|
},
|
|
85
95
|
{
|
|
86
96
|
name: "Modal",
|
|
97
|
+
category: "feedback",
|
|
98
|
+
description: "Modal dialog container for confirmations and focused workflows.",
|
|
87
99
|
import: "import { Modal } from 'eha-design-system'",
|
|
88
100
|
figmaNodeNames: ["Modal", "Dialog", "Popup", "Confirmation Dialog", "Alert Dialog"],
|
|
89
101
|
cssClass: "ds-modal",
|
|
@@ -98,6 +110,8 @@ var components = [
|
|
|
98
110
|
},
|
|
99
111
|
{
|
|
100
112
|
name: "Table",
|
|
113
|
+
category: "display",
|
|
114
|
+
description: "Data table with sortable columns and row-level interaction patterns.",
|
|
101
115
|
import: "import { Table } from 'eha-design-system'",
|
|
102
116
|
figmaNodeNames: ["Table", "Data Table", "Data Grid", "List Table", "Grid"],
|
|
103
117
|
cssClass: "ds-table",
|
|
@@ -116,6 +130,8 @@ var components = [
|
|
|
116
130
|
},
|
|
117
131
|
{
|
|
118
132
|
name: "SelectPicker",
|
|
133
|
+
category: "input",
|
|
134
|
+
description: "Single-select dropdown input for choosing one option from a list.",
|
|
119
135
|
import: "import { SelectPicker } from 'eha-design-system'",
|
|
120
136
|
figmaNodeNames: ["Select", "Select Picker", "Dropdown Select", "Combobox", "Select Field"],
|
|
121
137
|
cssClass: "ds-select-picker",
|
|
@@ -132,6 +148,8 @@ var components = [
|
|
|
132
148
|
},
|
|
133
149
|
{
|
|
134
150
|
name: "Tabs",
|
|
151
|
+
category: "navigation",
|
|
152
|
+
description: "Tabbed navigation container for switching between related views.",
|
|
135
153
|
import: "import { Tabs } from 'eha-design-system'",
|
|
136
154
|
figmaNodeNames: ["Tabs", "Tab Group", "Tab Navigation", "Tab Panel", "Tab Bar"],
|
|
137
155
|
cssClass: "ds-tabs",
|
|
@@ -146,6 +164,8 @@ var components = [
|
|
|
146
164
|
},
|
|
147
165
|
{
|
|
148
166
|
name: "Notification",
|
|
167
|
+
category: "feedback",
|
|
168
|
+
description: "Inline or toast notification feedback for status updates.",
|
|
149
169
|
import: "import { Notification } from 'eha-design-system'",
|
|
150
170
|
figmaNodeNames: ["Notification", "Toast", "Alert", "Banner", "Snackbar"],
|
|
151
171
|
cssClass: "ds-notification",
|
|
@@ -164,9 +184,28 @@ function resolveComponent(query) {
|
|
|
164
184
|
(c) => c.name.toLowerCase() === q || c.figmaNodeNames.some((n) => n.toLowerCase() === q)
|
|
165
185
|
);
|
|
166
186
|
}
|
|
187
|
+
function getAllManifests() {
|
|
188
|
+
return components;
|
|
189
|
+
}
|
|
190
|
+
function getComponentManifest(name) {
|
|
191
|
+
return components.find((c) => c.name.toLowerCase() === name.toLowerCase());
|
|
192
|
+
}
|
|
193
|
+
function getComponentsByCategory(category) {
|
|
194
|
+
return components.filter((c) => c.category === category);
|
|
195
|
+
}
|
|
196
|
+
function searchComponents(query) {
|
|
197
|
+
const q = query.toLowerCase();
|
|
198
|
+
return components.filter(
|
|
199
|
+
(c) => c.name.toLowerCase().includes(q) || c.description.toLowerCase().includes(q) || c.figmaNodeNames.some((n) => n.toLowerCase().includes(q)) || c.notes?.toLowerCase().includes(q) === true
|
|
200
|
+
);
|
|
201
|
+
}
|
|
167
202
|
|
|
168
203
|
export {
|
|
169
204
|
components,
|
|
170
|
-
resolveComponent
|
|
205
|
+
resolveComponent,
|
|
206
|
+
getAllManifests,
|
|
207
|
+
getComponentManifest,
|
|
208
|
+
getComponentsByCategory,
|
|
209
|
+
searchComponents
|
|
171
210
|
};
|
|
172
|
-
//# sourceMappingURL=chunk-
|
|
211
|
+
//# sourceMappingURL=chunk-LMSDRJHS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/manifests/components.ts"],"sourcesContent":["/**\n * Component manifest — sourced from eha-design-system.\n * Run `npm run sync` to regenerate from the latest package version.\n */\n\nexport type ComponentCategory = 'layout' | 'input' | 'display' | 'feedback' | 'navigation' | 'template';\n\nexport interface ComponentManifest {\n name: string;\n category: ComponentCategory;\n description: string;\n import: string;\n figmaNodeNames: string[];\n cssClass: string;\n props: Record<string, string>;\n usage: string;\n notes?: string;\n subComponents?: string[];\n namedExports?: string[];\n}\n\nexport const components: ComponentManifest[] = [\n {\n name: 'Button',\n category: 'input',\n description: 'Brand-aware action trigger with required variant styling.',\n import: \"import { Button } from 'eha-design-system'\",\n figmaNodeNames: ['Button', 'Primary Button', 'Secondary Button', 'Ghost Button', 'Tertiary Button', 'CTA', 'Action Button'],\n cssClass: 'ds-button',\n props: {\n variant: \"'primary' | 'secondary' | 'tertiary' | 'ghost' — REQUIRED\",\n size: \"'xs' | 'sm' | 'md' | 'lg' — default 'md'\",\n isLoading: 'boolean',\n fullWidth: 'boolean',\n disabled: 'boolean',\n onClick: '() => void',\n children: 'ReactNode (required)',\n },\n usage: '<Button variant=\"primary\" size=\"md\" onClick={handleClick}>Save</Button>',\n notes: 'NEVER use RSuite Button directly. Always use EHA Button with variant prop.',\n },\n {\n name: 'Sidenav',\n category: 'navigation',\n description: 'Primary side navigation shell with brand logo and expandable state.',\n import: \"import { Sidenav } from 'eha-design-system'\",\n figmaNodeNames: ['Sidenav', 'Sidebar', 'Side Navigation', 'Navigation Menu', 'Nav Menu', 'Side Menu'],\n cssClass: 'ds-sidenav',\n subComponents: ['Sidenav.Header', 'Sidenav.Body', 'Sidenav.Toggle'],\n props: {\n expanded: 'boolean — default true',\n onToggle: '(expanded: boolean) => void',\n activeKey: 'string',\n onSelect: '(eventKey: string | number, event) => void',\n logo: 'string — expanded state logo path',\n collapsedLogo: 'string — collapsed state icon path',\n logoHeight: 'number — default 60',\n items: 'SidenavItem[]',\n style: 'CSSProperties — pass brand background colour here',\n },\n usage: '<Sidenav\\n expanded={expanded}\\n onToggle={setExpanded}\\n logo=\"/brands/reach/logo.svg\"\\n collapsedLogo=\"/brands/reach/icon.svg\"\\n style={{ backgroundColor: brand.colorPrimitives.primary50 }}\\n items={navItems}\\n/>',\n },\n {\n name: 'MetricCard',\n category: 'display',\n description: 'KPI card for numeric summaries with optional icon and breakdown.',\n import: \"import { MetricCard } from 'eha-design-system'\",\n figmaNodeNames: ['Metric Card', 'Metric item', 'KPI Card', 'Stats Card', 'Dashboard Card', 'Data Card', 'Stat Card'],\n cssClass: 'ds-metric-card',\n props: {\n value: 'string | number (required)',\n label: 'string (required)',\n icon: 'ReactElement — optional, renders in 64x64px circle',\n variant: \"'compact' | 'detailed' — default 'compact'\",\n breakdown: 'Array<{ label: string; value: string }> — detailed variant only',\n },\n usage: '<MetricCard value=\"2,420\" label=\"Total Users\" icon={<AccountCircleOutlinedIcon />} />',\n notes: 'Icon circle: primary10 bg, primary50 icon color. Both brand-aware.',\n },\n {\n name: 'PageHeader',\n category: 'layout',\n description: 'Top page header with title, subtitle, and user/notification actions.',\n import: \"import { PageHeader } from 'eha-design-system'\",\n figmaNodeNames: ['Page Header', 'Top Bar', 'Header', 'App Header', 'Dashboard Header', 'Page Title'],\n cssClass: 'ds-page-header',\n props: {\n title: 'string (required)',\n subtitle: 'string',\n user: '{ name: string; avatar?: string; initials?: string }',\n onUserSelect: \"(eventKey: string, event) => void — built-in keys: 'profile', 'settings', 'logout'\",\n onNotificationClick: '() => void',\n },\n usage: '<PageHeader title=\"Dashboard\" subtitle=\"Overview\" user={{ name: \\\"John\\\", initials: \\\"JD\\\" }} />',\n },\n {\n name: 'Input',\n category: 'input',\n description: 'Standard text input with label, helper text, and validation error support.',\n import: \"import { Input } from 'eha-design-system'\",\n figmaNodeNames: ['Input', 'Text Input', 'Text Field', 'Form Input', 'Search Input', 'Text Box'],\n cssClass: 'ds-input',\n props: {\n size: \"'xs' | 'sm' | 'md' | 'lg' — default 'md'\",\n label: 'string',\n helperText: 'string',\n error: 'string — error message',\n fullWidth: 'boolean',\n placeholder: 'string',\n value: 'string',\n onChange: '(value, event) => void',\n },\n usage: '<Input label=\"Email\" placeholder=\"Enter email\" error={errors.email} fullWidth />',\n },\n {\n name: 'Modal',\n category: 'feedback',\n description: 'Modal dialog container for confirmations and focused workflows.',\n import: \"import { Modal } from 'eha-design-system'\",\n figmaNodeNames: ['Modal', 'Dialog', 'Popup', 'Confirmation Dialog', 'Alert Dialog'],\n cssClass: 'ds-modal',\n subComponents: ['Modal.Header', 'Modal.Body', 'Modal.Footer', 'Modal.Title'],\n props: {\n open: 'boolean (required)',\n onClose: '() => void',\n size: \"'xs' | 'sm' | 'md' | 'lg' | 'full' — default 'md'\",\n backdrop: \"boolean | 'static'\",\n },\n usage: '<Modal open={open} onClose={() => setOpen(false)}>\\n <Modal.Header><Modal.Title>Title</Modal.Title></Modal.Header>\\n <Modal.Body>Content</Modal.Body>\\n <Modal.Footer>\\n <Button variant=\"primary\" onClick={() => setOpen(false)}>Confirm</Button>\\n </Modal.Footer>\\n</Modal>',\n },\n {\n name: 'Table',\n category: 'display',\n description: 'Data table with sortable columns and row-level interaction patterns.',\n import: \"import { Table } from 'eha-design-system'\",\n figmaNodeNames: ['Table', 'Data Table', 'Data Grid', 'List Table', 'Grid'],\n cssClass: 'ds-table',\n subComponents: ['Table.Column', 'Table.HeaderCell', 'Table.Cell', 'Table.Pagination'],\n props: {\n data: 'object[] (required)',\n autoHeight: 'boolean — preferred',\n loading: 'boolean',\n rowKey: 'string',\n onRowClick: '(rowData) => void',\n sortColumn: 'string',\n sortType: \"'asc' | 'desc'\",\n onSortColumn: '(sortColumn, sortType) => void',\n },\n usage: '<Table autoHeight data={data}>\\n <Table.Column flexGrow={1}>\\n <Table.HeaderCell>Name</Table.HeaderCell>\\n <Table.Cell dataKey=\"name\" />\\n </Table.Column>\\n</Table>',\n },\n {\n name: 'SelectPicker',\n category: 'input',\n description: 'Single-select dropdown input for choosing one option from a list.',\n import: \"import { SelectPicker } from 'eha-design-system'\",\n figmaNodeNames: ['Select', 'Select Picker', 'Dropdown Select', 'Combobox', 'Select Field'],\n cssClass: 'ds-select-picker',\n props: {\n data: 'Array<{ label: string; value: any }> (required)',\n label: 'string',\n error: 'string',\n value: 'any',\n onChange: '(value) => void',\n block: 'boolean — full width',\n placeholder: 'string',\n },\n usage: '<SelectPicker data={options} label=\"Status\" placeholder=\"Select\" block />',\n },\n {\n name: 'Tabs',\n category: 'navigation',\n description: 'Tabbed navigation container for switching between related views.',\n import: \"import { Tabs } from 'eha-design-system'\",\n figmaNodeNames: ['Tabs', 'Tab Group', 'Tab Navigation', 'Tab Panel', 'Tab Bar'],\n cssClass: 'ds-tabs',\n subComponents: ['Tabs.Tab'],\n props: {\n appearance: \"'tabs' | 'subtle' | 'pills' — default 'tabs'\",\n activeKey: 'any',\n defaultActiveKey: 'any',\n onSelect: '(eventKey) => void',\n },\n usage: '<Tabs defaultActiveKey=\"tab1\">\\n <Tabs.Tab eventKey=\"tab1\" title=\"Tab 1\">Content</Tabs.Tab>\\n</Tabs>',\n },\n {\n name: 'Notification',\n category: 'feedback',\n description: 'Inline or toast notification feedback for status updates.',\n import: \"import { Notification } from 'eha-design-system'\",\n figmaNodeNames: ['Notification', 'Toast', 'Alert', 'Banner', 'Snackbar'],\n cssClass: 'ds-notification',\n props: {\n type: \"'info' | 'success' | 'warning' | 'error'\",\n header: 'ReactNode',\n closable: 'boolean',\n duration: 'number — ms, default 4500',\n },\n usage: '<Notification type=\"success\" header=\"Saved!\" closable>Your changes were saved.</Notification>',\n },\n];\n\n/** Resolve a component by name or Figma node name */\nexport function resolveComponent(query: string): ComponentManifest | undefined {\n const q = query.toLowerCase();\n return components.find(\n (c) =>\n c.name.toLowerCase() === q ||\n c.figmaNodeNames.some((n) => n.toLowerCase() === q),\n );\n}\n\nexport function getAllManifests(): ComponentManifest[] {\n return components;\n}\n\nexport function getComponentManifest(name: string): ComponentManifest | undefined {\n return components.find((c) => c.name.toLowerCase() === name.toLowerCase());\n}\n\nexport function getComponentsByCategory(category: ComponentCategory): ComponentManifest[] {\n return components.filter((c) => c.category === category);\n}\n\nexport function searchComponents(query: string): ComponentManifest[] {\n const q = query.toLowerCase();\n return components.filter(\n (c) =>\n c.name.toLowerCase().includes(q) ||\n c.description.toLowerCase().includes(q) ||\n c.figmaNodeNames.some((n) => n.toLowerCase().includes(q)) ||\n c.notes?.toLowerCase().includes(q) === true,\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
// src/recipes/index.ts
|
|
2
2
|
var recipes = [
|
|
3
3
|
{
|
|
4
|
+
id: "app-shell",
|
|
4
5
|
name: "app-shell",
|
|
6
|
+
category: "dashboard",
|
|
5
7
|
description: "Full app shell with ThemeProvider, Sidenav, and PageHeader",
|
|
8
|
+
components: ["ThemeProvider", "Sidenav", "PageHeader"],
|
|
6
9
|
tags: ["layout", "sidenav", "header", "brand"],
|
|
7
10
|
code: `import { ThemeProvider, Sidenav, PageHeader, brands } from 'eha-design-system';
|
|
8
11
|
import { useState } from 'react';
|
|
@@ -13,7 +16,7 @@ export function AppShell({ children }: { children: React.ReactNode }) {
|
|
|
13
16
|
const [expanded, setExpanded] = useState(true);
|
|
14
17
|
|
|
15
18
|
return (
|
|
16
|
-
<ThemeProvider
|
|
19
|
+
<ThemeProvider brandId="reach">
|
|
17
20
|
<div style={{ display: 'flex', height: '100vh' }}>
|
|
18
21
|
<Sidenav
|
|
19
22
|
expanded={expanded}
|
|
@@ -35,8 +38,11 @@ export function AppShell({ children }: { children: React.ReactNode }) {
|
|
|
35
38
|
}`
|
|
36
39
|
},
|
|
37
40
|
{
|
|
41
|
+
id: "metric-grid",
|
|
38
42
|
name: "metric-grid",
|
|
43
|
+
category: "dashboard",
|
|
39
44
|
description: "Responsive grid of MetricCard components",
|
|
45
|
+
components: ["MetricCard"],
|
|
40
46
|
tags: ["dashboard", "metrics", "grid"],
|
|
41
47
|
code: `import { MetricCard } from 'eha-design-system';
|
|
42
48
|
import AccountCircleOutlinedIcon from '@mui/icons-material/AccountCircleOutlined';
|
|
@@ -57,8 +63,11 @@ export function MetricGrid() {
|
|
|
57
63
|
}`
|
|
58
64
|
},
|
|
59
65
|
{
|
|
66
|
+
id: "data-table-with-pagination",
|
|
60
67
|
name: "data-table-with-pagination",
|
|
68
|
+
category: "list",
|
|
61
69
|
description: "Table with sorting and pagination",
|
|
70
|
+
components: ["Table", "Button"],
|
|
62
71
|
tags: ["table", "data", "pagination"],
|
|
63
72
|
code: `import { Table, Button } from 'eha-design-system';
|
|
64
73
|
import { useState } from 'react';
|
|
@@ -92,11 +101,13 @@ export function DataTable({ data }: { data: Record<string, unknown>[] }) {
|
|
|
92
101
|
}`
|
|
93
102
|
},
|
|
94
103
|
{
|
|
104
|
+
id: "confirm-modal",
|
|
95
105
|
name: "confirm-modal",
|
|
106
|
+
category: "form",
|
|
96
107
|
description: "Confirmation modal with primary and ghost actions",
|
|
108
|
+
components: ["Modal", "Button"],
|
|
97
109
|
tags: ["modal", "dialog", "confirm"],
|
|
98
110
|
code: `import { Modal, Button } from 'eha-design-system';
|
|
99
|
-
import { useState } from 'react';
|
|
100
111
|
|
|
101
112
|
export function ConfirmModal({
|
|
102
113
|
open,
|
|
@@ -126,8 +137,11 @@ export function ConfirmModal({
|
|
|
126
137
|
}`
|
|
127
138
|
},
|
|
128
139
|
{
|
|
140
|
+
id: "filter-drawer",
|
|
129
141
|
name: "filter-drawer",
|
|
142
|
+
category: "form",
|
|
130
143
|
description: "Filter drawer with clear and apply actions",
|
|
144
|
+
components: ["Drawer", "Button", "SelectPicker"],
|
|
131
145
|
tags: ["drawer", "filter", "form"],
|
|
132
146
|
code: `import { Drawer, Button, SelectPicker } from 'eha-design-system';
|
|
133
147
|
|
|
@@ -162,12 +176,17 @@ export function FilterDrawer({
|
|
|
162
176
|
}`
|
|
163
177
|
}
|
|
164
178
|
];
|
|
165
|
-
function getRecipe(
|
|
166
|
-
|
|
179
|
+
function getRecipe(query) {
|
|
180
|
+
const q = query.toLowerCase();
|
|
181
|
+
return recipes.find((r) => r.id === q || r.name.toLowerCase() === q || r.tags.includes(q));
|
|
182
|
+
}
|
|
183
|
+
function getRecipesByCategory(category) {
|
|
184
|
+
return recipes.filter((r) => r.category === category);
|
|
167
185
|
}
|
|
168
186
|
|
|
169
187
|
export {
|
|
170
188
|
recipes,
|
|
171
|
-
getRecipe
|
|
189
|
+
getRecipe,
|
|
190
|
+
getRecipesByCategory
|
|
172
191
|
};
|
|
173
|
-
//# sourceMappingURL=chunk-
|
|
192
|
+
//# sourceMappingURL=chunk-QID5XXWN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/recipes/index.ts"],"sourcesContent":["/**\n * Code recipes for common EHA Design System UI patterns.\n */\n\nexport type RecipeCategory = 'dashboard' | 'form' | 'list' | 'detail' | 'auth' | 'settings';\n\nexport interface Recipe {\n id: string;\n name: string;\n category: RecipeCategory;\n description: string;\n components: string[];\n tags: string[];\n code: string;\n}\n\nexport const recipes: Recipe[] = [\n {\n id: 'app-shell',\n name: 'app-shell',\n category: 'dashboard',\n description: 'Full app shell with ThemeProvider, Sidenav, and PageHeader',\n components: ['ThemeProvider', 'Sidenav', 'PageHeader'],\n tags: ['layout', 'sidenav', 'header', 'brand'],\n code: `import { ThemeProvider, Sidenav, PageHeader, brands } from 'eha-design-system';\nimport { useState } from 'react';\n\nconst brand = brands['reach'];\n\nexport function AppShell({ children }: { children: React.ReactNode }) {\n const [expanded, setExpanded] = useState(true);\n\n return (\n <ThemeProvider brandId=\"reach\">\n <div style={{ display: 'flex', height: '100vh' }}>\n <Sidenav\n expanded={expanded}\n onToggle={setExpanded}\n logo=\"/brands/reach/logo.svg\"\n collapsedLogo=\"/brands/reach/icon.svg\"\n style={{ backgroundColor: brand.colorPrimitives.primary50 }}\n items={[]}\n />\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column' }}>\n <PageHeader title=\"Dashboard\" />\n <main style={{ flex: 1, padding: 24, overflow: 'auto' }}>\n {children}\n </main>\n </div>\n </div>\n </ThemeProvider>\n );\n}`,\n },\n {\n id: 'metric-grid',\n name: 'metric-grid',\n category: 'dashboard',\n description: 'Responsive grid of MetricCard components',\n components: ['MetricCard'],\n tags: ['dashboard', 'metrics', 'grid'],\n code: `import { MetricCard } from 'eha-design-system';\nimport AccountCircleOutlinedIcon from '@mui/icons-material/AccountCircleOutlined';\nimport TrendingUpOutlinedIcon from '@mui/icons-material/TrendingUpOutlined';\n\nexport function MetricGrid() {\n return (\n <div style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fit, minmax(280px, 1fr))',\n gap: 20,\n }}>\n <MetricCard value=\"2,420\" label=\"Total Users\" icon={<AccountCircleOutlinedIcon />} />\n <MetricCard value=\"12.5%\" label=\"Growth Rate\" icon={<TrendingUpOutlinedIcon />} />\n <MetricCard value=\"98.2%\" label=\"Uptime\" />\n </div>\n );\n}`,\n },\n {\n id: 'data-table-with-pagination',\n name: 'data-table-with-pagination',\n category: 'list',\n description: 'Table with sorting and pagination',\n components: ['Table', 'Button'],\n tags: ['table', 'data', 'pagination'],\n code: `import { Table, Button } from 'eha-design-system';\nimport { useState } from 'react';\n\nexport function DataTable({ data }: { data: Record<string, unknown>[] }) {\n const [sortColumn, setSortColumn] = useState('');\n const [sortType, setSortType] = useState<'asc' | 'desc'>('asc');\n\n return (\n <Table\n autoHeight\n data={data}\n sortColumn={sortColumn}\n sortType={sortType}\n onSortColumn={(col, type) => { setSortColumn(col); setSortType(type); }}\n >\n <Table.Column flexGrow={1} sortable>\n <Table.HeaderCell>Name</Table.HeaderCell>\n <Table.Cell dataKey=\"name\" />\n </Table.Column>\n <Table.Column width={120} align=\"center\">\n <Table.HeaderCell>Actions</Table.HeaderCell>\n <Table.Cell>\n {(rowData) => (\n <Button variant=\"ghost\" size=\"sm\">Edit</Button>\n )}\n </Table.Cell>\n </Table.Column>\n </Table>\n );\n}`,\n },\n {\n id: 'confirm-modal',\n name: 'confirm-modal',\n category: 'form',\n description: 'Confirmation modal with primary and ghost actions',\n components: ['Modal', 'Button'],\n tags: ['modal', 'dialog', 'confirm'],\n code: `import { Modal, Button } from 'eha-design-system';\n\nexport function ConfirmModal({\n open,\n onClose,\n onConfirm,\n title,\n message,\n}: {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void;\n title: string;\n message: string;\n}) {\n return (\n <Modal open={open} onClose={onClose} size=\"xs\" backdrop=\"static\">\n <Modal.Header>\n <Modal.Title>{title}</Modal.Title>\n </Modal.Header>\n <Modal.Body>{message}</Modal.Body>\n <Modal.Footer>\n <Button variant=\"primary\" onClick={onConfirm}>Confirm</Button>\n <Button variant=\"ghost\" onClick={onClose}>Cancel</Button>\n </Modal.Footer>\n </Modal>\n );\n}`,\n },\n {\n id: 'filter-drawer',\n name: 'filter-drawer',\n category: 'form',\n description: 'Filter drawer with clear and apply actions',\n components: ['Drawer', 'Button', 'SelectPicker'],\n tags: ['drawer', 'filter', 'form'],\n code: `import { Drawer, Button, SelectPicker } from 'eha-design-system';\n\nexport function FilterDrawer({\n open,\n onClose,\n onApply,\n}: {\n open: boolean;\n onClose: () => void;\n onApply: () => void;\n}) {\n return (\n <Drawer open={open} onClose={onClose} size=\"sm\">\n <Drawer.Header>\n <Drawer.Title>Filter</Drawer.Title>\n <Drawer.Actions>\n <Button variant=\"ghost\" onClick={onClose}>Clear</Button>\n <Button variant=\"primary\" onClick={onApply}>Apply</Button>\n </Drawer.Actions>\n </Drawer.Header>\n <Drawer.Body>\n <SelectPicker\n data={[{ label: 'Active', value: 'active' }, { label: 'Inactive', value: 'inactive' }]}\n label=\"Status\"\n placeholder=\"Select status\"\n block\n />\n </Drawer.Body>\n </Drawer>\n );\n}`,\n },\n];\n\nexport function getRecipe(query: string): Recipe | undefined {\n const q = query.toLowerCase();\n return recipes.find((r) => r.id === q || r.name.toLowerCase() === q || r.tags.includes(q));\n}\n\nexport function getRecipesByCategory(category: RecipeCategory): Recipe[] {\n return recipes.filter((r) => r.category === category);\n}\n"],"mappings":";AAgBO,IAAM,UAAoB;AAAA,EAC/B;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,YAAY,CAAC,iBAAiB,WAAW,YAAY;AAAA,IACrD,MAAM,CAAC,UAAU,WAAW,UAAU,OAAO;AAAA,IAC7C,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6BR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,YAAY,CAAC,YAAY;AAAA,IACzB,MAAM,CAAC,aAAa,WAAW,MAAM;AAAA,IACrC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,YAAY,CAAC,SAAS,QAAQ;AAAA,IAC9B,MAAM,CAAC,SAAS,QAAQ,YAAY;AAAA,IACpC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,YAAY,CAAC,SAAS,QAAQ;AAAA,IAC9B,MAAM,CAAC,SAAS,UAAU,SAAS;AAAA,IACnC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA4BR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,aAAa;AAAA,IACb,YAAY,CAAC,UAAU,UAAU,cAAc;AAAA,IAC/C,MAAM,CAAC,UAAU,UAAU,MAAM;AAAA,IACjC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA+BR;AACF;AAEO,SAAS,UAAU,OAAmC;AAC3D,QAAM,IAAI,MAAM,YAAY;AAC5B,SAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,KAAK,YAAY,MAAM,KAAK,EAAE,KAAK,SAAS,CAAC,CAAC;AAC3F;AAEO,SAAS,qBAAqB,UAAoC;AACvE,SAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AACtD;","names":[]}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// src/tokens/index.ts
|
|
2
|
+
var sharedTokens = {
|
|
3
|
+
spacing: { xs: "4px", sm: "8px", md: "12px", lg: "16px", xl: "20px", "2xl": "24px", "3xl": "32px", "4xl": "40px", "5xl": "48px", "6xl": "64px" },
|
|
4
|
+
typography: {
|
|
5
|
+
fontFamily: { body: '"Manrope",-apple-system,sans-serif', heading: '"Manrope",-apple-system,sans-serif', mono: '"SF Mono",Monaco,monospace' },
|
|
6
|
+
fontSize: { xxs: "10px", xs: "12px", sm: "14px", md: "16px", lg: "18px", xl: "20px", "2xl": "24px", "3xl": "32px", "4xl": "36px", "5xl": "48px" },
|
|
7
|
+
fontWeight: { regular: 400, medium: 500, semibold: 600, bold: 700 },
|
|
8
|
+
lineHeight: { tight: 1.25, normal: 1.5, relaxed: 1.75, loose: 2 }
|
|
9
|
+
},
|
|
10
|
+
borderRadius: { none: "0", xs: "2px", sm: "4px", md: "6px", lg: "8px", xl: "12px", "2xl": "16px", full: "9999px" },
|
|
11
|
+
shadows: { none: "none", sm: "0 1px 2px 0 rgba(0,0,0,0.05)", md: "0 4px 6px -1px rgba(0,0,0,0.1)", lg: "0 10px 15px -3px rgba(0,0,0,0.1)", xl: "0 20px 25px -5px rgba(0,0,0,0.1)", "2xl": "0 25px 50px -12px rgba(0,0,0,0.25)" },
|
|
12
|
+
zIndex: { base: 0, dropdown: 1e3, sticky: 1020, fixed: 1030, modalBackdrop: 1040, modal: 1050, popover: 1060, tooltip: 1070, notification: 1080 }
|
|
13
|
+
};
|
|
14
|
+
var sharedColors = {
|
|
15
|
+
neutral: "#2B3136",
|
|
16
|
+
white: "#FFFFFF",
|
|
17
|
+
black: "#000000",
|
|
18
|
+
error: "#BA1B1B",
|
|
19
|
+
success: "#54BF85",
|
|
20
|
+
warning: "#C0850C",
|
|
21
|
+
neutralScale: { neutral10: "#F4F5F6", neutral20: "#D4D9DD", neutral30: "#B4BCC3", neutral40: "#6B7A86", neutral50: "#3D464D", neutral60: "#2B3136" },
|
|
22
|
+
errorScale: { error10: "#FDEFEF", error20: "#F6BEBE", error30: "#EF8E8E", error40: "#E75D5D", error50: "#E02C2C", error60: "#BA1B1B" },
|
|
23
|
+
successScale: { success10: "#EAFFE8", success20: "#C1FFD5", success30: "#7CFCB0", success40: "#71DB9F", success50: "#54BF85", success60: "#2A9D64" },
|
|
24
|
+
warningScale: { warning10: "#FFEEDA", warning20: "#FFDEAE", warning30: "#FDBA46", warning40: "#DEA02D", warning50: "#C0850C", warning60: "#9F6D00" }
|
|
25
|
+
};
|
|
26
|
+
var brandConfigs = {
|
|
27
|
+
eha: {
|
|
28
|
+
id: "eha",
|
|
29
|
+
description: "Default EHA brand \u2014 health programmes and general applications",
|
|
30
|
+
cssImport: "import 'eha-design-system/styles/brands/eha.css'",
|
|
31
|
+
themeProviderUsage: '<ThemeProvider brandId="eha">{children}</ThemeProvider>',
|
|
32
|
+
primary: "#0090FC",
|
|
33
|
+
secondary: "#EBCB00",
|
|
34
|
+
tertiary: "#003963",
|
|
35
|
+
primaryScale: { primary10: "#F3FBFF", primary20: "#D4EDFF", primary30: "#53B5FF", primary40: "#0090FC", primary50: "#0078D2", primary60: "#0060A8" },
|
|
36
|
+
secondaryScale: { secondary10: "#FDFAE5", secondary20: "#FBF5CC", secondary30: "#F7EA99", secondary40: "#F3E066", secondary50: "#EBCB00", secondary60: "#BCA200" },
|
|
37
|
+
tertiaryScale: { tertiary10: "#D1E4FF", tertiary20: "#9ECAFF", tertiary30: "#6DAFF6", tertiary40: "#5195DA", tertiary50: "#327ABE", tertiary60: "#0061A3" },
|
|
38
|
+
semanticOverrides: { link: "#0078D2", borderFocus: "#0090FC", interactivePrimary: "#0090FC", interactivePrimaryHover: "#0078D2", interactivePrimaryActive: "#0060A8", interactiveTertiary: "#5195DA", info: "#0090FC", infoBg: "#F3FBFF" },
|
|
39
|
+
keyDifferences: ["Default brand \u2014 no overrides required"]
|
|
40
|
+
},
|
|
41
|
+
etrac: {
|
|
42
|
+
id: "etrac",
|
|
43
|
+
description: "eTrac brand \u2014 vaccination tracking system. Same palette as eha.",
|
|
44
|
+
cssImport: "import 'eha-design-system/styles/brands/etrac.css'",
|
|
45
|
+
themeProviderUsage: '<ThemeProvider brandId="etrac">{children}</ThemeProvider>',
|
|
46
|
+
primary: "#0090FC",
|
|
47
|
+
secondary: "#EBCB00",
|
|
48
|
+
tertiary: "#003963",
|
|
49
|
+
primaryScale: { primary10: "#F3FBFF", primary20: "#D4EDFF", primary30: "#53B5FF", primary40: "#0090FC", primary50: "#0078D2", primary60: "#0060A8" },
|
|
50
|
+
secondaryScale: { secondary10: "#FDFAE5", secondary20: "#FBF5CC", secondary30: "#F7EA99", secondary40: "#F3E066", secondary50: "#EBCB00", secondary60: "#BCA200" },
|
|
51
|
+
tertiaryScale: { tertiary10: "#D1E4FF", tertiary20: "#9ECAFF", tertiary30: "#6DAFF6", tertiary40: "#5195DA", tertiary50: "#327ABE", tertiary60: "#0061A3" },
|
|
52
|
+
semanticOverrides: { link: "#0078D2", borderFocus: "#0090FC", interactivePrimary: "#0090FC", interactivePrimaryHover: "#0078D2", interactivePrimaryActive: "#0060A8", interactiveTertiary: "#5195DA", info: "#0090FC", infoBg: "#F3FBFF" },
|
|
53
|
+
keyDifferences: ["Same colour palette as eha \u2014 differs in brand assets/logo only"]
|
|
54
|
+
},
|
|
55
|
+
lomis: {
|
|
56
|
+
id: "lomis",
|
|
57
|
+
description: "LoMIS brand \u2014 Logistics Management Information System. Different tertiary scale (navy blues).",
|
|
58
|
+
cssImport: "import 'eha-design-system/styles/brands/lomis.css'",
|
|
59
|
+
themeProviderUsage: '<ThemeProvider brandId="lomis">{children}</ThemeProvider>',
|
|
60
|
+
primary: "#0090FC",
|
|
61
|
+
secondary: "#EBCB00",
|
|
62
|
+
tertiary: "#1E3A5F",
|
|
63
|
+
primaryScale: { primary10: "#F3FBFF", primary20: "#D4EDFF", primary30: "#53B5FF", primary40: "#0090FC", primary50: "#0078D2", primary60: "#0060A8" },
|
|
64
|
+
secondaryScale: { secondary10: "#FDFAE5", secondary20: "#FBF5CC", secondary30: "#F7EA99", secondary40: "#F3E066", secondary50: "#EBCB00", secondary60: "#BCA200" },
|
|
65
|
+
tertiaryScale: { tertiary10: "#EFF6FF", tertiary20: "#DBEAFE", tertiary30: "#93C5FD", tertiary40: "#3B82F6", tertiary50: "#2563EB", tertiary60: "#1E3A5F" },
|
|
66
|
+
semanticOverrides: { link: "#0078D2", borderFocus: "#0090FC", interactivePrimary: "#0090FC", interactivePrimaryHover: "#0078D2", interactivePrimaryActive: "#0060A8", interactiveTertiary: "#3B82F6", info: "#0090FC", infoBg: "#F3FBFF" },
|
|
67
|
+
keyDifferences: [
|
|
68
|
+
"tertiary: #1E3A5F (deep navy) vs eha #003963",
|
|
69
|
+
"tertiary scale uses blue/indigo (#EFF6FF \u2192 #1E3A5F)",
|
|
70
|
+
"interactive.tertiary: #3B82F6 (brighter blue)"
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
reach: {
|
|
74
|
+
id: "reach",
|
|
75
|
+
description: "Reach Data Portal \u2014 earthy terracotta primary, golden secondary. Significantly different visual identity from other brands.",
|
|
76
|
+
cssImport: "import 'eha-design-system/styles/brands/reach.css'",
|
|
77
|
+
themeProviderUsage: '<ThemeProvider brandId="reach">{children}</ThemeProvider>',
|
|
78
|
+
primary: "#522E1C",
|
|
79
|
+
secondary: "#E3C934",
|
|
80
|
+
tertiary: "#003963",
|
|
81
|
+
primaryScale: { primary10: "#E4C2B1", primary20: "#C7A493", primary30: "#AA8775", primary40: "#6F4C3A", primary50: "#422516", primary60: "#311C11" },
|
|
82
|
+
secondaryScale: { secondary10: "#FCF9E9", secondary20: "#F8F1C9", secondary30: "#F0E293", secondary40: "#E9D562", secondary50: "#E3C934", secondary60: "#AA9417" },
|
|
83
|
+
tertiaryScale: { tertiary10: "#D1E4FF", tertiary20: "#9ECAFF", tertiary30: "#6DAFF6", tertiary40: "#5195DA", tertiary50: "#327ABE", tertiary60: "#0061A3" },
|
|
84
|
+
semanticOverrides: { link: "#422516", borderFocus: "#6F4C3A", interactivePrimary: "#6F4C3A", interactivePrimaryHover: "#422516", interactivePrimaryActive: "#311C11", interactiveTertiary: "#5195DA", info: "#6F4C3A", infoBg: "#E4C2B1" },
|
|
85
|
+
keyDifferences: [
|
|
86
|
+
"primary: #522E1C (terracotta brown) \u2014 completely different from other brands",
|
|
87
|
+
"primary scale is earthy browns, NOT blues",
|
|
88
|
+
"secondary: #E3C934 (golden yellow)",
|
|
89
|
+
"links use brown (#422516), not blue \u2014 affects all anchor/link colours",
|
|
90
|
+
"focus ring uses #6F4C3A (dark brown)",
|
|
91
|
+
"info/infoBg uses brown tones instead of blue",
|
|
92
|
+
"Button variant='primary' renders brown, not blue"
|
|
93
|
+
]
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
var tokens = {
|
|
97
|
+
...sharedTokens,
|
|
98
|
+
colors: {
|
|
99
|
+
...brandConfigs.eha.primaryScale,
|
|
100
|
+
...brandConfigs.eha.secondaryScale,
|
|
101
|
+
...brandConfigs.eha.tertiaryScale,
|
|
102
|
+
...sharedColors.neutralScale,
|
|
103
|
+
...sharedColors.errorScale,
|
|
104
|
+
...sharedColors.successScale,
|
|
105
|
+
...sharedColors.warningScale,
|
|
106
|
+
primary: brandConfigs.eha.primary,
|
|
107
|
+
secondary: brandConfigs.eha.secondary,
|
|
108
|
+
tertiary: brandConfigs.eha.tertiary,
|
|
109
|
+
neutral: sharedColors.neutral,
|
|
110
|
+
white: sharedColors.white,
|
|
111
|
+
black: sharedColors.black,
|
|
112
|
+
error: sharedColors.error,
|
|
113
|
+
success: sharedColors.success,
|
|
114
|
+
warning: sharedColors.warning
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export {
|
|
119
|
+
sharedTokens,
|
|
120
|
+
sharedColors,
|
|
121
|
+
brandConfigs,
|
|
122
|
+
tokens
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=chunk-QYLQDNOW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tokens/index.ts"],"sourcesContent":["// src/tokens/index.ts\n// EHA Design System design tokens — derived from eha-design-system@0.2.2\n// Includes multi-brand theming: eha, etrac, lomis, reach\n\nexport type BrandId = \"eha\" | \"etrac\" | \"lomis\" | \"reach\";\n\nexport const sharedTokens = {\n spacing: { xs: \"4px\", sm: \"8px\", md: \"12px\", lg: \"16px\", xl: \"20px\", \"2xl\": \"24px\", \"3xl\": \"32px\", \"4xl\": \"40px\", \"5xl\": \"48px\", \"6xl\": \"64px\" },\n typography: {\n fontFamily: { body: '\"Manrope\",-apple-system,sans-serif', heading: '\"Manrope\",-apple-system,sans-serif', mono: '\"SF Mono\",Monaco,monospace' },\n fontSize: { xxs: \"10px\", xs: \"12px\", sm: \"14px\", md: \"16px\", lg: \"18px\", xl: \"20px\", \"2xl\": \"24px\", \"3xl\": \"32px\", \"4xl\": \"36px\", \"5xl\": \"48px\" },\n fontWeight: { regular: 400, medium: 500, semibold: 600, bold: 700 },\n lineHeight: { tight: 1.25, normal: 1.5, relaxed: 1.75, loose: 2 },\n },\n borderRadius: { none: \"0\", xs: \"2px\", sm: \"4px\", md: \"6px\", lg: \"8px\", xl: \"12px\", \"2xl\": \"16px\", full: \"9999px\" },\n shadows: { none: \"none\", sm: \"0 1px 2px 0 rgba(0,0,0,0.05)\", md: \"0 4px 6px -1px rgba(0,0,0,0.1)\", lg: \"0 10px 15px -3px rgba(0,0,0,0.1)\", xl: \"0 20px 25px -5px rgba(0,0,0,0.1)\", \"2xl\": \"0 25px 50px -12px rgba(0,0,0,0.25)\" },\n zIndex: { base: 0, dropdown: 1000, sticky: 1020, fixed: 1030, modalBackdrop: 1040, modal: 1050, popover: 1060, tooltip: 1070, notification: 1080 },\n};\n\nexport const sharedColors = {\n neutral: \"#2B3136\", white: \"#FFFFFF\", black: \"#000000\",\n error: \"#BA1B1B\", success: \"#54BF85\", warning: \"#C0850C\",\n neutralScale: { neutral10: \"#F4F5F6\", neutral20: \"#D4D9DD\", neutral30: \"#B4BCC3\", neutral40: \"#6B7A86\", neutral50: \"#3D464D\", neutral60: \"#2B3136\" },\n errorScale: { error10: \"#FDEFEF\", error20: \"#F6BEBE\", error30: \"#EF8E8E\", error40: \"#E75D5D\", error50: \"#E02C2C\", error60: \"#BA1B1B\" },\n successScale: { success10: \"#EAFFE8\", success20: \"#C1FFD5\", success30: \"#7CFCB0\", success40: \"#71DB9F\", success50: \"#54BF85\", success60: \"#2A9D64\" },\n warningScale: { warning10: \"#FFEEDA\", warning20: \"#FFDEAE\", warning30: \"#FDBA46\", warning40: \"#DEA02D\", warning50: \"#C0850C\", warning60: \"#9F6D00\" },\n};\n\nexport interface BrandConfig {\n id: BrandId;\n description: string;\n cssImport: string;\n themeProviderUsage: string;\n primary: string;\n secondary: string;\n tertiary: string;\n primaryScale: Record<string, string>;\n secondaryScale: Record<string, string>;\n tertiaryScale: Record<string, string>;\n semanticOverrides: {\n link: string;\n borderFocus: string;\n interactivePrimary: string;\n interactivePrimaryHover: string;\n interactivePrimaryActive: string;\n interactiveTertiary: string;\n info: string;\n infoBg: string;\n };\n keyDifferences: string[];\n}\n\nexport const brandConfigs: Record<BrandId, BrandConfig> = {\n eha: {\n id: \"eha\",\n description: \"Default EHA brand — health programmes and general applications\",\n cssImport: \"import 'eha-design-system/styles/brands/eha.css'\",\n themeProviderUsage: \"<ThemeProvider brandId=\\\"eha\\\">{children}</ThemeProvider>\",\n primary: \"#0090FC\", secondary: \"#EBCB00\", tertiary: \"#003963\",\n primaryScale: { primary10: \"#F3FBFF\", primary20: \"#D4EDFF\", primary30: \"#53B5FF\", primary40: \"#0090FC\", primary50: \"#0078D2\", primary60: \"#0060A8\" },\n secondaryScale: { secondary10: \"#FDFAE5\", secondary20: \"#FBF5CC\", secondary30: \"#F7EA99\", secondary40: \"#F3E066\", secondary50: \"#EBCB00\", secondary60: \"#BCA200\" },\n tertiaryScale: { tertiary10: \"#D1E4FF\", tertiary20: \"#9ECAFF\", tertiary30: \"#6DAFF6\", tertiary40: \"#5195DA\", tertiary50: \"#327ABE\", tertiary60: \"#0061A3\" },\n semanticOverrides: { link: \"#0078D2\", borderFocus: \"#0090FC\", interactivePrimary: \"#0090FC\", interactivePrimaryHover: \"#0078D2\", interactivePrimaryActive: \"#0060A8\", interactiveTertiary: \"#5195DA\", info: \"#0090FC\", infoBg: \"#F3FBFF\" },\n keyDifferences: [\"Default brand — no overrides required\"],\n },\n\n etrac: {\n id: \"etrac\",\n description: \"eTrac brand — vaccination tracking system. Same palette as eha.\",\n cssImport: \"import 'eha-design-system/styles/brands/etrac.css'\",\n themeProviderUsage: \"<ThemeProvider brandId=\\\"etrac\\\">{children}</ThemeProvider>\",\n primary: \"#0090FC\", secondary: \"#EBCB00\", tertiary: \"#003963\",\n primaryScale: { primary10: \"#F3FBFF\", primary20: \"#D4EDFF\", primary30: \"#53B5FF\", primary40: \"#0090FC\", primary50: \"#0078D2\", primary60: \"#0060A8\" },\n secondaryScale: { secondary10: \"#FDFAE5\", secondary20: \"#FBF5CC\", secondary30: \"#F7EA99\", secondary40: \"#F3E066\", secondary50: \"#EBCB00\", secondary60: \"#BCA200\" },\n tertiaryScale: { tertiary10: \"#D1E4FF\", tertiary20: \"#9ECAFF\", tertiary30: \"#6DAFF6\", tertiary40: \"#5195DA\", tertiary50: \"#327ABE\", tertiary60: \"#0061A3\" },\n semanticOverrides: { link: \"#0078D2\", borderFocus: \"#0090FC\", interactivePrimary: \"#0090FC\", interactivePrimaryHover: \"#0078D2\", interactivePrimaryActive: \"#0060A8\", interactiveTertiary: \"#5195DA\", info: \"#0090FC\", infoBg: \"#F3FBFF\" },\n keyDifferences: [\"Same colour palette as eha — differs in brand assets/logo only\"],\n },\n\n lomis: {\n id: \"lomis\",\n description: \"LoMIS brand — Logistics Management Information System. Different tertiary scale (navy blues).\",\n cssImport: \"import 'eha-design-system/styles/brands/lomis.css'\",\n themeProviderUsage: \"<ThemeProvider brandId=\\\"lomis\\\">{children}</ThemeProvider>\",\n primary: \"#0090FC\", secondary: \"#EBCB00\", tertiary: \"#1E3A5F\",\n primaryScale: { primary10: \"#F3FBFF\", primary20: \"#D4EDFF\", primary30: \"#53B5FF\", primary40: \"#0090FC\", primary50: \"#0078D2\", primary60: \"#0060A8\" },\n secondaryScale: { secondary10: \"#FDFAE5\", secondary20: \"#FBF5CC\", secondary30: \"#F7EA99\", secondary40: \"#F3E066\", secondary50: \"#EBCB00\", secondary60: \"#BCA200\" },\n tertiaryScale: { tertiary10: \"#EFF6FF\", tertiary20: \"#DBEAFE\", tertiary30: \"#93C5FD\", tertiary40: \"#3B82F6\", tertiary50: \"#2563EB\", tertiary60: \"#1E3A5F\" },\n semanticOverrides: { link: \"#0078D2\", borderFocus: \"#0090FC\", interactivePrimary: \"#0090FC\", interactivePrimaryHover: \"#0078D2\", interactivePrimaryActive: \"#0060A8\", interactiveTertiary: \"#3B82F6\", info: \"#0090FC\", infoBg: \"#F3FBFF\" },\n keyDifferences: [\n \"tertiary: #1E3A5F (deep navy) vs eha #003963\",\n \"tertiary scale uses blue/indigo (#EFF6FF → #1E3A5F)\",\n \"interactive.tertiary: #3B82F6 (brighter blue)\",\n ],\n },\n\n reach: {\n id: \"reach\",\n description: \"Reach Data Portal — earthy terracotta primary, golden secondary. Significantly different visual identity from other brands.\",\n cssImport: \"import 'eha-design-system/styles/brands/reach.css'\",\n themeProviderUsage: \"<ThemeProvider brandId=\\\"reach\\\">{children}</ThemeProvider>\",\n primary: \"#522E1C\", secondary: \"#E3C934\", tertiary: \"#003963\",\n primaryScale: { primary10: \"#E4C2B1\", primary20: \"#C7A493\", primary30: \"#AA8775\", primary40: \"#6F4C3A\", primary50: \"#422516\", primary60: \"#311C11\" },\n secondaryScale: { secondary10: \"#FCF9E9\", secondary20: \"#F8F1C9\", secondary30: \"#F0E293\", secondary40: \"#E9D562\", secondary50: \"#E3C934\", secondary60: \"#AA9417\" },\n tertiaryScale: { tertiary10: \"#D1E4FF\", tertiary20: \"#9ECAFF\", tertiary30: \"#6DAFF6\", tertiary40: \"#5195DA\", tertiary50: \"#327ABE\", tertiary60: \"#0061A3\" },\n semanticOverrides: { link: \"#422516\", borderFocus: \"#6F4C3A\", interactivePrimary: \"#6F4C3A\", interactivePrimaryHover: \"#422516\", interactivePrimaryActive: \"#311C11\", interactiveTertiary: \"#5195DA\", info: \"#6F4C3A\", infoBg: \"#E4C2B1\" },\n keyDifferences: [\n \"primary: #522E1C (terracotta brown) — completely different from other brands\",\n \"primary scale is earthy browns, NOT blues\",\n \"secondary: #E3C934 (golden yellow)\",\n \"links use brown (#422516), not blue — affects all anchor/link colours\",\n \"focus ring uses #6F4C3A (dark brown)\",\n \"info/infoBg uses brown tones instead of blue\",\n \"Button variant='primary' renders brown, not blue\",\n ],\n },\n};\n\n// Default tokens export (eha brand) for backward compat\nexport const tokens = {\n ...sharedTokens,\n colors: {\n ...brandConfigs.eha.primaryScale,\n ...brandConfigs.eha.secondaryScale,\n ...brandConfigs.eha.tertiaryScale,\n ...sharedColors.neutralScale,\n ...sharedColors.errorScale,\n ...sharedColors.successScale,\n ...sharedColors.warningScale,\n primary: brandConfigs.eha.primary,\n secondary: brandConfigs.eha.secondary,\n tertiary: brandConfigs.eha.tertiary,\n neutral: sharedColors.neutral,\n white: sharedColors.white, black: sharedColors.black,\n error: sharedColors.error, success: sharedColors.success, warning: sharedColors.warning,\n },\n};\n\nexport type Tokens = typeof tokens;"],"mappings":"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","names":[]}
|