@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,258 +0,0 @@
|
|
|
1
|
-
# Recipe: Onboarding
|
|
2
|
-
|
|
3
|
-
First-run setup wizard with step-by-step progression and completion celebration.
|
|
4
|
-
|
|
5
|
-
## Route Pattern
|
|
6
|
-
|
|
7
|
-
`/onboarding` (with optional `/onboarding/[step]`)
|
|
8
|
-
|
|
9
|
-
## Shell
|
|
10
|
-
|
|
11
|
-
`onboarding-shell` (minimal header with logo + progress bar, no navigation)
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Layout Blueprint (Desktop)
|
|
16
|
-
|
|
17
|
-
```
|
|
18
|
-
+------------------------------------------------+
|
|
19
|
-
| Logo Step 2 of 5 [Skip] |
|
|
20
|
-
+------------------------------------------------+
|
|
21
|
-
| [===------] Progress bar (40%) |
|
|
22
|
-
+------------------------------------------------+
|
|
23
|
-
| |
|
|
24
|
-
| +--------------------------------------+ |
|
|
25
|
-
| | Step Title | |
|
|
26
|
-
| | Step description | |
|
|
27
|
-
| | | |
|
|
28
|
-
| | [Step-specific content] | |
|
|
29
|
-
| | - Form fields, selections, | |
|
|
30
|
-
| | checkboxes, team invite, etc. | |
|
|
31
|
-
| | | |
|
|
32
|
-
| +--------------------------------------+ |
|
|
33
|
-
| |
|
|
34
|
-
| [Back] [Continue] |
|
|
35
|
-
+------------------------------------------------+
|
|
36
|
-
|
|
37
|
-
Completion (final step):
|
|
38
|
-
+------------------------------------------------+
|
|
39
|
-
| |
|
|
40
|
-
| [ConfettiBurst] |
|
|
41
|
-
| [SuccessCheck] |
|
|
42
|
-
| |
|
|
43
|
-
| Welcome aboard, [Name]! |
|
|
44
|
-
| Your workspace is ready. |
|
|
45
|
-
| |
|
|
46
|
-
| [Go to Dashboard] |
|
|
47
|
-
| |
|
|
48
|
-
+------------------------------------------------+
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
---
|
|
52
|
-
|
|
53
|
-
## Section Sequence
|
|
54
|
-
|
|
55
|
-
### 1. Onboarding Header
|
|
56
|
-
|
|
57
|
-
```tsx
|
|
58
|
-
<header className="flex items-center justify-between px-6 py-4 border-b border-border">
|
|
59
|
-
<Logo className="h-6" />
|
|
60
|
-
<Typography variant="small" className="text-text-secondary">
|
|
61
|
-
Step {currentStep} of {totalSteps}
|
|
62
|
-
</Typography>
|
|
63
|
-
<Button variant="ghost" size="sm" onClick={handleSkip}>Skip</Button>
|
|
64
|
-
</header>
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### 2. Progress Bar
|
|
68
|
-
|
|
69
|
-
```tsx
|
|
70
|
-
<Progress value={(currentStep / totalSteps) * 100} className="h-1 rounded-none" />
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
### 3. Step Content (using FormWizard or manual)
|
|
74
|
-
|
|
75
|
-
```tsx
|
|
76
|
-
<div className="flex-1 flex items-center justify-center p-6">
|
|
77
|
-
<div className="w-full max-w-lg">
|
|
78
|
-
<Heading level={2} size="section" className="mb-2">{step.title}</Heading>
|
|
79
|
-
<Typography variant="lead" className="text-text-secondary mb-8">
|
|
80
|
-
{step.description}
|
|
81
|
-
</Typography>
|
|
82
|
-
|
|
83
|
-
{/* Step-specific content */}
|
|
84
|
-
{step.type === "form" && (
|
|
85
|
-
<div className="space-y-4">
|
|
86
|
-
<FormField>{/* Fields for this step */}</FormField>
|
|
87
|
-
</div>
|
|
88
|
-
)}
|
|
89
|
-
{step.type === "selection" && (
|
|
90
|
-
<div className="grid grid-cols-2 gap-4">
|
|
91
|
-
{step.options.map(opt => (
|
|
92
|
-
<Card
|
|
93
|
-
key={opt.id}
|
|
94
|
-
className={cn("glass-panel p-4 cursor-pointer", selected === opt.id && "ring-2 ring-accent")}
|
|
95
|
-
onClick={() => setSelected(opt.id)}
|
|
96
|
-
>
|
|
97
|
-
{opt.label}
|
|
98
|
-
</Card>
|
|
99
|
-
))}
|
|
100
|
-
</div>
|
|
101
|
-
)}
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
### 4. Navigation Controls
|
|
107
|
-
|
|
108
|
-
```tsx
|
|
109
|
-
<footer className="flex items-center justify-between px-6 py-4 border-t border-border">
|
|
110
|
-
<Button variant="ghost" onClick={handleBack} disabled={currentStep === 1}>
|
|
111
|
-
Back
|
|
112
|
-
</Button>
|
|
113
|
-
<Button onClick={handleNext} disabled={!stepValid}>
|
|
114
|
-
{currentStep === totalSteps ? "Complete Setup" : "Continue"}
|
|
115
|
-
</Button>
|
|
116
|
-
</footer>
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### 5. Completion Celebration
|
|
120
|
-
|
|
121
|
-
```tsx
|
|
122
|
-
<div className="flex-1 flex flex-col items-center justify-center p-6 text-center">
|
|
123
|
-
<ConfettiBurst trigger={showCelebration} />
|
|
124
|
-
<SuccessCheck className="mb-6" />
|
|
125
|
-
<Heading level={2} size="section" >Welcome aboard, {name}!</Heading>
|
|
126
|
-
<Typography variant="lead" className="text-text-secondary mt-2 mb-8">
|
|
127
|
-
Your workspace is ready to go.
|
|
128
|
-
</Typography>
|
|
129
|
-
<Button size="lg" onClick={() => router.push("/dashboard")}>
|
|
130
|
-
Go to Dashboard
|
|
131
|
-
</Button>
|
|
132
|
-
</div>
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## Standard Steps (3-5 recommended)
|
|
138
|
-
|
|
139
|
-
| Step | Content | Validation |
|
|
140
|
-
|------|---------|------------|
|
|
141
|
-
| 1. Profile | Name, avatar upload | Name required |
|
|
142
|
-
| 2. Workspace | Workspace name, URL slug | Name required, slug unique |
|
|
143
|
-
| 3. Preferences | Role selection, use case | At least 1 selected |
|
|
144
|
-
| 4. Team | Invite team members (optional) | Skip-able |
|
|
145
|
-
| 5. Complete | Celebration + CTA | Auto-valid |
|
|
146
|
-
|
|
147
|
-
---
|
|
148
|
-
|
|
149
|
-
## Animation Storyboard
|
|
150
|
-
|
|
151
|
-
```
|
|
152
|
-
ANIMATION STORYBOARD
|
|
153
|
-
====================
|
|
154
|
-
BUDGET: 400ms per step | SPRING: gentle | REDUCED: opacity-only
|
|
155
|
-
|
|
156
|
-
STEP TRANSITION (forward):
|
|
157
|
-
T+0ms [current] Current step slides out left {slideOutLeft, gentle}
|
|
158
|
-
T+100ms [next] Next step slides in from right {slideInRight, gentle}
|
|
159
|
-
T+200ms [fields] Step fields stagger in {blockStagger, 60ms}
|
|
160
|
-
|
|
161
|
-
STEP TRANSITION (back):
|
|
162
|
-
T+0ms [current] Current step slides out right
|
|
163
|
-
T+100ms [prev] Previous step slides in from left
|
|
164
|
-
|
|
165
|
-
COMPLETION:
|
|
166
|
-
T+0ms [confetti] ConfettiBurst fires (particle animation)
|
|
167
|
-
T+100ms [check] SuccessCheck animates {scaleIn, bouncy}
|
|
168
|
-
T+300ms [text] Welcome text fades in {fadeInUp, gentle}
|
|
169
|
-
T+450ms [cta] Dashboard button fades in {fadeIn, snappy}
|
|
170
|
-
|
|
171
|
-
REDUCED MOTION: Steps swap instantly (opacity only), confetti disabled
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
## Required Components
|
|
177
|
-
|
|
178
|
-
| Component | Import Path | Purpose |
|
|
179
|
-
|-----------|-------------|---------|
|
|
180
|
-
| `Progress` | `@vadimcomanescu/nadicode-design-system/progress` | Step progress bar |
|
|
181
|
-
| `Button` | `@vadimcomanescu/nadicode-design-system/button` | Navigation, completion |
|
|
182
|
-
| `Card` | `@vadimcomanescu/nadicode-design-system/card` | Selection cards, step container |
|
|
183
|
-
| `Typography` | `@vadimcomanescu/nadicode-design-system/typography` | Step titles, descriptions |
|
|
184
|
-
| `Logo` | `@vadimcomanescu/nadicode-design-system/logo` | Brand mark in header |
|
|
185
|
-
| `Input` | `@vadimcomanescu/nadicode-design-system/input` | Form fields |
|
|
186
|
-
| `ConfettiBurst` | `@vadimcomanescu/nadicode-design-system/confetti-burst` | Completion celebration |
|
|
187
|
-
| `SuccessCheck` | `@vadimcomanescu/nadicode-design-system/success-check` | Completion checkmark |
|
|
188
|
-
| `FormWizard` | `@vadimcomanescu/nadicode-design-system/form-wizard` | Multi-step form wrapper (optional) |
|
|
189
|
-
|
|
190
|
-
### Allowed (optional)
|
|
191
|
-
|
|
192
|
-
`AvatarUpload`, `Select`, `Checkbox`, `RadioGroup`, `TagInput`, `Label`, `Form`, `FormField`, `Stepper`, `Step`, `Badge`, `Separator`
|
|
193
|
-
|
|
194
|
-
### Forbidden
|
|
195
|
-
|
|
196
|
-
`Sidebar`, `DataTable`, chart components, `NavigationMenu`, `HeroBlock`, agentic components
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## Required States
|
|
201
|
-
|
|
202
|
-
| State | Trigger | Visual |
|
|
203
|
-
|-------|---------|--------|
|
|
204
|
-
| `step-active` | Viewing a step | Step content visible, progress updated |
|
|
205
|
-
| `step-valid` | Step requirements met | Continue button enabled |
|
|
206
|
-
| `step-error` | Validation failure | Field-level errors shown |
|
|
207
|
-
| `step-saving` | Server-side step save | Continue button shows Spinner |
|
|
208
|
-
| `complete` | Final step completed | Celebration screen |
|
|
209
|
-
|
|
210
|
-
---
|
|
211
|
-
|
|
212
|
-
## Responsive Contract
|
|
213
|
-
|
|
214
|
-
| Breakpoint | Step Content | Navigation |
|
|
215
|
-
|------------|-------------|------------|
|
|
216
|
-
| Mobile | Full width, px-4, max-w-lg | Stacked back/next, full width |
|
|
217
|
-
| `sm:` | Centered, max-w-lg | Back left, Continue right |
|
|
218
|
-
| `lg:` | Same as sm (onboarding stays narrow) | Same |
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## Styling Rules
|
|
223
|
-
|
|
224
|
-
- Step container: centered, `max-w-lg`
|
|
225
|
-
- Selection cards: `glass-panel` with `ring-2 ring-accent` when selected
|
|
226
|
-
- Progress bar: `h-1 rounded-none` for full-width slim bar
|
|
227
|
-
- No sidebar, no heavy navigation
|
|
228
|
-
- Background: `bg-background` (clean, minimal)
|
|
229
|
-
|
|
230
|
-
---
|
|
231
|
-
|
|
232
|
-
## Accessibility
|
|
233
|
-
|
|
234
|
-
- Progress bar has `aria-valuenow`, `aria-valuemin`, `aria-valuemax`
|
|
235
|
-
- Step transitions announce new step title via `aria-live="polite"`
|
|
236
|
-
- Back/Continue buttons have descriptive labels
|
|
237
|
-
- Skip button explains what's skipped
|
|
238
|
-
- Focus moves to step title on transition
|
|
239
|
-
|
|
240
|
-
---
|
|
241
|
-
|
|
242
|
-
## Reference Implementations
|
|
243
|
-
|
|
244
|
-
- `src/app/onboarding/page.tsx`
|
|
245
|
-
- `src/components/blocks/OnboardingBlock.tsx`
|
|
246
|
-
- `src/components/blocks/WizardBlock.tsx`
|
|
247
|
-
- `src/components/ui/FormWizard.tsx`
|
|
248
|
-
|
|
249
|
-
---
|
|
250
|
-
|
|
251
|
-
## Verification
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
npx tsc --noEmit
|
|
255
|
-
npm run lint
|
|
256
|
-
npm run test
|
|
257
|
-
npx vitest run src/test/css-variable-usage.test.ts
|
|
258
|
-
```
|
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
# Recipe: Pricing
|
|
2
|
-
|
|
3
|
-
Plan comparison page with billing toggle, feature matrix, and conversion CTAs.
|
|
4
|
-
|
|
5
|
-
## Route Pattern
|
|
6
|
-
|
|
7
|
-
`/pricing`
|
|
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
|
-
| PRICING HERO |
|
|
23
|
-
| "Simple, transparent pricing" |
|
|
24
|
-
| "No hidden fees. Cancel anytime." |
|
|
25
|
-
| |
|
|
26
|
-
| [Monthly] [Annual - Save 20%] (toggle) |
|
|
27
|
-
| |
|
|
28
|
-
+------------------------------------------------+
|
|
29
|
-
| |
|
|
30
|
-
| +----------+ +------------+ +----------+ |
|
|
31
|
-
| | Free | | Pro | | Enterprise| |
|
|
32
|
-
| | $0/mo | | $29/mo | | Custom | |
|
|
33
|
-
| | | | [Popular] | | | |
|
|
34
|
-
| | Feature 1| | Feature 1 | | Feature 1| |
|
|
35
|
-
| | Feature 2| | Feature 2 | | Feature 2| |
|
|
36
|
-
| | Feature 3| | Feature 3 | | Feature 3| |
|
|
37
|
-
| | ... | | ... | | ... | |
|
|
38
|
-
| | | | | | | |
|
|
39
|
-
| | [Start] | | [Start] | | [Contact]| |
|
|
40
|
-
| +----------+ +------------+ +----------+ |
|
|
41
|
-
| |
|
|
42
|
-
+------------------------------------------------+
|
|
43
|
-
| FEATURE COMPARISON TABLE |
|
|
44
|
-
| (expandable, full feature matrix) |
|
|
45
|
-
+------------------------------------------------+
|
|
46
|
-
| |
|
|
47
|
-
| FAQ SECTION |
|
|
48
|
-
| |
|
|
49
|
-
+------------------------------------------------+
|
|
50
|
-
| FINAL CTA |
|
|
51
|
-
+------------------------------------------------+
|
|
52
|
-
| FooterBlock |
|
|
53
|
-
+------------------------------------------------+
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## Section Sequence
|
|
59
|
-
|
|
60
|
-
### 1. Pricing Hero
|
|
61
|
-
|
|
62
|
-
```tsx
|
|
63
|
-
<section className="py-16 md:py-24 text-center">
|
|
64
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
65
|
-
<Heading level={1} size="display" >Simple, transparent pricing</Heading>
|
|
66
|
-
<Typography variant="lead" className="mt-4 text-text-secondary max-w-2xl mx-auto">
|
|
67
|
-
No hidden fees. Cancel anytime.
|
|
68
|
-
</Typography>
|
|
69
|
-
<div className="mt-8 inline-flex items-center gap-3">
|
|
70
|
-
<Typography variant="small" className={cn(!isAnnual && "font-bold")}>Monthly</Typography>
|
|
71
|
-
<Switch checked={isAnnual} onCheckedChange={setIsAnnual} />
|
|
72
|
-
<Typography variant="small" className={cn(isAnnual && "font-bold")}>
|
|
73
|
-
Annual <Badge variant="success" className="ml-1">Save 20%</Badge>
|
|
74
|
-
</Typography>
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
</section>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### 2. Plan Cards
|
|
81
|
-
|
|
82
|
-
```tsx
|
|
83
|
-
<section className="pb-16 md:pb-24">
|
|
84
|
-
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
85
|
-
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6 lg:gap-8">
|
|
86
|
-
{plans.map(plan => (
|
|
87
|
-
<Card
|
|
88
|
-
key={plan.id}
|
|
89
|
-
className={cn("glass-panel p-8 relative", plan.popular && "ring-2 ring-accent")}
|
|
90
|
-
>
|
|
91
|
-
{plan.popular && (
|
|
92
|
-
<Badge className="absolute -top-3 left-1/2 -translate-x-1/2" variant="default">
|
|
93
|
-
Most Popular
|
|
94
|
-
</Badge>
|
|
95
|
-
)}
|
|
96
|
-
<Heading level={4} size="title" >{plan.name}</Heading>
|
|
97
|
-
<div className="mt-4 flex items-baseline gap-1">
|
|
98
|
-
<span className="text-4xl font-bold">${isAnnual ? plan.annualPrice : plan.monthlyPrice}</span>
|
|
99
|
-
<span className="text-text-secondary">/mo</span>
|
|
100
|
-
</div>
|
|
101
|
-
<Typography variant="small" className="text-text-secondary mt-2">
|
|
102
|
-
{plan.description}
|
|
103
|
-
</Typography>
|
|
104
|
-
<Separator className="my-6" />
|
|
105
|
-
<ul className="space-y-3">
|
|
106
|
-
{plan.features.map(f => (
|
|
107
|
-
<li key={f} className="flex items-center gap-2 text-sm">
|
|
108
|
-
<CheckIcon size={16} className="text-success shrink-0" />
|
|
109
|
-
{f}
|
|
110
|
-
</li>
|
|
111
|
-
))}
|
|
112
|
-
</ul>
|
|
113
|
-
<Button
|
|
114
|
-
className="w-full mt-8"
|
|
115
|
-
variant={plan.popular ? "default" : "outline"}
|
|
116
|
-
>
|
|
117
|
-
{plan.cta}
|
|
118
|
-
</Button>
|
|
119
|
-
</Card>
|
|
120
|
-
))}
|
|
121
|
-
</div>
|
|
122
|
-
</div>
|
|
123
|
-
</section>
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### 3. Feature Comparison (optional)
|
|
127
|
-
|
|
128
|
-
```tsx
|
|
129
|
-
<ScrollFadeIn>
|
|
130
|
-
<section className="py-16 md:py-24 bg-muted">
|
|
131
|
-
<ComparisonBlock items={featureMatrix} />
|
|
132
|
-
</section>
|
|
133
|
-
</ScrollFadeIn>
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### 4. FAQ
|
|
137
|
-
|
|
138
|
-
```tsx
|
|
139
|
-
<ScrollFadeIn>
|
|
140
|
-
<section className="py-16 md:py-24">
|
|
141
|
-
<FAQBlock items={pricingFaqItems} />
|
|
142
|
-
</section>
|
|
143
|
-
</ScrollFadeIn>
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### 5. Final CTA
|
|
147
|
-
|
|
148
|
-
```tsx
|
|
149
|
-
<ScrollFadeIn>
|
|
150
|
-
<CallToActionBlock
|
|
151
|
-
title="Start building today"
|
|
152
|
-
description="Free plan available. No credit card required."
|
|
153
|
-
action={<Button size="lg">Get Started Free</Button>}
|
|
154
|
-
/>
|
|
155
|
-
</ScrollFadeIn>
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
## Animation Storyboard
|
|
161
|
-
|
|
162
|
-
```
|
|
163
|
-
ANIMATION STORYBOARD
|
|
164
|
-
====================
|
|
165
|
-
BUDGET: 800ms | SPRING: snappy (cards), dramatic (hero) | REDUCED: opacity-only
|
|
166
|
-
|
|
167
|
-
T+0ms [nav] Header visible (instant)
|
|
168
|
-
T+100ms [headline] Pricing headline {fadeInUp, dramatic}
|
|
169
|
-
T+250ms [subtitle] Subtitle + toggle {fadeInUp, dramatic}
|
|
170
|
-
T+400ms [card-1] First plan card {fadeInUp, snappy}
|
|
171
|
-
T+500ms [card-2] Second plan card (popular) {fadeInUp, snappy}
|
|
172
|
-
T+600ms [card-3] Third plan card {fadeInUp, snappy}
|
|
173
|
-
|
|
174
|
-
TOGGLE ANIMATION:
|
|
175
|
-
[prices] Price numbers animate {CountingNumber transition}
|
|
176
|
-
[badge] Annual badge scales in {scaleIn, bouncy}
|
|
177
|
-
|
|
178
|
-
SCROLL-TRIGGERED:
|
|
179
|
-
[comparison] ScrollFadeIn at 20% {fadeInUp, snappy}
|
|
180
|
-
[faq] ScrollFadeIn at 20% {fadeInUp, snappy}
|
|
181
|
-
[cta] ScrollFadeIn at 20% {scaleIn, gentle}
|
|
182
|
-
|
|
183
|
-
REDUCED MOTION: All items visible immediately
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
---
|
|
187
|
-
|
|
188
|
-
## Required Components
|
|
189
|
-
|
|
190
|
-
| Component | Import Path | Purpose |
|
|
191
|
-
|-----------|-------------|---------|
|
|
192
|
-
| `Card` | `@vadimcomanescu/nadicode-design-system/card` | Plan cards |
|
|
193
|
-
| `Badge` | `@vadimcomanescu/nadicode-design-system/badge` | Popular tag, annual savings |
|
|
194
|
-
| `Button` | `@vadimcomanescu/nadicode-design-system/button` | Plan CTAs |
|
|
195
|
-
| `Switch` | `@vadimcomanescu/nadicode-design-system/switch` | Billing toggle |
|
|
196
|
-
| `Typography` | `@vadimcomanescu/nadicode-design-system/typography` | Headings, descriptions |
|
|
197
|
-
| `Separator` | `@vadimcomanescu/nadicode-design-system/separator` | Plan card divider |
|
|
198
|
-
| `FAQBlock` | `@vadimcomanescu/nadicode-design-system/faq-block` | FAQ section |
|
|
199
|
-
| `CallToActionBlock` | `@vadimcomanescu/nadicode-design-system/call-to-action-block` | Final CTA |
|
|
200
|
-
| `HeaderBlock` | `@vadimcomanescu/nadicode-design-system/header-block` | Navigation |
|
|
201
|
-
| `FooterBlock` | `@vadimcomanescu/nadicode-design-system/footer-block` | Footer |
|
|
202
|
-
| `ScrollFadeIn` | `@vadimcomanescu/nadicode-design-system/scroll-fade-in` | Below-fold animation |
|
|
203
|
-
| `CountingNumber` | `@vadimcomanescu/nadicode-design-system/text-effects/counting-number` | Price animation on toggle |
|
|
204
|
-
|
|
205
|
-
### Allowed (optional)
|
|
206
|
-
|
|
207
|
-
`PricingBlock`, `ComparisonBlock`, `Table`, `Tooltip`, `ToggleGroup`, `Tabs`, `Accordion`, `CheckoutForm`
|
|
208
|
-
|
|
209
|
-
### Forbidden
|
|
210
|
-
|
|
211
|
-
`Sidebar`, `DataTable`, `FormWizard`, agentic components, decorative effects (in plan cards)
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
## Required States
|
|
216
|
-
|
|
217
|
-
| State | Trigger | Visual |
|
|
218
|
-
|-------|---------|--------|
|
|
219
|
-
| `default` | Page loaded (monthly selected) | Plan cards with monthly prices |
|
|
220
|
-
| `annual-toggle` | User toggles annual | Prices animate to annual, savings badge appears |
|
|
221
|
-
| `cta-loading` | Plan CTA clicked | Button shows Spinner |
|
|
222
|
-
| `checkout-redirect` | CTA completed | Redirect to checkout or external billing |
|
|
223
|
-
|
|
224
|
-
---
|
|
225
|
-
|
|
226
|
-
## Responsive Contract
|
|
227
|
-
|
|
228
|
-
| Breakpoint | Plan Cards | Comparison | FAQ |
|
|
229
|
-
|------------|------------|------------|-----|
|
|
230
|
-
| Mobile | 1 col, stacked | Horizontal scroll table | Full width |
|
|
231
|
-
| `sm:` | 2 col (popular card spans or emphasized) | Same | Full width |
|
|
232
|
-
| `lg:` | 3 col side-by-side | Full table | max-w-3xl centered |
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## Styling Rules
|
|
237
|
-
|
|
238
|
-
- Plan cards: `glass-panel p-8`
|
|
239
|
-
- Popular card: `ring-2 ring-accent` for emphasis
|
|
240
|
-
- Price numbers: `text-4xl font-bold`
|
|
241
|
-
- Feature checkmarks: `text-success`
|
|
242
|
-
- No raw palette colors
|
|
243
|
-
- Billing toggle: standard `Switch` component
|
|
244
|
-
|
|
245
|
-
---
|
|
246
|
-
|
|
247
|
-
## Accessibility
|
|
248
|
-
|
|
249
|
-
- Billing toggle has `aria-label="Switch to annual billing"`
|
|
250
|
-
- Plan cards are not `<button>` (CTA button inside is the interactive element)
|
|
251
|
-
- Feature lists use `<ul>` with semantic markup
|
|
252
|
-
- Price changes announce via `aria-live="polite"` region
|
|
253
|
-
- All CTAs have descriptive text
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## Reference Implementations
|
|
258
|
-
|
|
259
|
-
- `src/app/pricing/page.tsx`
|
|
260
|
-
- `src/components/blocks/PricingBlock.tsx`
|
|
261
|
-
|
|
262
|
-
---
|
|
263
|
-
|
|
264
|
-
## Verification
|
|
265
|
-
|
|
266
|
-
```bash
|
|
267
|
-
npx tsc --noEmit
|
|
268
|
-
npm run lint
|
|
269
|
-
npm run test
|
|
270
|
-
npx vitest run src/test/css-variable-usage.test.ts
|
|
271
|
-
```
|