@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.
- package/instructions/AGENTS.md +12 -0
- package/instructions/deck-project.instructions.md +6 -0
- package/instructions/shadcn-components.instructions.md +283 -0
- package/instructions/shadcn-setup.instructions.md +117 -0
- package/instructions/slide-css.instructions.md +8 -0
- package/instructions/slide-jsx.instructions.md +20 -0
- package/package.json +2 -1
- package/scripts/sync-version-from-npm.mjs +68 -0
- package/skills/deck-add-slide/SKILL.md +29 -0
- package/skills/deck-validate-project/SKILL.md +38 -0
- package/styles/global.css +7 -1
- package/themes/descriptors/funky-punk.md +231 -0
- package/themes/descriptors/shadcn-design-system.md +467 -0
- package/themes/descriptors/shadcn.md +356 -106
|
@@ -3,85 +3,160 @@
|
|
|
3
3
|
## Metadata
|
|
4
4
|
|
|
5
5
|
- **Theme id:** `shadcn`
|
|
6
|
-
- **Primary slide authoring pattern:** `
|
|
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
|
-
##
|
|
72
|
+
## Default authoring pattern — component-native JSX
|
|
16
73
|
|
|
17
|
-
Use
|
|
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.
|
|
28
|
-
<
|
|
29
|
-
<
|
|
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
|
-
<
|
|
33
|
-
|
|
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.
|
|
36
|
-
<
|
|
37
|
-
|
|
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=
|
|
134
|
+
<BottomBar text={project.title} />
|
|
44
135
|
</Slide>
|
|
45
136
|
)
|
|
46
137
|
}
|
|
47
138
|
```
|
|
48
139
|
|
|
49
|
-
|
|
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:
|
|
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
|
-
.
|
|
156
|
+
.header {
|
|
66
157
|
display: flex;
|
|
67
|
-
|
|
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
|
-
.
|
|
173
|
+
.grid {
|
|
100
174
|
display: grid;
|
|
101
|
-
grid-template-columns: repeat(
|
|
102
|
-
gap: 20px;
|
|
175
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
176
|
+
gap: var(--spacing-md, 20px);
|
|
103
177
|
}
|
|
104
178
|
|
|
105
|
-
.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
186
|
+
---
|
|
115
187
|
|
|
116
|
-
##
|
|
188
|
+
## shadcn v4 patterns used in preinstalled components
|
|
117
189
|
|
|
118
|
-
|
|
190
|
+
Understanding these patterns helps you use components correctly and stay consistent when adding new ones:
|
|
119
191
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
- `
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
- `
|
|
126
|
-
-
|
|
127
|
-
|
|
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
|
-
|
|
201
|
+
---
|
|
138
202
|
|
|
139
|
-
|
|
140
|
-
- `var(--purple)`
|
|
141
|
-
- `var(--purple-deep)`
|
|
142
|
-
- `var(--pink)`
|
|
143
|
-
- `var(--cyan)`
|
|
144
|
-
- `var(--green)`
|
|
203
|
+
## Migration examples
|
|
145
204
|
|
|
146
|
-
|
|
205
|
+
### Before: raw HTML/CSS → After: real components
|
|
147
206
|
|
|
148
|
-
|
|
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
|
-
|
|
|
151
|
-
|
|
|
152
|
-
|
|
|
153
|
-
|
|
|
154
|
-
|
|
|
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
|
-
###
|
|
369
|
+
### Engine primitives
|
|
159
370
|
|
|
160
|
-
| Resource | Import
|
|
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
|
-
###
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
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
|
-
|
|
398
|
+
| Resource | Import |
|
|
399
|
+
|---|---|
|
|
400
|
+
| `cn()` | `'@/lib/utils'` |
|
|
401
|
+
| `ThemeProvider` | `'./components/theme-provider'` |
|
|
402
|
+
| Icons (Lucide) | `'lucide-react'` |
|
|
174
403
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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 `
|
|
183
|
-
2. Never use
|
|
184
|
-
3. Never use `
|
|
185
|
-
4. Never use `
|
|
186
|
-
5. Never use `
|
|
187
|
-
6. Never use `var(--text)`
|
|
188
|
-
7. Never
|
|
189
|
-
8. Never
|
|
190
|
-
9. Never
|
|
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
|
|
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.
|