@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
|
@@ -31,17 +31,34 @@ OPENAI_API_KEY=sk-proj-...
|
|
|
31
31
|
|
|
32
32
|
## Workflow
|
|
33
33
|
|
|
34
|
-
### Step 1 —
|
|
34
|
+
### Step 1 — Read the active theme descriptor
|
|
35
|
+
|
|
36
|
+
Open `deck.config.js`, read `theme` and `designSystem`, then resolve the active theme descriptor using the same rules as `deck-add-slide`.
|
|
37
|
+
|
|
38
|
+
Use the descriptor as the source of truth for:
|
|
39
|
+
|
|
40
|
+
- palette and semantic token intent
|
|
41
|
+
- overall image style
|
|
42
|
+
- what decorative language belongs in the project
|
|
43
|
+
- what to avoid so the image does not fight the slide system
|
|
44
|
+
|
|
45
|
+
### Step 2 — Craft the prompt
|
|
35
46
|
|
|
36
47
|
Write a detailed prompt including:
|
|
37
48
|
|
|
38
|
-
- **Subject** — what the image depicts
|
|
39
|
-
- **Style** —
|
|
40
|
-
- **Colors** —
|
|
41
|
-
- **Background** —
|
|
42
|
-
- **Aspect ratio** — square (1024x1024) for icons, wide (1536x1024) for banners
|
|
49
|
+
- **Subject** — what the image depicts
|
|
50
|
+
- **Style** — match the descriptor's slide personality and example direction
|
|
51
|
+
- **Colors** — derive from the descriptor's token table and visual language instead of hardcoded hex values
|
|
52
|
+
- **Background** — usually "transparent background"
|
|
53
|
+
- **Aspect ratio** — square (`1024x1024`) for icons, wide (`1536x1024`) for banners
|
|
54
|
+
|
|
55
|
+
Examples:
|
|
56
|
+
|
|
57
|
+
- Dark descriptor → deep, high-contrast accents, presentation-friendly glow restraint
|
|
58
|
+
- Light descriptor → brighter, cleaner palette with subtle contrast and restrained glow
|
|
59
|
+
- shadcn descriptor → clean editorial/system aesthetic with semantic surfaces and no deep-space ornament
|
|
43
60
|
|
|
44
|
-
### Step
|
|
61
|
+
### Step 3 — Generate
|
|
45
62
|
|
|
46
63
|
Run from the project root:
|
|
47
64
|
|
|
@@ -60,7 +77,7 @@ node node_modules/@deckio/deck-engine/scripts/generate-image.mjs --prompt "..."
|
|
|
60
77
|
|
|
61
78
|
Images are saved to `src/data/generated/`.
|
|
62
79
|
|
|
63
|
-
### Step
|
|
80
|
+
### Step 4 — Use in a slide
|
|
64
81
|
|
|
65
82
|
```jsx
|
|
66
83
|
import myIcon from '../data/generated/my-icon.png'
|
|
@@ -68,9 +85,9 @@ import myIcon from '../data/generated/my-icon.png'
|
|
|
68
85
|
<img src={myIcon} alt="Bridge icon" style={{ width: 120, height: 120 }} />
|
|
69
86
|
```
|
|
70
87
|
|
|
71
|
-
### Step
|
|
88
|
+
### Step 5 — Iterate
|
|
72
89
|
|
|
73
|
-
If the image doesn't match expectations, refine the prompt and re-run with the same `--name` to overwrite. Use **deck-
|
|
90
|
+
If the image doesn't match expectations, refine the prompt and re-run with the same `--name` to overwrite. Use **deck-inspect** to verify how it looks in the slide.
|
|
74
91
|
|
|
75
92
|
## SVG alternative
|
|
76
93
|
|
|
@@ -78,7 +95,7 @@ For simple icons, write SVG markup directly in JSX:
|
|
|
78
95
|
|
|
79
96
|
```jsx
|
|
80
97
|
<svg width="48" height="48" viewBox="0 0 48 48" fill="none">
|
|
81
|
-
<circle cx="24" cy="24" r="20" stroke="
|
|
98
|
+
<circle cx="24" cy="24" r="20" stroke="currentColor" strokeWidth="2" />
|
|
82
99
|
</svg>
|
|
83
100
|
```
|
|
84
101
|
|
|
@@ -7,6 +7,23 @@ description: Capture a screenshot of the deck app to visually inspect slides. Us
|
|
|
7
7
|
|
|
8
8
|
Captures a screenshot of the running deck using VS Code browser tools (Edge "Sharing with Agent").
|
|
9
9
|
|
|
10
|
+
## Step 0 — Read `deck.config.js` and the active theme descriptor
|
|
11
|
+
|
|
12
|
+
Before deciding what to capture:
|
|
13
|
+
|
|
14
|
+
1. Open `deck.config.js`
|
|
15
|
+
2. Read `theme` and `designSystem`
|
|
16
|
+
3. Resolve and read the active theme descriptor using the same rules as `deck-add-slide`
|
|
17
|
+
4. Use that descriptor as the visual source of truth
|
|
18
|
+
|
|
19
|
+
Judge the screenshot against the descriptor's:
|
|
20
|
+
|
|
21
|
+
- slide personality
|
|
22
|
+
- decorative elements
|
|
23
|
+
- surface treatment
|
|
24
|
+
- component ecosystem
|
|
25
|
+
- anti-patterns
|
|
26
|
+
|
|
10
27
|
## Deciding what to capture
|
|
11
28
|
|
|
12
29
|
1. **Slide** — resolve in this order:
|
|
@@ -32,29 +49,35 @@ Read `project` and `port` from `.github/memory/state.md` if not known.
|
|
|
32
49
|
|
|
33
50
|
### Step 2 — Navigate to the target slide
|
|
34
51
|
|
|
35
|
-
The deck opens on slide 1. To reach slide N, press `ArrowRight` (N − 1) times
|
|
36
|
-
|
|
37
|
-
```js
|
|
38
|
-
// run_playwright_code on the page
|
|
39
|
-
for (let i = 0; i < N - 1; i++) {
|
|
40
|
-
await page.keyboard.press('ArrowRight');
|
|
41
|
-
await page.waitForTimeout(300);
|
|
42
|
-
}
|
|
43
|
-
```
|
|
52
|
+
The deck opens on slide 1. To reach slide N, press `ArrowRight` (N − 1) times.
|
|
44
53
|
|
|
45
54
|
If the page is already on a different slide, navigate to slide 1 first by pressing `Home`, then advance forward.
|
|
46
55
|
|
|
47
56
|
### Step 3 — Take a screenshot
|
|
48
57
|
|
|
49
|
-
Use `screenshot_page` with the page ID to capture the current view.
|
|
58
|
+
Use `screenshot_page` with the page ID to capture the current view.
|
|
50
59
|
|
|
51
60
|
### Step 4 — Inspect and report
|
|
52
61
|
|
|
53
62
|
Study the screenshot and check for:
|
|
63
|
+
|
|
54
64
|
- Layout alignment and spacing
|
|
55
|
-
- Typography
|
|
65
|
+
- Typography hierarchy
|
|
56
66
|
- Missing or broken elements
|
|
57
67
|
- Color and contrast issues
|
|
58
68
|
- Overflow or clipping
|
|
69
|
+
- Theme or design-system mismatches
|
|
70
|
+
|
|
71
|
+
### Step 5 — Use the descriptor to judge fit
|
|
72
|
+
|
|
73
|
+
Examples of descriptor mismatches to flag:
|
|
74
|
+
|
|
75
|
+
- A default descriptor slide missing the left accent bar or orb treatment
|
|
76
|
+
- A shadcn descriptor slide showing DECKIO orb backgrounds or gradient card-top bars
|
|
77
|
+
- A shadcn descriptor slide that ignores semantic surfaces and looks like a dark DECKIO default slide
|
|
78
|
+
- A light descriptor slide using heavy dark-theme glows that muddy the canvas
|
|
79
|
+
- A slide importing or visually implying the wrong component ecosystem
|
|
80
|
+
|
|
81
|
+
If `designSystem` and the descriptor disagree, explicitly report that as a configuration mismatch.
|
|
59
82
|
|
|
60
|
-
|
|
83
|
+
When a mismatch exists, say the slide was built with the wrong theme/design-system pattern set and should be corrected using `deck-add-slide`.
|
|
@@ -61,31 +61,38 @@ Write-Host "Sketch saved: $file"
|
|
|
61
61
|
|
|
62
62
|
Reference the saved screenshot image. Study it carefully and identify:
|
|
63
63
|
|
|
64
|
-
- **Layout structure** — columns/rows, content zones, header/footer areas
|
|
65
|
-
- **Text elements** — headings, labels, bullet points, callouts
|
|
66
|
-
- **Visual elements** — boxes, icons, images, dividers, backgrounds
|
|
67
|
-
- **Data patterns** — tables, grids, lists, charts, metrics
|
|
64
|
+
- **Layout structure** — columns/rows, content zones, header/footer areas
|
|
65
|
+
- **Text elements** — headings, labels, bullet points, callouts
|
|
66
|
+
- **Visual elements** — boxes, icons, images, dividers, backgrounds
|
|
67
|
+
- **Data patterns** — tables, grids, lists, charts, metrics
|
|
68
68
|
|
|
69
69
|
Describe what you see back to the user and confirm your interpretation.
|
|
70
70
|
|
|
71
|
-
### Step 4 —
|
|
71
|
+
### Step 4 — Build the slide with the active descriptor
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
Before creating code:
|
|
74
74
|
|
|
75
|
-
1.
|
|
76
|
-
2.
|
|
77
|
-
3.
|
|
78
|
-
4.
|
|
79
|
-
|
|
75
|
+
1. Read `deck.config.js`
|
|
76
|
+
2. Read `theme` and `designSystem`
|
|
77
|
+
3. Resolve the active theme descriptor using the same rules as `deck-add-slide`
|
|
78
|
+
4. Use **deck-add-slide** plus that descriptor to build the real slide
|
|
79
|
+
|
|
80
|
+
While translating the sketch:
|
|
81
|
+
|
|
82
|
+
1. Map sketch regions to CSS Grid or Flexbox layout
|
|
83
|
+
2. Translate hand-drawn text into real content with proper typography
|
|
84
|
+
3. Replace rough shapes with styled containers using CSS Modules
|
|
85
|
+
4. Follow the active descriptor for JSX skeleton, CSS skeleton, decoration, tokens, and allowed components
|
|
86
|
+
5. Register the slide in `deck.config.js`
|
|
80
87
|
|
|
81
88
|
### Step 5 — Visual verification
|
|
82
89
|
|
|
83
|
-
After creating the slide, use **deck-
|
|
90
|
+
After creating the slide, use **deck-inspect** to capture a screenshot of the rendered result.
|
|
84
91
|
|
|
85
92
|
Compare the rendered slide against the original sketch. If the user is present, show both and ask if adjustments are needed.
|
|
86
93
|
|
|
87
94
|
## Notes
|
|
88
95
|
|
|
89
|
-
- Whiteboard sketches are rough — interpret intent, not exact pixels
|
|
90
|
-
- If text is hard to read, ask the user to clarify
|
|
91
|
-
- Screenshots are saved under `.github/eyes/` (gitignored) with a `sketch-` prefix
|
|
96
|
+
- Whiteboard sketches are rough — interpret intent, not exact pixels
|
|
97
|
+
- If text is hard to read, ask the user to clarify
|
|
98
|
+
- Screenshots are saved under `.github/eyes/` (gitignored) with a `sketch-` prefix
|
|
@@ -5,77 +5,117 @@ description: Validate and audit a deck project for correctness. Use this when as
|
|
|
5
5
|
|
|
6
6
|
# Validate & Audit a Deck Project
|
|
7
7
|
|
|
8
|
-
## Step
|
|
8
|
+
## Step 0 — Read `deck.config.js`
|
|
9
9
|
|
|
10
|
-
Open `deck.config.js` and
|
|
10
|
+
Open `deck.config.js` and read:
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
- `theme`
|
|
13
|
+
- `designSystem`
|
|
14
|
+
- `slides`
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
Then resolve the active theme descriptor using the same rules as `deck-add-slide`:
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
- Built-ins: read `dark.md`, `light.md`, or `shadcn.md` from the engine package descriptors folder
|
|
19
|
+
- Custom themes: read the project's custom `descriptor.md` or `*.descriptor.md`
|
|
20
|
+
- If no custom descriptor exists, fall back to the built-in descriptor implied by `designSystem`
|
|
17
21
|
|
|
18
|
-
|
|
19
|
-
- No unused imports (imported but not in the array).
|
|
20
|
-
- No undefined entries in the array (in array but not imported).
|
|
22
|
+
Use the descriptor as the source of truth for required structure, required tokens, allowed components, decorative elements, and anti-patterns.
|
|
21
23
|
|
|
22
|
-
|
|
24
|
+
## Step 1: Audit `deck.config.js`
|
|
23
25
|
|
|
24
|
-
|
|
26
|
+
Verify:
|
|
25
27
|
|
|
26
|
-
|
|
28
|
+
1. Every imported slide resolves to an existing file in `src/slides/`
|
|
29
|
+
2. Every imported slide appears in the `slides` array
|
|
30
|
+
3. There are no unused imports or undefined slide entries
|
|
31
|
+
4. `slides` is non-empty
|
|
32
|
+
5. `theme` and `designSystem` were not changed accidentally during unrelated work
|
|
27
33
|
|
|
28
|
-
|
|
29
|
-
- [ ] Wrapped in `<Slide index={index} className={styles.xxx}>` (accepts `index` as prop)
|
|
30
|
-
- [ ] Contains `<div className="accent-bar" />` as first child
|
|
31
|
-
- [ ] Contains at least one decorative orb
|
|
32
|
-
- [ ] Content is inside `<div className="content-frame content-gutter">`
|
|
33
|
-
- [ ] `<BottomBar />` is the **last child** inside `<Slide>`
|
|
34
|
-
- [ ] `BottomBar text` is consistent across all slides in the project
|
|
34
|
+
## Step 2: Validate slide structure against the descriptor
|
|
35
35
|
|
|
36
|
-
For each `.
|
|
37
|
-
- [ ] `background: var(--bg-deep)`
|
|
38
|
-
- [ ] `padding: 0 0 44px 0`
|
|
39
|
-
- [ ] Does NOT use `flex: 1` on the body wrapper (defeats vertical centering)
|
|
40
|
-
- [ ] Does NOT redundantly set `flex-direction: column` (inherited from engine `.slide` class)
|
|
36
|
+
For each slide `.jsx` file in `src/slides/`, check:
|
|
41
37
|
|
|
42
|
-
|
|
38
|
+
### Common checks (all themes)
|
|
43
39
|
|
|
44
|
-
|
|
40
|
+
- [ ] Imports `{ Slide, BottomBar }` from `'@deckio/deck-engine'`
|
|
41
|
+
- [ ] Uses `<Slide index={index} className={styles.xxx}>`
|
|
42
|
+
- [ ] Uses a wrapper that includes `content-frame content-gutter`
|
|
43
|
+
- [ ] Places `<BottomBar />` as the last child inside `<Slide>`
|
|
44
|
+
- [ ] Uses consistent `BottomBar text` across slides
|
|
45
45
|
|
|
46
|
-
-
|
|
47
|
-
- No orphaned `.module.css` files without a matching `.jsx`
|
|
46
|
+
### Descriptor-driven checks
|
|
48
47
|
|
|
49
|
-
|
|
48
|
+
Read the descriptor and verify the slide matches:
|
|
50
49
|
|
|
51
|
-
|
|
50
|
+
- its **Exact JSX skeleton**
|
|
51
|
+
- its **Decorative elements available** section
|
|
52
|
+
- its **Available components** section
|
|
53
|
+
- its **Anti-patterns** section
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
- [ ] `id` — string, matches the project folder name convention
|
|
55
|
-
- [ ] `title` — display name
|
|
56
|
-
- [ ] `subtitle` — tagline
|
|
57
|
-
- [ ] `icon` — emoji
|
|
58
|
-
- [ ] `accent` — CSS color value
|
|
59
|
-
- [ ] `slides` — non-empty array
|
|
55
|
+
Examples:
|
|
60
56
|
|
|
61
|
-
|
|
57
|
+
- If the descriptor requires `accent-bar` and orbs, those must be present
|
|
58
|
+
- If the descriptor forbids `accent-bar`, `orb`, or deep-space ornament, they must be absent
|
|
59
|
+
- If the descriptor allows shadcn / ReactBits imports, imports must stay inside that ecosystem
|
|
60
|
+
|
|
61
|
+
## Step 3: Validate CSS against the descriptor
|
|
62
|
+
|
|
63
|
+
For each `.module.css` file, check:
|
|
64
|
+
|
|
65
|
+
### Common checks (all themes)
|
|
66
|
+
|
|
67
|
+
- [ ] Root class includes `padding: 0 0 44px 0`
|
|
68
|
+
- [ ] No `flex: 1` on the body wrapper
|
|
69
|
+
- [ ] No redundant `flex-direction: column` on the slide root
|
|
70
|
+
- [ ] No obvious overflow-causing patterns
|
|
71
|
+
|
|
72
|
+
### Descriptor-driven checks
|
|
73
|
+
|
|
74
|
+
Read the descriptor and verify the CSS matches:
|
|
62
75
|
|
|
63
|
-
|
|
76
|
+
- its **Exact CSS skeleton**
|
|
77
|
+
- its **Token table**
|
|
78
|
+
- its **Anti-patterns**
|
|
64
79
|
|
|
65
|
-
|
|
80
|
+
Examples:
|
|
66
81
|
|
|
82
|
+
- If the descriptor requires `var(--background)`, `var(--card)`, `var(--border)`, or other semantic tokens, use those exact names
|
|
83
|
+
- If the descriptor forbids `var(--bg-deep)`, `var(--surface)`, `var(--text)`, or `var(--text-muted)`, flag them
|
|
84
|
+
- If the descriptor forbids orb positioning classes or card `::before` bars, flag them
|
|
85
|
+
|
|
86
|
+
## Step 4: Check companion files
|
|
87
|
+
|
|
88
|
+
- Every `.jsx` slide in `src/slides/` should have a matching `.module.css`
|
|
89
|
+
- No orphaned `.module.css` files without a matching `.jsx`
|
|
90
|
+
|
|
91
|
+
## Step 5: Validate theme/design-system alignment
|
|
92
|
+
|
|
93
|
+
Check whether the project configuration and descriptor agree:
|
|
94
|
+
|
|
95
|
+
- If `designSystem === 'shadcn'`, the project should visually and structurally follow the shadcn descriptor rules
|
|
96
|
+
- If `designSystem` is not `'shadcn'`, the project should follow a default DECKIO descriptor such as dark or light
|
|
97
|
+
- If the descriptor and `designSystem` disagree, report an **architecture mismatch** even if individual slides render
|
|
98
|
+
|
|
99
|
+
## Step 6: Report results
|
|
100
|
+
|
|
101
|
+
Summarize:
|
|
102
|
+
|
|
103
|
+
- Active theme detected
|
|
104
|
+
- Design system detected
|
|
105
|
+
- Descriptor used
|
|
67
106
|
- Number of slides validated
|
|
68
|
-
-
|
|
107
|
+
- Descriptor mismatches found
|
|
108
|
+
- Any issues found and fixed
|
|
69
109
|
- Overall project health: **pass** or **issues found**
|
|
70
110
|
|
|
71
|
-
---
|
|
72
|
-
|
|
73
111
|
## Quick checklist
|
|
74
112
|
|
|
75
|
-
- [ ]
|
|
76
|
-
- [ ]
|
|
113
|
+
- [ ] Read `theme` and `designSystem`
|
|
114
|
+
- [ ] Read the active descriptor
|
|
115
|
+
- [ ] All `deck.config.js` imports resolve
|
|
116
|
+
- [ ] `slides` array matches imports
|
|
77
117
|
- [ ] Every `.jsx` slide has a companion `.module.css`
|
|
78
|
-
- [ ] All slides
|
|
79
|
-
- [ ] BottomBar
|
|
80
|
-
- [ ] CSS root classes have required properties
|
|
81
|
-
- [ ]
|
|
118
|
+
- [ ] All slides match the descriptor and the design system
|
|
119
|
+
- [ ] `BottomBar` is present and consistent
|
|
120
|
+
- [ ] CSS root classes have required properties
|
|
121
|
+
- [ ] No descriptor anti-patterns slipped in
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Theme Descriptor — Dark
|
|
2
|
+
|
|
3
|
+
## Metadata
|
|
4
|
+
|
|
5
|
+
- **Theme id:** `dark`
|
|
6
|
+
- **Primary slide authoring pattern:** `default`
|
|
7
|
+
- **Compatible design systems:** `default`
|
|
8
|
+
- **Mood:** deep-space, cinematic, high-contrast, presentation-first
|
|
9
|
+
- **Read this file when:** `deck.config.js` uses `theme: 'dark'` or no explicit theme and you need to create, inspect, validate, or generate assets for slides
|
|
10
|
+
|
|
11
|
+
## Slide personality
|
|
12
|
+
|
|
13
|
+
Dark slides should feel unmistakably DECKIO: a deep background, a left accent bar, ambient orb decoration, and high-contrast content surfaces that glow subtly without looking noisy.
|
|
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
|
+
var(--accent),
|
|
63
|
+
color-mix(in srgb, var(--green) 30%, transparent) 50%,
|
|
64
|
+
transparent 70%
|
|
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
|
+
var(--purple-deep),
|
|
76
|
+
color-mix(in srgb, var(--purple-deep) 30%, transparent) 60%,
|
|
77
|
+
transparent 75%
|
|
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(--secondary);
|
|
99
|
+
border: 1px solid var(--border);
|
|
100
|
+
border-radius: 16px;
|
|
101
|
+
padding: 24px;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.card::before {
|
|
105
|
+
content: '';
|
|
106
|
+
position: absolute;
|
|
107
|
+
top: 0;
|
|
108
|
+
left: 0;
|
|
109
|
+
right: 0;
|
|
110
|
+
height: 3px;
|
|
111
|
+
background: linear-gradient(90deg, var(--purple), var(--accent));
|
|
112
|
+
opacity: 0.6;
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Token table
|
|
117
|
+
|
|
118
|
+
### Use these tokens
|
|
119
|
+
|
|
120
|
+
- `var(--background)`
|
|
121
|
+
- `var(--foreground)`
|
|
122
|
+
- `var(--muted-foreground)`
|
|
123
|
+
- `var(--secondary)`
|
|
124
|
+
- `var(--border)`
|
|
125
|
+
- `var(--accent)`
|
|
126
|
+
- `var(--blue-glow)`
|
|
127
|
+
- `var(--purple)`
|
|
128
|
+
- `var(--purple-deep)`
|
|
129
|
+
- `var(--pink)`
|
|
130
|
+
- `var(--cyan)`
|
|
131
|
+
- `var(--green)`
|
|
132
|
+
- `var(--surface-overlay)`
|
|
133
|
+
|
|
134
|
+
### Never regress to
|
|
135
|
+
|
|
136
|
+
- `var(--bg-deep)` in new slide code
|
|
137
|
+
- `var(--surface)` in new slide code
|
|
138
|
+
- `var(--text)` or `var(--text-muted)` in new slide code
|
|
139
|
+
|
|
140
|
+
## Decorative elements available
|
|
141
|
+
|
|
142
|
+
| Element | How to use it |
|
|
143
|
+
|---|---|
|
|
144
|
+
| `accent-bar` | Required first child for default DECKIO slides |
|
|
145
|
+
| `orb` | Required ambient decoration; add 2–4 per slide |
|
|
146
|
+
| `grid-dots` | Optional subtle pattern layer inside the content area |
|
|
147
|
+
| Card top gradient | Acceptable via `.card::before` in the default system |
|
|
148
|
+
|
|
149
|
+
## Available components
|
|
150
|
+
|
|
151
|
+
| Resource | Import path |
|
|
152
|
+
|---|---|
|
|
153
|
+
| `Slide`, `BottomBar`, `Navigation`, `SlideProvider`, `useSlides`, `GenericThankYouSlide` | `'@deckio/deck-engine'` |
|
|
154
|
+
| Data / logos | `'../data/<file>'` |
|
|
155
|
+
|
|
156
|
+
## Anti-patterns
|
|
157
|
+
|
|
158
|
+
1. Missing `accent-bar`
|
|
159
|
+
2. Missing orb decoration
|
|
160
|
+
3. Missing `content-frame content-gutter`
|
|
161
|
+
4. Missing `BottomBar`
|
|
162
|
+
5. Using `flex: 1` on the body wrapper
|
|
163
|
+
6. Adding `flex-direction: column` on the slide root
|
|
164
|
+
7. Overloading the slide until it overflows the viewport
|
|
165
|
+
8. Importing shadcn-only UI components into a default DECKIO slide
|
|
166
|
+
|
|
167
|
+
## Example slide direction
|
|
168
|
+
|
|
169
|
+
A strong dark slide should combine a bold heading, restrained supporting copy, and 3-card content blocks over a deep background. The cards can use the default gradient top rule; the overall frame should still feel calm and readable from a distance.
|