@vadimcomanescu/nadicode-design-system 4.0.1 → 4.0.2
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/.agents/skills/seed/SKILL.md +34 -163
- package/.agents/skills/seed/references/animation.md +2 -2
- package/.agents/skills/seed/references/responsive.md +1 -1
- package/README.md +2 -2
- package/eslint-rules/nadicode/rules/no-has-svg-selector.js +1 -1
- package/package.json +1 -2
- package/scripts/ds-check.mjs +0 -10
- package/scripts/sync-seed-skill.mjs +0 -3
- package/.agents/skills/seed/contract.md +0 -110
- package/.agents/skills/seed/intent-map.md +0 -320
- package/.agents/skills/seed/recipes/agency-home.md +0 -311
- package/.agents/skills/seed/recipes/agents-chat.md +0 -305
- package/.agents/skills/seed/recipes/analytics.md +0 -253
- package/.agents/skills/seed/recipes/auth.md +0 -254
- package/.agents/skills/seed/recipes/blog-content.md +0 -307
- package/.agents/skills/seed/recipes/checkout.md +0 -311
- package/.agents/skills/seed/recipes/company-about.md +0 -276
- package/.agents/skills/seed/recipes/company-contact.md +0 -234
- package/.agents/skills/seed/recipes/crud-form.md +0 -233
- package/.agents/skills/seed/recipes/crud-list-detail.md +0 -230
- package/.agents/skills/seed/recipes/dashboard.md +0 -354
- package/.agents/skills/seed/recipes/digital-workers.md +0 -314
- package/.agents/skills/seed/recipes/error-pages.md +0 -199
- package/.agents/skills/seed/recipes/marketing-landing.md +0 -293
- package/.agents/skills/seed/recipes/marketing-shell.md +0 -156
- package/.agents/skills/seed/recipes/navigation-shell.md +0 -787
- package/.agents/skills/seed/recipes/onboarding.md +0 -258
- package/.agents/skills/seed/recipes/pricing.md +0 -271
- package/.agents/skills/seed/recipes/service-detail.md +0 -302
- package/.agents/skills/seed/recipes/settings.md +0 -252
- package/.agents/skills/seed/references/blocks.md +0 -128
- package/.agents/skills/seed/references/components.md +0 -287
- package/.agents/skills/seed/references/icons.md +0 -169
- package/.agents/skills/seed/references/nextjs.md +0 -49
- package/.agents/skills/seed/references/tokens.md +0 -88
|
@@ -1,354 +0,0 @@
|
|
|
1
|
-
# Recipe: Dashboard
|
|
2
|
-
|
|
3
|
-
Overview/summary surface with KPIs, trends, charts, and quick actions. The primary authenticated landing page for data-driven apps.
|
|
4
|
-
|
|
5
|
-
## Route Pattern
|
|
6
|
-
|
|
7
|
-
`/dashboard`
|
|
8
|
-
|
|
9
|
-
## Shell
|
|
10
|
-
|
|
11
|
-
`app-shell` (Sidebar + top bar + SearchCommand)
|
|
12
|
-
|
|
13
|
-
## Layout Blueprint (Desktop)
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
+--+------------------------------------------------+
|
|
17
|
-
|S | Breadcrumb: Home > Dashboard |
|
|
18
|
-
|I | Dashboard [DateRange] [+ Action] |
|
|
19
|
-
|D | |
|
|
20
|
-
|E | +----------+ +----------+ +----------+ +------+ |
|
|
21
|
-
|B | | KPI 1 | | KPI 2 | | KPI 3 | | KPI 4| |
|
|
22
|
-
|A | | value | | value | | value | | val | |
|
|
23
|
-
|R | | [spark] | | [spark] | | [spark] | | [sp] | |
|
|
24
|
-
| | +----------+ +----------+ +----------+ +------+ |
|
|
25
|
-
| | |
|
|
26
|
-
| | +-------------------------------+ +-----------+ |
|
|
27
|
-
| | | Primary Chart (AreaChart) | | Secondary | |
|
|
28
|
-
| | | span-2 | | (BarChart)| |
|
|
29
|
-
| | +-------------------------------+ +-----------+ |
|
|
30
|
-
| | |
|
|
31
|
-
| | +--------------------------------------------+ |
|
|
32
|
-
| | | Activity Feed / Recent Items | |
|
|
33
|
-
| | +--------------------------------------------+ |
|
|
34
|
-
+--+------------------------------------------------+
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Section Sequence
|
|
40
|
-
|
|
41
|
-
### 1. Page Header
|
|
42
|
-
|
|
43
|
-
```tsx
|
|
44
|
-
<div className="flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between">
|
|
45
|
-
<div>
|
|
46
|
-
<Breadcrumb>
|
|
47
|
-
<BreadcrumbList>
|
|
48
|
-
<BreadcrumbItem><BreadcrumbLink href="/">Home</BreadcrumbLink></BreadcrumbItem>
|
|
49
|
-
<BreadcrumbSeparator />
|
|
50
|
-
<BreadcrumbItem><BreadcrumbLink href="/dashboard">Dashboard</BreadcrumbLink></BreadcrumbItem>
|
|
51
|
-
</BreadcrumbList>
|
|
52
|
-
</Breadcrumb>
|
|
53
|
-
<Heading level={2} size="section" >Dashboard</Heading>
|
|
54
|
-
</div>
|
|
55
|
-
<div className="flex items-center gap-3">
|
|
56
|
-
<DataFreshness lastUpdated={lastUpdated} isLive={false} />
|
|
57
|
-
<DatePickerWithRange value={dateRange} onChange={setDateRange} />
|
|
58
|
-
<Button>
|
|
59
|
-
<PlusIcon size={16} />
|
|
60
|
-
New Report
|
|
61
|
-
</Button>
|
|
62
|
-
</div>
|
|
63
|
-
</div>
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 2. KPI Row
|
|
67
|
-
|
|
68
|
-
Wrap in `StaggerChildren` for entrance animation. Each card includes a `Sparkline` for trend context and a `TrendIndicator` for directional change.
|
|
69
|
-
|
|
70
|
-
```tsx
|
|
71
|
-
<StaggerChildren staggerMs={80} className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 lg:gap-6">
|
|
72
|
-
{kpis.map(kpi => (
|
|
73
|
-
<Card key={kpi.id} className="glass-panel p-6">
|
|
74
|
-
<div className="flex items-center justify-between">
|
|
75
|
-
<Typography variant="small" className="text-text-secondary">
|
|
76
|
-
{kpi.label}
|
|
77
|
-
</Typography>
|
|
78
|
-
<TrendIndicator value={kpi.trend} />
|
|
79
|
-
</div>
|
|
80
|
-
<div className="mt-2">
|
|
81
|
-
<SlidingNumber
|
|
82
|
-
value={kpi.value}
|
|
83
|
-
className="metric-value text-3xl font-bold tracking-tight tabular-nums"
|
|
84
|
-
/>
|
|
85
|
-
</div>
|
|
86
|
-
<div className="mt-3 h-10">
|
|
87
|
-
<Sparkline data={kpi.sparkData} color={`var(--color-${kpi.chartColor})`} />
|
|
88
|
-
</div>
|
|
89
|
-
</Card>
|
|
90
|
-
))}
|
|
91
|
-
</StaggerChildren>
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
**Key details:**
|
|
95
|
-
- `metric-value` CSS class provides enhanced typography (defined in `index.css`)
|
|
96
|
-
- `tabular-nums` and `tracking-tight` keep numbers aligned across cards
|
|
97
|
-
- `SlidingNumber` for smooth digit transitions (preferred over `CountingNumber` for live dashboards)
|
|
98
|
-
- `Sparkline` height fixed at `h-10` (40px) for visual consistency
|
|
99
|
-
- `TrendIndicator` renders a colored arrow + percentage, auto-styles green/red
|
|
100
|
-
|
|
101
|
-
### 3. Charts Section
|
|
102
|
-
|
|
103
|
-
Use asymmetric grid (`lg:grid-cols-3`) with the primary chart spanning 2 columns.
|
|
104
|
-
|
|
105
|
-
```tsx
|
|
106
|
-
<ScrollFadeIn threshold={0.2} spring="gentle">
|
|
107
|
-
<div className="grid grid-cols-1 lg:grid-cols-3 gap-4 lg:gap-6">
|
|
108
|
-
{/* Primary chart: 2/3 width */}
|
|
109
|
-
<Card className="glass-panel p-6 lg:col-span-2">
|
|
110
|
-
<div className="flex items-center justify-between mb-4">
|
|
111
|
-
<Heading level={4} size="title" >Revenue Trend</Heading>
|
|
112
|
-
<Select value={chartMetric} onValueChange={setChartMetric}>
|
|
113
|
-
<SelectTrigger className="w-36">
|
|
114
|
-
<SelectValue />
|
|
115
|
-
</SelectTrigger>
|
|
116
|
-
<SelectContent>
|
|
117
|
-
<SelectItem value="revenue">Revenue</SelectItem>
|
|
118
|
-
<SelectItem value="orders">Orders</SelectItem>
|
|
119
|
-
</SelectContent>
|
|
120
|
-
</Select>
|
|
121
|
-
</div>
|
|
122
|
-
<ChartContainer config={revenueChartConfig} className="h-[300px]">
|
|
123
|
-
<AreaChart data={revenueData}>
|
|
124
|
-
<CartesianGrid strokeDasharray="3 3" />
|
|
125
|
-
<XAxis dataKey="date" />
|
|
126
|
-
<YAxis />
|
|
127
|
-
<ChartTooltip content={<ChartTooltipContent />} />
|
|
128
|
-
<Area
|
|
129
|
-
type="monotone"
|
|
130
|
-
dataKey="value"
|
|
131
|
-
fill="var(--color-chart-1)"
|
|
132
|
-
stroke="var(--color-chart-1)"
|
|
133
|
-
fillOpacity={0.15}
|
|
134
|
-
/>
|
|
135
|
-
</AreaChart>
|
|
136
|
-
</ChartContainer>
|
|
137
|
-
</Card>
|
|
138
|
-
|
|
139
|
-
{/* Secondary chart: 1/3 width */}
|
|
140
|
-
<Card className="glass-panel p-6">
|
|
141
|
-
<Heading level={4} size="title" className="mb-4">By Category</Heading>
|
|
142
|
-
<ChartContainer config={categoryChartConfig} className="h-[300px]">
|
|
143
|
-
<BarChart data={categoryData}>
|
|
144
|
-
<CartesianGrid strokeDasharray="3 3" />
|
|
145
|
-
<XAxis dataKey="name" />
|
|
146
|
-
<YAxis />
|
|
147
|
-
<ChartTooltip content={<ChartTooltipContent />} />
|
|
148
|
-
<Bar dataKey="value" fill="var(--color-chart-2)" radius={[4, 4, 0, 0]} />
|
|
149
|
-
</BarChart>
|
|
150
|
-
</ChartContainer>
|
|
151
|
-
</Card>
|
|
152
|
-
</div>
|
|
153
|
-
</ScrollFadeIn>
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
**Key details:**
|
|
157
|
-
- Always use `ChartContainer` with a `config` object (provides aria-label and theme-aware colors)
|
|
158
|
-
- Always use `ChartTooltip` + `ChartTooltipContent` (never custom tooltip divs)
|
|
159
|
-
- Chart colors reference tokens only: `var(--color-chart-1)` through `var(--color-chart-8)`
|
|
160
|
-
- `fillOpacity={0.15}` for area charts (premium transparency, not solid fills)
|
|
161
|
-
|
|
162
|
-
### 4. Activity Section
|
|
163
|
-
|
|
164
|
-
```tsx
|
|
165
|
-
<ScrollFadeIn threshold={0.2} spring="gentle">
|
|
166
|
-
<Card className="glass-panel p-6">
|
|
167
|
-
<div className="flex items-center justify-between mb-4">
|
|
168
|
-
<Heading level={4} size="title" >Recent Activity</Heading>
|
|
169
|
-
<Button variant="ghost" size="sm">View All</Button>
|
|
170
|
-
</div>
|
|
171
|
-
<Timeline
|
|
172
|
-
items={activityItems.map(item => ({
|
|
173
|
-
id: item.id,
|
|
174
|
-
title: item.title,
|
|
175
|
-
description: item.description,
|
|
176
|
-
timestamp: item.timestamp,
|
|
177
|
-
icon: item.icon,
|
|
178
|
-
variant: item.variant,
|
|
179
|
-
}))}
|
|
180
|
-
/>
|
|
181
|
-
</Card>
|
|
182
|
-
</ScrollFadeIn>
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
---
|
|
186
|
-
|
|
187
|
-
## Animation Storyboard
|
|
188
|
-
|
|
189
|
-
```
|
|
190
|
-
ANIMATION STORYBOARD
|
|
191
|
-
====================
|
|
192
|
-
BUDGET: 550ms | SPRING: snappy | REDUCED: opacity-only
|
|
193
|
-
|
|
194
|
-
T+0ms [shell] Sidebar + top bar visible instant
|
|
195
|
-
T+50ms [header] Page title + breadcrumb {fadeInUp, snappy}
|
|
196
|
-
T+130ms [kpi-1] First KPI + SlidingNumber {StaggerChildren 80ms}
|
|
197
|
-
T+210ms [kpi-2] Second KPI {StaggerChildren}
|
|
198
|
-
T+290ms [kpi-3] Third KPI {StaggerChildren}
|
|
199
|
-
T+370ms [kpi-4] Fourth KPI {StaggerChildren}
|
|
200
|
-
T+450ms [charts] ChartCard section {ScrollFadeIn, gentle}
|
|
201
|
-
T+550ms [activity] Activity section {ScrollFadeIn, gentle}
|
|
202
|
-
|
|
203
|
-
DATE FILTER CHANGE:
|
|
204
|
-
[kpis] SlidingNumber digits roll to new values built-in
|
|
205
|
-
[sparklines] Sparkline data transitions recharts built-in
|
|
206
|
-
[charts] Chart data transitions smoothly recharts built-in
|
|
207
|
-
|
|
208
|
-
REDUCED MOTION: All items visible immediately, opacity 0->1 in 10ms
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## Required Components
|
|
214
|
-
|
|
215
|
-
| Component | Import Path | Purpose |
|
|
216
|
-
|-----------|-------------|---------|
|
|
217
|
-
| `Card` | `@vadimcomanescu/nadicode-design-system/card` | KPI cards, chart containers, activity container |
|
|
218
|
-
| `Sparkline` | `@vadimcomanescu/nadicode-design-system/charts/sparkline` | Mini trend line in KPI cards |
|
|
219
|
-
| `TrendIndicator` | `@vadimcomanescu/nadicode-design-system/trend-indicator` | Directional change arrow + percentage |
|
|
220
|
-
| `Badge` | `@vadimcomanescu/nadicode-design-system/badge` | Status badges, trend labels |
|
|
221
|
-
| `Typography` | `@vadimcomanescu/nadicode-design-system/typography` | Page title, section headers, labels |
|
|
222
|
-
| `Breadcrumb` | `@vadimcomanescu/nadicode-design-system/breadcrumb` | Navigation context |
|
|
223
|
-
| `Button` | `@vadimcomanescu/nadicode-design-system/button` | Primary action, view-all links |
|
|
224
|
-
| `AreaChart` | `@vadimcomanescu/nadicode-design-system/charts/area-chart` | Primary trend chart |
|
|
225
|
-
| `BarChart` | `@vadimcomanescu/nadicode-design-system/charts/bar-chart` | Category breakdown |
|
|
226
|
-
| `ChartContainer` | `@vadimcomanescu/nadicode-design-system/chart` | Wraps all charts with config + aria |
|
|
227
|
-
| `ChartTooltip` | `@vadimcomanescu/nadicode-design-system/chart` | Theme-aware tooltip |
|
|
228
|
-
| `Timeline` | `@vadimcomanescu/nadicode-design-system/timeline` | Activity feed |
|
|
229
|
-
| `SlidingNumber` | `@vadimcomanescu/nadicode-design-system/text-effects/sliding-number` | Animated KPI values (digit roll) |
|
|
230
|
-
| `CountingNumber` | `@vadimcomanescu/nadicode-design-system/text-effects/counting-number` | Animated KPI values (count up) |
|
|
231
|
-
| `DatePickerWithRange` | `@vadimcomanescu/nadicode-design-system/date-range-picker` | Time filter |
|
|
232
|
-
| `DataFreshness` | `@vadimcomanescu/nadicode-design-system/data-freshness` | Last-updated timestamp indicator |
|
|
233
|
-
| `Skeleton` | `@vadimcomanescu/nadicode-design-system/skeleton` | Loading state placeholders |
|
|
234
|
-
| `Empty` | `@vadimcomanescu/nadicode-design-system/empty` | No-data state |
|
|
235
|
-
| `StaggerChildren` | `@vadimcomanescu/nadicode-design-system/stagger-children` | KPI row entrance stagger |
|
|
236
|
-
| `ScrollFadeIn` | `@vadimcomanescu/nadicode-design-system/scroll-fade-in` | Below-fold entrance animation |
|
|
237
|
-
| `Select` | `@vadimcomanescu/nadicode-design-system/select` | Chart metric selector |
|
|
238
|
-
|
|
239
|
-
### Allowed (optional)
|
|
240
|
-
|
|
241
|
-
`Tabs`, `Progress`, `ProgressRing`, `LineChart`, `PieChart`, `AgentMetricsCard`, `DataTable`, `Tooltip`, `StatusDot`, `HeatmapChart`
|
|
242
|
-
|
|
243
|
-
### Forbidden
|
|
244
|
-
|
|
245
|
-
`HeroBlock`, `PricingBlock`, `FormWizard`, `AuthLayout`, `TextReveal`, `AnimatedGradientText`, `AuroraEffect`, `MeteorShower`
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
## Required States
|
|
250
|
-
|
|
251
|
-
| State | Trigger | Visual |
|
|
252
|
-
|-------|---------|--------|
|
|
253
|
-
| `loading` | Initial page load, date filter change | Skeleton grid: 4 skeleton cards (match KPI card height) + 2 skeleton chart containers + skeleton timeline rows |
|
|
254
|
-
| `empty` | Zero data (first-time user) | `Empty` with chart icon, "No data yet" title, "Connect your first integration to start seeing metrics" description, primary CTA button |
|
|
255
|
-
| `has-data` | Data loaded | Full layout as described above |
|
|
256
|
-
| `error` | API failure | `Alert` variant="destructive" at top of content, with retry button. KPI cards show `--` values. Charts show empty state |
|
|
257
|
-
|
|
258
|
-
### Loading Skeleton Pattern
|
|
259
|
-
|
|
260
|
-
```tsx
|
|
261
|
-
{/* KPI skeleton row */}
|
|
262
|
-
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 lg:gap-6">
|
|
263
|
-
{Array.from({ length: 4 }).map((_, i) => (
|
|
264
|
-
<Card key={i} className="glass-panel p-6">
|
|
265
|
-
<Skeleton className="h-4 w-24 mb-2" />
|
|
266
|
-
<Skeleton className="h-8 w-32 mb-3" />
|
|
267
|
-
<Skeleton className="h-10 w-full" />
|
|
268
|
-
</Card>
|
|
269
|
-
))}
|
|
270
|
-
</div>
|
|
271
|
-
|
|
272
|
-
{/* Chart skeleton row */}
|
|
273
|
-
<div className="grid grid-cols-1 lg:grid-cols-3 gap-4 lg:gap-6 mt-6">
|
|
274
|
-
<Card className="glass-panel p-6 lg:col-span-2">
|
|
275
|
-
<Skeleton className="h-6 w-40 mb-4" />
|
|
276
|
-
<Skeleton className="h-[300px] w-full rounded-lg" />
|
|
277
|
-
</Card>
|
|
278
|
-
<Card className="glass-panel p-6">
|
|
279
|
-
<Skeleton className="h-6 w-32 mb-4" />
|
|
280
|
-
<Skeleton className="h-[300px] w-full rounded-lg" />
|
|
281
|
-
</Card>
|
|
282
|
-
</div>
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
|
-
## Responsive Contract
|
|
288
|
-
|
|
289
|
-
| Breakpoint | KPI Grid | Chart Grid | Activity | Sparklines |
|
|
290
|
-
|------------|----------|------------|----------|------------|
|
|
291
|
-
| Mobile | 1 col, stacked | 1 col, stacked | Full width | Hidden (`hidden sm:block`) |
|
|
292
|
-
| `sm:` | 2 col | 1 col | Full width | Visible |
|
|
293
|
-
| `lg:` | 4 col | 3 col (2+1 asymmetric) | Full width | Visible |
|
|
294
|
-
|
|
295
|
-
---
|
|
296
|
-
|
|
297
|
-
## Styling Rules
|
|
298
|
-
|
|
299
|
-
- KPI cards: `glass-panel` class (max 4 glass cards in KPI row)
|
|
300
|
-
- Chart containers: `glass-panel` class (max 1 additional glass card for activity = **5 total glass budget**)
|
|
301
|
-
- Chart colors: `chart-1` through `chart-8` tokens only, via `var(--color-chart-N)`
|
|
302
|
-
- Metric values: `metric-value` CSS class + `text-3xl font-bold tracking-tight tabular-nums`
|
|
303
|
-
- Labels: `text-text-secondary` for KPI labels, `text-text-tertiary` for comparison text
|
|
304
|
-
- Values: `text-text-primary` for metric numbers
|
|
305
|
-
- No raw palette colors (`bg-zinc-*`, `text-gray-*`, hardcoded hex)
|
|
306
|
-
- Grid gaps: `gap-4 lg:gap-6` consistently across all grid sections
|
|
307
|
-
- Section spacing: `mt-6` between major sections (header, KPIs, charts, activity)
|
|
308
|
-
|
|
309
|
-
### Glass Budget
|
|
310
|
-
|
|
311
|
-
Dashboard pages have a **max 5 glass-panel** budget:
|
|
312
|
-
- 4x KPI cards
|
|
313
|
-
- 1x grouped chart/activity section (or split: 2 chart cards + 1 activity card if needed)
|
|
314
|
-
|
|
315
|
-
If you need more containers, use `bg-surface` (solid) instead of `glass-panel`.
|
|
316
|
-
|
|
317
|
-
---
|
|
318
|
-
|
|
319
|
-
## Accessibility
|
|
320
|
-
|
|
321
|
-
- KPI cards: each has `aria-label` describing metric name, value, and trend direction (e.g., `aria-label="Revenue: $45,231, up 12.5% from last period"`)
|
|
322
|
-
- Charts: all wrapped in `ChartContainer` which provides `aria-label` describing the chart type and data summary
|
|
323
|
-
- Date filter: fully keyboard accessible, announces selected range to screen readers
|
|
324
|
-
- Activity timeline: rendered as semantic `<ol>` list markup with `role="feed"` or `aria-label="Recent activity"`
|
|
325
|
-
- Trend indicators: include screen-reader text (e.g., `<span className="sr-only">increased by</span>`)
|
|
326
|
-
- Color contrast: all text meets WCAG AA (4.5:1 body, 3:1 large text)
|
|
327
|
-
|
|
328
|
-
---
|
|
329
|
-
|
|
330
|
-
## Reference Implementations
|
|
331
|
-
|
|
332
|
-
- `src/app/dashboard/page.tsx`
|
|
333
|
-
- `src/components/blocks/StatsBlock.tsx` (KPI pattern)
|
|
334
|
-
- `src/components/blocks/ChartBlock.tsx` (chart container)
|
|
335
|
-
- `src/components/blocks/ChartCollectionBlock.tsx` (multi-chart grid)
|
|
336
|
-
- `src/components/blocks/ActivityFeedBlock.tsx` (activity feed)
|
|
337
|
-
|
|
338
|
-
---
|
|
339
|
-
|
|
340
|
-
## Verification
|
|
341
|
-
|
|
342
|
-
```bash
|
|
343
|
-
npx tsc --noEmit
|
|
344
|
-
npm run lint
|
|
345
|
-
npm run test
|
|
346
|
-
npx vitest run src/test/css-variable-usage.test.ts
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
Visual verification (mandatory): navigate to `/dashboard` in both light and dark mode. Check:
|
|
350
|
-
- KPI values are readable (not washed out in light mode)
|
|
351
|
-
- Glass panels have visible blur effect in dark mode
|
|
352
|
-
- Sparklines render with correct chart-token colors
|
|
353
|
-
- Skeleton loading state matches card dimensions
|
|
354
|
-
- Date picker opens and is keyboard navigable
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
# Recipe: Digital Workers
|
|
2
|
-
|
|
3
|
-
"Meet your AI team" showcase page presenting AI agent profiles, capabilities, and workflow integration.
|
|
4
|
-
|
|
5
|
-
## Route Pattern
|
|
6
|
-
|
|
7
|
-
`/digital-workers`, `/agents`, or `/platform`
|
|
8
|
-
|
|
9
|
-
## Shell
|
|
10
|
-
|
|
11
|
-
`marketing-shell` (HeaderBlock + FooterBlock)
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Layout Blueprint (Desktop)
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
+------------------------------------------------+
|
|
19
|
-
| HeaderBlock: Logo [Nav links] [CTA Button] |
|
|
20
|
-
+------------------------------------------------+
|
|
21
|
-
| |
|
|
22
|
-
| HERO SECTION |
|
|
23
|
-
| "Meet Your AI Team" |
|
|
24
|
-
| Subtitle: digital workers intro |
|
|
25
|
-
| [Primary CTA] [Secondary CTA] |
|
|
26
|
-
| |
|
|
27
|
-
+------------------------------------------------+
|
|
28
|
-
| |
|
|
29
|
-
| AGENT PROFILE GRID (BentoGrid) |
|
|
30
|
-
| +----------------+ +----------+ +----------+ |
|
|
31
|
-
| | | | Agent 2 | | Agent 3 | |
|
|
32
|
-
| | Agent 1 | +----------+ +----------+ |
|
|
33
|
-
| | (featured) | +----------+ +----------+ |
|
|
34
|
-
| | | | Agent 4 | | Agent 5 | |
|
|
35
|
-
| +----------------+ +----------+ +----------+ |
|
|
36
|
-
| |
|
|
37
|
-
+------------------------------------------------+
|
|
38
|
-
| |
|
|
39
|
-
| AGENT DEEP DIVE #1 (alternating) |
|
|
40
|
-
| +-------------------+ +------------------+ |
|
|
41
|
-
| | Visual / Demo | | Features list | |
|
|
42
|
-
| +-------------------+ +------------------+ |
|
|
43
|
-
| |
|
|
44
|
-
+------------------------------------------------+
|
|
45
|
-
| |
|
|
46
|
-
| AGENT DEEP DIVE #2 (reversed) |
|
|
47
|
-
| +------------------+ +-------------------+ |
|
|
48
|
-
| | Features list | | Visual / Demo | |
|
|
49
|
-
| +------------------+ +-------------------+ |
|
|
50
|
-
| |
|
|
51
|
-
+------------------------------------------------+
|
|
52
|
-
| |
|
|
53
|
-
| WORKFLOW GRAPH |
|
|
54
|
-
| How agents collaborate on tasks |
|
|
55
|
-
| [Agent A] → [Agent B] → [Agent C] |
|
|
56
|
-
| |
|
|
57
|
-
+------------------------------------------------+
|
|
58
|
-
| INTEGRATIONS |
|
|
59
|
-
| Logo grid of supported platforms |
|
|
60
|
-
+------------------------------------------------+
|
|
61
|
-
| |
|
|
62
|
-
| FAQ (Accordion) |
|
|
63
|
-
| |
|
|
64
|
-
+------------------------------------------------+
|
|
65
|
-
| FINAL CTA SECTION |
|
|
66
|
-
| Headline + [CTA Button] |
|
|
67
|
-
+------------------------------------------------+
|
|
68
|
-
| FooterBlock: columns + social + legal |
|
|
69
|
-
+------------------------------------------------+
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Section Sequence
|
|
75
|
-
|
|
76
|
-
### 1. Header
|
|
77
|
-
|
|
78
|
-
```tsx
|
|
79
|
-
<HeaderBlock logo={<Logo />} links={navLinks} actions={<Button>Get Started</Button>} />
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### 2. Hero Section
|
|
83
|
-
|
|
84
|
-
```tsx
|
|
85
|
-
<section className="relative py-24 md:py-32 overflow-hidden">
|
|
86
|
-
<ShaderBackground shader="meshGradient" intent="hero" opacity={0.2} />
|
|
87
|
-
<div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
|
88
|
-
<motion.div variants={heroStagger.container} initial="hidden" animate="visible">
|
|
89
|
-
<motion.div variants={heroStagger.child}>
|
|
90
|
-
<Badge variant="outline" className="mb-4">AI-Powered Team</Badge>
|
|
91
|
-
</motion.div>
|
|
92
|
-
<motion.h1 variants={heroStagger.child} className="text-4xl md:text-6xl font-bold tracking-tight">
|
|
93
|
-
Meet Your Digital Workers
|
|
94
|
-
</motion.h1>
|
|
95
|
-
<motion.p variants={heroStagger.child} className="mt-6 text-lg md:text-xl text-text-secondary max-w-2xl mx-auto">
|
|
96
|
-
Autonomous AI agents that work alongside your team, 24/7.
|
|
97
|
-
</motion.p>
|
|
98
|
-
<motion.div variants={heroStagger.child} className="mt-8 flex flex-col sm:flex-row gap-4 justify-center">
|
|
99
|
-
<Button size="lg">Deploy Your Team</Button>
|
|
100
|
-
<Button size="lg" variant="outline">See Them in Action</Button>
|
|
101
|
-
</motion.div>
|
|
102
|
-
</motion.div>
|
|
103
|
-
</div>
|
|
104
|
-
</section>
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### 3. Agent Profile Grid
|
|
108
|
-
|
|
109
|
-
```tsx
|
|
110
|
-
<ScrollFadeIn>
|
|
111
|
-
<section className="py-16 md:py-24">
|
|
112
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
113
|
-
<div className="text-center mb-12">
|
|
114
|
-
<Heading level={2} size="section" >Your AI Team</Heading>
|
|
115
|
-
<Typography variant="lead" className="mt-4 text-text-secondary">
|
|
116
|
-
Specialized agents for every business function
|
|
117
|
-
</Typography>
|
|
118
|
-
</div>
|
|
119
|
-
<AgentProfileGridBlock agents={agents} />
|
|
120
|
-
</div>
|
|
121
|
-
</section>
|
|
122
|
-
</ScrollFadeIn>
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
### 4. Agent Deep Dives (alternating FeatureBlocks)
|
|
126
|
-
|
|
127
|
-
```tsx
|
|
128
|
-
<ScrollFadeIn>
|
|
129
|
-
<section className="py-16 md:py-24 bg-muted">
|
|
130
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 space-y-24">
|
|
131
|
-
{agentDetails.map((agent, i) => (
|
|
132
|
-
<ScrollFadeIn key={agent.id}>
|
|
133
|
-
<FeatureBlock
|
|
134
|
-
title={agent.name}
|
|
135
|
-
description={agent.description}
|
|
136
|
-
features={agent.capabilities}
|
|
137
|
-
media={agent.visual}
|
|
138
|
-
reversed={i % 2 === 1}
|
|
139
|
-
/>
|
|
140
|
-
</ScrollFadeIn>
|
|
141
|
-
))}
|
|
142
|
-
</div>
|
|
143
|
-
</section>
|
|
144
|
-
</ScrollFadeIn>
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
### 5. Workflow Graph
|
|
148
|
-
|
|
149
|
-
```tsx
|
|
150
|
-
<ScrollFadeIn>
|
|
151
|
-
<section className="py-16 md:py-24">
|
|
152
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
153
|
-
<div className="text-center mb-12">
|
|
154
|
-
<Heading level={2} size="section" >How They Collaborate</Heading>
|
|
155
|
-
<Typography variant="lead" className="mt-4 text-text-secondary">
|
|
156
|
-
Agents work together seamlessly on complex workflows
|
|
157
|
-
</Typography>
|
|
158
|
-
</div>
|
|
159
|
-
<WorkflowGraph nodes={workflowNodes} edges={workflowEdges} />
|
|
160
|
-
</div>
|
|
161
|
-
</section>
|
|
162
|
-
</ScrollFadeIn>
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### 6. Integrations
|
|
166
|
-
|
|
167
|
-
```tsx
|
|
168
|
-
<ScrollFadeIn>
|
|
169
|
-
<section className="py-16 md:py-24 bg-muted">
|
|
170
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
171
|
-
<IntegrationsBlock integrations={integrations} />
|
|
172
|
-
</div>
|
|
173
|
-
</section>
|
|
174
|
-
</ScrollFadeIn>
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
### 7. FAQ
|
|
178
|
-
|
|
179
|
-
```tsx
|
|
180
|
-
<ScrollFadeIn>
|
|
181
|
-
<section className="py-16 md:py-24">
|
|
182
|
-
<FAQBlock items={faqItems} />
|
|
183
|
-
</section>
|
|
184
|
-
</ScrollFadeIn>
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### 8. Final CTA
|
|
188
|
-
|
|
189
|
-
```tsx
|
|
190
|
-
<ScrollFadeIn>
|
|
191
|
-
<section className="py-16 md:py-24">
|
|
192
|
-
<CallToActionBlock
|
|
193
|
-
title="Ready to build your AI team?"
|
|
194
|
-
description="Deploy your first digital worker in minutes."
|
|
195
|
-
action={<Button size="lg">Get Started</Button>}
|
|
196
|
-
/>
|
|
197
|
-
</section>
|
|
198
|
-
</ScrollFadeIn>
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
### 9. Footer
|
|
202
|
-
|
|
203
|
-
```tsx
|
|
204
|
-
<FooterBlock columns={footerColumns} social={socialLinks} legal={legalLinks} />
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
---
|
|
208
|
-
|
|
209
|
-
## Animation Storyboard
|
|
210
|
-
|
|
211
|
-
```
|
|
212
|
-
ANIMATION STORYBOARD
|
|
213
|
-
====================
|
|
214
|
-
BUDGET: 1000ms (above-fold) | SPRING: dramatic (hero), snappy (rest) | REDUCED: opacity-only
|
|
215
|
-
|
|
216
|
-
T+0ms [nav] Header visible (instant)
|
|
217
|
-
T+100ms [badge] Badge appears {fadeIn, snappy}
|
|
218
|
-
T+200ms [headline] Hero headline {fadeInUp, dramatic}
|
|
219
|
-
T+350ms [subtitle] Hero subtitle {fadeInUp, dramatic}
|
|
220
|
-
T+500ms [ctas] CTA buttons {fadeInUp, dramatic}
|
|
221
|
-
T+700ms [shader] Hero shader appears {fadeIn, gentle}
|
|
222
|
-
|
|
223
|
-
SCROLL-TRIGGERED (below fold):
|
|
224
|
-
[profiles] ScrollFadeIn at 20% visible {fadeInUp, snappy, stagger 100ms}
|
|
225
|
-
[deep-dives] ScrollFadeIn at 20% visible {fadeInUp, snappy}
|
|
226
|
-
[workflow] ScrollFadeIn at 20% visible {fadeIn, gentle, nodes stagger 200ms}
|
|
227
|
-
[integrations] ScrollFadeIn at 20% visible {fadeInUp, snappy}
|
|
228
|
-
[faq] ScrollFadeIn at 20% visible {fadeInUp, snappy}
|
|
229
|
-
[cta] ScrollFadeIn at 20% visible {scaleIn, gentle}
|
|
230
|
-
|
|
231
|
-
REDUCED MOTION: All items visible immediately, opacity 0->1 in 10ms
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## Required Components
|
|
237
|
-
|
|
238
|
-
| Component | Import Path | Purpose |
|
|
239
|
-
|-----------|-------------|---------|
|
|
240
|
-
| `HeaderBlock` | `@vadimcomanescu/nadicode-design-system/catalog/components` via `seedComponents` | Site navigation |
|
|
241
|
-
| `FooterBlock` | `@vadimcomanescu/nadicode-design-system/catalog/components` via `seedComponents` | Site footer |
|
|
242
|
-
| `Button` | `@vadimcomanescu/nadicode-design-system/button` | CTAs |
|
|
243
|
-
| `Badge` | `@vadimcomanescu/nadicode-design-system/badge` | Hero tag |
|
|
244
|
-
| `Typography` | `@vadimcomanescu/nadicode-design-system/typography` | Headings, body text |
|
|
245
|
-
| `ScrollFadeIn` | `@vadimcomanescu/nadicode-design-system/scroll-fade-in` | Below-fold animations |
|
|
246
|
-
| `AgentProfileGridBlock` | `@vadimcomanescu/nadicode-design-system/catalog/components` via `seedComponents` | Agent profile cards grid |
|
|
247
|
-
|
|
248
|
-
### Allowed (optional)
|
|
249
|
-
|
|
250
|
-
`HeroBlock`, `HeroSectionBlock`, `FeatureBlock`, `FeatureGridBlock`, `WorkflowGraph`, `IntegrationsBlock`, `FAQBlock`, `CallToActionBlock`, `StatsMarketingBlock`, `Card`, `BentoGrid`, `ShaderBackground`
|
|
251
|
-
|
|
252
|
-
### Forbidden
|
|
253
|
-
|
|
254
|
-
`Sidebar`, `DataTable`, `Form`, `FormWizard`, `SettingsLayout`, `ChatLayout`
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## Required States
|
|
259
|
-
|
|
260
|
-
| State | Trigger | Visual |
|
|
261
|
-
|-------|---------|--------|
|
|
262
|
-
| `default` | Page loaded | Full showcase content |
|
|
263
|
-
| `mobile-navigation` | Hamburger tap | Mobile nav drawer/sheet |
|
|
264
|
-
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
## Responsive Contract
|
|
268
|
-
|
|
269
|
-
| Breakpoint | Hero | Agent Grid | Deep Dives | Workflow | Content Width |
|
|
270
|
-
|------------|------|------------|------------|----------|---------------|
|
|
271
|
-
| Mobile | Stacked, text-center | 1 col | Stacked (image above) | Vertical | px-4 |
|
|
272
|
-
| `sm:` | Stacked, text-center | 2 col | Stacked (image above) | Vertical | px-6, max-w-7xl |
|
|
273
|
-
| `lg:` | Centered | 3 col bento | Side-by-side alternating | Horizontal | px-8, max-w-7xl |
|
|
274
|
-
|
|
275
|
-
---
|
|
276
|
-
|
|
277
|
-
## Styling Rules
|
|
278
|
-
|
|
279
|
-
- Agent cards use `glass-panel` with hover elevation to `glass-floating`
|
|
280
|
-
- Deep dive sections alternate `bg-background` and `bg-muted`
|
|
281
|
-
- Workflow graph uses `border-accent` for active connections
|
|
282
|
-
- Integration logos are grayscale with hover color reveal
|
|
283
|
-
- No raw palette colors; semantic tokens only
|
|
284
|
-
|
|
285
|
-
---
|
|
286
|
-
|
|
287
|
-
## Accessibility
|
|
288
|
-
|
|
289
|
-
- Hero heading is `<h1>`, section headings are `<h2>`
|
|
290
|
-
- Agent cards are focusable with descriptive labels
|
|
291
|
-
- Workflow graph has `aria-label` describing the flow
|
|
292
|
-
- Skip-nav link to main content
|
|
293
|
-
- All agent avatars/icons have alt text
|
|
294
|
-
- Mobile nav is keyboard accessible with focus trap
|
|
295
|
-
|
|
296
|
-
---
|
|
297
|
-
|
|
298
|
-
## Reference Implementations
|
|
299
|
-
|
|
300
|
-
- `src/components/blocks/AgentProfileGridBlock.tsx`
|
|
301
|
-
- `src/components/ui/WorkflowGraph.tsx`
|
|
302
|
-
- `src/components/blocks/FeatureBlock.tsx`
|
|
303
|
-
- `src/components/blocks/IntegrationsBlock.tsx`
|
|
304
|
-
|
|
305
|
-
---
|
|
306
|
-
|
|
307
|
-
## Verification
|
|
308
|
-
|
|
309
|
-
```bash
|
|
310
|
-
npx tsc --noEmit
|
|
311
|
-
npm run lint
|
|
312
|
-
npm run test
|
|
313
|
-
npx vitest run src/test/css-variable-usage.test.ts
|
|
314
|
-
```
|