@deckio/deck-engine 0.1.1 → 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.
@@ -31,17 +31,34 @@ OPENAI_API_KEY=sk-proj-...
31
31
 
32
32
  ## Workflow
33
33
 
34
- ### Step 1 — Craft the prompt
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** — flat icon, line art, illustration, isometric, etc.
40
- - **Colors** — match the design system: `#0d1117` (bg-deep), `#58a6ff` (accent), `#3fb950` (green), `#bc8cff` (purple).
41
- - **Background** — almost always "transparent 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 2 — Generate
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 3 — Use in a slide
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 4 — Iterate
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-eyes** to verify how it looks in the slide.
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="#58a6ff" strokeWidth="2" />
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. The screenshot is returned inline — no file path needed.
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 (size, weight, color)
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
- Report any issues found to the user.
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 — Create the slide
71
+ ### Step 4 — Build the slide with the active descriptor
72
72
 
73
- Use the **deck-add-slide** skill to build the slide, guided by the sketch:
73
+ Before creating code:
74
74
 
75
- 1. Map sketch regions to CSS Grid or Flexbox layout.
76
- 2. Translate hand-drawn text into real content with proper typography.
77
- 3. Replace rough shapes with styled `<div>` containers using CSS Modules.
78
- 4. Follow all deck-add-slide conventions (accent-bar, content-frame, BottomBar, imports from `@deckio/deck-engine`).
79
- 5. Register the slide in `deck.config.js`.
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-eyes** to capture a screenshot of the rendered result.
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 1: Audit deck.config.js
8
+ ## Step 0 Read `deck.config.js`
9
9
 
10
- Open `deck.config.js` and verify:
10
+ Open `deck.config.js` and read:
11
11
 
12
- ### 1a. All imports resolve
12
+ - `theme`
13
+ - `designSystem`
14
+ - `slides`
13
15
 
14
- For each slide import at the top of the file, verify the target file exists in `src/slides/`.
16
+ Then resolve the active theme descriptor using the same rules as `deck-add-slide`:
15
17
 
16
- ### 1b. slides array matches imports
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
- - Every imported slide should appear in the `slides` array.
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
- ## Step 2: Verify slide structure
26
+ Verify:
25
27
 
26
- For each slide `.jsx` file in `src/slides/`, verify:
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
- - [ ] Imports `{ Slide }` and `{ BottomBar }` from `'@deckio/deck-engine'`
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 `.module.css` file, verify the root class has:
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
- ## Step 3: Check companion files
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
- - Every `.jsx` slide in `src/slides/` should have a matching `.module.css` file
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
- ## Step 4: Verify metadata
50
+ - its **Exact JSX skeleton**
51
+ - its **Decorative elements available** section
52
+ - its **Available components** section
53
+ - its **Anti-patterns** section
52
54
 
53
- Check `deck.config.js` exports these fields:
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
- ## Step 5: Report results
76
+ - its **Exact CSS skeleton**
77
+ - its **Token table**
78
+ - its **Anti-patterns**
64
79
 
65
- Summarize findings:
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
- - Any issues found and fixed (missing files, broken imports, structural issues)
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
- - [ ] All imports in `deck.config.js` resolve to existing files
76
- - [ ] `slides` array matches imports (no unused, no missing)
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 have accent-bar, content-frame, BottomBar
79
- - [ ] BottomBar text is consistent across the project
80
- - [ ] CSS root classes have required properties (`background`, `padding`) and no `flex: 1` on body wrapper
81
- - [ ] Project metadata (id, title, subtitle, icon, accent) is present
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.