@sanity-labs/slides 0.0.0

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.
Files changed (224) hide show
  1. package/README.md +241 -0
  2. package/SKILL.md +119 -0
  3. package/dist/cli.d.ts +38 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +386 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/components.d.ts +179 -0
  8. package/dist/core/components.d.ts.map +1 -0
  9. package/dist/core/components.js +40 -0
  10. package/dist/core/components.js.map +1 -0
  11. package/dist/core/fake-runtime.d.ts +138 -0
  12. package/dist/core/fake-runtime.d.ts.map +1 -0
  13. package/dist/core/fake-runtime.js +210 -0
  14. package/dist/core/fake-runtime.js.map +1 -0
  15. package/dist/core/font-resolver.d.ts +28 -0
  16. package/dist/core/font-resolver.d.ts.map +1 -0
  17. package/dist/core/font-resolver.js +30 -0
  18. package/dist/core/font-resolver.js.map +1 -0
  19. package/dist/core/geometry.d.ts +71 -0
  20. package/dist/core/geometry.d.ts.map +1 -0
  21. package/dist/core/geometry.js +44 -0
  22. package/dist/core/geometry.js.map +1 -0
  23. package/dist/core/index.d.ts +19 -0
  24. package/dist/core/index.d.ts.map +1 -0
  25. package/dist/core/index.js +20 -0
  26. package/dist/core/index.js.map +1 -0
  27. package/dist/core/manifest.d.ts +123 -0
  28. package/dist/core/manifest.d.ts.map +1 -0
  29. package/dist/core/manifest.js +43 -0
  30. package/dist/core/manifest.js.map +1 -0
  31. package/dist/core/op-translator-pptx.d.ts +150 -0
  32. package/dist/core/op-translator-pptx.d.ts.map +1 -0
  33. package/dist/core/op-translator-pptx.js +245 -0
  34. package/dist/core/op-translator-pptx.js.map +1 -0
  35. package/dist/core/pptx-runtime.d.ts +103 -0
  36. package/dist/core/pptx-runtime.d.ts.map +1 -0
  37. package/dist/core/pptx-runtime.js +405 -0
  38. package/dist/core/pptx-runtime.js.map +1 -0
  39. package/dist/core/reconciler.d.ts +113 -0
  40. package/dist/core/reconciler.d.ts.map +1 -0
  41. package/dist/core/reconciler.js +453 -0
  42. package/dist/core/reconciler.js.map +1 -0
  43. package/dist/core/runtime.d.ts +161 -0
  44. package/dist/core/runtime.d.ts.map +1 -0
  45. package/dist/core/runtime.js +11 -0
  46. package/dist/core/runtime.js.map +1 -0
  47. package/dist/core/template.d.ts +32 -0
  48. package/dist/core/template.d.ts.map +1 -0
  49. package/dist/core/template.js +3 -0
  50. package/dist/core/template.js.map +1 -0
  51. package/dist/dev/auto-examples.d.ts +6 -0
  52. package/dist/dev/auto-examples.d.ts.map +1 -0
  53. package/dist/dev/auto-examples.js +79 -0
  54. package/dist/dev/auto-examples.js.map +1 -0
  55. package/dist/dev/bin/slides-dev.d.ts +3 -0
  56. package/dist/dev/bin/slides-dev.d.ts.map +1 -0
  57. package/dist/dev/bin/slides-dev.js +87 -0
  58. package/dist/dev/bin/slides-dev.js.map +1 -0
  59. package/dist/dev/bin/slides-dev.mjs +24 -0
  60. package/dist/dev/compose-deck.d.ts +18 -0
  61. package/dist/dev/compose-deck.d.ts.map +1 -0
  62. package/dist/dev/compose-deck.js +19 -0
  63. package/dist/dev/compose-deck.js.map +1 -0
  64. package/dist/dev/deck-viewer.d.ts +19 -0
  65. package/dist/dev/deck-viewer.d.ts.map +1 -0
  66. package/dist/dev/deck-viewer.js +237 -0
  67. package/dist/dev/deck-viewer.js.map +1 -0
  68. package/dist/dev/dev-server/client/entry.d.ts +2 -0
  69. package/dist/dev/dev-server/client/entry.d.ts.map +1 -0
  70. package/dist/dev/dev-server/client/entry.js +12 -0
  71. package/dist/dev/dev-server/client/entry.js.map +1 -0
  72. package/dist/dev/dev-server/output.d.ts +8 -0
  73. package/dist/dev/dev-server/output.d.ts.map +1 -0
  74. package/dist/dev/dev-server/output.js +32 -0
  75. package/dist/dev/dev-server/output.js.map +1 -0
  76. package/dist/dev/dev-server/server-only-stub.d.ts +7 -0
  77. package/dist/dev/dev-server/server-only-stub.d.ts.map +1 -0
  78. package/dist/dev/dev-server/server-only-stub.js +12 -0
  79. package/dist/dev/dev-server/server-only-stub.js.map +1 -0
  80. package/dist/dev/dev-server/start.d.ts +14 -0
  81. package/dist/dev/dev-server/start.d.ts.map +1 -0
  82. package/dist/dev/dev-server/start.js +135 -0
  83. package/dist/dev/dev-server/start.js.map +1 -0
  84. package/dist/dev/index.d.ts +5 -0
  85. package/dist/dev/index.d.ts.map +1 -0
  86. package/dist/dev/index.js +5 -0
  87. package/dist/dev/index.js.map +1 -0
  88. package/dist/dev/lib/cn.d.ts +3 -0
  89. package/dist/dev/lib/cn.d.ts.map +1 -0
  90. package/dist/dev/lib/cn.js +3 -0
  91. package/dist/dev/lib/cn.js.map +1 -0
  92. package/dist/dev/slide-canvas.d.ts +12 -0
  93. package/dist/dev/slide-canvas.d.ts.map +1 -0
  94. package/dist/dev/slide-canvas.js +123 -0
  95. package/dist/dev/slide-canvas.js.map +1 -0
  96. package/dist/dev/styles.css +37 -0
  97. package/dist/dev/ui/icon-button.d.ts +12 -0
  98. package/dist/dev/ui/icon-button.d.ts.map +1 -0
  99. package/dist/dev/ui/icon-button.js +6 -0
  100. package/dist/dev/ui/icon-button.js.map +1 -0
  101. package/dist/dev/ui/kbd.d.ts +6 -0
  102. package/dist/dev/ui/kbd.d.ts.map +1 -0
  103. package/dist/dev/ui/kbd.js +4 -0
  104. package/dist/dev/ui/kbd.js.map +1 -0
  105. package/dist/dev/ui/text-button.d.ts +10 -0
  106. package/dist/dev/ui/text-button.d.ts.map +1 -0
  107. package/dist/dev/ui/text-button.js +6 -0
  108. package/dist/dev/ui/text-button.js.map +1 -0
  109. package/dist/dev/url-state.d.ts +7 -0
  110. package/dist/dev/url-state.d.ts.map +1 -0
  111. package/dist/dev/url-state.js +13 -0
  112. package/dist/dev/url-state.js.map +1 -0
  113. package/dist/dev/use-keyboard-nav.d.ts +17 -0
  114. package/dist/dev/use-keyboard-nav.d.ts.map +1 -0
  115. package/dist/dev/use-keyboard-nav.js +53 -0
  116. package/dist/dev/use-keyboard-nav.js.map +1 -0
  117. package/dist/index.d.ts +17 -0
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +17 -0
  120. package/dist/index.js.map +1 -0
  121. package/dist/mcp/errors.d.ts +57 -0
  122. package/dist/mcp/errors.d.ts.map +1 -0
  123. package/dist/mcp/errors.js +44 -0
  124. package/dist/mcp/errors.js.map +1 -0
  125. package/dist/mcp/index.d.ts +29 -0
  126. package/dist/mcp/index.d.ts.map +1 -0
  127. package/dist/mcp/index.js +29 -0
  128. package/dist/mcp/index.js.map +1 -0
  129. package/dist/mcp/naming.d.ts +37 -0
  130. package/dist/mcp/naming.d.ts.map +1 -0
  131. package/dist/mcp/naming.js +43 -0
  132. package/dist/mcp/naming.js.map +1 -0
  133. package/dist/mcp/render.d.ts +45 -0
  134. package/dist/mcp/render.d.ts.map +1 -0
  135. package/dist/mcp/render.js +77 -0
  136. package/dist/mcp/render.js.map +1 -0
  137. package/dist/mcp/schema.d.ts +54 -0
  138. package/dist/mcp/schema.d.ts.map +1 -0
  139. package/dist/mcp/schema.js +55 -0
  140. package/dist/mcp/schema.js.map +1 -0
  141. package/dist/mcp/server.d.ts +63 -0
  142. package/dist/mcp/server.d.ts.map +1 -0
  143. package/dist/mcp/server.js +196 -0
  144. package/dist/mcp/server.js.map +1 -0
  145. package/dist/scaffold/index.d.ts +39 -0
  146. package/dist/scaffold/index.d.ts.map +1 -0
  147. package/dist/scaffold/index.js +84 -0
  148. package/dist/scaffold/index.js.map +1 -0
  149. package/dist/scaffold/template-base/README.md +134 -0
  150. package/dist/scaffold/template-base/_gitignore +4 -0
  151. package/dist/scaffold/template-base/package.json +35 -0
  152. package/dist/scaffold/template-base/src/components/Cover.tsx +30 -0
  153. package/dist/scaffold/template-base/src/index.ts +27 -0
  154. package/dist/scaffold/template-base/src/preview.tsx +9 -0
  155. package/dist/scaffold/template-base/tsconfig.build.json +10 -0
  156. package/dist/scaffold/template-base/tsconfig.json +18 -0
  157. package/package.json +164 -0
  158. package/src/__tests__/fixtures/test-template/index.tsx +77 -0
  159. package/src/__tests__/pptx-mcp.test.ts +85 -0
  160. package/src/__tests__/pptx-smoke.test.ts +45 -0
  161. package/src/__tests__/preview.test.ts +28 -0
  162. package/src/cli.ts +426 -0
  163. package/src/core/__snapshots__/reconciler.test.ts.snap +320 -0
  164. package/src/core/components.test.ts +57 -0
  165. package/src/core/components.ts +196 -0
  166. package/src/core/fake-runtime.test.ts +174 -0
  167. package/src/core/fake-runtime.ts +302 -0
  168. package/src/core/font-resolver.ts +46 -0
  169. package/src/core/geometry.test.ts +58 -0
  170. package/src/core/geometry.ts +91 -0
  171. package/src/core/index.ts +69 -0
  172. package/src/core/manifest.test.ts +33 -0
  173. package/src/core/manifest.ts +150 -0
  174. package/src/core/op-translator-pptx.test.ts +204 -0
  175. package/src/core/op-translator-pptx.ts +365 -0
  176. package/src/core/pptx-runtime.test.ts +137 -0
  177. package/src/core/pptx-runtime.ts +504 -0
  178. package/src/core/reconciler.test.ts +644 -0
  179. package/src/core/reconciler.ts +603 -0
  180. package/src/core/runtime.ts +150 -0
  181. package/src/core/template.test.ts +136 -0
  182. package/src/core/template.ts +37 -0
  183. package/src/dev/auto-examples.ts +89 -0
  184. package/src/dev/bin/slides-dev.mjs +24 -0
  185. package/src/dev/bin/slides-dev.ts +101 -0
  186. package/src/dev/compose-deck.test.ts +68 -0
  187. package/src/dev/compose-deck.ts +40 -0
  188. package/src/dev/deck-viewer.tsx +677 -0
  189. package/src/dev/dev-server/client/entry.tsx +15 -0
  190. package/src/dev/dev-server/client/index.html +24 -0
  191. package/src/dev/dev-server/output.ts +37 -0
  192. package/src/dev/dev-server/server-only-stub.ts +12 -0
  193. package/src/dev/dev-server/start.ts +155 -0
  194. package/src/dev/index.ts +4 -0
  195. package/src/dev/lib/cn.ts +3 -0
  196. package/src/dev/slide-canvas.test.tsx +66 -0
  197. package/src/dev/slide-canvas.tsx +170 -0
  198. package/src/dev/styles.css +37 -0
  199. package/src/dev/ui/icon-button.tsx +31 -0
  200. package/src/dev/ui/kbd.tsx +20 -0
  201. package/src/dev/ui/text-button.tsx +31 -0
  202. package/src/dev/url-state.test.ts +22 -0
  203. package/src/dev/url-state.ts +17 -0
  204. package/src/dev/use-keyboard-nav.ts +64 -0
  205. package/src/index.ts +17 -0
  206. package/src/mcp/errors.test.ts +51 -0
  207. package/src/mcp/errors.ts +76 -0
  208. package/src/mcp/index.ts +45 -0
  209. package/src/mcp/naming.test.ts +39 -0
  210. package/src/mcp/naming.ts +49 -0
  211. package/src/mcp/render.ts +110 -0
  212. package/src/mcp/schema.test.ts +86 -0
  213. package/src/mcp/schema.ts +93 -0
  214. package/src/mcp/server.test.ts +309 -0
  215. package/src/mcp/server.ts +276 -0
  216. package/src/scaffold/index.ts +102 -0
  217. package/src/scaffold/template-base/README.md +134 -0
  218. package/src/scaffold/template-base/_gitignore +4 -0
  219. package/src/scaffold/template-base/package.json +35 -0
  220. package/src/scaffold/template-base/src/components/Cover.tsx +30 -0
  221. package/src/scaffold/template-base/src/index.ts +27 -0
  222. package/src/scaffold/template-base/src/preview.tsx +9 -0
  223. package/src/scaffold/template-base/tsconfig.build.json +10 -0
  224. package/src/scaffold/template-base/tsconfig.json +18 -0
@@ -0,0 +1,134 @@
1
+ # **NAME**
2
+
3
+ A react-pptx template. The brand lives in JSX; an LLM (Claude, anything that
4
+ speaks MCP) drives it through the generic `react-pptx-mcp` server without
5
+ ever touching fonts, colors, or layout.
6
+
7
+ ## Develop
8
+
9
+ ```bash
10
+ pnpm install
11
+ pnpm dev
12
+ ```
13
+
14
+ Opens the hot-reloading viewer at <http://localhost:5173>. Edit anything
15
+ under `src/` and the page updates.
16
+
17
+ ## Anatomy
18
+
19
+ ```
20
+ src/
21
+ ├── index.ts # Template value — tokens, fonts, components map
22
+ ├── preview.tsx # Canonical slide order shown in the viewer
23
+ └── components/ # Slide components, each one a Zod schema + JSX
24
+ ```
25
+
26
+ The Zod schema on every component is what Claude sees as the tool input
27
+ schema. Field descriptions become the LLM-facing documentation. Drop a
28
+ new component into `src/components/` and `defineTemplateComponent({...})`
29
+ in `src/index.ts` — that's the entire authoring loop.
30
+
31
+ ## Generate a deck from the CLI
32
+
33
+ After editing, build once and then invoke the generic CLI against your
34
+ template:
35
+
36
+ ```bash
37
+ pnpm build
38
+ echo '{
39
+ "title": "Q2 Review",
40
+ "slides": [{ "component": "Cover", "props": { "title": "Q2 Review" } }]
41
+ }' | pnpm generate --output ~/Desktop
42
+ # /Users/you/Desktop/Q2-Review.pptx
43
+ ```
44
+
45
+ `pnpm generate` is a thin wrapper around `react-pptx-mcp generate --template
46
+ ./dist/index.js`.
47
+
48
+ ## Plug this template into Claude Desktop
49
+
50
+ No global install. No per-template binary. Use `npx` so Claude pulls the
51
+ generic MCP server straight from npm.
52
+
53
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`
54
+ (or the equivalent on your OS):
55
+
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "__NAME__-slides": {
60
+ "command": "npx",
61
+ "args": [
62
+ "-y",
63
+ "react-pptx-mcp",
64
+ "serve",
65
+ "--template",
66
+ "/absolute/path/to/__NAME__/dist/index.js",
67
+ "--output",
68
+ "/Users/you/Desktop"
69
+ ]
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ Restart Claude. Three tools appear, auto-derived from this template:
76
+
77
+ | Tool | Purpose |
78
+ | ------------------- | ---------------------------------------------------------------- |
79
+ | `slides_list` | Lists every slide type, with descriptions. |
80
+ | `slides_add_<type>` | Validates a single slide's props against the Zod schema. |
81
+ | `slides_create` | Takes `{ title, slides }`, writes the `.pptx`, returns the path. |
82
+
83
+ Ask Claude:
84
+
85
+ > "Make me a 5-slide Q2 review deck with this template."
86
+
87
+ Whenever you edit the template, run `pnpm build` and Claude will pick up
88
+ the changes on its next request.
89
+
90
+ ### Want Claude to know the conventions up front?
91
+
92
+ Drop the bundled skill into your Claude project. Print it with:
93
+
94
+ ```bash
95
+ npx react-pptx-mcp skill
96
+ ```
97
+
98
+ …and paste into your Claude project's knowledge sources.
99
+
100
+ ## API in 30 seconds
101
+
102
+ ```ts
103
+ import { defineTemplate, defineTemplateComponent, CANVAS_16_9 } from 'react-pptx';
104
+ import { Cover, CoverSchema } from './components/Cover.js';
105
+ import { preview } from './preview.js';
106
+
107
+ export const __IDENT__ = defineTemplate({
108
+ name: '__NAME__',
109
+ canvas: CANVAS_16_9,
110
+ fonts: { display: ['Inter'], body: ['Inter'], mono: ['IBM Plex Mono'] },
111
+ colors: {},
112
+ typography: {},
113
+ spacing: {},
114
+ components: {
115
+ Cover: defineTemplateComponent({
116
+ component: Cover,
117
+ schema: CoverSchema,
118
+ description: 'Use as the first slide of a deck.',
119
+ }),
120
+ },
121
+ preview,
122
+ });
123
+ ```
124
+
125
+ Add a new component:
126
+
127
+ 1. Create `src/components/MySlide.tsx` exporting a Zod schema and a React
128
+ component. Keep all styling token-locked through your tokens map.
129
+ 2. Register it in `src/index.ts` under `components` with a clear
130
+ description (LLMs read it).
131
+ 3. Add a sample call in `src/preview.tsx` so the viewer shows it.
132
+
133
+ Run `pnpm build` and the new component appears as `slides_add_my_slide` the
134
+ next time Claude talks to your MCP server.
@@ -0,0 +1,4 @@
1
+ node_modules
2
+ dist
3
+ *.tsbuildinfo
4
+ .vite
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "__NAME__",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "description": "A react-pptx template.",
6
+ "type": "module",
7
+ "main": "./src/index.ts",
8
+ "types": "./src/index.ts",
9
+ "files": [
10
+ "dist",
11
+ "src"
12
+ ],
13
+ "scripts": {
14
+ "dev": "slides-dev",
15
+ "build": "tsc -p tsconfig.build.json",
16
+ "typecheck": "tsc --noEmit -p tsconfig.json",
17
+ "serve": "react-pptx-mcp serve --template ./dist/index.js",
18
+ "generate": "react-pptx-mcp generate --template ./dist/index.js"
19
+ },
20
+ "peerDependencies": {
21
+ "react": "^19.0.0",
22
+ "react-pptx": "^0.0.0"
23
+ },
24
+ "dependencies": {
25
+ "zod": "^3.23.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/react": "^19.0.0",
29
+ "react": "19.2.5",
30
+ "react-pptx": "^0.0.0",
31
+ "react-pptx-dev": "^0.0.0",
32
+ "react-pptx-mcp": "^0.0.0",
33
+ "typescript": "^5.5.0"
34
+ }
35
+ }
@@ -0,0 +1,30 @@
1
+ import type { ReactElement } from 'react';
2
+ import { Slide, Box, Text } from '../../../../core/index.js';
3
+ import { z } from 'zod';
4
+
5
+ export const CoverSchema = z
6
+ .object({
7
+ title: z.string().min(1).describe('The deck title.'),
8
+ subtitle: z.string().optional().describe('Optional subtitle.'),
9
+ })
10
+ .strict();
11
+
12
+ type CoverProps = z.infer<typeof CoverSchema>;
13
+
14
+ export const Cover = ({ title, subtitle }: CoverProps): ReactElement => (
15
+ <Slide>
16
+ <Box rect={{ x: 0, y: 0, w: 960, h: 540 }} fill={{ kind: 'solid', color: '#0b0b0b' }} />
17
+ <Box rect={{ x: 60, y: 200, w: 800, h: 120 }}>
18
+ <Text textStyle={{ fontFamily: 'display', fontSize: 64, foregroundColor: '#ffffff' }}>
19
+ {title}
20
+ </Text>
21
+ </Box>
22
+ {subtitle ? (
23
+ <Box rect={{ x: 60, y: 320, w: 800, h: 40 }}>
24
+ <Text textStyle={{ fontFamily: 'body', fontSize: 20, foregroundColor: '#cccccc' }}>
25
+ {subtitle}
26
+ </Text>
27
+ </Box>
28
+ ) : null}
29
+ </Slide>
30
+ );
@@ -0,0 +1,27 @@
1
+ import { CANVAS_16_9, defineTemplate, defineTemplateComponent } from '../../../core/index.js';
2
+ import { Cover, CoverSchema } from './components/Cover.js';
3
+ import { preview } from './preview.js';
4
+
5
+ export const __IDENT__ = defineTemplate({
6
+ name: '__NAME__',
7
+ canvas: CANVAS_16_9,
8
+ fonts: {
9
+ display: ['Inter', 'Arial'],
10
+ body: ['Inter', 'Arial'],
11
+ mono: ['IBM Plex Mono', 'Courier New'],
12
+ },
13
+ colors: {
14
+ 'fg.base': '#0b0b0b',
15
+ 'bg.surface': '#ffffff',
16
+ },
17
+ typography: {},
18
+ spacing: { md: 12, lg: 24 },
19
+ components: {
20
+ Cover: defineTemplateComponent({
21
+ component: Cover,
22
+ schema: CoverSchema,
23
+ description: 'Use as the first slide of a deck. Sets the title.',
24
+ }),
25
+ },
26
+ preview,
27
+ });
@@ -0,0 +1,9 @@
1
+ import type { ReactElement } from 'react';
2
+ import { Cover } from './components/Cover.js';
3
+
4
+ export const preview = (): ReactElement => (
5
+ <>
6
+ <Cover title="Hello, __NAME__" subtitle="A react-pptx template." />
7
+ <Cover title="Edit me" subtitle="src/preview.tsx" />
8
+ </>
9
+ );
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "noEmit": false,
5
+ "outDir": "./dist",
6
+ "declaration": true,
7
+ "sourceMap": true
8
+ },
9
+ "include": ["src/**/*"]
10
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "jsx": "react-jsx",
8
+ "strict": true,
9
+ "noUncheckedIndexedAccess": true,
10
+ "isolatedModules": true,
11
+ "esModuleInterop": true,
12
+ "skipLibCheck": true,
13
+ "resolveJsonModule": true,
14
+ "verbatimModuleSyntax": true,
15
+ "noEmit": true
16
+ },
17
+ "include": ["src/**/*"]
18
+ }