@vadimcomanescu/nadicode-design-system 4.0.1 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/.agents/skills/seed/SKILL.md +34 -163
  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/eslint-rules/nadicode/rules/no-has-svg-selector.js +1 -1
  6. package/package.json +1 -2
  7. package/scripts/ds-check.mjs +0 -10
  8. package/scripts/sync-seed-skill.mjs +0 -3
  9. package/.agents/skills/seed/contract.md +0 -110
  10. package/.agents/skills/seed/intent-map.md +0 -320
  11. package/.agents/skills/seed/recipes/agency-home.md +0 -311
  12. package/.agents/skills/seed/recipes/agents-chat.md +0 -305
  13. package/.agents/skills/seed/recipes/analytics.md +0 -253
  14. package/.agents/skills/seed/recipes/auth.md +0 -254
  15. package/.agents/skills/seed/recipes/blog-content.md +0 -307
  16. package/.agents/skills/seed/recipes/checkout.md +0 -311
  17. package/.agents/skills/seed/recipes/company-about.md +0 -276
  18. package/.agents/skills/seed/recipes/company-contact.md +0 -234
  19. package/.agents/skills/seed/recipes/crud-form.md +0 -233
  20. package/.agents/skills/seed/recipes/crud-list-detail.md +0 -230
  21. package/.agents/skills/seed/recipes/dashboard.md +0 -354
  22. package/.agents/skills/seed/recipes/digital-workers.md +0 -314
  23. package/.agents/skills/seed/recipes/error-pages.md +0 -199
  24. package/.agents/skills/seed/recipes/marketing-landing.md +0 -293
  25. package/.agents/skills/seed/recipes/marketing-shell.md +0 -156
  26. package/.agents/skills/seed/recipes/navigation-shell.md +0 -787
  27. package/.agents/skills/seed/recipes/onboarding.md +0 -258
  28. package/.agents/skills/seed/recipes/pricing.md +0 -271
  29. package/.agents/skills/seed/recipes/service-detail.md +0 -302
  30. package/.agents/skills/seed/recipes/settings.md +0 -252
  31. package/.agents/skills/seed/references/blocks.md +0 -128
  32. package/.agents/skills/seed/references/components.md +0 -287
  33. package/.agents/skills/seed/references/icons.md +0 -169
  34. package/.agents/skills/seed/references/nextjs.md +0 -49
  35. package/.agents/skills/seed/references/tokens.md +0 -88
@@ -1,311 +0,0 @@
1
- # Recipe: Checkout
2
-
3
- Payment flow with Stripe integration, order summary, and success state.
4
-
5
- ## Route Patterns
6
-
7
- - `/checkout`
8
- - `/checkout/success`
9
-
10
- ## Shell
11
-
12
- `marketing-shell` (minimal: logo + trust badge, no full nav to avoid abandonment)
13
-
14
- ---
15
-
16
- ## Layout Blueprint (Desktop)
17
-
18
- ```
19
- +------------------------------------------------+
20
- | Logo Secure checkout [Back to cart]|
21
- +------------------------------------------------+
22
- | |
23
- | +-------------------------+ +-------------+ |
24
- | | Checkout Form | | Order | |
25
- | | | | Summary | |
26
- | | Contact Information | | | |
27
- | | [Email input] | | Item 1 $29 | |
28
- | | | | Item 2 $49 | |
29
- | | Payment | | | |
30
- | | [Stripe Card Element] | | Subtotal $78| |
31
- | | | | Tax $8 | |
32
- | | Billing Address | | ----------- | |
33
- | | [Address fields] | | Total $86| |
34
- | | | | | |
35
- | | [Pay $86.00] | | [Coupon] | |
36
- | +-------------------------+ +-------------+ |
37
- | |
38
- | [Stripe] [SSL] [Money-back guarantee badges] |
39
- +------------------------------------------------+
40
-
41
- Success Page:
42
- +------------------------------------------------+
43
- | Logo [Home] |
44
- +------------------------------------------------+
45
- | |
46
- | [ConfettiBurst] |
47
- | [SuccessCheck] |
48
- | |
49
- | Payment successful! |
50
- | Order #12345 confirmed. |
51
- | |
52
- | We've sent a confirmation to your email. |
53
- | |
54
- | [Go to Dashboard] [View Receipt] |
55
- | |
56
- +------------------------------------------------+
57
- ```
58
-
59
- ---
60
-
61
- ## Section Sequence
62
-
63
- ### 1. Minimal Header
64
-
65
- ```tsx
66
- <header className="flex items-center justify-between px-6 py-4 border-b border-border">
67
- <Logo className="h-6" />
68
- <div className="flex items-center gap-2 text-text-secondary">
69
- <LockIcon size={14} />
70
- <Typography variant="small">Secure checkout</Typography>
71
- </div>
72
- <Button variant="ghost" size="sm" asChild>
73
- <a href="/pricing">Back</a>
74
- </Button>
75
- </header>
76
- ```
77
-
78
- ### 2. Checkout Form + Order Summary (2-column)
79
-
80
- ```tsx
81
- <div className="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 py-8 md:py-12">
82
- <div className="grid grid-cols-1 lg:grid-cols-[1fr_380px] gap-8">
83
- {/* Left: Form */}
84
- <div className="space-y-6">
85
- {/* Contact */}
86
- <Card className="glass-panel p-6">
87
- <Heading level={4} size="title" className="mb-4">Contact information</Heading>
88
- <div className="space-y-4">
89
- <FormField>
90
- <FormLabel>Email</FormLabel>
91
- <FormControl><Input type="email" /></FormControl>
92
- </FormField>
93
- </div>
94
- </Card>
95
-
96
- {/* Payment */}
97
- <Card className="glass-panel p-6">
98
- <Heading level={4} size="title" className="mb-4">Payment</Heading>
99
- <CheckoutForm
100
- amount={totalAmount}
101
- onSuccess={handlePaymentSuccess}
102
- onError={handlePaymentError}
103
- />
104
- </Card>
105
-
106
- {/* Billing Address */}
107
- <Card className="glass-panel p-6">
108
- <Heading level={4} size="title" className="mb-4">Billing address</Heading>
109
- <div className="grid grid-cols-2 gap-4">
110
- <FormField>
111
- <FormLabel>First name</FormLabel>
112
- <FormControl><Input /></FormControl>
113
- </FormField>
114
- <FormField>
115
- <FormLabel>Last name</FormLabel>
116
- <FormControl><Input /></FormControl>
117
- </FormField>
118
- <FormField className="col-span-2">
119
- <FormLabel>Address</FormLabel>
120
- <FormControl><Input /></FormControl>
121
- </FormField>
122
- {/* City, State, ZIP */}
123
- </div>
124
- </Card>
125
- </div>
126
-
127
- {/* Right: Order Summary */}
128
- <div className="lg:sticky lg:top-8 self-start">
129
- <Card className="glass-panel p-6">
130
- <Heading level={4} size="title" className="mb-4">Order summary</Heading>
131
- <div className="space-y-3">
132
- {items.map(item => (
133
- <div key={item.id} className="flex items-center justify-between">
134
- <Typography variant="small">{item.name}</Typography>
135
- <Typography variant="small" className="font-medium">${item.price}</Typography>
136
- </div>
137
- ))}
138
- </div>
139
- <Separator className="my-4" />
140
- <div className="space-y-2">
141
- <div className="flex justify-between text-text-secondary text-sm">
142
- <span>Subtotal</span><span>${subtotal}</span>
143
- </div>
144
- <div className="flex justify-between text-text-secondary text-sm">
145
- <span>Tax</span><span>${tax}</span>
146
- </div>
147
- </div>
148
- <Separator className="my-4" />
149
- <div className="flex justify-between font-bold text-lg">
150
- <span>Total</span><span>${total}</span>
151
- </div>
152
-
153
- {/* Coupon input */}
154
- <div className="mt-4">
155
- <InputGroup>
156
- <Input placeholder="Coupon code" />
157
- <Button variant="outline">Apply</Button>
158
- </InputGroup>
159
- </div>
160
- </Card>
161
- </div>
162
- </div>
163
-
164
- {/* Trust badges */}
165
- <div className="flex items-center justify-center gap-6 mt-8 text-text-tertiary">
166
- <div className="flex items-center gap-1 text-sm">
167
- <ShieldIcon size={14} /> SSL Encrypted
168
- </div>
169
- <div className="flex items-center gap-1 text-sm">
170
- <RefreshIcon size={14} /> 30-day guarantee
171
- </div>
172
- </div>
173
- </div>
174
- ```
175
-
176
- ### 3. Success Page
177
-
178
- ```tsx
179
- <div className="min-h-dvh flex flex-col items-center justify-center p-6 text-center">
180
- <ConfettiBurst trigger={showCelebration} />
181
- <SuccessCheck className="mb-6" />
182
- <Heading level={2} size="section" >Payment successful!</Heading>
183
- <Typography variant="p" className="text-text-secondary mt-2 mb-2">
184
- Order #{orderId} confirmed.
185
- </Typography>
186
- <Typography variant="small" className="text-text-tertiary mb-8">
187
- We've sent a confirmation to {email}
188
- </Typography>
189
- <div className="flex gap-4">
190
- <Button asChild><a href="/dashboard">Go to Dashboard</a></Button>
191
- <Button variant="outline" asChild><a href={receiptUrl}>View Receipt</a></Button>
192
- </div>
193
- </div>
194
- ```
195
-
196
- ---
197
-
198
- ## Animation Storyboard
199
-
200
- ```
201
- ANIMATION STORYBOARD
202
- ====================
203
-
204
- CHECKOUT PAGE:
205
- BUDGET: 400ms | SPRING: snappy | REDUCED: opacity-only
206
-
207
- T+0ms [header] Minimal header visible (instant)
208
- T+50ms [contact] Contact section {fadeInUp, snappy}
209
- T+150ms [payment] Payment section {fadeInUp, snappy}
210
- T+250ms [address] Billing address section {fadeInUp, snappy}
211
- T+100ms [summary] Order summary (right column) {fadeIn, snappy}
212
-
213
- SUCCESS PAGE:
214
- BUDGET: 500ms | SPRING: bouncy | REDUCED: check visible, no confetti
215
-
216
- T+0ms [confetti] ConfettiBurst fires (particle animation)
217
- T+100ms [check] SuccessCheck animates {scaleIn, bouncy}
218
- T+300ms [title] Success title fades in {fadeInUp, gentle}
219
- T+400ms [details] Order details fade in {fadeIn, snappy}
220
- T+500ms [actions] Buttons fade in {fadeIn, snappy}
221
-
222
- REDUCED MOTION: All items visible immediately, no confetti
223
- ```
224
-
225
- ---
226
-
227
- ## Required Components
228
-
229
- | Component | Import Path | Purpose |
230
- |-----------|-------------|---------|
231
- | `CheckoutForm` | `@vadimcomanescu/nadicode-design-system/checkout-form` | Stripe Elements payment |
232
- | `Card` | `@vadimcomanescu/nadicode-design-system/card` | Section containers, order summary |
233
- | `Input` | `@vadimcomanescu/nadicode-design-system/input` | Contact, address fields |
234
- | `InputGroup` | `@vadimcomanescu/nadicode-design-system/input-group` | Coupon input + apply button |
235
- | `Button` | `@vadimcomanescu/nadicode-design-system/button` | Submit, apply, navigation |
236
- | `Typography` | `@vadimcomanescu/nadicode-design-system/typography` | Headings, text |
237
- | `Separator` | `@vadimcomanescu/nadicode-design-system/separator` | Price dividers |
238
- | `Logo` | `@vadimcomanescu/nadicode-design-system/logo` | Brand mark |
239
- | `Form` / `FormField` | `@vadimcomanescu/nadicode-design-system/form` | Form management |
240
- | `ConfettiBurst` | `@vadimcomanescu/nadicode-design-system/confetti-burst` | Success celebration |
241
- | `SuccessCheck` | `@vadimcomanescu/nadicode-design-system/success-check` | Success checkmark |
242
- | `Alert` | `@vadimcomanescu/nadicode-design-system/alert` | Payment errors |
243
- | `Spinner` | `@vadimcomanescu/nadicode-design-system/spinner` | Processing state |
244
-
245
- ### Allowed (optional)
246
-
247
- `CheckoutFormDemo`, `Label`, `Select` (country picker), `NativeSelect`, `Badge`, `Tooltip`
248
-
249
- ### Forbidden
250
-
251
- `Sidebar`, `NavigationMenu`, `DataTable`, chart components, agentic components, decorative effects, marketing blocks
252
-
253
- ---
254
-
255
- ## Required States
256
-
257
- | State | Trigger | Visual |
258
- |-------|---------|--------|
259
- | `default` | Page loaded | Form ready for input |
260
- | `submitting` | Pay button clicked | Button shows Spinner, form disabled |
261
- | `processing` | Stripe processing | "Processing payment..." message |
262
- | `error` | Payment failed | `Alert` variant="destructive" with error + retry |
263
- | `success` | Payment succeeded | Redirect to success page with celebration |
264
-
265
- ---
266
-
267
- ## Responsive Contract
268
-
269
- | Breakpoint | Layout | Order Summary |
270
- |------------|--------|---------------|
271
- | Mobile | Single column, summary above form | Collapsible or stacked above form |
272
- | `lg:` | 2-column: form (flex-1) + summary (380px sticky) | Sticky sidebar |
273
-
274
- ---
275
-
276
- ## Styling Rules
277
-
278
- - Form sections: `glass-panel p-6`
279
- - Order summary: `glass-panel p-6`, sticky on desktop
280
- - Trust badges: `text-text-tertiary`, small, centered
281
- - No heavy decoration (reduce friction)
282
- - Minimal navigation (prevent abandonment)
283
- - Labels always stacked above inputs
284
-
285
- ---
286
-
287
- ## Accessibility
288
-
289
- - Payment form has proper labels (Stripe Elements handle internal a11y)
290
- - Error messages use `role="alert"`
291
- - Form fields have `autocomplete` attributes (email, name, address)
292
- - Tab order: contact -> payment -> address -> submit
293
- - Success page auto-announces via `aria-live`
294
-
295
- ---
296
-
297
- ## Reference Implementations
298
-
299
- - `src/components/ui/CheckoutForm.tsx`
300
- - `src/components/ui/CheckoutFormDemo.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,276 +0,0 @@
1
- # Recipe: Company About
2
-
3
- About, manifesto, or team page showcasing company mission, values, team, and partnerships.
4
-
5
- ## Route Pattern
6
-
7
- `/about`, `/manifesto`, or `/chi-siamo`
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
- | MISSION HERO |
23
- | Company mission statement |
24
- | Subtitle: founding story or tagline |
25
- | |
26
- +------------------------------------------------+
27
- | |
28
- | VALUES GRID (3-col) |
29
- | +----------+ +----------+ +----------+ |
30
- | | Value 1 | | Value 2 | | Value 3 | |
31
- | +----------+ +----------+ +----------+ |
32
- | +----------+ +----------+ +----------+ |
33
- | | Value 4 | | Value 5 | | Value 6 | |
34
- | +----------+ +----------+ +----------+ |
35
- | |
36
- +------------------------------------------------+
37
- | |
38
- | TEAM SECTION |
39
- | +--------+ +--------+ +--------+ +--------+ |
40
- | | Member | | Member | | Member | | Member | |
41
- | +--------+ +--------+ +--------+ +--------+ |
42
- | |
43
- +------------------------------------------------+
44
- | COMPANY STATS |
45
- | +------+ +------+ +------+ +------+ |
46
- | | Year | | Team | | Clients| | Projects |
47
- | | 2020 | | 25 | | 100+ | | 500+ | |
48
- | +------+ +------+ +------+ +------+ |
49
- +------------------------------------------------+
50
- | PARTNERS / LOGO CLOUD |
51
- | Partner and technology logos |
52
- +------------------------------------------------+
53
- | FINAL CTA SECTION |
54
- | "Join our mission" + [CTA Button] |
55
- +------------------------------------------------+
56
- | FooterBlock: columns + social + legal |
57
- +------------------------------------------------+
58
- ```
59
-
60
- ---
61
-
62
- ## Section Sequence
63
-
64
- ### 1. Header
65
-
66
- ```tsx
67
- <HeaderBlock logo={<Logo />} links={navLinks} actions={<Button>Contact Us</Button>} />
68
- ```
69
-
70
- ### 2. Mission Hero
71
-
72
- ```tsx
73
- <section className="relative py-24 md:py-32 overflow-hidden">
74
- <ShaderBackground shader="meshGradient" intent="hero" opacity={0.15} />
75
- <div className="relative z-10 max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
76
- <motion.div variants={heroStagger.container} initial="hidden" animate="visible">
77
- <motion.div variants={heroStagger.child}>
78
- <Badge variant="outline" className="mb-4">Our Story</Badge>
79
- </motion.div>
80
- <motion.h1 variants={heroStagger.child} className="text-4xl md:text-6xl font-bold tracking-tight">
81
- {missionStatement}
82
- </motion.h1>
83
- <motion.p variants={heroStagger.child} className="mt-6 text-lg md:text-xl text-text-secondary max-w-3xl mx-auto">
84
- {foundingStory}
85
- </motion.p>
86
- </motion.div>
87
- </div>
88
- </section>
89
- ```
90
-
91
- ### 3. Values Grid
92
-
93
- ```tsx
94
- <ScrollFadeIn>
95
- <section className="py-16 md:py-24">
96
- <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
97
- <div className="text-center mb-12">
98
- <Heading level={2} size="section" >Our Values</Heading>
99
- <Typography variant="lead" className="mt-4 text-text-secondary">
100
- The principles that guide everything we do
101
- </Typography>
102
- </div>
103
- <FeatureGridBlock features={values} columns={3} />
104
- </div>
105
- </section>
106
- </ScrollFadeIn>
107
- ```
108
-
109
- ### 4. Team Section
110
-
111
- ```tsx
112
- <ScrollFadeIn>
113
- <section className="py-16 md:py-24 bg-muted">
114
- <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
115
- <div className="text-center mb-12">
116
- <Heading level={2} size="section" >Meet the Team</Heading>
117
- <Typography variant="lead" className="mt-4 text-text-secondary">
118
- The people behind the mission
119
- </Typography>
120
- </div>
121
- <TeamBlock members={teamMembers} />
122
- </div>
123
- </section>
124
- </ScrollFadeIn>
125
- ```
126
-
127
- ### 5. Company Stats
128
-
129
- ```tsx
130
- <ScrollFadeIn>
131
- <section className="py-16 md:py-24">
132
- <StatsMarketingBlock stats={companyStats} />
133
- </section>
134
- </ScrollFadeIn>
135
- ```
136
-
137
- ### 6. Partners / Logo Cloud
138
-
139
- ```tsx
140
- <ScrollFadeIn>
141
- <section className="py-12 md:py-16 bg-muted">
142
- <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
143
- <Typography variant="small" className="text-center text-text-tertiary mb-6">
144
- Our partners and technology stack
145
- </Typography>
146
- <LogoCloud logos={partnerLogos} />
147
- </div>
148
- </section>
149
- </ScrollFadeIn>
150
- ```
151
-
152
- ### 7. Final CTA
153
-
154
- ```tsx
155
- <ScrollFadeIn>
156
- <section className="py-16 md:py-24">
157
- <CallToActionBlock
158
- title="Join our mission"
159
- description="We're always looking for talented people who share our values."
160
- action={<Button size="lg">Get in Touch</Button>}
161
- />
162
- </section>
163
- </ScrollFadeIn>
164
- ```
165
-
166
- ### 8. Footer
167
-
168
- ```tsx
169
- <FooterBlock columns={footerColumns} social={socialLinks} legal={legalLinks} />
170
- ```
171
-
172
- ---
173
-
174
- ## Animation Storyboard
175
-
176
- ```
177
- ANIMATION STORYBOARD
178
- ====================
179
- BUDGET: 800ms (above-fold) | SPRING: dramatic (hero), snappy (rest) | REDUCED: opacity-only
180
-
181
- T+0ms [nav] Header visible (instant)
182
- T+100ms [badge] Story badge {fadeIn, snappy}
183
- T+200ms [headline] Mission statement {fadeInUp, dramatic}
184
- T+400ms [subtitle] Founding story {fadeInUp, dramatic}
185
- T+600ms [shader] Hero shader appears {fadeIn, gentle}
186
-
187
- SCROLL-TRIGGERED (below fold):
188
- [values] ScrollFadeIn at 20% visible {fadeInUp, snappy, stagger 100ms}
189
- [team] ScrollFadeIn at 20% visible {fadeInUp, snappy, stagger 80ms}
190
- [stats] ScrollFadeIn at 20% visible {fadeInUp, snappy}
191
- [partners] ScrollFadeIn at 20% visible {fadeIn, gentle}
192
- [cta] ScrollFadeIn at 20% visible {scaleIn, gentle}
193
-
194
- REDUCED MOTION: All items visible immediately, opacity 0->1 in 10ms
195
- ```
196
-
197
- ---
198
-
199
- ## Required Components
200
-
201
- | Component | Import Path | Purpose |
202
- |-----------|-------------|---------|
203
- | `HeaderBlock` | `@vadimcomanescu/nadicode-design-system/catalog/components` via `seedComponents` | Site navigation |
204
- | `FooterBlock` | `@vadimcomanescu/nadicode-design-system/catalog/components` via `seedComponents` | Site footer |
205
- | `Button` | `@vadimcomanescu/nadicode-design-system/button` | CTAs |
206
- | `Badge` | `@vadimcomanescu/nadicode-design-system/badge` | Hero tag |
207
- | `Typography` | `@vadimcomanescu/nadicode-design-system/typography` | Headings, body text |
208
- | `ScrollFadeIn` | `@vadimcomanescu/nadicode-design-system/scroll-fade-in` | Below-fold animations |
209
- | `TeamBlock` | `@vadimcomanescu/nadicode-design-system/catalog/components` via `seedComponents` | Team member grid |
210
-
211
- ### Allowed (optional)
212
-
213
- `FeatureBlock`, `FeatureGridBlock`, `StatsMarketingBlock`, `LogoCloud`, `CallToActionBlock`, `HeroBlock`, `HeroSectionBlock`, `Card`, `ShaderBackground`, `TestimonialsBlock`
214
-
215
- ### Forbidden
216
-
217
- `Sidebar`, `DataTable`, `Form`, `FormWizard`, `AgentTeamPanel`, `PricingBlock`, `SettingsLayout`, `ChatLayout`
218
-
219
- ---
220
-
221
- ## Required States
222
-
223
- | State | Trigger | Visual |
224
- |-------|---------|--------|
225
- | `default` | Page loaded | Full about page content |
226
- | `mobile-navigation` | Hamburger tap | Mobile nav drawer/sheet |
227
-
228
- ---
229
-
230
- ## Responsive Contract
231
-
232
- | Breakpoint | Hero | Values | Team | Stats | Content Width |
233
- |------------|------|--------|------|-------|---------------|
234
- | Mobile | Stacked, text-center | 1 col | 1 col | 2 col | px-4 |
235
- | `sm:` | Stacked, text-center | 2 col | 2 col | 2 col | px-6, max-w-7xl |
236
- | `lg:` | Centered | 3 col | 4 col | 4 col | px-8, max-w-7xl |
237
-
238
- ---
239
-
240
- ## Styling Rules
241
-
242
- - Mission hero uses `ShaderBackground` with low opacity for subtle ambient
243
- - Value cards use `glass-panel` with icon + heading + description
244
- - Team cards use circular avatar, name, role, and social links
245
- - Section backgrounds alternate: `bg-background` and `bg-muted`
246
- - Partner logos are grayscale with hover color reveal
247
- - No raw palette colors; semantic tokens only
248
-
249
- ---
250
-
251
- ## Accessibility
252
-
253
- - Hero heading is `<h1>`, section headings are `<h2>`
254
- - Skip-nav link to main content
255
- - Team member images have alt text with name and role
256
- - Social links have aria-labels
257
- - Mobile nav is keyboard accessible with focus trap
258
-
259
- ---
260
-
261
- ## Reference Implementations
262
-
263
- - `src/components/blocks/TeamBlock.tsx`
264
- - `src/components/blocks/FeatureGridBlock.tsx`
265
- - `src/components/blocks/StatsMarketingBlock.tsx`
266
-
267
- ---
268
-
269
- ## Verification
270
-
271
- ```bash
272
- npx tsc --noEmit
273
- npm run lint
274
- npm run test
275
- npx vitest run src/test/css-variable-usage.test.ts
276
- ```