@deckio/deck-engine 0.2.0 → 0.2.1
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/deck-config.instructions.md +13 -5
- package/instructions/deck-project.instructions.md +17 -1
- package/instructions/slide-css.instructions.md +45 -71
- package/instructions/slide-jsx.instructions.md +38 -11
- package/package.json +2 -1
- package/skills/deck-add-slide/SKILL.md +72 -190
- package/skills/deck-generate-image/SKILL.md +28 -11
- package/skills/deck-inspect/SKILL.md +35 -12
- package/skills/deck-sketch/SKILL.md +22 -15
- package/skills/deck-validate-project/SKILL.md +88 -48
- package/themes/descriptors/dark.md +169 -0
- package/themes/descriptors/light.md +172 -0
- package/themes/descriptors/shadcn.md +194 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Theme Descriptor — Light
|
|
2
|
+
|
|
3
|
+
## Metadata
|
|
4
|
+
|
|
5
|
+
- **Theme id:** `light`
|
|
6
|
+
- **Primary slide authoring pattern:** `default`
|
|
7
|
+
- **Compatible design systems:** `default`
|
|
8
|
+
- **Mood:** crisp, professional, airy, projection-friendly
|
|
9
|
+
- **Read this file when:** `deck.config.js` uses `theme: 'light'` and you need to create, inspect, validate, or generate assets for slides
|
|
10
|
+
|
|
11
|
+
## Slide personality
|
|
12
|
+
|
|
13
|
+
Light slides still use the DECKIO default structure, but the feel should be cleaner and brighter than dark: lighter surfaces, softer glow usage, and more breathing room. Keep decoration present but restrained.
|
|
14
|
+
|
|
15
|
+
## Exact JSX skeleton
|
|
16
|
+
|
|
17
|
+
Use this exact starting structure for new slides:
|
|
18
|
+
|
|
19
|
+
```jsx
|
|
20
|
+
import { BottomBar, Slide } from '@deckio/deck-engine'
|
|
21
|
+
import styles from './MyNewSlide.module.css'
|
|
22
|
+
|
|
23
|
+
export default function MyNewSlide({ index, project }) {
|
|
24
|
+
return (
|
|
25
|
+
<Slide index={index} className={styles.myNewSlide}>
|
|
26
|
+
<div className="accent-bar" />
|
|
27
|
+
<div className={`orb ${styles.orb1}`} />
|
|
28
|
+
<div className={`orb ${styles.orb2}`} />
|
|
29
|
+
|
|
30
|
+
<div className={`${styles.body} content-frame content-gutter`}>
|
|
31
|
+
{/* Slide content */}
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<BottomBar text="Project Footer Text" />
|
|
35
|
+
</Slide>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Required child order inside `<Slide>`
|
|
41
|
+
|
|
42
|
+
1. `<div className="accent-bar" />`
|
|
43
|
+
2. `2–4` decorative orb elements using the global `orb` class plus local positioning classes
|
|
44
|
+
3. One content wrapper using `content-frame content-gutter`
|
|
45
|
+
4. `<BottomBar text="..." />` as the last child
|
|
46
|
+
|
|
47
|
+
## Exact CSS skeleton
|
|
48
|
+
|
|
49
|
+
```css
|
|
50
|
+
.myNewSlide {
|
|
51
|
+
background: var(--background);
|
|
52
|
+
padding: 0 0 44px 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.orb1 {
|
|
56
|
+
width: 420px;
|
|
57
|
+
height: 420px;
|
|
58
|
+
top: -100px;
|
|
59
|
+
right: -60px;
|
|
60
|
+
background: radial-gradient(
|
|
61
|
+
circle at 40% 40%,
|
|
62
|
+
color-mix(in srgb, var(--accent) 82%, white),
|
|
63
|
+
color-mix(in srgb, var(--cyan) 20%, transparent) 52%,
|
|
64
|
+
transparent 72%
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.orb2 {
|
|
69
|
+
width: 320px;
|
|
70
|
+
height: 320px;
|
|
71
|
+
bottom: -40px;
|
|
72
|
+
right: 100px;
|
|
73
|
+
background: radial-gradient(
|
|
74
|
+
circle at 50% 50%,
|
|
75
|
+
color-mix(in srgb, var(--purple) 72%, white),
|
|
76
|
+
color-mix(in srgb, var(--purple-deep) 18%, transparent) 60%,
|
|
77
|
+
transparent 76%
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.body {
|
|
82
|
+
position: relative;
|
|
83
|
+
z-index: 10;
|
|
84
|
+
display: flex;
|
|
85
|
+
flex-direction: column;
|
|
86
|
+
gap: 24px;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.cards {
|
|
90
|
+
display: grid;
|
|
91
|
+
grid-template-columns: repeat(3, 1fr);
|
|
92
|
+
gap: 24px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.card {
|
|
96
|
+
position: relative;
|
|
97
|
+
overflow: hidden;
|
|
98
|
+
background: var(--card);
|
|
99
|
+
border: 1px solid var(--border);
|
|
100
|
+
border-radius: 16px;
|
|
101
|
+
padding: 24px;
|
|
102
|
+
box-shadow: var(--shadow-elevated);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.card::before {
|
|
106
|
+
content: '';
|
|
107
|
+
position: absolute;
|
|
108
|
+
top: 0;
|
|
109
|
+
left: 0;
|
|
110
|
+
right: 0;
|
|
111
|
+
height: 3px;
|
|
112
|
+
background: linear-gradient(90deg, var(--accent), var(--cyan));
|
|
113
|
+
opacity: 0.45;
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Token table
|
|
118
|
+
|
|
119
|
+
### Use these tokens
|
|
120
|
+
|
|
121
|
+
- `var(--background)`
|
|
122
|
+
- `var(--foreground)`
|
|
123
|
+
- `var(--muted-foreground)`
|
|
124
|
+
- `var(--card)`
|
|
125
|
+
- `var(--secondary)`
|
|
126
|
+
- `var(--border)`
|
|
127
|
+
- `var(--accent)`
|
|
128
|
+
- `var(--blue-glow)`
|
|
129
|
+
- `var(--purple)`
|
|
130
|
+
- `var(--purple-deep)`
|
|
131
|
+
- `var(--pink)`
|
|
132
|
+
- `var(--cyan)`
|
|
133
|
+
- `var(--green)`
|
|
134
|
+
- `var(--surface-overlay)`
|
|
135
|
+
- `var(--shadow-elevated)`
|
|
136
|
+
|
|
137
|
+
### Never regress to
|
|
138
|
+
|
|
139
|
+
- Heavy dark-theme glow stacks that overpower a light background
|
|
140
|
+
- `var(--bg-deep)` in new slide code
|
|
141
|
+
- `var(--surface)` in new slide code
|
|
142
|
+
- `var(--text)` or `var(--text-muted)` in new slide code
|
|
143
|
+
|
|
144
|
+
## Decorative elements available
|
|
145
|
+
|
|
146
|
+
| Element | How to use it |
|
|
147
|
+
|---|---|
|
|
148
|
+
| `accent-bar` | Required first child for default DECKIO slides |
|
|
149
|
+
| `orb` | Required, but keep the glow softer than dark |
|
|
150
|
+
| `grid-dots` | Optional light patterning inside a content area |
|
|
151
|
+
| Card top gradient | Acceptable, but use lower opacity than dark |
|
|
152
|
+
|
|
153
|
+
## Available components
|
|
154
|
+
|
|
155
|
+
| Resource | Import path |
|
|
156
|
+
|---|---|
|
|
157
|
+
| `Slide`, `BottomBar`, `Navigation`, `SlideProvider`, `useSlides`, `GenericThankYouSlide` | `'@deckio/deck-engine'` |
|
|
158
|
+
| Data / logos | `'../data/<file>'` |
|
|
159
|
+
|
|
160
|
+
## Anti-patterns
|
|
161
|
+
|
|
162
|
+
1. Removing the default DECKIO frame entirely
|
|
163
|
+
2. Making the orbs as loud as the dark theme
|
|
164
|
+
3. Missing `content-frame content-gutter`
|
|
165
|
+
4. Missing `BottomBar`
|
|
166
|
+
5. Using `flex: 1` on the body wrapper
|
|
167
|
+
6. Overloading the slide until it overflows the viewport
|
|
168
|
+
7. Importing shadcn-only UI components into a default DECKIO slide
|
|
169
|
+
|
|
170
|
+
## Example slide direction
|
|
171
|
+
|
|
172
|
+
A strong light slide should feel polished and executive-ready: crisp white or off-white surfaces, subtle blue/cyan motion in the decoration, and clear contrast between heading, body copy, and cards.
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Theme Descriptor — shadcn
|
|
2
|
+
|
|
3
|
+
## Metadata
|
|
4
|
+
|
|
5
|
+
- **Theme id:** `shadcn`
|
|
6
|
+
- **Primary slide authoring pattern:** `shadcn`
|
|
7
|
+
- **Compatible design systems:** `shadcn`
|
|
8
|
+
- **Mood:** editorial, product-grade, semantic-token-driven, clean
|
|
9
|
+
- **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
|
+
## Slide personality
|
|
12
|
+
|
|
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.
|
|
14
|
+
|
|
15
|
+
## Exact JSX skeleton
|
|
16
|
+
|
|
17
|
+
Use this exact starting structure for new slides:
|
|
18
|
+
|
|
19
|
+
```jsx
|
|
20
|
+
import { BottomBar, Slide } from '@deckio/deck-engine'
|
|
21
|
+
import styles from './MyNewSlide.module.css'
|
|
22
|
+
|
|
23
|
+
export default function MyNewSlide({ index, project }) {
|
|
24
|
+
return (
|
|
25
|
+
<Slide index={index} className={styles.myNewSlide}>
|
|
26
|
+
<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>
|
|
30
|
+
</div>
|
|
31
|
+
|
|
32
|
+
<h2 className={styles.title}>Slide Title</h2>
|
|
33
|
+
<p className={styles.subtitle}>Supporting copy for the slide.</p>
|
|
34
|
+
|
|
35
|
+
<div className={styles.cards}>
|
|
36
|
+
<article className={styles.card}>
|
|
37
|
+
<h3>Card title</h3>
|
|
38
|
+
<p>Card body text.</p>
|
|
39
|
+
</article>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
<BottomBar text="Project Footer Text" />
|
|
44
|
+
</Slide>
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Exact CSS skeleton
|
|
50
|
+
|
|
51
|
+
```css
|
|
52
|
+
.myNewSlide {
|
|
53
|
+
background: color-mix(in oklch, var(--background) 85%, transparent);
|
|
54
|
+
padding: 0 0 44px 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.body {
|
|
58
|
+
position: relative;
|
|
59
|
+
z-index: 10;
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
gap: 24px;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.overline {
|
|
66
|
+
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);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.title {
|
|
88
|
+
font-size: clamp(28px, 3.2vw, 36px);
|
|
89
|
+
font-weight: 700;
|
|
90
|
+
color: var(--foreground);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.subtitle {
|
|
94
|
+
font-size: clamp(16px, 1.6vw, 19px);
|
|
95
|
+
font-weight: 400;
|
|
96
|
+
color: var(--muted-foreground);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.cards {
|
|
100
|
+
display: grid;
|
|
101
|
+
grid-template-columns: repeat(3, 1fr);
|
|
102
|
+
gap: 20px;
|
|
103
|
+
}
|
|
104
|
+
|
|
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);
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
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.
|
|
115
|
+
|
|
116
|
+
## Token table
|
|
117
|
+
|
|
118
|
+
### Use these semantic tokens
|
|
119
|
+
|
|
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)`
|
|
136
|
+
|
|
137
|
+
### Decorative accents allowed only inside content
|
|
138
|
+
|
|
139
|
+
- `var(--blue-glow)`
|
|
140
|
+
- `var(--purple)`
|
|
141
|
+
- `var(--purple-deep)`
|
|
142
|
+
- `var(--pink)`
|
|
143
|
+
- `var(--cyan)`
|
|
144
|
+
- `var(--green)`
|
|
145
|
+
|
|
146
|
+
## Decorative elements available
|
|
147
|
+
|
|
148
|
+
| Element | Rule |
|
|
149
|
+
|---|---|
|
|
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 |
|
|
155
|
+
|
|
156
|
+
## Available components
|
|
157
|
+
|
|
158
|
+
### Core imports
|
|
159
|
+
|
|
160
|
+
| Resource | Import path |
|
|
161
|
+
|---|---|
|
|
162
|
+
| `Slide`, `BottomBar`, `Navigation`, `SlideProvider`, `useSlides`, `GenericThankYouSlide` | `'@deckio/deck-engine'` |
|
|
163
|
+
| Data / logos | `'../data/<file>'` |
|
|
164
|
+
| ReactBits / shadcn components | `'@/components/ui/<component>'` |
|
|
165
|
+
|
|
166
|
+
### Pre-installed ReactBits components
|
|
167
|
+
|
|
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'`
|
|
172
|
+
|
|
173
|
+
### Common shadcn/ui additions
|
|
174
|
+
|
|
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'`
|
|
179
|
+
|
|
180
|
+
## Anti-patterns
|
|
181
|
+
|
|
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
|
|
191
|
+
|
|
192
|
+
## Example slide direction
|
|
193
|
+
|
|
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.
|