@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,199 +0,0 @@
|
|
|
1
|
-
# Recipe: Error Pages
|
|
2
|
-
|
|
3
|
-
404 Not Found and 500 Server Error fallback surfaces with recovery CTAs.
|
|
4
|
-
|
|
5
|
-
## Route Patterns
|
|
6
|
-
|
|
7
|
-
- `/404` (or Next.js `not-found.tsx`)
|
|
8
|
-
- `/500` (or Next.js `error.tsx`)
|
|
9
|
-
- Any route with `notFound()` or unhandled error
|
|
10
|
-
|
|
11
|
-
## Shell
|
|
12
|
-
|
|
13
|
-
`fallback-shell` (minimal: logo + "go home" link, no sidebar or full nav)
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## Layout Blueprint
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
+------------------------------------------------+
|
|
21
|
-
| Logo [Home] |
|
|
22
|
-
+------------------------------------------------+
|
|
23
|
-
| |
|
|
24
|
-
| |
|
|
25
|
-
| [Illustration / Icon] |
|
|
26
|
-
| |
|
|
27
|
-
| 404 |
|
|
28
|
-
| Page not found |
|
|
29
|
-
| |
|
|
30
|
-
| The page you're looking for doesn't |
|
|
31
|
-
| exist or has been moved. |
|
|
32
|
-
| |
|
|
33
|
-
| [Go Home] [Contact Support] |
|
|
34
|
-
| |
|
|
35
|
-
| |
|
|
36
|
-
+------------------------------------------------+
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
## Section Sequence
|
|
42
|
-
|
|
43
|
-
### 1. Minimal Header
|
|
44
|
-
|
|
45
|
-
```tsx
|
|
46
|
-
<header className="flex items-center justify-between px-6 py-4">
|
|
47
|
-
<Logo className="h-6" />
|
|
48
|
-
<Button variant="ghost" asChild>
|
|
49
|
-
<a href="/">Home</a>
|
|
50
|
-
</Button>
|
|
51
|
-
</header>
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### 2. Error Content (centered)
|
|
55
|
-
|
|
56
|
-
```tsx
|
|
57
|
-
<main className="flex-1 flex items-center justify-center px-4">
|
|
58
|
-
<div className="text-center max-w-md">
|
|
59
|
-
{/* Large status code or icon */}
|
|
60
|
-
<div className="mb-6">
|
|
61
|
-
<Heading level={1} size="display" className="text-8xl font-bold text-text-tertiary">
|
|
62
|
-
{statusCode}
|
|
63
|
-
</Heading>
|
|
64
|
-
</div>
|
|
65
|
-
|
|
66
|
-
{/* Error message */}
|
|
67
|
-
<Heading level={2} size="section" className="mb-3">
|
|
68
|
-
{statusCode === 404 ? "Page not found" : "Something went wrong"}
|
|
69
|
-
</Heading>
|
|
70
|
-
<Typography variant="p" className="text-text-secondary mb-8">
|
|
71
|
-
{statusCode === 404
|
|
72
|
-
? "The page you're looking for doesn't exist or has been moved."
|
|
73
|
-
: "We're working on fixing this. Please try again in a moment."}
|
|
74
|
-
</Typography>
|
|
75
|
-
|
|
76
|
-
{/* Recovery actions */}
|
|
77
|
-
<div className="flex flex-col sm:flex-row gap-3 justify-center">
|
|
78
|
-
<Button asChild>
|
|
79
|
-
<a href="/">Go Home</a>
|
|
80
|
-
</Button>
|
|
81
|
-
{statusCode === 500 && (
|
|
82
|
-
<Button variant="outline" onClick={() => window.location.reload()}>
|
|
83
|
-
Try Again
|
|
84
|
-
</Button>
|
|
85
|
-
)}
|
|
86
|
-
<Button variant="outline" asChild>
|
|
87
|
-
<a href="/contact">Contact Support</a>
|
|
88
|
-
</Button>
|
|
89
|
-
</div>
|
|
90
|
-
</div>
|
|
91
|
-
</main>
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
---
|
|
95
|
-
|
|
96
|
-
## Animation Storyboard
|
|
97
|
-
|
|
98
|
-
```
|
|
99
|
-
ANIMATION STORYBOARD
|
|
100
|
-
====================
|
|
101
|
-
BUDGET: 250ms | SPRING: gentle | REDUCED: opacity-only
|
|
102
|
-
|
|
103
|
-
T+0ms [header] Logo + home link visible (instant)
|
|
104
|
-
T+50ms [code] Status code fades in {fadeIn, gentle}
|
|
105
|
-
T+100ms [title] Error title fades in {fadeInUp, gentle}
|
|
106
|
-
T+150ms [desc] Description fades in {fadeInUp, gentle}
|
|
107
|
-
T+250ms [actions] CTA buttons fade in {fadeIn, snappy}
|
|
108
|
-
|
|
109
|
-
REDUCED MOTION: All items visible immediately
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
---
|
|
113
|
-
|
|
114
|
-
## Required Components
|
|
115
|
-
|
|
116
|
-
| Component | Import Path | Purpose |
|
|
117
|
-
|-----------|-------------|---------|
|
|
118
|
-
| `Button` | `@vadimcomanescu/nadicode-design-system/button` | Recovery CTAs |
|
|
119
|
-
| `Typography` | `@vadimcomanescu/nadicode-design-system/typography` | Status code, title, description |
|
|
120
|
-
| `Logo` | `@vadimcomanescu/nadicode-design-system/logo` | Brand mark |
|
|
121
|
-
|
|
122
|
-
### Allowed (optional)
|
|
123
|
-
|
|
124
|
-
`Card` (to wrap error content), `NotFoundBlock`, any single decorative icon from `@vadimcomanescu/nadicode-design-system/icons`
|
|
125
|
-
|
|
126
|
-
### Forbidden
|
|
127
|
-
|
|
128
|
-
`Sidebar`, `DataTable`, charts, forms, `NavigationMenu`, heavy decorative effects, marketing blocks
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Required States
|
|
133
|
-
|
|
134
|
-
| State | Trigger | Visual |
|
|
135
|
-
|-------|---------|--------|
|
|
136
|
-
| `not-found` | 404 response or `notFound()` | "Page not found" with go-home CTA |
|
|
137
|
-
| `server-error` | 500 response or unhandled error | "Something went wrong" with retry + support CTAs |
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
## Responsive Contract
|
|
142
|
-
|
|
143
|
-
| Breakpoint | Layout | Buttons |
|
|
144
|
-
|------------|--------|---------|
|
|
145
|
-
| Mobile | Centered, full width, px-4 | Stacked vertically |
|
|
146
|
-
| `sm:` | Centered, max-w-md | Inline row |
|
|
147
|
-
|
|
148
|
-
---
|
|
149
|
-
|
|
150
|
-
## Styling Rules
|
|
151
|
-
|
|
152
|
-
- Status code: `text-8xl font-bold text-text-tertiary`
|
|
153
|
-
- Background: `bg-background min-h-dvh`
|
|
154
|
-
- No glass effects (keep it clean and fast)
|
|
155
|
-
- No sidebar or heavy chrome
|
|
156
|
-
- Semantic tokens only
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
## Accessibility
|
|
161
|
-
|
|
162
|
-
- Page has `role="main"` on content area
|
|
163
|
-
- Status code is decorative (title conveys the error)
|
|
164
|
-
- CTA buttons have descriptive text
|
|
165
|
-
- Focus auto-moves to primary CTA
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## Next.js Implementation
|
|
170
|
-
|
|
171
|
-
```tsx
|
|
172
|
-
// app/not-found.tsx (404)
|
|
173
|
-
export default function NotFound() {
|
|
174
|
-
return <ErrorPage statusCode={404} />
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// app/error.tsx (500)
|
|
178
|
-
"use client"
|
|
179
|
-
export default function Error({ reset }: { reset: () => void }) {
|
|
180
|
-
return <ErrorPage statusCode={500} onRetry={reset} />
|
|
181
|
-
}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
## Reference Implementations
|
|
187
|
-
|
|
188
|
-
- `src/app/not-found.tsx`
|
|
189
|
-
- `src/components/blocks/NotFoundBlock.tsx`
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## Verification
|
|
194
|
-
|
|
195
|
-
```bash
|
|
196
|
-
npx tsc --noEmit
|
|
197
|
-
npm run lint
|
|
198
|
-
npm run test
|
|
199
|
-
```
|
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
# Recipe: Marketing Landing
|
|
2
|
-
|
|
3
|
-
Public home/landing page with hero, features, social proof, and conversion CTAs.
|
|
4
|
-
|
|
5
|
-
## Route Pattern
|
|
6
|
-
|
|
7
|
-
`/` or `/landing`
|
|
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
|
-
| Headline (centered or split) |
|
|
24
|
-
| Subtitle |
|
|
25
|
-
| [Primary CTA] [Secondary CTA] |
|
|
26
|
-
| Hero visual / ShaderBackground |
|
|
27
|
-
| |
|
|
28
|
-
+------------------------------------------------+
|
|
29
|
-
| Logo Cloud: partner/client logos (InfiniteSlider)|
|
|
30
|
-
+------------------------------------------------+
|
|
31
|
-
| |
|
|
32
|
-
| FEATURES GRID (3-col) |
|
|
33
|
-
| +----------+ +----------+ +----------+ |
|
|
34
|
-
| | Feature 1| | Feature 2| | Feature 3| |
|
|
35
|
-
| +----------+ +----------+ +----------+ |
|
|
36
|
-
| +----------+ +----------+ +----------+ |
|
|
37
|
-
| | Feature 4| | Feature 5| | Feature 6| |
|
|
38
|
-
| +----------+ +----------+ +----------+ |
|
|
39
|
-
| |
|
|
40
|
-
+------------------------------------------------+
|
|
41
|
-
| SOCIAL PROOF / STATS |
|
|
42
|
-
| +------+ +------+ +------+ +------+ |
|
|
43
|
-
| | Stat | | Stat | | Stat | | Stat | |
|
|
44
|
-
| +------+ +------+ +------+ +------+ |
|
|
45
|
-
+------------------------------------------------+
|
|
46
|
-
| |
|
|
47
|
-
| TESTIMONIALS (carousel or grid) |
|
|
48
|
-
| |
|
|
49
|
-
+------------------------------------------------+
|
|
50
|
-
| PRICING TEASER |
|
|
51
|
-
| See plans / Compare options |
|
|
52
|
-
+------------------------------------------------+
|
|
53
|
-
| |
|
|
54
|
-
| FAQ (Accordion) |
|
|
55
|
-
| |
|
|
56
|
-
+------------------------------------------------+
|
|
57
|
-
| FINAL CTA SECTION |
|
|
58
|
-
| Headline + [CTA Button] |
|
|
59
|
-
+------------------------------------------------+
|
|
60
|
-
| FooterBlock: columns + social + legal |
|
|
61
|
-
+------------------------------------------------+
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## Section Sequence
|
|
67
|
-
|
|
68
|
-
### 1. Header
|
|
69
|
-
|
|
70
|
-
```tsx
|
|
71
|
-
<HeaderBlock logo={<Logo />} links={navLinks} actions={<Button>Get Started</Button>} />
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### 2. Hero Section
|
|
75
|
-
|
|
76
|
-
```tsx
|
|
77
|
-
<section className="relative py-24 md:py-32 overflow-hidden">
|
|
78
|
-
<ShaderBackground shader="meshGradient" intent="hero" opacity={0.25} />
|
|
79
|
-
<div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
|
80
|
-
<motion.div variants={heroStagger.container} initial="hidden" animate="visible">
|
|
81
|
-
<motion.div variants={heroStagger.child}>
|
|
82
|
-
<Badge variant="outline" className="mb-4">New: Feature X</Badge>
|
|
83
|
-
</motion.div>
|
|
84
|
-
<motion.h1 variants={heroStagger.child} className="text-4xl md:text-6xl font-bold tracking-tight">
|
|
85
|
-
{headline}
|
|
86
|
-
</motion.h1>
|
|
87
|
-
<motion.p variants={heroStagger.child} className="mt-6 text-lg md:text-xl text-text-secondary max-w-2xl mx-auto">
|
|
88
|
-
{subtitle}
|
|
89
|
-
</motion.p>
|
|
90
|
-
<motion.div variants={heroStagger.child} className="mt-8 flex flex-col sm:flex-row gap-4 justify-center">
|
|
91
|
-
<Button size="lg">Get Started</Button>
|
|
92
|
-
<Button size="lg" variant="outline">Learn More</Button>
|
|
93
|
-
</motion.div>
|
|
94
|
-
</motion.div>
|
|
95
|
-
</div>
|
|
96
|
-
</section>
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### 3. Logo Cloud
|
|
100
|
-
|
|
101
|
-
```tsx
|
|
102
|
-
<section className="py-12 border-y border-border-subtle">
|
|
103
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
104
|
-
<Typography variant="small" className="text-center text-text-tertiary mb-6">
|
|
105
|
-
Trusted by industry leaders
|
|
106
|
-
</Typography>
|
|
107
|
-
<LogoCloud logos={partnerLogos} /> {/* or InfiniteSlider */}
|
|
108
|
-
</div>
|
|
109
|
-
</section>
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### 4. Features Grid
|
|
113
|
-
|
|
114
|
-
```tsx
|
|
115
|
-
<ScrollFadeIn>
|
|
116
|
-
<section className="py-16 md:py-24">
|
|
117
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
118
|
-
<div className="text-center mb-12">
|
|
119
|
-
<Heading level={2} size="section" >Everything you need</Heading>
|
|
120
|
-
<Typography variant="lead" className="mt-4 text-text-secondary">
|
|
121
|
-
Section description
|
|
122
|
-
</Typography>
|
|
123
|
-
</div>
|
|
124
|
-
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 lg:gap-8">
|
|
125
|
-
{features.map(f => <FeatureBlock key={f.id} {...f} />)}
|
|
126
|
-
</div>
|
|
127
|
-
</div>
|
|
128
|
-
</section>
|
|
129
|
-
</ScrollFadeIn>
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### 5. Social Proof / Stats
|
|
133
|
-
|
|
134
|
-
```tsx
|
|
135
|
-
<ScrollFadeIn>
|
|
136
|
-
<section className="py-16 md:py-24 bg-muted">
|
|
137
|
-
<StatsMarketingBlock stats={stats} />
|
|
138
|
-
</section>
|
|
139
|
-
</ScrollFadeIn>
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### 6. Testimonials
|
|
143
|
-
|
|
144
|
-
```tsx
|
|
145
|
-
<ScrollFadeIn>
|
|
146
|
-
<section className="py-16 md:py-24">
|
|
147
|
-
<TestimonialsBlock testimonials={testimonials} />
|
|
148
|
-
</section>
|
|
149
|
-
</ScrollFadeIn>
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### 7. FAQ
|
|
153
|
-
|
|
154
|
-
```tsx
|
|
155
|
-
<ScrollFadeIn>
|
|
156
|
-
<section className="py-16 md:py-24">
|
|
157
|
-
<FAQBlock items={faqItems} />
|
|
158
|
-
</section>
|
|
159
|
-
</ScrollFadeIn>
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### 8. Final CTA
|
|
163
|
-
|
|
164
|
-
```tsx
|
|
165
|
-
<ScrollFadeIn>
|
|
166
|
-
<section className="py-16 md:py-24">
|
|
167
|
-
<CallToActionBlock
|
|
168
|
-
title="Ready to get started?"
|
|
169
|
-
description="Join thousands of teams already using our platform."
|
|
170
|
-
action={<Button size="lg">Start Free Trial</Button>}
|
|
171
|
-
/>
|
|
172
|
-
</section>
|
|
173
|
-
</ScrollFadeIn>
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
### 9. Footer
|
|
177
|
-
|
|
178
|
-
```tsx
|
|
179
|
-
<FooterBlock columns={footerColumns} social={socialLinks} legal={legalLinks} />
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
---
|
|
183
|
-
|
|
184
|
-
## Animation Storyboard
|
|
185
|
-
|
|
186
|
-
```
|
|
187
|
-
ANIMATION STORYBOARD
|
|
188
|
-
====================
|
|
189
|
-
BUDGET: 1000ms (above-fold) | SPRING: dramatic (hero), snappy (rest) | REDUCED: opacity-only
|
|
190
|
-
|
|
191
|
-
T+0ms [nav] Header visible (instant)
|
|
192
|
-
T+100ms [badge] Announcement badge {fadeIn, snappy}
|
|
193
|
-
T+200ms [headline] Hero headline {fadeInUp, dramatic}
|
|
194
|
-
T+350ms [subtitle] Hero subtitle {fadeInUp, dramatic}
|
|
195
|
-
T+500ms [ctas] CTA buttons {fadeInUp, dramatic}
|
|
196
|
-
T+700ms [shader] Hero visual/shader appears {fadeIn, gentle}
|
|
197
|
-
T+900ms [logos] Logo cloud fades in {fadeIn, snappy}
|
|
198
|
-
|
|
199
|
-
SCROLL-TRIGGERED (below fold):
|
|
200
|
-
[features] ScrollFadeIn at 20% visible {fadeInUp, snappy, stagger 100ms}
|
|
201
|
-
[stats] ScrollFadeIn at 20% visible {fadeInUp, snappy}
|
|
202
|
-
[testimonials] ScrollFadeIn at 20% visible {fadeIn, gentle}
|
|
203
|
-
[faq] ScrollFadeIn at 20% visible {fadeInUp, snappy}
|
|
204
|
-
[cta] ScrollFadeIn at 20% visible {scaleIn, gentle}
|
|
205
|
-
|
|
206
|
-
REDUCED MOTION: All items visible immediately, opacity 0->1 in 10ms
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
## Required Components
|
|
212
|
-
|
|
213
|
-
| Component | Import Path | Purpose |
|
|
214
|
-
|-----------|-------------|---------|
|
|
215
|
-
| `HeaderBlock` | `@vadimcomanescu/nadicode-design-system/header-block` | Site navigation |
|
|
216
|
-
| `FooterBlock` | `@vadimcomanescu/nadicode-design-system/footer-block` | Site footer |
|
|
217
|
-
| `Button` | `@vadimcomanescu/nadicode-design-system/button` | CTAs |
|
|
218
|
-
| `Badge` | `@vadimcomanescu/nadicode-design-system/badge` | Announcement tag |
|
|
219
|
-
| `Typography` | `@vadimcomanescu/nadicode-design-system/typography` | Headings, body text |
|
|
220
|
-
| `FeatureBlock` / `FeatureGridBlock` | `@vadimcomanescu/nadicode-design-system/feature*` | Feature showcase |
|
|
221
|
-
| `FAQBlock` | `@vadimcomanescu/nadicode-design-system/faq-block` | FAQ accordion |
|
|
222
|
-
| `CallToActionBlock` | `@vadimcomanescu/nadicode-design-system/call-to-action-block` | Final CTA |
|
|
223
|
-
| `TestimonialsBlock` | `@vadimcomanescu/nadicode-design-system/testimonials-block` | Social proof |
|
|
224
|
-
| `LogoCloud` | `@vadimcomanescu/nadicode-design-system/logo-cloud` | Partner logos |
|
|
225
|
-
| `StatsMarketingBlock` | `@vadimcomanescu/nadicode-design-system/stats-marketing-block` | Key metrics |
|
|
226
|
-
| `ScrollFadeIn` | `@vadimcomanescu/nadicode-design-system/scroll-fade-in` | Below-fold animations |
|
|
227
|
-
| `ShaderBackground` | `@vadimcomanescu/nadicode-design-system/shader-background` | Hero background |
|
|
228
|
-
|
|
229
|
-
### Allowed (optional)
|
|
230
|
-
|
|
231
|
-
`HeroBlock`, `HeroSectionBlock`, `SocialProofBlock`, `ComparisonBlock`, `BannerBlock`, `AnnouncementBanner`, `InfiniteSlider`, `AnimatedGradientText`, `CountingNumber`, `PricingBlock`, `BentoGrid`, decorative effects
|
|
232
|
-
|
|
233
|
-
### Forbidden
|
|
234
|
-
|
|
235
|
-
`Sidebar`, `DataTable`, `Form`, `FormWizard`, `AgentTeamPanel`, agentic components, `SettingsLayout`
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## Required States
|
|
240
|
-
|
|
241
|
-
| State | Trigger | Visual |
|
|
242
|
-
|-------|---------|--------|
|
|
243
|
-
| `default` | Page loaded | Full marketing content |
|
|
244
|
-
| `mobile-navigation` | Hamburger tap | Mobile nav drawer/sheet |
|
|
245
|
-
|
|
246
|
-
---
|
|
247
|
-
|
|
248
|
-
## Responsive Contract
|
|
249
|
-
|
|
250
|
-
| Breakpoint | Hero | Features | Stats | Content Width |
|
|
251
|
-
|------------|------|----------|-------|---------------|
|
|
252
|
-
| Mobile | Stacked, text-center | 1 col | 2 col | px-4 |
|
|
253
|
-
| `sm:` | Stacked, text-center | 2 col | 2 col | px-6, max-w-7xl |
|
|
254
|
-
| `lg:` | Centered or split | 3 col | 4 col | px-8, max-w-7xl |
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## Styling Rules
|
|
259
|
-
|
|
260
|
-
- Hero: `glass-floating` for elevated hero cards, `ShaderBackground` for ambient
|
|
261
|
-
- Section backgrounds alternate: `bg-background` and `bg-muted`
|
|
262
|
-
- CTAs use `Button` with `size="lg"` for prominence
|
|
263
|
-
- Logo cloud uses muted/grayscale logos with hover color reveal
|
|
264
|
-
- No raw palette colors; semantic tokens only
|
|
265
|
-
|
|
266
|
-
---
|
|
267
|
-
|
|
268
|
-
## Accessibility
|
|
269
|
-
|
|
270
|
-
- Hero heading is `<h1>`, section headings are `<h2>`
|
|
271
|
-
- Skip-nav link to main content (`SkipNav` component)
|
|
272
|
-
- All images have alt text
|
|
273
|
-
- CTA buttons have descriptive text (not just "Click here")
|
|
274
|
-
- Mobile nav is keyboard accessible with focus trap
|
|
275
|
-
|
|
276
|
-
---
|
|
277
|
-
|
|
278
|
-
## Reference Implementations
|
|
279
|
-
|
|
280
|
-
- `src/app/landing/page.tsx`
|
|
281
|
-
- `src/components/blocks/HeroBlock.tsx`
|
|
282
|
-
- `src/components/blocks/FeatureGridBlock.tsx`
|
|
283
|
-
|
|
284
|
-
---
|
|
285
|
-
|
|
286
|
-
## Verification
|
|
287
|
-
|
|
288
|
-
```bash
|
|
289
|
-
npx tsc --noEmit
|
|
290
|
-
npm run lint
|
|
291
|
-
npm run test
|
|
292
|
-
npx vitest run src/test/css-variable-usage.test.ts
|
|
293
|
-
```
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
# Recipe: Marketing Shell
|
|
2
|
-
|
|
3
|
-
Shared marketing layout providing scroll-aware header, main content area, and footer.
|
|
4
|
-
|
|
5
|
-
## Route Pattern
|
|
6
|
-
|
|
7
|
-
`(marketing)` route group layout
|
|
8
|
-
|
|
9
|
-
## Shell
|
|
10
|
-
|
|
11
|
-
`marketing-shell` (this IS the shell definition)
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Layout Blueprint (Desktop)
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
+------------------------------------------------+
|
|
19
|
-
| HeaderBlock: Logo [Nav links] [CTA Button] |
|
|
20
|
-
| glass-floating · blur-on-scroll · sticky |
|
|
21
|
-
+------------------------------------------------+
|
|
22
|
-
| |
|
|
23
|
-
| {children} |
|
|
24
|
-
| (page content rendered here) |
|
|
25
|
-
| |
|
|
26
|
-
+------------------------------------------------+
|
|
27
|
-
| FooterBlock: columns + social + legal |
|
|
28
|
-
+------------------------------------------------+
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
## Section Sequence
|
|
34
|
-
|
|
35
|
-
### 1. Layout Shell
|
|
36
|
-
|
|
37
|
-
```tsx
|
|
38
|
-
import { HeaderBlock } from '@vadimcomanescu/nadicode-design-system/header-block'
|
|
39
|
-
import { FooterBlock } from '@vadimcomanescu/nadicode-design-system/footer-block'
|
|
40
|
-
|
|
41
|
-
const navLinks = [
|
|
42
|
-
{ name: 'Services', href: '/services' },
|
|
43
|
-
{ name: 'About', href: '/about' },
|
|
44
|
-
{ name: 'Pricing', href: '/pricing' },
|
|
45
|
-
{ name: 'Contact', href: '/contact' },
|
|
46
|
-
]
|
|
47
|
-
|
|
48
|
-
export default function MarketingLayout({ children }: { children: React.ReactNode }) {
|
|
49
|
-
return (
|
|
50
|
-
<div className="flex min-h-screen flex-col bg-background">
|
|
51
|
-
<HeaderBlock
|
|
52
|
-
menuItems={navLinks}
|
|
53
|
-
loginLabel="Contact Sales"
|
|
54
|
-
signUpLabel="Get Started"
|
|
55
|
-
loginHref="/contact"
|
|
56
|
-
signUpHref="/signup"
|
|
57
|
-
/>
|
|
58
|
-
<main className="flex-1">{children}</main>
|
|
59
|
-
<FooterBlock />
|
|
60
|
-
</div>
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
## Animation Storyboard
|
|
68
|
-
|
|
69
|
-
```
|
|
70
|
-
ANIMATION STORYBOARD
|
|
71
|
-
====================
|
|
72
|
-
BUDGET: 200ms (header only) | SPRING: snappy | REDUCED: opacity-only
|
|
73
|
-
|
|
74
|
-
T+0ms [header] Header visible immediately (instant)
|
|
75
|
-
T+0ms [children] Page content visible (instant, page controls own animation)
|
|
76
|
-
|
|
77
|
-
SCROLL-TRIGGERED:
|
|
78
|
-
[header-blur] On scroll > 20px, glass blur transitions in {CSS transition, 200ms}
|
|
79
|
-
|
|
80
|
-
REDUCED MOTION: Header visible immediately, no blur transition
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## Required Components
|
|
86
|
-
|
|
87
|
-
| Component | Import Path | Purpose |
|
|
88
|
-
|-----------|-------------|---------|
|
|
89
|
-
| `HeaderBlock` | `@vadimcomanescu/nadicode-design-system/header-block` | Site navigation with glass blur |
|
|
90
|
-
| `FooterBlock` | `@vadimcomanescu/nadicode-design-system/footer-block` | Site footer |
|
|
91
|
-
|
|
92
|
-
### Allowed (optional)
|
|
93
|
-
|
|
94
|
-
`AnnouncementBanner`, `BannerBlock`, `SkipNav`
|
|
95
|
-
|
|
96
|
-
### Forbidden
|
|
97
|
-
|
|
98
|
-
`Sidebar`, `SidebarProvider`, `DataTable`, `Form`, `FormWizard`, `AgentTeamPanel`, `SettingsLayout`, `ChatLayout`
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
## Required States
|
|
103
|
-
|
|
104
|
-
| State | Trigger | Visual |
|
|
105
|
-
|-------|---------|--------|
|
|
106
|
-
| `default` | Page loaded | Header transparent, content visible |
|
|
107
|
-
| `scrolled` | Scroll > 20px | Header gains glass blur backdrop |
|
|
108
|
-
| `mobile-navigation` | Hamburger tap | Mobile nav drawer/sheet |
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## Responsive Contract
|
|
113
|
-
|
|
114
|
-
| Breakpoint | Header | Content | Footer |
|
|
115
|
-
|------------|--------|---------|--------|
|
|
116
|
-
| Mobile | Hamburger menu | Full width, px-4 | Stacked columns |
|
|
117
|
-
| `sm:` | Hamburger menu | px-6, max-w-7xl | 2-col grid |
|
|
118
|
-
| `lg:` | Full nav links + CTA | px-8, max-w-7xl | 4-col grid |
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## Styling Rules
|
|
123
|
-
|
|
124
|
-
- Header uses `glass-floating` with scroll-triggered blur
|
|
125
|
-
- Header is `sticky top-0 z-50`
|
|
126
|
-
- Main content area uses `flex-1` to push footer to bottom
|
|
127
|
-
- No raw palette colors; semantic tokens only
|
|
128
|
-
- Footer uses `bg-surface` with `border-t border-border`
|
|
129
|
-
|
|
130
|
-
---
|
|
131
|
-
|
|
132
|
-
## Accessibility
|
|
133
|
-
|
|
134
|
-
- Skip-nav link to main content (`SkipNav` component)
|
|
135
|
-
- Mobile nav is keyboard accessible with focus trap
|
|
136
|
-
- Header landmark: `<header role="banner">`
|
|
137
|
-
- Main landmark: `<main role="main">`
|
|
138
|
-
- Footer landmark: `<footer role="contentinfo">`
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## Reference Implementations
|
|
143
|
-
|
|
144
|
-
- `src/components/blocks/HeaderBlock.tsx`
|
|
145
|
-
- `src/components/blocks/FooterBlock.tsx`
|
|
146
|
-
|
|
147
|
-
---
|
|
148
|
-
|
|
149
|
-
## Verification
|
|
150
|
-
|
|
151
|
-
```bash
|
|
152
|
-
npx tsc --noEmit
|
|
153
|
-
npm run lint
|
|
154
|
-
npm run test
|
|
155
|
-
npx vitest run src/test/css-variable-usage.test.ts
|
|
156
|
-
```
|