@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.
Files changed (49) hide show
  1. package/.agents/skills/seed/SKILL.md +38 -166
  2. package/.agents/skills/seed/references/animation.md +2 -2
  3. package/.agents/skills/seed/references/responsive.md +1 -1
  4. package/README.md +2 -2
  5. package/dist/catalog/components.js +4 -4
  6. package/dist/{chunk-7A2RXKGH.js → chunk-GJ557DGH.js} +1 -1
  7. package/dist/{chunk-7XLZCXUL.js → chunk-K4U67BVG.js} +1 -1
  8. package/dist/{chunk-TUJZMJXW.js → chunk-LK2L3C7D.js} +1 -1
  9. package/dist/{chunk-DSMGCFMJ.js → chunk-POFFOUQW.js} +2 -5
  10. package/dist/components/blocks/HeroBlock.js +2 -2
  11. package/dist/components/page-kits/LandingPageKit.js +3 -3
  12. package/dist/components/page-kits/ServiceSuitePageKit.js +3 -3
  13. package/dist/components/ui/AvatarUpload.js +1 -1
  14. package/dist/components/ui/MouseEffect.js +1 -1
  15. package/eslint-rules/nadicode/config.js +1 -0
  16. package/eslint-rules/nadicode/index.js +2 -0
  17. package/eslint-rules/nadicode/rules/__tests__/require-catalog-import.test.js +111 -0
  18. package/eslint-rules/nadicode/rules/no-has-svg-selector.js +1 -1
  19. package/eslint-rules/nadicode/rules/require-catalog-import.js +59 -0
  20. package/package.json +1 -338
  21. package/scripts/ds-check.mjs +0 -10
  22. package/scripts/sync-seed-skill.mjs +0 -3
  23. package/.agents/skills/seed/contract.md +0 -104
  24. package/.agents/skills/seed/intent-map.md +0 -320
  25. package/.agents/skills/seed/recipes/agency-home.md +0 -311
  26. package/.agents/skills/seed/recipes/agents-chat.md +0 -305
  27. package/.agents/skills/seed/recipes/analytics.md +0 -253
  28. package/.agents/skills/seed/recipes/auth.md +0 -254
  29. package/.agents/skills/seed/recipes/blog-content.md +0 -307
  30. package/.agents/skills/seed/recipes/checkout.md +0 -311
  31. package/.agents/skills/seed/recipes/company-about.md +0 -276
  32. package/.agents/skills/seed/recipes/company-contact.md +0 -234
  33. package/.agents/skills/seed/recipes/crud-form.md +0 -233
  34. package/.agents/skills/seed/recipes/crud-list-detail.md +0 -230
  35. package/.agents/skills/seed/recipes/dashboard.md +0 -354
  36. package/.agents/skills/seed/recipes/digital-workers.md +0 -314
  37. package/.agents/skills/seed/recipes/error-pages.md +0 -199
  38. package/.agents/skills/seed/recipes/marketing-landing.md +0 -293
  39. package/.agents/skills/seed/recipes/marketing-shell.md +0 -156
  40. package/.agents/skills/seed/recipes/navigation-shell.md +0 -786
  41. package/.agents/skills/seed/recipes/onboarding.md +0 -258
  42. package/.agents/skills/seed/recipes/pricing.md +0 -271
  43. package/.agents/skills/seed/recipes/service-detail.md +0 -302
  44. package/.agents/skills/seed/recipes/settings.md +0 -252
  45. package/.agents/skills/seed/references/blocks.md +0 -128
  46. package/.agents/skills/seed/references/components.md +0 -287
  47. package/.agents/skills/seed/references/icons.md +0 -169
  48. package/.agents/skills/seed/references/nextjs.md +0 -49
  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
- ```