@schandlergarcia/sf-web-components 1.9.88 → 2.1.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/.a4drules/features/command-center-dashboard-rule.md +1 -1
- package/.a4drules/skills/command-center-builder/SKILL.md +33 -36
- package/.a4drules/skills/command-center-builder/getting-started.md +64 -104
- package/.a4drules/skills/command-center-builder/improved-build-process.md +28 -34
- package/.a4drules/skills/command-center-guide/SKILL.md +9 -9
- package/.a4drules/skills/command-center-project/SKILL.md +4 -5
- package/.a4drules/skills/component-library/SKILL.md +8 -10
- package/.a4drules/skills/component-library/card-components.md +3 -3
- package/.a4drules/skills/component-library/chat-data.md +4 -6
- package/.a4drules/troubleshooting/codegen-overwrites-types.md +21 -162
- package/.a4drules/troubleshooting/graphql-introspection-failure.md +13 -264
- package/.a4drules/validation-requirements.md +3 -5
- package/.a4drules/webapp-data.md +1 -1
- package/CHANGELOG.md +33 -0
- package/CLAUDE.md +42 -39
- package/brands/engine/brand.css +40 -0
- package/brands/engine/global.css +234 -0
- package/dist/components/library/cards/ActivityCard.js +9 -9
- package/dist/components/library/cards/ActivityCard.js.map +1 -1
- package/dist/styles/base.css +112 -27
- package/dist/styles/global.css +15 -30
- package/package.json +7 -4
- package/scripts/apply-brand.mjs +178 -0
- package/scripts/postinstall.mjs +24 -201
- package/scripts/reset-command-center.sh +53 -411
- package/scripts/validate-dashboard.sh +4 -4
- package/src/components/library/cards/ActivityCard.jsx +2 -2
- package/src/styles/base.css +223 -0
- package/src/styles/global.css +223 -0
- package/src/templates/config/vite.config.ts.template +0 -18
- package/.a4drules/features/engine-dashboard-rule.md +0 -63
- package/.a4drules/features/phase2-data-pattern.md +0 -15
- package/data/README.md +0 -202
- package/data/USAGE.md +0 -81
- package/data/copy-to-webapp.sh +0 -61
- package/scripts/generate-schema-from-sample.mjs +0 -370
- /package/{data → brands/engine}/agentApiConfig.ts +0 -0
- /package/{data → brands/engine}/engine-command-center-prd.md +0 -0
- /package/{data → brands/engine}/engine-live-data.js +0 -0
- /package/{data → brands/engine}/engine-sample-data.js +0 -0
- /package/{assets/images → brands/engine}/engine_logo.png +0 -0
- /package/{data → brands/engine}/schema.graphql +0 -0
- /package/{data → brands/engine}/useEngineLiveData.ts +0 -0
- /package/{data → brands/engine}/useEvaAgent.ts +0 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
@import '@heroui/styles';
|
|
2
|
+
|
|
3
|
+
@layer base {
|
|
4
|
+
html,
|
|
5
|
+
body,
|
|
6
|
+
#root {
|
|
7
|
+
@apply min-h-screen;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
body {
|
|
11
|
+
@apply antialiased bg-white;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@import 'tw-animate-css';
|
|
16
|
+
@import 'shadcn/tailwind.css';
|
|
17
|
+
|
|
18
|
+
@custom-variant dark (&:is(.dark *));
|
|
19
|
+
|
|
20
|
+
@source "../components/library";
|
|
21
|
+
@source "../components/pages";
|
|
22
|
+
|
|
23
|
+
@theme inline {
|
|
24
|
+
--color-background: var(--background);
|
|
25
|
+
--color-foreground: var(--foreground);
|
|
26
|
+
--color-card: var(--card);
|
|
27
|
+
--color-card-foreground: var(--card-foreground);
|
|
28
|
+
--color-popover: var(--popover);
|
|
29
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
30
|
+
--color-primary: var(--primary);
|
|
31
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
32
|
+
--color-secondary: var(--secondary);
|
|
33
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
34
|
+
--color-muted: var(--muted);
|
|
35
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
36
|
+
--color-accent: var(--accent);
|
|
37
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
38
|
+
--color-destructive: var(--destructive);
|
|
39
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
40
|
+
--color-border: var(--border);
|
|
41
|
+
--color-input: var(--input);
|
|
42
|
+
--color-ring: var(--ring);
|
|
43
|
+
--color-chart-1: var(--chart-1);
|
|
44
|
+
--color-chart-2: var(--chart-2);
|
|
45
|
+
--color-chart-3: var(--chart-3);
|
|
46
|
+
--color-chart-4: var(--chart-4);
|
|
47
|
+
--color-chart-5: var(--chart-5);
|
|
48
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
49
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
50
|
+
--radius-lg: var(--radius);
|
|
51
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
52
|
+
--color-sidebar: var(--sidebar);
|
|
53
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
54
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
55
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
56
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
57
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
58
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
59
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
60
|
+
|
|
61
|
+
/* Brand palette — customize these to match your brand */
|
|
62
|
+
--color-brand-50: #F0F9FF;
|
|
63
|
+
--color-brand-100: #E0F2FE;
|
|
64
|
+
--color-brand-200: #BAE6FD;
|
|
65
|
+
--color-brand-300: #7DD3FC;
|
|
66
|
+
--color-brand-400: #38BDF8;
|
|
67
|
+
--color-brand-500: #0EA5E9;
|
|
68
|
+
--color-brand-600: #0284C7;
|
|
69
|
+
--color-brand-700: #0369A1;
|
|
70
|
+
--color-brand-800: #075985;
|
|
71
|
+
--color-brand-900: #0C4A6E;
|
|
72
|
+
--color-brand-950: #082F49;
|
|
73
|
+
|
|
74
|
+
--font-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif;
|
|
75
|
+
--font-mono: 'JetBrains Mono', ui-monospace, monospace;
|
|
76
|
+
|
|
77
|
+
--radius-pill: 9999px;
|
|
78
|
+
--radius-card: 10px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
:root {
|
|
82
|
+
--radius: 0.625rem;
|
|
83
|
+
--background: oklch(1 0 0);
|
|
84
|
+
--foreground: oklch(0.145 0 0);
|
|
85
|
+
--card: oklch(1 0 0);
|
|
86
|
+
--card-foreground: oklch(0.145 0 0);
|
|
87
|
+
--popover: oklch(1 0 0);
|
|
88
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
89
|
+
--primary: oklch(0.205 0 0);
|
|
90
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
91
|
+
--secondary: oklch(0.97 0 0);
|
|
92
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
93
|
+
--muted: oklch(0.97 0 0);
|
|
94
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
95
|
+
--accent: oklch(0.97 0 0);
|
|
96
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
97
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
98
|
+
--border: oklch(0.922 0 0);
|
|
99
|
+
--input: oklch(0.922 0 0);
|
|
100
|
+
--ring: oklch(0.708 0 0);
|
|
101
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
102
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
103
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
104
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
105
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
106
|
+
--sidebar: oklch(0.985 0 0);
|
|
107
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
108
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
109
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
110
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
111
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
112
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
113
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.dark {
|
|
117
|
+
--background: oklch(0.145 0 0);
|
|
118
|
+
--foreground: oklch(0.985 0 0);
|
|
119
|
+
--card: oklch(0.205 0 0);
|
|
120
|
+
--card-foreground: oklch(0.985 0 0);
|
|
121
|
+
--popover: oklch(0.205 0 0);
|
|
122
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
123
|
+
--primary: oklch(0.922 0 0);
|
|
124
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
125
|
+
--secondary: oklch(0.269 0 0);
|
|
126
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
127
|
+
--muted: oklch(0.269 0 0);
|
|
128
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
129
|
+
--accent: oklch(0.269 0 0);
|
|
130
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
131
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
132
|
+
--border: oklch(1 0 0 / 10%);
|
|
133
|
+
--input: oklch(1 0 0 / 15%);
|
|
134
|
+
--ring: oklch(0.556 0 0);
|
|
135
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
136
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
137
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
138
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
139
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
140
|
+
--sidebar: oklch(0.205 0 0);
|
|
141
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
142
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
143
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
144
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
145
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
146
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
147
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@layer base {
|
|
151
|
+
* {
|
|
152
|
+
@apply border-border outline-ring/50;
|
|
153
|
+
}
|
|
154
|
+
body {
|
|
155
|
+
@apply bg-background text-foreground;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* Restore HeroUI theme variables inside the Command Center scope.
|
|
161
|
+
* shadcn redefines --muted, --accent, --accent-foreground with different
|
|
162
|
+
* semantics (bg colors vs text colors). This scope restores HeroUI's values
|
|
163
|
+
* so HeroUI components render correctly.
|
|
164
|
+
*/
|
|
165
|
+
.heroui-scope {
|
|
166
|
+
--primary: #000000;
|
|
167
|
+
--primary-foreground: oklch(0.9911 0 0);
|
|
168
|
+
--secondary: #0EA5E9;
|
|
169
|
+
--secondary-foreground: oklch(0.9911 0 0);
|
|
170
|
+
--success: #16A34A;
|
|
171
|
+
--success-foreground: oklch(0.9911 0 0);
|
|
172
|
+
--warning: #F59E0B;
|
|
173
|
+
--warning-foreground: oklch(0.2103 0.0059 285.89);
|
|
174
|
+
--danger: #EF4444;
|
|
175
|
+
--danger-foreground: oklch(0.9911 0 0);
|
|
176
|
+
|
|
177
|
+
--muted: oklch(0.5517 0.0138 285.94);
|
|
178
|
+
--accent: oklch(0.6204 0.195 253.83);
|
|
179
|
+
--accent-foreground: oklch(0.9911 0 0);
|
|
180
|
+
--background: oklch(0.9702 0 0);
|
|
181
|
+
--foreground: oklch(0.2103 0.0059 285.89);
|
|
182
|
+
--default: oklch(94% 0.001 286.375);
|
|
183
|
+
--default-foreground: oklch(0.2103 0.0059 285.89);
|
|
184
|
+
--border: oklch(90% 0.004 286.32);
|
|
185
|
+
--separator: oklch(92% 0.004 286.32);
|
|
186
|
+
--segment: oklch(100% 0 0);
|
|
187
|
+
--segment-foreground: oklch(0.2103 0.0059 285.89);
|
|
188
|
+
--surface: oklch(100% 0 0);
|
|
189
|
+
--surface-foreground: oklch(0.2103 0.0059 285.89);
|
|
190
|
+
--overlay: oklch(100% 0 0);
|
|
191
|
+
--overlay-foreground: oklch(0.2103 0.0059 285.89);
|
|
192
|
+
--focus: oklch(0.6204 0.195 253.83);
|
|
193
|
+
--link: oklch(0.2103 0.0059 285.89);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* ChatBar expanded overlay — horizontal padding so it doesn't hit window edges */
|
|
197
|
+
body > .fixed.inset-x-0.rounded-2xl {
|
|
198
|
+
left: 1.5rem !important;
|
|
199
|
+
right: 1.5rem !important;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.dark .heroui-scope,
|
|
203
|
+
.heroui-scope.dark {
|
|
204
|
+
--muted: oklch(70.5% 0.015 286.067);
|
|
205
|
+
--background: oklch(12% 0.005 285.823);
|
|
206
|
+
--foreground: oklch(0.9911 0 0);
|
|
207
|
+
--default: oklch(27.4% 0.006 286.033);
|
|
208
|
+
--default-foreground: oklch(0.9911 0 0);
|
|
209
|
+
--border: oklch(28% 0.006 286.033);
|
|
210
|
+
--separator: oklch(25% 0.006 286.033);
|
|
211
|
+
--segment: oklch(0.3964 0.01 285.93);
|
|
212
|
+
--segment-foreground: oklch(0.9911 0 0);
|
|
213
|
+
--surface: oklch(0.2103 0.0059 285.89);
|
|
214
|
+
--surface-foreground: oklch(0.9911 0 0);
|
|
215
|
+
--overlay: oklch(0.2103 0.0059 285.89);
|
|
216
|
+
--overlay-foreground: oklch(0.9911 0 0);
|
|
217
|
+
--warning: oklch(0.8203 0.1388 76.34);
|
|
218
|
+
--warning-foreground: oklch(0.2103 0.0059 285.89);
|
|
219
|
+
--danger: oklch(0.594 0.1967 24.63);
|
|
220
|
+
--danger-foreground: oklch(0.9911 0 0);
|
|
221
|
+
--focus: oklch(0.6204 0.195 253.83);
|
|
222
|
+
--link: oklch(0.9911 0 0);
|
|
223
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
@import '@heroui/styles';
|
|
2
|
+
|
|
3
|
+
@layer base {
|
|
4
|
+
html,
|
|
5
|
+
body,
|
|
6
|
+
#root {
|
|
7
|
+
@apply min-h-screen;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
body {
|
|
11
|
+
@apply antialiased bg-white;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@import 'tw-animate-css';
|
|
16
|
+
@import 'shadcn/tailwind.css';
|
|
17
|
+
|
|
18
|
+
@custom-variant dark (&:is(.dark *));
|
|
19
|
+
|
|
20
|
+
@source "../components/library";
|
|
21
|
+
@source "../components/pages";
|
|
22
|
+
|
|
23
|
+
@theme inline {
|
|
24
|
+
--color-background: var(--background);
|
|
25
|
+
--color-foreground: var(--foreground);
|
|
26
|
+
--color-card: var(--card);
|
|
27
|
+
--color-card-foreground: var(--card-foreground);
|
|
28
|
+
--color-popover: var(--popover);
|
|
29
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
30
|
+
--color-primary: var(--primary);
|
|
31
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
32
|
+
--color-secondary: var(--secondary);
|
|
33
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
34
|
+
--color-muted: var(--muted);
|
|
35
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
36
|
+
--color-accent: var(--accent);
|
|
37
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
38
|
+
--color-destructive: var(--destructive);
|
|
39
|
+
--color-destructive-foreground: var(--destructive-foreground);
|
|
40
|
+
--color-border: var(--border);
|
|
41
|
+
--color-input: var(--input);
|
|
42
|
+
--color-ring: var(--ring);
|
|
43
|
+
--color-chart-1: var(--chart-1);
|
|
44
|
+
--color-chart-2: var(--chart-2);
|
|
45
|
+
--color-chart-3: var(--chart-3);
|
|
46
|
+
--color-chart-4: var(--chart-4);
|
|
47
|
+
--color-chart-5: var(--chart-5);
|
|
48
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
49
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
50
|
+
--radius-lg: var(--radius);
|
|
51
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
52
|
+
--color-sidebar: var(--sidebar);
|
|
53
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
54
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
55
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
56
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
57
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
58
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
59
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
60
|
+
|
|
61
|
+
/* Brand palette — customize these to match your brand */
|
|
62
|
+
--color-brand-50: #F0F9FF;
|
|
63
|
+
--color-brand-100: #E0F2FE;
|
|
64
|
+
--color-brand-200: #BAE6FD;
|
|
65
|
+
--color-brand-300: #7DD3FC;
|
|
66
|
+
--color-brand-400: #38BDF8;
|
|
67
|
+
--color-brand-500: #0EA5E9;
|
|
68
|
+
--color-brand-600: #0284C7;
|
|
69
|
+
--color-brand-700: #0369A1;
|
|
70
|
+
--color-brand-800: #075985;
|
|
71
|
+
--color-brand-900: #0C4A6E;
|
|
72
|
+
--color-brand-950: #082F49;
|
|
73
|
+
|
|
74
|
+
--font-sans: 'Inter', ui-sans-serif, system-ui, -apple-system, sans-serif;
|
|
75
|
+
--font-mono: 'JetBrains Mono', ui-monospace, monospace;
|
|
76
|
+
|
|
77
|
+
--radius-pill: 9999px;
|
|
78
|
+
--radius-card: 10px;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
:root {
|
|
82
|
+
--radius: 0.625rem;
|
|
83
|
+
--background: oklch(1 0 0);
|
|
84
|
+
--foreground: oklch(0.145 0 0);
|
|
85
|
+
--card: oklch(1 0 0);
|
|
86
|
+
--card-foreground: oklch(0.145 0 0);
|
|
87
|
+
--popover: oklch(1 0 0);
|
|
88
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
89
|
+
--primary: oklch(0.205 0 0);
|
|
90
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
91
|
+
--secondary: oklch(0.97 0 0);
|
|
92
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
93
|
+
--muted: oklch(0.97 0 0);
|
|
94
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
95
|
+
--accent: oklch(0.97 0 0);
|
|
96
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
97
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
98
|
+
--border: oklch(0.922 0 0);
|
|
99
|
+
--input: oklch(0.922 0 0);
|
|
100
|
+
--ring: oklch(0.708 0 0);
|
|
101
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
102
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
103
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
104
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
105
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
106
|
+
--sidebar: oklch(0.985 0 0);
|
|
107
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
108
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
109
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
110
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
111
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
112
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
113
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.dark {
|
|
117
|
+
--background: oklch(0.145 0 0);
|
|
118
|
+
--foreground: oklch(0.985 0 0);
|
|
119
|
+
--card: oklch(0.205 0 0);
|
|
120
|
+
--card-foreground: oklch(0.985 0 0);
|
|
121
|
+
--popover: oklch(0.205 0 0);
|
|
122
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
123
|
+
--primary: oklch(0.922 0 0);
|
|
124
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
125
|
+
--secondary: oklch(0.269 0 0);
|
|
126
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
127
|
+
--muted: oklch(0.269 0 0);
|
|
128
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
129
|
+
--accent: oklch(0.269 0 0);
|
|
130
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
131
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
132
|
+
--border: oklch(1 0 0 / 10%);
|
|
133
|
+
--input: oklch(1 0 0 / 15%);
|
|
134
|
+
--ring: oklch(0.556 0 0);
|
|
135
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
136
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
137
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
138
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
139
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
140
|
+
--sidebar: oklch(0.205 0 0);
|
|
141
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
142
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
143
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
144
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
145
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
146
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
147
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@layer base {
|
|
151
|
+
* {
|
|
152
|
+
@apply border-border outline-ring/50;
|
|
153
|
+
}
|
|
154
|
+
body {
|
|
155
|
+
@apply bg-background text-foreground;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* Restore HeroUI theme variables inside the Command Center scope.
|
|
161
|
+
* shadcn redefines --muted, --accent, --accent-foreground with different
|
|
162
|
+
* semantics (bg colors vs text colors). This scope restores HeroUI's values
|
|
163
|
+
* so HeroUI components render correctly.
|
|
164
|
+
*/
|
|
165
|
+
.heroui-scope {
|
|
166
|
+
--primary: #000000;
|
|
167
|
+
--primary-foreground: oklch(0.9911 0 0);
|
|
168
|
+
--secondary: #0EA5E9;
|
|
169
|
+
--secondary-foreground: oklch(0.9911 0 0);
|
|
170
|
+
--success: #16A34A;
|
|
171
|
+
--success-foreground: oklch(0.9911 0 0);
|
|
172
|
+
--warning: #F59E0B;
|
|
173
|
+
--warning-foreground: oklch(0.2103 0.0059 285.89);
|
|
174
|
+
--danger: #EF4444;
|
|
175
|
+
--danger-foreground: oklch(0.9911 0 0);
|
|
176
|
+
|
|
177
|
+
--muted: oklch(0.5517 0.0138 285.94);
|
|
178
|
+
--accent: oklch(0.6204 0.195 253.83);
|
|
179
|
+
--accent-foreground: oklch(0.9911 0 0);
|
|
180
|
+
--background: oklch(0.9702 0 0);
|
|
181
|
+
--foreground: oklch(0.2103 0.0059 285.89);
|
|
182
|
+
--default: oklch(94% 0.001 286.375);
|
|
183
|
+
--default-foreground: oklch(0.2103 0.0059 285.89);
|
|
184
|
+
--border: oklch(90% 0.004 286.32);
|
|
185
|
+
--separator: oklch(92% 0.004 286.32);
|
|
186
|
+
--segment: oklch(100% 0 0);
|
|
187
|
+
--segment-foreground: oklch(0.2103 0.0059 285.89);
|
|
188
|
+
--surface: oklch(100% 0 0);
|
|
189
|
+
--surface-foreground: oklch(0.2103 0.0059 285.89);
|
|
190
|
+
--overlay: oklch(100% 0 0);
|
|
191
|
+
--overlay-foreground: oklch(0.2103 0.0059 285.89);
|
|
192
|
+
--focus: oklch(0.6204 0.195 253.83);
|
|
193
|
+
--link: oklch(0.2103 0.0059 285.89);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* ChatBar expanded overlay — horizontal padding so it doesn't hit window edges */
|
|
197
|
+
body > .fixed.inset-x-0.rounded-2xl {
|
|
198
|
+
left: 1.5rem !important;
|
|
199
|
+
right: 1.5rem !important;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.dark .heroui-scope,
|
|
203
|
+
.heroui-scope.dark {
|
|
204
|
+
--muted: oklch(70.5% 0.015 286.067);
|
|
205
|
+
--background: oklch(12% 0.005 285.823);
|
|
206
|
+
--foreground: oklch(0.9911 0 0);
|
|
207
|
+
--default: oklch(27.4% 0.006 286.033);
|
|
208
|
+
--default-foreground: oklch(0.9911 0 0);
|
|
209
|
+
--border: oklch(28% 0.006 286.033);
|
|
210
|
+
--separator: oklch(25% 0.006 286.033);
|
|
211
|
+
--segment: oklch(0.3964 0.01 285.93);
|
|
212
|
+
--segment-foreground: oklch(0.9911 0 0);
|
|
213
|
+
--surface: oklch(0.2103 0.0059 285.89);
|
|
214
|
+
--surface-foreground: oklch(0.9911 0 0);
|
|
215
|
+
--overlay: oklch(0.2103 0.0059 285.89);
|
|
216
|
+
--overlay-foreground: oklch(0.9911 0 0);
|
|
217
|
+
--warning: oklch(0.8203 0.1388 76.34);
|
|
218
|
+
--warning-foreground: oklch(0.2103 0.0059 285.89);
|
|
219
|
+
--danger: oklch(0.594 0.1967 24.63);
|
|
220
|
+
--danger-foreground: oklch(0.9911 0 0);
|
|
221
|
+
--focus: oklch(0.6204 0.195 253.83);
|
|
222
|
+
--link: oklch(0.9911 0 0);
|
|
223
|
+
}
|
|
@@ -34,24 +34,6 @@ export default defineConfig(({ mode }) => {
|
|
|
34
34
|
: []),
|
|
35
35
|
] as import('vite').PluginOption[],
|
|
36
36
|
|
|
37
|
-
// Proxy Agentforce Agent API calls through the dev server to avoid CORS.
|
|
38
|
-
// /sf-oauth/* → Salesforce org (for OAuth client-credentials token)
|
|
39
|
-
// /sf-agent/* → Agent API base (for session + message calls)
|
|
40
|
-
server: {
|
|
41
|
-
proxy: {
|
|
42
|
-
'/sf-oauth': {
|
|
43
|
-
target: 'https://tdx26-keynote-org-1com.my.salesforce.com',
|
|
44
|
-
changeOrigin: true,
|
|
45
|
-
rewrite: (p: string) => p.replace(/^\/sf-oauth/, ''),
|
|
46
|
-
},
|
|
47
|
-
'/sf-agent': {
|
|
48
|
-
target: 'https://api.salesforce.com',
|
|
49
|
-
changeOrigin: true,
|
|
50
|
-
rewrite: (p: string) => p.replace(/^\/sf-agent/, ''),
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
|
|
55
37
|
// Build configuration for MPA
|
|
56
38
|
build: {
|
|
57
39
|
outDir: resolve(__dirname, 'dist'),
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/pages/EngineDashboard.tsx"
|
|
4
|
-
- "**/pages/Engine*.tsx"
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Engine Dashboard — Auto-Loaded Rules
|
|
8
|
-
|
|
9
|
-
These rules load automatically when editing Engine dashboard files. For full build instructions, use the phase files in `.a4drules/phases/`.
|
|
10
|
-
|
|
11
|
-
## Source of Truth
|
|
12
|
-
|
|
13
|
-
**The PRD is law.** `engine-command-center-prd.md` is the complete specification. If anything conflicts with the PRD, the PRD wins.
|
|
14
|
-
|
|
15
|
-
## Non-Negotiable Constraints
|
|
16
|
-
|
|
17
|
-
1. **File:** `.tsx` extension, located in `src/pages/`
|
|
18
|
-
2. **Imports:** ONLY from `@/components/library` and `@heroicons/react` — no shadcn (`@/components/ui/`), no Lucide, no Recharts
|
|
19
|
-
3. **Colors:** Slate scale only — `text-slate-50` not `text-white`, `bg-slate-900` not `bg-black`. Exception: `bg-black/40` with opacity is OK for glass overlays
|
|
20
|
-
4. **Layout:** Full-page scroll (no `h-screen`), visualization-hero pattern with full-width map
|
|
21
|
-
5. **Data:** All data via `useDataSource({ sample, live })` — sample data imported from `src/data/engine-sample-data.js`
|
|
22
|
-
6. **Dark mode:** Every custom element needs `dark:` variants
|
|
23
|
-
7. **DO NOT** run `npm run dev`, `npm run validate:dashboard`, or `npm run build` during builds
|
|
24
|
-
|
|
25
|
-
## Phase Build Order
|
|
26
|
-
|
|
27
|
-
| Phase | File | What it covers |
|
|
28
|
-
|-------|------|----------------|
|
|
29
|
-
| 1 | `.a4drules/phases/phase-1-layout.md` | Header, hero map, glass overlays, flight strip, placeholder panels |
|
|
30
|
-
| 2 | `.a4drules/phases/phase-2-components.md` | Library components, sample data, map data, charts |
|
|
31
|
-
| 3 | `.a4drules/phases/phase-3-live-data.md` | GraphQL hooks, live Salesforce data |
|
|
32
|
-
| 4 | `.a4drules/phases/phase-4-agent.md` | Eva ChatBar, Salesforce signals |
|
|
33
|
-
|
|
34
|
-
Complete each phase fully before starting the next. Read the relevant phase file for detailed instructions and code templates.
|
|
35
|
-
|
|
36
|
-
## Wiring Checklist — MANDATORY
|
|
37
|
-
|
|
38
|
-
After creating or updating `EngineDashboard.tsx`, update ALL 3 files:
|
|
39
|
-
|
|
40
|
-
1. **`CommandCenter.tsx`** — imports `EngineDashboard` (not `BlankDashboard`)
|
|
41
|
-
2. **`Home.tsx`** — REWRITE to render `CommandCenter` (it ships as Account Search by default):
|
|
42
|
-
```tsx
|
|
43
|
-
import CommandCenter from "@/components/workspace/CommandCenter";
|
|
44
|
-
export default function HomePage() { return <CommandCenter />; }
|
|
45
|
-
```
|
|
46
|
-
3. **`routes.tsx`** — has `Home` as index route with label "Dashboard", `Search` at `/search`
|
|
47
|
-
|
|
48
|
-
**If you skip steps 2-3, the user sees the Account Search page instead of the dashboard.**
|
|
49
|
-
|
|
50
|
-
## Component Quick Reference
|
|
51
|
-
|
|
52
|
-
| Need | Use |
|
|
53
|
-
|------|-----|
|
|
54
|
-
| KPI number | `MetricCard` |
|
|
55
|
-
| Data table | `TableCard` |
|
|
56
|
-
| Item list | `ListCard` |
|
|
57
|
-
| Activity feed | `ActivityCard` (wrap in `BaseCard` for card styling) |
|
|
58
|
-
| Chart | `ChartCard` + `D3Chart` with `D3ChartTemplates` |
|
|
59
|
-
| Map | `GeoMap` (direct, not wrapped in ChartCard) |
|
|
60
|
-
| Status items | `StatusCard` |
|
|
61
|
-
| Multi-section | `WidgetCard` |
|
|
62
|
-
|
|
63
|
-
For full component API, read `.a4drules/skills/component-library/SKILL.md`.
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Phase 2: Sample Data Pattern
|
|
2
|
-
|
|
3
|
-
For complete Phase 2 instructions, see `.a4drules/phases/phase-2-components.md`.
|
|
4
|
-
|
|
5
|
-
## Key Rule
|
|
6
|
-
|
|
7
|
-
The sample data file already exists at `src/data/engine-sample-data.js`. **DO NOT create a new data file.** Import from the existing one.
|
|
8
|
-
|
|
9
|
-
## Available exports
|
|
10
|
-
|
|
11
|
-
**Base records:** `TRAVELERS`, `TRIPS`, `FLIGHTS`, `HOTELS`, `DISRUPTIONS`, `BOOKINGS`, `REBOOKING_ACTIONS`, `TRAVEL_POLICIES`, `ACCOUNT`, `MONTHLY_SPEND`
|
|
12
|
-
|
|
13
|
-
**Dashboard-ready derivatives:** `MAP_MARKERS`, `MAP_ARCS`, `MAP_OVERLAYS`, `FLIGHT_STATUS_LIST`, `TRAVELER_CARDS`, `DISRUPTION_CARDS`, `ESCALATION_CARDS`, `EVA_ACTIONS`, `BOOKING_ROWS`, `POLICY_ITEMS`, `DESTINATION_CHART_DATA`, `SPEND_CHART_DATA`, `METRICS`
|
|
14
|
-
|
|
15
|
-
All derivatives are computed from the base records — not hardcoded separately.
|