@vadimcomanescu/nadicode-design-system 4.0.0 → 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 +38 -166
- package/.agents/skills/seed/references/animation.md +2 -2
- package/.agents/skills/seed/references/responsive.md +1 -1
- package/README.md +2 -2
- package/dist/catalog/components.js +4 -4
- package/dist/{chunk-7A2RXKGH.js → chunk-GJ557DGH.js} +1 -1
- package/dist/{chunk-7XLZCXUL.js → chunk-K4U67BVG.js} +1 -1
- package/dist/{chunk-TUJZMJXW.js → chunk-LK2L3C7D.js} +1 -1
- package/dist/{chunk-DSMGCFMJ.js → chunk-POFFOUQW.js} +2 -5
- package/dist/components/blocks/HeroBlock.js +2 -2
- package/dist/components/page-kits/LandingPageKit.js +3 -3
- package/dist/components/page-kits/ServiceSuitePageKit.js +3 -3
- package/dist/components/ui/AvatarUpload.js +1 -1
- package/dist/components/ui/MouseEffect.js +1 -1
- package/eslint-rules/nadicode/config.js +1 -0
- package/eslint-rules/nadicode/index.js +2 -0
- package/eslint-rules/nadicode/rules/__tests__/require-catalog-import.test.js +111 -0
- package/eslint-rules/nadicode/rules/no-has-svg-selector.js +1 -1
- package/eslint-rules/nadicode/rules/require-catalog-import.js +59 -0
- package/package.json +1 -338
- package/scripts/ds-check.mjs +0 -10
- package/scripts/sync-seed-skill.mjs +0 -3
- package/.agents/skills/seed/contract.md +0 -104
- 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 -786
- 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,311 +0,0 @@
|
|
|
1
|
-
# Recipe: Agency Home
|
|
2
|
-
|
|
3
|
-
AI agency/platform homepage oriented around selling AI services, showcasing process and outcomes.
|
|
4
|
-
|
|
5
|
-
## Route Pattern
|
|
6
|
-
|
|
7
|
-
`/` or `/home`
|
|
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
|
-
| Agency headline (centered) |
|
|
24
|
-
| Subtitle: what the agency delivers |
|
|
25
|
-
| [Primary CTA] [Secondary CTA] |
|
|
26
|
-
| ShaderBackground / ambient visual |
|
|
27
|
-
| |
|
|
28
|
-
+------------------------------------------------+
|
|
29
|
-
| Logo Cloud: client logos (InfiniteSlider) |
|
|
30
|
-
+------------------------------------------------+
|
|
31
|
-
| |
|
|
32
|
-
| SERVICES GRID (3-col) |
|
|
33
|
-
| +----------+ +----------+ +----------+ |
|
|
34
|
-
| | Service 1| | Service 2| | Service 3| |
|
|
35
|
-
| +----------+ +----------+ +----------+ |
|
|
36
|
-
| +----------+ +----------+ +----------+ |
|
|
37
|
-
| | Service 4| | Service 5| | Service 6| |
|
|
38
|
-
| +----------+ +----------+ +----------+ |
|
|
39
|
-
| |
|
|
40
|
-
+------------------------------------------------+
|
|
41
|
-
| PROCESS FLOW |
|
|
42
|
-
| [Step 1] → [Step 2] → [Step 3] → [Step 4] |
|
|
43
|
-
| How we work: discovery → design → deliver |
|
|
44
|
-
+------------------------------------------------+
|
|
45
|
-
| OUTCOME STATS |
|
|
46
|
-
| +------+ +------+ +------+ +------+ |
|
|
47
|
-
| | ROI | | Time | | Cost | | Scale| |
|
|
48
|
-
| | 340% | | -60% | | -45% | | 10x | |
|
|
49
|
-
| +------+ +------+ +------+ +------+ |
|
|
50
|
-
+------------------------------------------------+
|
|
51
|
-
| |
|
|
52
|
-
| TESTIMONIALS (carousel or grid) |
|
|
53
|
-
| |
|
|
54
|
-
+------------------------------------------------+
|
|
55
|
-
| |
|
|
56
|
-
| FAQ (Accordion) |
|
|
57
|
-
| |
|
|
58
|
-
+------------------------------------------------+
|
|
59
|
-
| FINAL CTA SECTION |
|
|
60
|
-
| Headline + [CTA Button] |
|
|
61
|
-
+------------------------------------------------+
|
|
62
|
-
| FooterBlock: columns + social + legal |
|
|
63
|
-
+------------------------------------------------+
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
---
|
|
67
|
-
|
|
68
|
-
## Section Sequence
|
|
69
|
-
|
|
70
|
-
### 1. Header
|
|
71
|
-
|
|
72
|
-
```tsx
|
|
73
|
-
<HeaderBlock logo={<Logo />} links={navLinks} actions={<Button>Book a Call</Button>} />
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### 2. Hero Section
|
|
77
|
-
|
|
78
|
-
```tsx
|
|
79
|
-
<section className="relative py-24 md:py-32 overflow-hidden">
|
|
80
|
-
<ShaderBackground shader="meshGradient" intent="hero" opacity={0.25} />
|
|
81
|
-
<div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
|
82
|
-
<motion.div variants={heroStagger.container} initial="hidden" animate="visible">
|
|
83
|
-
<motion.div variants={heroStagger.child}>
|
|
84
|
-
<Badge variant="outline" className="mb-4">AI-Powered Solutions</Badge>
|
|
85
|
-
</motion.div>
|
|
86
|
-
<motion.h1 variants={heroStagger.child} className="text-4xl md:text-6xl font-bold tracking-tight">
|
|
87
|
-
{headline}
|
|
88
|
-
</motion.h1>
|
|
89
|
-
<motion.p variants={heroStagger.child} className="mt-6 text-lg md:text-xl text-text-secondary max-w-2xl mx-auto">
|
|
90
|
-
{subtitle}
|
|
91
|
-
</motion.p>
|
|
92
|
-
<motion.div variants={heroStagger.child} className="mt-8 flex flex-col sm:flex-row gap-4 justify-center">
|
|
93
|
-
<Button size="lg">Book a Call</Button>
|
|
94
|
-
<Button size="lg" variant="outline">See Our Work</Button>
|
|
95
|
-
</motion.div>
|
|
96
|
-
</motion.div>
|
|
97
|
-
</div>
|
|
98
|
-
</section>
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### 3. Logo Cloud
|
|
102
|
-
|
|
103
|
-
```tsx
|
|
104
|
-
<section className="py-12 border-y border-border-subtle">
|
|
105
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
106
|
-
<Typography variant="small" className="text-center text-text-tertiary mb-6">
|
|
107
|
-
Trusted by forward-thinking companies
|
|
108
|
-
</Typography>
|
|
109
|
-
<LogoCloud logos={clientLogos} />
|
|
110
|
-
</div>
|
|
111
|
-
</section>
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### 4. Services Grid
|
|
115
|
-
|
|
116
|
-
```tsx
|
|
117
|
-
<ScrollFadeIn>
|
|
118
|
-
<section className="py-16 md:py-24">
|
|
119
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
120
|
-
<div className="text-center mb-12">
|
|
121
|
-
<Heading level={2} size="section" >Our Services</Heading>
|
|
122
|
-
<Typography variant="lead" className="mt-4 text-text-secondary">
|
|
123
|
-
End-to-end AI solutions tailored to your business
|
|
124
|
-
</Typography>
|
|
125
|
-
</div>
|
|
126
|
-
<FeatureGridBlock features={services} columns={3} />
|
|
127
|
-
</div>
|
|
128
|
-
</section>
|
|
129
|
-
</ScrollFadeIn>
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### 5. Process Flow
|
|
133
|
-
|
|
134
|
-
```tsx
|
|
135
|
-
<ScrollFadeIn>
|
|
136
|
-
<section className="py-16 md:py-24 bg-muted">
|
|
137
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
138
|
-
<div className="text-center mb-12">
|
|
139
|
-
<Heading level={2} size="section" >How We Work</Heading>
|
|
140
|
-
<Typography variant="lead" className="mt-4 text-text-secondary">
|
|
141
|
-
A proven process from discovery to deployment
|
|
142
|
-
</Typography>
|
|
143
|
-
</div>
|
|
144
|
-
<ProcessFlowBlock steps={processSteps} />
|
|
145
|
-
</div>
|
|
146
|
-
</section>
|
|
147
|
-
</ScrollFadeIn>
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### 6. Outcome Stats
|
|
151
|
-
|
|
152
|
-
```tsx
|
|
153
|
-
<ScrollFadeIn>
|
|
154
|
-
<section className="py-16 md:py-24">
|
|
155
|
-
<StatsMarketingBlock stats={outcomeStats} />
|
|
156
|
-
</section>
|
|
157
|
-
</ScrollFadeIn>
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
### 7. Testimonials
|
|
161
|
-
|
|
162
|
-
```tsx
|
|
163
|
-
<ScrollFadeIn>
|
|
164
|
-
<section className="py-16 md:py-24 bg-muted">
|
|
165
|
-
<TestimonialsBlock testimonials={testimonials} />
|
|
166
|
-
</section>
|
|
167
|
-
</ScrollFadeIn>
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### 8. FAQ
|
|
171
|
-
|
|
172
|
-
```tsx
|
|
173
|
-
<ScrollFadeIn>
|
|
174
|
-
<section className="py-16 md:py-24">
|
|
175
|
-
<FAQBlock items={faqItems} />
|
|
176
|
-
</section>
|
|
177
|
-
</ScrollFadeIn>
|
|
178
|
-
```
|
|
179
|
-
|
|
180
|
-
### 9. Final CTA
|
|
181
|
-
|
|
182
|
-
```tsx
|
|
183
|
-
<ScrollFadeIn>
|
|
184
|
-
<section className="py-16 md:py-24">
|
|
185
|
-
<CallToActionBlock
|
|
186
|
-
title="Ready to transform your business with AI?"
|
|
187
|
-
description="Book a free discovery call and see how we can help."
|
|
188
|
-
action={<Button size="lg">Book a Call</Button>}
|
|
189
|
-
/>
|
|
190
|
-
</section>
|
|
191
|
-
</ScrollFadeIn>
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### 10. Footer
|
|
195
|
-
|
|
196
|
-
```tsx
|
|
197
|
-
<FooterBlock columns={footerColumns} social={socialLinks} legal={legalLinks} />
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
---
|
|
201
|
-
|
|
202
|
-
## Animation Storyboard
|
|
203
|
-
|
|
204
|
-
```
|
|
205
|
-
ANIMATION STORYBOARD
|
|
206
|
-
====================
|
|
207
|
-
BUDGET: 1000ms (above-fold) | SPRING: dramatic (hero), snappy (rest) | REDUCED: opacity-only
|
|
208
|
-
|
|
209
|
-
T+0ms [nav] Header visible (instant)
|
|
210
|
-
T+100ms [badge] Agency badge {fadeIn, snappy}
|
|
211
|
-
T+200ms [headline] Hero headline {fadeInUp, dramatic}
|
|
212
|
-
T+350ms [subtitle] Hero subtitle {fadeInUp, dramatic}
|
|
213
|
-
T+500ms [ctas] CTA buttons {fadeInUp, dramatic}
|
|
214
|
-
T+700ms [shader] Hero visual/shader appears {fadeIn, gentle}
|
|
215
|
-
T+900ms [logos] Logo cloud fades in {fadeIn, snappy}
|
|
216
|
-
|
|
217
|
-
SCROLL-TRIGGERED (below fold):
|
|
218
|
-
[services] ScrollFadeIn at 20% visible {fadeInUp, snappy, stagger 100ms}
|
|
219
|
-
[process] ScrollFadeIn at 20% visible {fadeInUp, snappy, stagger 150ms}
|
|
220
|
-
[stats] ScrollFadeIn at 20% visible {fadeInUp, snappy}
|
|
221
|
-
[testimonials] ScrollFadeIn at 20% visible {fadeIn, gentle}
|
|
222
|
-
[faq] ScrollFadeIn at 20% visible {fadeInUp, snappy}
|
|
223
|
-
[cta] ScrollFadeIn at 20% visible {scaleIn, gentle}
|
|
224
|
-
|
|
225
|
-
REDUCED MOTION: All items visible immediately, opacity 0->1 in 10ms
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
## Required Components
|
|
231
|
-
|
|
232
|
-
| Component | Import Path | Purpose |
|
|
233
|
-
|-----------|-------------|---------|
|
|
234
|
-
| `HeaderBlock` | `@vadimcomanescu/nadicode-design-system/header-block` | Site navigation |
|
|
235
|
-
| `FooterBlock` | `@vadimcomanescu/nadicode-design-system/footer-block` | Site footer |
|
|
236
|
-
| `Button` | `@vadimcomanescu/nadicode-design-system/button` | CTAs |
|
|
237
|
-
| `Badge` | `@vadimcomanescu/nadicode-design-system/badge` | Hero tag |
|
|
238
|
-
| `Typography` | `@vadimcomanescu/nadicode-design-system/typography` | Headings, body text |
|
|
239
|
-
| `ScrollFadeIn` | `@vadimcomanescu/nadicode-design-system/scroll-fade-in` | Below-fold animations |
|
|
240
|
-
| `ProcessFlowBlock` | `@vadimcomanescu/nadicode-design-system/process-flow-block` | How-we-work process |
|
|
241
|
-
| `FeatureGridBlock` | `@vadimcomanescu/nadicode-design-system/feature-grid-block` | Services grid |
|
|
242
|
-
| `StatsMarketingBlock` | `@vadimcomanescu/nadicode-design-system/stats-marketing-block` | Outcome metrics (ROI, time saved) |
|
|
243
|
-
|
|
244
|
-
### Allowed (optional)
|
|
245
|
-
|
|
246
|
-
`HeroBlock`, `HeroSectionBlock`, `TestimonialsBlock`, `LogoCloud`, `FAQBlock`, `CallToActionBlock`, `SocialProofBlock`, `InfiniteSlider`, `CountingNumber`, `ShaderBackground`, `Card`, `BentoGrid`
|
|
247
|
-
|
|
248
|
-
### Forbidden
|
|
249
|
-
|
|
250
|
-
`Sidebar`, `DataTable`, `Form`, `FormWizard`, `AgentTeamPanel`, `AgentTerminal`, `SettingsLayout`, `ChatLayout`
|
|
251
|
-
|
|
252
|
-
---
|
|
253
|
-
|
|
254
|
-
## Required States
|
|
255
|
-
|
|
256
|
-
| State | Trigger | Visual |
|
|
257
|
-
|-------|---------|--------|
|
|
258
|
-
| `default` | Page loaded | Full marketing content |
|
|
259
|
-
| `mobile-navigation` | Hamburger tap | Mobile nav drawer/sheet |
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
## Responsive Contract
|
|
264
|
-
|
|
265
|
-
| Breakpoint | Hero | Services | Process | Stats | Content Width |
|
|
266
|
-
|------------|------|----------|---------|-------|---------------|
|
|
267
|
-
| Mobile | Stacked, text-center | 1 col | Vertical stack | 2 col | px-4 |
|
|
268
|
-
| `sm:` | Stacked, text-center | 2 col | Vertical stack | 2 col | px-6, max-w-7xl |
|
|
269
|
-
| `lg:` | Centered | 3 col | Horizontal flow | 4 col | px-8, max-w-7xl |
|
|
270
|
-
|
|
271
|
-
---
|
|
272
|
-
|
|
273
|
-
## Styling Rules
|
|
274
|
-
|
|
275
|
-
- Hero: `ShaderBackground` for ambient glow, `glass-floating` for elevated cards
|
|
276
|
-
- Section backgrounds alternate: `bg-background` and `bg-muted`
|
|
277
|
-
- Process flow uses connected step indicators with semantic `border-accent`
|
|
278
|
-
- Stats use `CountingNumber` for animated counters
|
|
279
|
-
- CTAs use `Button` with `size="lg"` for prominence
|
|
280
|
-
- No raw palette colors; semantic tokens only
|
|
281
|
-
|
|
282
|
-
---
|
|
283
|
-
|
|
284
|
-
## Accessibility
|
|
285
|
-
|
|
286
|
-
- Hero heading is `<h1>`, section headings are `<h2>`
|
|
287
|
-
- Skip-nav link to main content
|
|
288
|
-
- All images have alt text
|
|
289
|
-
- CTA buttons have descriptive text (not just "Click here")
|
|
290
|
-
- Mobile nav is keyboard accessible with focus trap
|
|
291
|
-
- Process flow steps are in an ordered list
|
|
292
|
-
|
|
293
|
-
---
|
|
294
|
-
|
|
295
|
-
## Reference Implementations
|
|
296
|
-
|
|
297
|
-
- `src/app/landing/page.tsx`
|
|
298
|
-
- `src/components/blocks/ProcessFlowBlock.tsx`
|
|
299
|
-
- `src/components/blocks/FeatureGridBlock.tsx`
|
|
300
|
-
- `src/components/blocks/StatsMarketingBlock.tsx`
|
|
301
|
-
|
|
302
|
-
---
|
|
303
|
-
|
|
304
|
-
## Verification
|
|
305
|
-
|
|
306
|
-
```bash
|
|
307
|
-
npx tsc --noEmit
|
|
308
|
-
npm run lint
|
|
309
|
-
npm run test
|
|
310
|
-
npx vitest run src/test/css-variable-usage.test.ts
|
|
311
|
-
```
|
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
# Recipe: Agent Chat
|
|
2
|
-
|
|
3
|
-
3-region agent workbench for AI agent interaction, tool monitoring, and artifact inspection.
|
|
4
|
-
|
|
5
|
-
## Route Patterns
|
|
6
|
-
|
|
7
|
-
- `/agents`
|
|
8
|
-
- `/voice-agents`
|
|
9
|
-
|
|
10
|
-
## Shell
|
|
11
|
-
|
|
12
|
-
`app-shell` (Sidebar + top bar + SearchCommand)
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Layout Blueprint (Desktop)
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
+--+------+---------------------------+---------+
|
|
20
|
-
| | Team | Conversation | Work |
|
|
21
|
-
|S | Panel| | Panel |
|
|
22
|
-
|I | | [AgentMessageBubble] | |
|
|
23
|
-
|D | Agent| [ToolCallCard] | [Tabs] |
|
|
24
|
-
|E | list | [ThinkingIndicator] | Work |
|
|
25
|
-
|B | with | [AgentMessageBubble] | Logs |
|
|
26
|
-
|A | status| [ApprovalCard] | Files |
|
|
27
|
-
|R | | | |
|
|
28
|
-
| | Team | [AgentMessageBubble] | Code |
|
|
29
|
-
| | metrics| | Diff |
|
|
30
|
-
| | | | |
|
|
31
|
-
| | +---------------------------+ Artifact|
|
|
32
|
-
| | | Composer | Card |
|
|
33
|
-
| | | [Textarea] [Send] | |
|
|
34
|
-
+--+------+---------------------------+---------+
|
|
35
|
-
|
|
36
|
-
Mobile: Conversation + Composer only.
|
|
37
|
-
Team panel: left Sheet. Work panel: right Sheet.
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## Section Sequence
|
|
43
|
-
|
|
44
|
-
### 1. Team & Status Panel (left, 280px)
|
|
45
|
-
|
|
46
|
-
```tsx
|
|
47
|
-
<aside className="hidden xl:flex flex-col w-[280px] border-r border-border bg-surface/50">
|
|
48
|
-
<div className="p-4 border-b border-border">
|
|
49
|
-
<Heading level={4} size="title" >Team</Heading>
|
|
50
|
-
</div>
|
|
51
|
-
<ScrollArea className="flex-1">
|
|
52
|
-
<AgentTeamPanel agents={agents} activeAgent={active} onSelect={setActive} />
|
|
53
|
-
<div className="p-4 border-t border-border">
|
|
54
|
-
<WorkflowGraph nodes={workflowNodes} edges={workflowEdges} />
|
|
55
|
-
</div>
|
|
56
|
-
<div className="p-4 mt-auto">
|
|
57
|
-
<AgentMetricsCard metrics={runMetrics} />
|
|
58
|
-
</div>
|
|
59
|
-
</ScrollArea>
|
|
60
|
-
<div className="p-4 border-t border-border">
|
|
61
|
-
<ContextMeter used={contextUsed} total={contextTotal} />
|
|
62
|
-
</div>
|
|
63
|
-
</aside>
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### 2. Conversation Region (center, flex-1)
|
|
67
|
-
|
|
68
|
-
```tsx
|
|
69
|
-
<main className="flex-1 flex flex-col min-w-0">
|
|
70
|
-
{/* Mobile header with panel triggers */}
|
|
71
|
-
<header className="xl:hidden flex items-center gap-2 p-3 border-b border-border">
|
|
72
|
-
<Sheet>
|
|
73
|
-
<SheetTrigger asChild>
|
|
74
|
-
<Button variant="ghost" size="icon"><UsersIcon size={16} /></Button>
|
|
75
|
-
</SheetTrigger>
|
|
76
|
-
<SheetContent side="left"><AgentTeamPanel ... /></SheetContent>
|
|
77
|
-
</Sheet>
|
|
78
|
-
<Heading level={4} size="title" className="flex-1 text-center truncate">
|
|
79
|
-
{runTitle}
|
|
80
|
-
</Heading>
|
|
81
|
-
<Sheet>
|
|
82
|
-
<SheetTrigger asChild>
|
|
83
|
-
<Button variant="ghost" size="icon"><FileTextIcon size={16} /></Button>
|
|
84
|
-
</SheetTrigger>
|
|
85
|
-
<SheetContent side="right"><WorkPanel ... /></SheetContent>
|
|
86
|
-
</Sheet>
|
|
87
|
-
</header>
|
|
88
|
-
|
|
89
|
-
{/* Message thread */}
|
|
90
|
-
<ScrollArea className="flex-1 p-4" aria-live="polite">
|
|
91
|
-
{messages.map(msg => {
|
|
92
|
-
if (msg.type === "thinking") return <ThinkingIndicator key={msg.id} />
|
|
93
|
-
if (msg.type === "tool") return (
|
|
94
|
-
<ToolCallCard key={msg.id} name={msg.tool} args={msg.args}
|
|
95
|
-
status={msg.status} result={msg.result} />
|
|
96
|
-
)
|
|
97
|
-
if (msg.type === "approval") return (
|
|
98
|
-
<ApprovalCard key={msg.id} action={msg.action}
|
|
99
|
-
onApprove={() => approve(msg.id)} onReject={() => reject(msg.id)} />
|
|
100
|
-
)
|
|
101
|
-
return (
|
|
102
|
-
<AgentMessageBubble key={msg.id} role={msg.role}
|
|
103
|
-
content={msg.content} isStreaming={msg.isStreaming} />
|
|
104
|
-
)
|
|
105
|
-
})}
|
|
106
|
-
</ScrollArea>
|
|
107
|
-
|
|
108
|
-
{/* Composer */}
|
|
109
|
-
<div className="p-4 border-t border-border">
|
|
110
|
-
<div className="flex items-end gap-2">
|
|
111
|
-
<Textarea
|
|
112
|
-
placeholder="Type a message..."
|
|
113
|
-
className="flex-1 min-h-[44px] max-h-[200px]"
|
|
114
|
-
value={input}
|
|
115
|
-
onChange={e => setInput(e.target.value)}
|
|
116
|
-
onKeyDown={handleKeyDown}
|
|
117
|
-
/>
|
|
118
|
-
<Button onClick={handleSend} disabled={!input.trim() || isSending}>
|
|
119
|
-
<SendIcon size={16} />
|
|
120
|
-
</Button>
|
|
121
|
-
</div>
|
|
122
|
-
</div>
|
|
123
|
-
</main>
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### 3. Work Panel (right, 320px)
|
|
127
|
-
|
|
128
|
-
```tsx
|
|
129
|
-
<aside className="hidden xl:flex flex-col w-[320px] border-l border-border">
|
|
130
|
-
<Tabs value={workTab} onValueChange={setWorkTab} className="flex flex-col h-full">
|
|
131
|
-
<TabsList className="mx-4 mt-4">
|
|
132
|
-
<TabsTrigger value="work">Work</TabsTrigger>
|
|
133
|
-
<TabsTrigger value="logs">Logs</TabsTrigger>
|
|
134
|
-
<TabsTrigger value="files">Files</TabsTrigger>
|
|
135
|
-
</TabsList>
|
|
136
|
-
<ScrollArea className="flex-1">
|
|
137
|
-
<TabsContent value="work" className="p-4 space-y-4">
|
|
138
|
-
{artifacts.map(a => <ArtifactCard key={a.id} {...a} />)}
|
|
139
|
-
</TabsContent>
|
|
140
|
-
<TabsContent value="logs" className="p-4">
|
|
141
|
-
<AgentTerminal lines={logLines} />
|
|
142
|
-
</TabsContent>
|
|
143
|
-
<TabsContent value="files" className="p-4 space-y-4">
|
|
144
|
-
{diffs.map(d => <CodeDiffViewer key={d.file} {...d} />)}
|
|
145
|
-
</TabsContent>
|
|
146
|
-
</ScrollArea>
|
|
147
|
-
</Tabs>
|
|
148
|
-
</aside>
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## Animation Storyboard
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
ANIMATION STORYBOARD
|
|
157
|
-
====================
|
|
158
|
-
BUDGET: 300ms (shell) | STREAMING: continuous | REDUCED: opacity-only
|
|
159
|
-
|
|
160
|
-
T+0ms [shell] All panels visible (instant)
|
|
161
|
-
T+50ms [team] Team panel content fades in {fadeIn, snappy}
|
|
162
|
-
T+100ms [messages] Message history fades in {fadeIn, snappy}
|
|
163
|
-
T+200ms [work] Work panel content fades in {fadeIn, snappy}
|
|
164
|
-
|
|
165
|
-
NEW MESSAGE (runtime):
|
|
166
|
-
T+0ms [bubble] Message slides up from bottom {slideInUp, snappy, y: 16px}
|
|
167
|
-
|
|
168
|
-
TOOL CALL (runtime):
|
|
169
|
-
T+0ms [toolcard] Card expands in-place {scaleIn, snappy}
|
|
170
|
-
T+0ms [status] Status badge animates {fadeIn, micro}
|
|
171
|
-
|
|
172
|
-
THINKING (runtime):
|
|
173
|
-
T+0ms [dots] Pulsing dot animation (continuous CSS)
|
|
174
|
-
|
|
175
|
-
APPROVAL (runtime):
|
|
176
|
-
T+0ms [card] ApprovalCard scales in {scaleIn, gentle}
|
|
177
|
-
|
|
178
|
-
REDUCED MOTION: Items appear instantly, no slide/scale
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## Required Components
|
|
184
|
-
|
|
185
|
-
### Chat Primitives (preferred)
|
|
186
|
-
|
|
187
|
-
| Component | Import Path | Purpose |
|
|
188
|
-
|-----------|-------------|---------|
|
|
189
|
-
| `Conversation` | `.../conversation` | Scroll-aware container with auto-scroll |
|
|
190
|
-
| `ChatMessage` | `.../chat-message` | Core message with avatar, content, actions |
|
|
191
|
-
| `ChatResponse` | `.../chat-response` | Streaming markdown response renderer |
|
|
192
|
-
| `ChatPromptInput` | `.../chat-prompt-input` | Chat text input with keyboard handling |
|
|
193
|
-
| `ChatToolCall` | `.../chat-tool-call` | Tool call lifecycle wrapper |
|
|
194
|
-
| `ChatActions` | `.../chat-actions` | Copy, retry, edit action buttons |
|
|
195
|
-
| `ChatGreeting` | `.../chat-greeting` | Welcome greeting for sessions |
|
|
196
|
-
| `ChatThinkingMessage` | `.../chat-thinking-message` | Animated thinking state |
|
|
197
|
-
| `ChatShimmer` | `.../chat-shimmer` | Loading shimmer placeholder |
|
|
198
|
-
| `ChatReasoning` | `.../chat-reasoning` | AI reasoning with auto-close |
|
|
199
|
-
| `ChatConfirmation` | `.../chat-confirmation` | Action confirmation dialog |
|
|
200
|
-
| `ChatSuggestion` | `.../chat-suggestion` | Follow-up prompt chips |
|
|
201
|
-
| `ChatSources` | `.../chat-sources` | Source citations panel |
|
|
202
|
-
| `ChatBranch` | `.../chat-branch` | Conversation fork navigation |
|
|
203
|
-
| `ChatChainOfThought` | `.../chat-chain-of-thought` | Step-by-step reasoning |
|
|
204
|
-
| `ChatPlan` | `.../chat-plan` | Collapsible plan card |
|
|
205
|
-
| `ChatQueue` | `.../chat-queue` | Task queue with sections |
|
|
206
|
-
| `ChatPromptInputAttachments` | `.../chat-prompt-input-attachments` | File attachment support |
|
|
207
|
-
|
|
208
|
-
### Agent-Level Components
|
|
209
|
-
|
|
210
|
-
| Component | Import Path | Purpose |
|
|
211
|
-
|-----------|-------------|---------|
|
|
212
|
-
| `AgentTeamPanel` | `.../agent-team-panel` | Team member list |
|
|
213
|
-
| `AgentStatus` | `.../agent-status` | Connection status |
|
|
214
|
-
| `AgentTimeline` | `.../agent-timeline` | Action timeline |
|
|
215
|
-
| `AgentMetricsCard` | `.../agent-metrics-card` | Run metrics |
|
|
216
|
-
| `ConversationThread` | `.../conversation-thread` | Legacy message rendering |
|
|
217
|
-
| `AgentMessageBubble` | `.../agent-message-bubble` | Individual messages |
|
|
218
|
-
| `ThinkingIndicator` | `.../thinking-indicator` | Processing state |
|
|
219
|
-
| `ToolCallCard` | `.../tool-call-card` | Tool invocations |
|
|
220
|
-
| `ApprovalCard` | `.../approval-card` | Human approval flow |
|
|
221
|
-
| `CodeDiffViewer` | `.../code-diff-viewer` | Code changes |
|
|
222
|
-
| `ArtifactCard` | `.../artifact-card` | Generated outputs |
|
|
223
|
-
| `AgentTerminal` | `.../agent-terminal` | Command output |
|
|
224
|
-
| `WorkflowGraph` | `.../workflow-graph` | DAG execution flow |
|
|
225
|
-
| `ContextMeter` | `.../context-meter` | Context window usage |
|
|
226
|
-
| `SourceCitation` | `.../source-citation` | Referenced sources |
|
|
227
|
-
| `Tabs` | `.../tabs` | Work panel tabs |
|
|
228
|
-
| `Button` | `.../button` | Send, panel triggers |
|
|
229
|
-
| `ScrollArea` | `.../scroll-area` | Scrollable regions |
|
|
230
|
-
| `Sheet` | `.../sheet` | Mobile panel drawers |
|
|
231
|
-
|
|
232
|
-
### Allowed (optional)
|
|
233
|
-
|
|
234
|
-
`HandoffIndicator`, `MemoryInspector`, `StreamingText`, `Badge`, `Avatar`, `AgentAvatar`, `Resizable`
|
|
235
|
-
|
|
236
|
-
### Forbidden
|
|
237
|
-
|
|
238
|
-
`HeroBlock`, `PricingBlock`, `FormWizard`, `DataTable`, marketing blocks, decorative effects
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
## Required States
|
|
243
|
-
|
|
244
|
-
| State | Trigger | Visual |
|
|
245
|
-
|-------|---------|--------|
|
|
246
|
-
| `empty` | No active run | `Empty` with "Start a conversation" message |
|
|
247
|
-
| `loading` | History loading | Skeleton message bubbles |
|
|
248
|
-
| `running` | Agent(s) active | Live conversation with streaming |
|
|
249
|
-
| `thinking` | Agent processing | `ThinkingIndicator` in message thread |
|
|
250
|
-
| `blocked-approval` | Awaiting user action | `ApprovalCard` prominent in thread |
|
|
251
|
-
| `failed` | Run or tool error | Error message in thread + retry option |
|
|
252
|
-
| `complete` | Run finished | Final message with artifacts summary |
|
|
253
|
-
| `over-budget` | Cost/token threshold exceeded | Warning badge on metrics, pause prompt |
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## Responsive Contract
|
|
258
|
-
|
|
259
|
-
| Breakpoint | Team Panel | Conversation | Work Panel |
|
|
260
|
-
|------------|------------|-------------|------------|
|
|
261
|
-
| Mobile | Hidden (Sheet, left) | Full width + composer | Hidden (Sheet, right) |
|
|
262
|
-
| `lg:` | Sidebar 280px | Flex-1 | Hidden (Sheet) |
|
|
263
|
-
| `xl:` | Sidebar 280px | Flex-1 | Panel 320px |
|
|
264
|
-
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
## Styling Rules
|
|
268
|
-
|
|
269
|
-
- Panel backgrounds: `bg-surface/50` or `bg-background`
|
|
270
|
-
- Panel borders: `border-border`
|
|
271
|
-
- Message bubbles: styled by `AgentMessageBubble` (role-based)
|
|
272
|
-
- Tool call cards: `glass-panel` with status color
|
|
273
|
-
- Composer: `border-t border-border` with `p-4`
|
|
274
|
-
- No raw palette colors
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
|
-
## Accessibility
|
|
279
|
-
|
|
280
|
-
- Message thread uses `aria-live="polite"` for streaming updates
|
|
281
|
-
- All interactive controls have visible focus rings
|
|
282
|
-
- Panel toggles on mobile have `aria-label`
|
|
283
|
-
- Composer textarea has `aria-label="Message input"`
|
|
284
|
-
- Approval buttons are clearly labeled (approve/reject)
|
|
285
|
-
- Tab navigation for work panel is keyboard accessible
|
|
286
|
-
|
|
287
|
-
---
|
|
288
|
-
|
|
289
|
-
## Reference Implementations
|
|
290
|
-
|
|
291
|
-
- `src/app/voice-agents/page.tsx`
|
|
292
|
-
- `src/components/pages/VoiceAgentsPage.tsx`
|
|
293
|
-
- `src/components/blocks/AgentConversationBlock.tsx`
|
|
294
|
-
- `src/components/blocks/ChatLayout.tsx`
|
|
295
|
-
|
|
296
|
-
---
|
|
297
|
-
|
|
298
|
-
## Verification
|
|
299
|
-
|
|
300
|
-
```bash
|
|
301
|
-
npx tsc --noEmit
|
|
302
|
-
npm run lint
|
|
303
|
-
npm run test
|
|
304
|
-
npx vitest run src/test/css-variable-usage.test.ts
|
|
305
|
-
```
|