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.
Files changed (50) hide show
  1. package/EHA_RULES.md +4 -4
  2. package/README.md +33 -13
  3. package/dist/{chunk-TOWRWUJK.js → chunk-LMSDRJHS.js} +43 -4
  4. package/dist/chunk-LMSDRJHS.js.map +1 -0
  5. package/dist/{chunk-43DPD5CQ.js → chunk-QID5XXWN.js} +25 -6
  6. package/dist/chunk-QID5XXWN.js.map +1 -0
  7. package/dist/chunk-QYLQDNOW.js +124 -0
  8. package/dist/chunk-QYLQDNOW.js.map +1 -0
  9. package/dist/index.cjs +225 -244
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +3 -2
  12. package/dist/index.d.ts +3 -2
  13. package/dist/index.js +33 -11
  14. package/dist/index.js.map +1 -1
  15. package/dist/manifests/index.cjs +47 -4
  16. package/dist/manifests/index.cjs.map +1 -1
  17. package/dist/manifests/index.d.cts +12 -4
  18. package/dist/manifests/index.d.ts +12 -4
  19. package/dist/manifests/index.js +11 -3
  20. package/dist/mcp/server.cjs +492 -222
  21. package/dist/mcp/server.cjs.map +1 -1
  22. package/dist/mcp/server.d.cts +1 -6
  23. package/dist/mcp/server.d.ts +1 -6
  24. package/dist/mcp/server.js +383 -10
  25. package/dist/mcp/server.js.map +1 -1
  26. package/dist/recipes/index.cjs +24 -4
  27. package/dist/recipes/index.cjs.map +1 -1
  28. package/dist/recipes/index.d.cts +7 -2
  29. package/dist/recipes/index.d.ts +7 -2
  30. package/dist/recipes/index.js +3 -1
  31. package/dist/tokens/index.cjs +119 -97
  32. package/dist/tokens/index.cjs.map +1 -1
  33. package/dist/tokens/index.d.cts +247 -78
  34. package/dist/tokens/index.d.ts +247 -78
  35. package/dist/tokens/index.js +9 -19
  36. package/package.json +71 -6
  37. package/dist/chunk-43DPD5CQ.js.map +0 -1
  38. package/dist/chunk-BENZVDE6.js +0 -176
  39. package/dist/chunk-BENZVDE6.js.map +0 -1
  40. package/dist/chunk-TGIKADVU.js +0 -97
  41. package/dist/chunk-TGIKADVU.js.map +0 -1
  42. package/dist/chunk-TOWRWUJK.js.map +0 -1
  43. package/scripts/sync-manifest.ts +0 -34
  44. package/src/index.ts +0 -6
  45. package/src/manifests/components.ts +0 -185
  46. package/src/mcp/server.ts +0 -163
  47. package/src/recipes/index.ts +0 -178
  48. package/src/tokens/index.ts +0 -75
  49. package/tsconfig.json +0 -14
  50. 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 `brand` prop always wraps the app root
10
- 4. Missing components output comment, never build custom: `// MISSING: [Name] — not in EHA DS`
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 every Figma element to a component using `get_component` tool
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. Exposes components, design tokens, and code recipes to AI agents via the Model Context Protocol.
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
- | `get_component` | Get full component spec by name or Figma node name |
10
- | `list_components` | List all available components |
11
- | `get_token` | Look up a design token by name |
12
- | `get_recipe` | Get a code recipe for a common UI pattern |
13
- | `get_brand_tokens` | Get all token values for a specific brand |
14
- | `resolve_figma` | Map a Figma node name to a DS component |
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
- Add to your Claude Code config:
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-ai": {
35
+ "eha-design-system": {
29
36
  "command": "node",
30
- "args": ["/path/to/eha-ai/dist/index.js"]
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 manifest from DS
56
+ ## Sync Version Marker From DS
37
57
 
38
58
  ```bash
39
59
  npm run sync
40
60
  ```
41
61
 
42
- This pulls the latest component and token definitions from `eha-design-system`.
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 64\xD764px circle",
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: `<PageHeader title="Dashboard" subtitle="Overview" user={{ name: 'John', initials: 'JD' }} />`
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-TOWRWUJK.js.map
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 brand="reach">
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(name) {
166
- return recipes.find((r) => r.name === name || r.tags.includes(name));
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-43DPD5CQ.js.map
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":[]}