@deckio/deck-engine 0.2.1 → 0.2.3

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.
@@ -3,85 +3,160 @@
3
3
  ## Metadata
4
4
 
5
5
  - **Theme id:** `shadcn`
6
- - **Primary slide authoring pattern:** `shadcn`
6
+ - **Primary slide authoring pattern:** `component-native`
7
7
  - **Compatible design systems:** `shadcn`
8
+ - **Design system supplement:** `shadcn-design-system.md` (loaded when `designSystem: 'shadcn'`)
8
9
  - **Mood:** editorial, product-grade, semantic-token-driven, clean
9
10
  - **Read this file when:** `deck.config.js` uses `theme: 'shadcn'` or `designSystem: 'shadcn'` and you need to create, inspect, validate, or generate assets for slides
10
11
 
12
+ ---
13
+
14
+ ## Component availability
15
+
16
+ Scaffolded shadcn decks ship with **real shadcn/ui v4 components** ready to import. This is the real component library — not CSS imitation.
17
+
18
+ ### Component status table
19
+
20
+ | Component | Status | Import | Notes |
21
+ |---|---|---|---|
22
+ | **Button** | ✅ Preinstalled | `import { Button } from '@/components/ui/button'` | 6 variants, 8 sizes, `asChild` via Radix Slot |
23
+ | **Card** | ✅ Preinstalled | `import { Card, CardHeader, CardTitle, CardDescription, CardAction, CardContent, CardFooter } from '@/components/ui/card'` | 7 sub-components, container queries |
24
+ | **Badge** | ✅ Preinstalled | `import { Badge } from '@/components/ui/badge'` | 6 variants, Slot support |
25
+ | **Separator** | ✅ Preinstalled | `import { Separator } from '@/components/ui/separator'` | Radix primitive, horizontal/vertical |
26
+ | **Alert** | ✅ Preinstalled | `import { Alert, AlertTitle, AlertDescription } from '@/components/ui/alert'` | 2 variants (default, destructive) |
27
+ | Dialog | 🔧 Add via CLI | `npx shadcn@latest add dialog` | Radix Dialog primitive |
28
+ | Sheet | 🔧 Add via CLI | `npx shadcn@latest add sheet` | Slide-out panels |
29
+ | Tooltip | 🔧 Add via CLI | `npx shadcn@latest add tooltip` | Hover information |
30
+ | Tabs | 🔧 Add via CLI | `npx shadcn@latest add tabs` | Content organization |
31
+ | Input | 🔧 Add via CLI | `npx shadcn@latest add input` | Form input fields |
32
+ | Select | 🔧 Add via CLI | `npx shadcn@latest add select` | Dropdown selection |
33
+ | Table | 🔧 Add via CLI | `npx shadcn@latest add table` | Data display |
34
+ | Accordion | 🔧 Add via CLI | `npx shadcn@latest add accordion` | Collapsible sections |
35
+ | Avatar | 🔧 Add via CLI | `npx shadcn@latest add avatar` | User/brand images |
36
+ | Progress | 🔧 Add via CLI | `npx shadcn@latest add progress` | Progress indicators |
37
+
38
+ > **Expand via CLI:** `npx shadcn@latest add <component>`
39
+ > **Expand via MCP:** Use the preconfigured shadcn MCP server in `.vscode/mcp.json`
40
+
41
+ ### ReactBits animation components (preinstalled)
42
+
43
+ | Component | Import | Use case |
44
+ |---|---|---|
45
+ | `Aurora` | `'@/components/ui/aurora'` | Animated gradient canvas background |
46
+ | `BlurText` | `'@/components/ui/blur-text'` | Staggered text reveal on scroll |
47
+ | `ShinyText` | `'@/components/ui/shiny-text'` | Shimmer gradient sweep |
48
+ | `DecryptedText` | `'@/components/ui/decrypted-text'` | Character scramble → reveal |
49
+ | `SpotlightCard` | `'@/components/ui/spotlight-card'` | Mouse-following radial highlight |
50
+
51
+ ### Infrastructure (preinstalled)
52
+
53
+ - `src/index.css` — imports `@deckio/deck-engine/styles/global.css` and the active theme CSS
54
+ - `packages/deck-engine/themes/shadcn.css` — shadcn token map, Tailwind v4 import, `@theme inline` bridge
55
+ - `components.json` — shadcn CLI config with `@/` aliases + `@react-bits` registry
56
+ - `src/lib/utils.js` — exports `cn()` (clsx + tailwind-merge)
57
+ - `src/components/theme-provider.jsx` — light/dark mode for the deck shell
58
+ - `vite.config.js` — `@` → `src` path alias
59
+ - `jsconfig.json` — path mappings for `@/*`
60
+ - `.vscode/mcp.json` — preconfigured shadcn MCP server
61
+
62
+ ---
63
+
11
64
  ## Slide personality
12
65
 
13
- shadcn slides should look intentionally different from the default DECKIO system: cleaner surfaces, no deep-space ornament, no left accent bar, no floating orbs, and strong reliance on semantic tokens.
66
+ shadcn slides should look intentionally different from the default DECKIO system: cleaner surfaces, no deep-space ornament, no left accent bar, no floating orbs inside slide content, and strong reliance on **real components first**, semantic tokens second.
67
+
68
+ **Component-native composition is the default pattern.** Reach for Button, Card, Badge, Alert, and Separator before writing custom HTML. CSS modules handle layout and deck-specific polish — components handle content structure.
69
+
70
+ ---
14
71
 
15
- ## Exact JSX skeleton
72
+ ## Default authoring pattern — component-native JSX
16
73
 
17
- Use this exact starting structure for new slides:
74
+ This is the **primary** pattern for new slides. Use real shadcn components for content structure; CSS modules for layout and slide-specific polish.
18
75
 
19
76
  ```jsx
20
77
  import { BottomBar, Slide } from '@deckio/deck-engine'
78
+ import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'
79
+ import { Badge } from '@/components/ui/badge'
80
+ import { Button } from '@/components/ui/button'
81
+ import {
82
+ Card, CardContent, CardDescription,
83
+ CardHeader, CardTitle
84
+ } from '@/components/ui/card'
85
+ import { Separator } from '@/components/ui/separator'
86
+ import SpotlightCard from '@/components/ui/spotlight-card'
21
87
  import styles from './MyNewSlide.module.css'
22
88
 
23
89
  export default function MyNewSlide({ index, project }) {
24
90
  return (
25
91
  <Slide index={index} className={styles.myNewSlide}>
26
92
  <div className={`${styles.body} content-frame content-gutter`}>
27
- <div className={styles.overline}>
28
- <span className={styles.overlineDash} />
29
- <span className={styles.overlineText}>SECTION LABEL</span>
93
+ <div className={styles.header}>
94
+ <Badge variant="secondary">Product Update</Badge>
95
+ <h2 className={styles.title}>Slide Title</h2>
96
+ <p className={styles.subtitle}>Supporting copy for the slide.</p>
30
97
  </div>
31
98
 
32
- <h2 className={styles.title}>Slide Title</h2>
33
- <p className={styles.subtitle}>Supporting copy for the slide.</p>
99
+ <Alert>
100
+ <AlertTitle>Key signal</AlertTitle>
101
+ <AlertDescription>
102
+ Use Alert for the framing point, then let Cards carry deeper detail.
103
+ </AlertDescription>
104
+ </Alert>
105
+
106
+ <Separator />
107
+
108
+ <div className={styles.grid}>
109
+ <Card>
110
+ <CardHeader>
111
+ <CardTitle>Metric card</CardTitle>
112
+ <CardDescription>Real shadcn surfaces, not DIVs.</CardDescription>
113
+ </CardHeader>
114
+ <CardContent>
115
+ <p>Keep custom CSS focused on layout, spacing, and deck-specific polish.</p>
116
+ </CardContent>
117
+ </Card>
118
+
119
+ <SpotlightCard
120
+ className={styles.accentCard}
121
+ spotlightColor="color-mix(in srgb, var(--accent) 25%, transparent)"
122
+ >
123
+ <h3>ReactBits accent</h3>
124
+ <p>Motion belongs inside content blocks, not as full-slide ornament.</p>
125
+ </SpotlightCard>
126
+ </div>
34
127
 
35
- <div className={styles.cards}>
36
- <article className={styles.card}>
37
- <h3>Card title</h3>
38
- <p>Card body text.</p>
39
- </article>
128
+ <div className={styles.actions}>
129
+ <Button>Next step</Button>
130
+ <Button variant="outline">Learn more</Button>
40
131
  </div>
41
132
  </div>
42
133
 
43
- <BottomBar text="Project Footer Text" />
134
+ <BottomBar text={project.title} />
44
135
  </Slide>
45
136
  )
46
137
  }
47
138
  ```
48
139
 
49
- ## Exact CSS skeleton
140
+ ### Companion CSS module
141
+
142
+ CSS modules handle **layout only** — not content structure. Components own their own visual appearance via Tailwind classes and CVA variants.
50
143
 
51
144
  ```css
52
145
  .myNewSlide {
53
- background: color-mix(in oklch, var(--background) 85%, transparent);
146
+ background: var(--background);
54
147
  padding: 0 0 44px 0;
55
148
  }
56
149
 
57
150
  .body {
58
- position: relative;
59
- z-index: 10;
60
151
  display: flex;
61
152
  flex-direction: column;
62
- gap: 24px;
153
+ gap: var(--spacing-lg, 24px);
63
154
  }
64
155
 
65
- .overline {
156
+ .header {
66
157
  display: flex;
67
- align-items: center;
68
- gap: 12px;
69
- margin-bottom: 4px;
70
- }
71
-
72
- .overlineDash {
73
- width: 32px;
74
- height: 2px;
75
- border-radius: 999px;
76
- background: var(--primary);
77
- }
78
-
79
- .overlineText {
80
- font-size: 13px;
81
- font-weight: 500;
82
- letter-spacing: 3px;
83
- text-transform: uppercase;
84
- color: var(--muted-foreground);
158
+ flex-direction: column;
159
+ gap: var(--spacing-sm, 12px);
85
160
  }
86
161
 
87
162
  .title {
@@ -92,103 +167,278 @@ export default function MyNewSlide({ index, project }) {
92
167
 
93
168
  .subtitle {
94
169
  font-size: clamp(16px, 1.6vw, 19px);
95
- font-weight: 400;
96
170
  color: var(--muted-foreground);
97
171
  }
98
172
 
99
- .cards {
173
+ .grid {
100
174
  display: grid;
101
- grid-template-columns: repeat(3, 1fr);
102
- gap: 20px;
175
+ grid-template-columns: repeat(2, minmax(0, 1fr));
176
+ gap: var(--spacing-md, 20px);
103
177
  }
104
178
 
105
- .card {
106
- background: var(--card);
107
- border: 1px solid var(--border);
108
- border-radius: var(--radius);
109
- padding: 24px;
110
- box-shadow: 0 1px 3px color-mix(in srgb, var(--foreground) 4%, transparent);
179
+ .actions {
180
+ display: flex;
181
+ gap: var(--spacing-sm, 12px);
182
+ justify-content: flex-start;
111
183
  }
112
184
  ```
113
185
 
114
- Use `background: var(--background)` instead of the semi-transparent mix only when the slide intentionally needs a solid backdrop, such as a cover or thank-you slide.
186
+ ---
115
187
 
116
- ## Token table
188
+ ## shadcn v4 patterns used in preinstalled components
117
189
 
118
- ### Use these semantic tokens
190
+ Understanding these patterns helps you use components correctly and stay consistent when adding new ones:
119
191
 
120
- - `var(--background)`
121
- - `var(--foreground)`
122
- - `var(--card)`
123
- - `var(--card-foreground)`
124
- - `var(--primary)`
125
- - `var(--primary-foreground)`
126
- - `var(--secondary)`
127
- - `var(--secondary-foreground)`
128
- - `var(--muted)`
129
- - `var(--muted-foreground)`
130
- - `var(--border)`
131
- - `var(--ring)`
132
- - `var(--radius)`
133
- - `var(--destructive)`
134
- - `var(--surface-overlay)`
135
- - `var(--shadow-elevated)`
192
+ | Pattern | What it means | Example |
193
+ |---|---|---|
194
+ | `data-slot` | Every component emits a `data-slot` attribute for styling hooks | `<button data-slot="button">` |
195
+ | CVA variants | Variants defined via `class-variance-authority`, selected by prop | `<Button variant="destructive" size="lg">` |
196
+ | `asChild` | Renders as child element instead of default tag (via Radix Slot) | `<Button asChild><a href="/next">Go</a></Button>` |
197
+ | `cn()` | Class merging via clsx + tailwind-merge — always use for className composition | `className={cn("p-4", className)}` |
198
+ | Sub-components | Compound components composed as children | `<Card><CardHeader><CardTitle>...</CardTitle></CardHeader></Card>` |
199
+ | Container queries | Card uses `@container` for responsive internal layout | `@container/card-header` |
136
200
 
137
- ### Decorative accents allowed only inside content
201
+ ---
138
202
 
139
- - `var(--blue-glow)`
140
- - `var(--purple)`
141
- - `var(--purple-deep)`
142
- - `var(--pink)`
143
- - `var(--cyan)`
144
- - `var(--green)`
203
+ ## Migration examples
145
204
 
146
- ## Decorative elements available
205
+ ### Before: raw HTML/CSS → After: real components
147
206
 
148
- | Element | Rule |
207
+ **Badge before (CSS imitation):**
208
+ ```jsx
209
+ <span className={styles.badge}>Beta</span>
210
+ ```
211
+ ```css
212
+ .badge {
213
+ display: inline-flex;
214
+ align-items: center;
215
+ border-radius: 9999px;
216
+ padding: 2px 10px;
217
+ font-size: 12px;
218
+ background: var(--secondary);
219
+ color: var(--secondary-foreground);
220
+ }
221
+ ```
222
+
223
+ **Badge — after (real component):**
224
+ ```jsx
225
+ import { Badge } from '@/components/ui/badge'
226
+
227
+ <Badge variant="secondary">Beta</Badge>
228
+ ```
229
+ No custom CSS needed. Variant handles styling. `data-slot="badge"` available for overrides.
230
+
231
+ ---
232
+
233
+ **Card — before (raw markup):**
234
+ ```jsx
235
+ <div className={styles.card}>
236
+ <div className={styles.cardHeader}>
237
+ <h3 className={styles.cardTitle}>Feature</h3>
238
+ <p className={styles.cardDesc}>Description text</p>
239
+ </div>
240
+ <div className={styles.cardBody}>
241
+ <p>Content here</p>
242
+ </div>
243
+ </div>
244
+ ```
245
+ ```css
246
+ .card { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius); }
247
+ .cardHeader { padding: 24px 24px 0; }
248
+ .cardTitle { font-size: 18px; font-weight: 600; color: var(--card-foreground); }
249
+ .cardDesc { font-size: 14px; color: var(--muted-foreground); }
250
+ .cardBody { padding: 24px; }
251
+ ```
252
+
253
+ **Card — after (real component):**
254
+ ```jsx
255
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@/components/ui/card'
256
+
257
+ <Card>
258
+ <CardHeader>
259
+ <CardTitle>Feature</CardTitle>
260
+ <CardDescription>Description text</CardDescription>
261
+ </CardHeader>
262
+ <CardContent>
263
+ <p>Content here</p>
264
+ </CardContent>
265
+ </Card>
266
+ ```
267
+ Zero custom CSS. Card's built-in Tailwind classes handle spacing, colors, borders. Override by adding `className` prop.
268
+
269
+ ---
270
+
271
+ **Alert — before (manual markup):**
272
+ ```jsx
273
+ <div className={styles.callout} role="alert">
274
+ <strong>Important</strong>
275
+ <p>This is the key takeaway for this slide.</p>
276
+ </div>
277
+ ```
278
+
279
+ **Alert — after (real component):**
280
+ ```jsx
281
+ import { Alert, AlertTitle, AlertDescription } from '@/components/ui/alert'
282
+ import { Info } from 'lucide-react'
283
+
284
+ <Alert>
285
+ <Info className="size-4" />
286
+ <AlertTitle>Important</AlertTitle>
287
+ <AlertDescription>This is the key takeaway for this slide.</AlertDescription>
288
+ </Alert>
289
+ ```
290
+ Semantic `role="alert"` is built in. SVG icon support via grid layout. Destructive variant available.
291
+
292
+ ---
293
+
294
+ **Button — before (raw link):**
295
+ ```jsx
296
+ <a href="/next" className={styles.button}>Continue →</a>
297
+ ```
298
+
299
+ **Button — after (real component with `asChild`):**
300
+ ```jsx
301
+ import { Button } from '@/components/ui/button'
302
+
303
+ <Button asChild variant="outline">
304
+ <a href="/next">Continue →</a>
305
+ </Button>
306
+ ```
307
+ `asChild` renders the `<a>` tag directly while applying Button styling. No wrapper element.
308
+
309
+ ---
310
+
311
+ ## Token and Tailwind contract
312
+
313
+ ### `packages/deck-engine/themes/shadcn.css` contains
314
+
315
+ 1. **Tailwind v4 import:** `@import "tailwindcss"`
316
+ 2. **Light and dark semantic token sets:** background, foreground, card, primary, secondary, muted, accent, destructive, border, input, ring, popover, and radius
317
+ 3. **Deck-specific token groups:** decorative palette, overlays/glows, layout, typography, spacing, radius scale, z-index, and transition tokens
318
+ 4. **Chart tokens:** `--chart-1` through `--chart-5`
319
+ 5. **Tailwind bridge:** `@theme inline` maps the shadcn semantic variables into Tailwind utilities
320
+
321
+ ### `@theme inline` bridge mapping
322
+
323
+ The bridge exposes these Tailwind-facing variables:
324
+
325
+ | CSS variable | Tailwind utility |
149
326
  |---|---|
150
- | `content-frame` | Required layout wrapper |
151
- | `content-gutter` | Required layout wrapper |
152
- | Overline row | Preferred shadcn framing element |
153
- | Clean cards | Preferred surface treatment |
154
- | Decorative gradients | Allowed only inside content blocks, never as full-slide space effects |
327
+ | `--color-background` | `bg-background` |
328
+ | `--color-foreground` | `text-foreground` |
329
+ | `--color-card` / `--color-card-foreground` | `bg-card`, `text-card-foreground` |
330
+ | `--color-primary` / `--color-primary-foreground` | `bg-primary`, `text-primary-foreground` |
331
+ | `--color-secondary` / `--color-secondary-foreground` | `bg-secondary`, `text-secondary-foreground` |
332
+ | `--color-accent` / `--color-accent-foreground` | `bg-accent`, `text-accent-foreground` |
333
+ | `--color-destructive` / `--color-destructive-foreground` | `bg-destructive`, `text-destructive-foreground` |
334
+ | `--color-muted` / `--color-muted-foreground` | `bg-muted`, `text-muted-foreground` |
335
+ | `--color-border` | `border-border` |
336
+ | `--color-input` | `border-input` |
337
+ | `--color-ring` | `ring-ring` |
338
+ | `--color-popover` / `--color-popover-foreground` | `bg-popover`, `text-popover-foreground` |
339
+ | `--radius` | `rounded-[var(--radius)]` |
340
+
341
+ ### Semantic tokens (full list)
342
+
343
+ | Category | Tokens |
344
+ |---|---|
345
+ | Core | `--background`, `--foreground` |
346
+ | Card | `--card`, `--card-foreground` |
347
+ | Primary | `--primary`, `--primary-foreground` |
348
+ | Secondary | `--secondary`, `--secondary-foreground` |
349
+ | Muted | `--muted`, `--muted-foreground` |
350
+ | Accent | `--accent`, `--accent-foreground` |
351
+ | Destructive | `--destructive`, `--destructive-foreground` |
352
+ | Form | `--border`, `--input`, `--ring` |
353
+ | Popover | `--popover`, `--popover-foreground` |
354
+ | Radius | `--radius` |
355
+
356
+ ### Deck-specific support tokens
357
+
358
+ | Category | Tokens |
359
+ |---|---|
360
+ | Layout | `--slide-bg`, `--content-max-width`, `--content-gutter` |
361
+ | Overlays | `--surface-overlay`, `--surface-overlay-heavy`, `--background-overlay`, `--border-subtle`, `--shadow-elevated` |
362
+ | Decorative | `--blue-glow`, `--purple`, `--purple-deep`, `--pink`, `--cyan`, `--green` |
363
+ | Charts | `--chart-1` through `--chart-5` |
364
+
365
+ ---
155
366
 
156
- ## Available components
367
+ ## Available components — import reference
157
368
 
158
- ### Core imports
369
+ ### Engine primitives
159
370
 
160
- | Resource | Import path |
371
+ | Resource | Import |
161
372
  |---|---|
162
373
  | `Slide`, `BottomBar`, `Navigation`, `SlideProvider`, `useSlides`, `GenericThankYouSlide` | `'@deckio/deck-engine'` |
163
374
  | Data / logos | `'../data/<file>'` |
164
- | ReactBits / shadcn components | `'@/components/ui/<component>'` |
165
375
 
166
- ### Pre-installed ReactBits components
376
+ ### Preinstalled shadcn/ui (v4)
377
+
378
+ | Resource | Import |
379
+ |---|---|
380
+ | `Button` | `'@/components/ui/button'` |
381
+ | `Card`, `CardHeader`, `CardTitle`, `CardDescription`, `CardAction`, `CardContent`, `CardFooter` | `'@/components/ui/card'` |
382
+ | `Badge` | `'@/components/ui/badge'` |
383
+ | `Separator` | `'@/components/ui/separator'` |
384
+ | `Alert`, `AlertTitle`, `AlertDescription` | `'@/components/ui/alert'` |
385
+
386
+ ### Preinstalled ReactBits
167
387
 
168
- - `import BlurText from '@/components/ui/blur-text'`
169
- - `import ShinyText from '@/components/ui/shiny-text'`
170
- - `import DecryptedText from '@/components/ui/decrypted-text'`
171
- - `import SpotlightCard from '@/components/ui/spotlight-card'`
388
+ | Resource | Import |
389
+ |---|---|
390
+ | `Aurora` | `'@/components/ui/aurora'` |
391
+ | `BlurText` | `'@/components/ui/blur-text'` |
392
+ | `ShinyText` | `'@/components/ui/shiny-text'` |
393
+ | `DecryptedText` | `'@/components/ui/decrypted-text'` |
394
+ | `SpotlightCard` | `'@/components/ui/spotlight-card'` |
395
+
396
+ ### Utilities
172
397
 
173
- ### Common shadcn/ui additions
398
+ | Resource | Import |
399
+ |---|---|
400
+ | `cn()` | `'@/lib/utils'` |
401
+ | `ThemeProvider` | `'./components/theme-provider'` |
402
+ | Icons (Lucide) | `'lucide-react'` |
174
403
 
175
- - `npx shadcn add button` → `import { Button } from '@/components/ui/button'`
176
- - `npx shadcn add badge` → `import { Badge } from '@/components/ui/badge'`
177
- - `npx shadcn add card` → `import { Card, CardHeader, CardContent } from '@/components/ui/card'`
178
- - `npx shadcn add separator` → `import { Separator } from '@/components/ui/separator'`
404
+ ---
405
+
406
+ ## Decorative elements
407
+
408
+ | Element | Rule |
409
+ |---|---|
410
+ | `content-frame` | Required layout wrapper on every slide body |
411
+ | `content-gutter` | Required layout wrapper — provides horizontal padding |
412
+ | `Button`, `Card`, `Badge`, `Alert`, `Separator` | **Default** content structure — use these first |
413
+ | ReactBits accents | Allowed when they support the story and stay inside content blocks |
414
+ | Decorative gradients | Allowed only inside content blocks, never as full-slide space effects |
415
+
416
+ ---
417
+
418
+ ## Canonical setup path
419
+
420
+ For the full DECKIO shadcn wiring, also read:
421
+
422
+ - `.github/instructions/shadcn-setup.instructions.md`
423
+ - `packages/deck-engine/themes/descriptors/shadcn-design-system.md` (design system supplement)
424
+
425
+ ---
179
426
 
180
427
  ## Anti-patterns
181
428
 
182
- 1. Never use `accent-bar`
183
- 2. Never use `orb`
184
- 3. Never use `grid-dots`
185
- 4. Never use `var(--bg-deep)`
186
- 5. Never use `var(--surface)`
187
- 6. Never use `var(--text)`
188
- 7. Never use `var(--text-muted)`
189
- 8. Never add gradient `::before` bars to cards
190
- 9. Never hardcode deep-space glow decoration as full-slide ornament
429
+ 1. **Never use raw HTML where a preinstalled component exists** — `<div class="badge">` when `Badge` is available is always wrong
430
+ 2. **Never use CSS modules to recreate component appearance** — Card, Badge, Alert have built-in styling via Tailwind classes
431
+ 3. Never use `accent-bar` (dark theme only)
432
+ 4. Never use `orb` (dark theme only)
433
+ 5. Never use `grid-dots` as a default shadcn framing device
434
+ 6. Never use legacy token names: `var(--bg-deep)`, `var(--surface)`, `var(--text)`, `var(--text-muted)`
435
+ 7. Never add deep-space glow decoration as full-slide ornament
436
+ 8. **Never import a component that hasn't been added** — check the status table above; use `npx shadcn@latest add <name>` for components marked "Add via CLI"
437
+ 9. **Never skip `cn()` when composing classNames** always merge with `cn()` to avoid Tailwind class conflicts
438
+ 10. **Never hardcode colors** — use semantic tokens or Tailwind utilities mapped to the token bridge
439
+
440
+ ---
191
441
 
192
442
  ## Example slide direction
193
443
 
194
- A strong shadcn slide should read like a polished product or strategy artifact: overline, clear heading hierarchy, calm card surfaces, semantic token usage, and optional component accents such as `Badge`, `Separator`, `BlurText`, or `SpotlightCard` when they truly help the story.
444
+ A strong shadcn slide reads like a polished product or strategy artifact: real components for every recognizable UI pattern (badges, cards, alerts, buttons, separators), CSS modules only for grid layout and slide-level spacing, semantic tokens for any custom styling, and ReactBits accents only where motion genuinely supports the story.