@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,32 @@
1
+ import type { ComponentType, ReactNode } from 'react';
2
+ import type { z } from 'zod';
3
+ import type { FontStack } from './font-resolver.js';
4
+ import type { Canvas, Pt } from './geometry.js';
5
+ import type { HexColor } from './runtime.js';
6
+ export interface TemplateComponent<P = unknown> {
7
+ component: ComponentType<P>;
8
+ schema: z.ZodObject<z.ZodRawShape>;
9
+ masterRef?: string;
10
+ description: string;
11
+ }
12
+ export declare const defineTemplateComponent: <P>(spec: TemplateComponent<P>) => TemplateComponent;
13
+ export interface TypographyToken {
14
+ fontFamily: 'display' | 'body' | 'mono';
15
+ fontSize: Pt;
16
+ lineHeight: number;
17
+ letterSpacing?: number;
18
+ fontWeight?: number;
19
+ textTransform?: 'none' | 'uppercase' | 'lowercase';
20
+ }
21
+ export interface Template {
22
+ readonly name: string;
23
+ readonly canvas: Canvas;
24
+ readonly fonts: FontStack;
25
+ readonly colors: Readonly<Record<string, HexColor>>;
26
+ readonly typography: Readonly<Record<string, TypographyToken>>;
27
+ readonly spacing: Readonly<Record<string, Pt>>;
28
+ readonly components: Readonly<Record<string, TemplateComponent>>;
29
+ readonly preview?: () => ReactNode;
30
+ }
31
+ export declare const defineTemplate: (template: Template) => Template;
32
+ //# sourceMappingURL=template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/core/template.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,uBAAuB,GAAI,CAAC,EAAE,MAAM,iBAAiB,CAAC,CAAC,CAAC,KAAG,iBAC7C,CAAC;AAE5B,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC,QAAQ,EAAE,EAAE,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,WAAW,CAAC;CACpD;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAC/D,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,SAAS,CAAC;CACpC;AAED,eAAO,MAAM,cAAc,GAAI,UAAU,QAAQ,KAAG,QAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export const defineTemplateComponent = (spec) => spec;
2
+ export const defineTemplate = (template) => template;
3
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../src/core/template.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAI,IAA0B,EAAqB,EAAE,CAC1F,IAAyB,CAAC;AAsB5B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,QAAkB,EAAY,EAAE,CAAC,QAAQ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { z } from 'zod';
3
+ import type { Template } from '../core/template.js';
4
+ export declare const deriveAutoPreview: (template: Template) => ReactNode;
5
+ export declare const sampleProps: (schema: z.ZodTypeAny, contextName: string) => Record<string, unknown>;
6
+ //# sourceMappingURL=auto-examples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-examples.d.ts","sourceRoot":"","sources":["../../src/dev/auto-examples.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,QAAQ,EAAqB,MAAM,qBAAqB,CAAC;AAEvE,eAAO,MAAM,iBAAiB,GAAI,UAAU,QAAQ,KAAG,SAQtD,CAAC;AAMF,eAAO,MAAM,WAAW,GAAI,QAAQ,CAAC,CAAC,UAAU,EAAE,aAAa,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAG7F,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { Fragment, createElement } from 'react';
2
+ export const deriveAutoPreview = (template) => {
3
+ const entries = Object.entries(template.components);
4
+ if (entries.length === 0)
5
+ return null;
6
+ return createElement(Fragment, null, ...entries.map(([name, tc]) => createElement(Fragment, { key: name }, renderSample(tc, name))));
7
+ };
8
+ const renderSample = (tc, name) => {
9
+ const props = sampleProps(tc.schema, name);
10
+ return createElement(tc.component, props);
11
+ };
12
+ export const sampleProps = (schema, contextName) => {
13
+ const value = sample(schema, contextName);
14
+ return (value && typeof value === 'object' ? value : {}) ?? {};
15
+ };
16
+ const sample = (schema, ctx) => {
17
+ const def = schema._def;
18
+ switch (def.typeName) {
19
+ case 'ZodObject':
20
+ return sampleObject(schema, ctx);
21
+ case 'ZodString':
22
+ return sampleString(schema, ctx);
23
+ case 'ZodNumber':
24
+ return 1;
25
+ case 'ZodBoolean':
26
+ return false;
27
+ case 'ZodEnum':
28
+ case 'ZodNativeEnum': {
29
+ const values = def.values;
30
+ const arr = Array.isArray(values) ? values : Object.values(values);
31
+ return arr[0];
32
+ }
33
+ case 'ZodLiteral':
34
+ return def.value;
35
+ case 'ZodUnion':
36
+ case 'ZodDiscriminatedUnion': {
37
+ const options = def.options;
38
+ return options.length > 0 && options[0] ? sample(options[0], ctx) : undefined;
39
+ }
40
+ case 'ZodArray': {
41
+ const item = def.type;
42
+ return [sample(item, ctx), sample(item, ctx)];
43
+ }
44
+ case 'ZodOptional':
45
+ case 'ZodNullable':
46
+ case 'ZodDefault': {
47
+ const inner = def.innerType;
48
+ return sample(inner, ctx);
49
+ }
50
+ case 'ZodEffects': {
51
+ const inner = def.schema;
52
+ return sample(inner, ctx);
53
+ }
54
+ default:
55
+ return undefined;
56
+ }
57
+ };
58
+ const sampleObject = (schema, ctx) => {
59
+ const shape = schema.shape;
60
+ const out = {};
61
+ for (const [key, child] of Object.entries(shape)) {
62
+ if (isOptional(child))
63
+ continue;
64
+ out[key] = sample(child, `${ctx}.${key}`);
65
+ }
66
+ return out;
67
+ };
68
+ const isOptional = (schema) => {
69
+ const name = schema._def.typeName;
70
+ return name === 'ZodOptional' || name === 'ZodDefault' || name === 'ZodNullable';
71
+ };
72
+ const sampleString = (schema, ctx) => {
73
+ const checks = schema._def
74
+ .checks ?? [];
75
+ const min = checks.find((c) => c.kind === 'min')?.value ?? 0;
76
+ const sample = `Sample ${ctx.split('.').pop() ?? 'value'}`;
77
+ return sample.length >= min ? sample : sample.padEnd(min, '.');
78
+ };
79
+ //# sourceMappingURL=auto-examples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-examples.js","sourceRoot":"","sources":["../../src/dev/auto-examples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=slides-dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slides-dev.d.ts","sourceRoot":"","sources":["../../../src/dev/bin/slides-dev.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env node
2
+ import { realpathSync } from 'node:fs';
3
+ import { basename } from 'node:path';
4
+ import pc from 'picocolors';
5
+ import { startDevServer } from '../dev-server/start.js';
6
+ import { formatBanner, formatReady, formatStartupError } from '../dev-server/output.js';
7
+ const USAGE = `${pc.bold('Usage:')} slides-dev [options]
8
+
9
+ ${pc.bold('Options:')}
10
+ --port <n> Dev server port. Default: 5173.
11
+ --host <h> Dev server host. Default: localhost.
12
+ Pass --host with no value to expose on the network.
13
+ -h, --help Show this help.
14
+
15
+ Run from your template package directory.
16
+ `;
17
+ const parseFlags = (argv) => {
18
+ const out = { exposed: false };
19
+ for (let i = 0; i < argv.length; i++) {
20
+ const arg = argv[i];
21
+ if (arg === '--help' || arg === '-h') {
22
+ process.stdout.write(USAGE);
23
+ process.exit(0);
24
+ }
25
+ if (arg === '--port') {
26
+ const v = argv[++i];
27
+ if (!v)
28
+ throw new Error('Missing value for --port');
29
+ out.port = Number.parseInt(v, 10);
30
+ continue;
31
+ }
32
+ if (arg === '--host') {
33
+ const v = argv[i + 1];
34
+ if (v && !v.startsWith('--')) {
35
+ out.host = v;
36
+ i++;
37
+ }
38
+ else {
39
+ out.host = '0.0.0.0';
40
+ }
41
+ out.exposed = true;
42
+ continue;
43
+ }
44
+ throw new Error(`Unknown argument: ${arg}`);
45
+ }
46
+ return out;
47
+ };
48
+ const main = async () => {
49
+ const flags = parseFlags(process.argv.slice(2));
50
+ const handle = await startDevServer({
51
+ cwd: process.cwd(),
52
+ ...(flags.port !== undefined ? { port: flags.port } : {}),
53
+ ...(flags.host !== undefined ? { host: flags.host } : {}),
54
+ });
55
+ const templateName = inferTemplateName(handle.templatePath);
56
+ process.stdout.write(formatBanner(templateName, handle.startedInMs));
57
+ process.stdout.write(formatReady({
58
+ url: handle.url,
59
+ templatePath: handle.templatePath,
60
+ host: flags.exposed,
61
+ }));
62
+ process.stdout.write('\n');
63
+ const shutdown = async () => {
64
+ await handle.server.close();
65
+ process.exit(0);
66
+ };
67
+ process.on('SIGINT', shutdown);
68
+ process.on('SIGTERM', shutdown);
69
+ };
70
+ const findPackageDirName = (templatePath) => {
71
+ const parts = templatePath.split('/').filter(Boolean);
72
+ for (let i = parts.length - 1; i >= 0; i--) {
73
+ if (parts[i] === 'src' && i > 0)
74
+ return parts[i - 1];
75
+ }
76
+ return undefined;
77
+ };
78
+ const inferTemplateName = (templatePath) => findPackageDirName(templatePath) ?? basename(templatePath, '.ts');
79
+ const argvPath = process.argv[1];
80
+ const isEntrypoint = argvPath !== undefined && import.meta.filename === realpathSync(argvPath);
81
+ if (isEntrypoint) {
82
+ main().catch((err) => {
83
+ process.stderr.write(formatStartupError(err));
84
+ process.exit(1);
85
+ });
86
+ }
87
+ //# sourceMappingURL=slides-dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slides-dev.js","sourceRoot":"","sources":["../../../src/dev/bin/slides-dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn } from 'node:child_process';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { dirname, resolve } from 'node:path';
6
+ import { createRequire } from 'node:module';
7
+
8
+ const here = dirname(fileURLToPath(import.meta.url));
9
+ const require = createRequire(import.meta.url);
10
+
11
+ const tsxLoader = require.resolve('tsx/esm');
12
+ const entry = resolve(here, 'slides-dev.ts');
13
+
14
+ const child = spawn(
15
+ process.execPath,
16
+ ['--import', `file://${tsxLoader}`, entry, ...process.argv.slice(2)],
17
+ { stdio: 'inherit' },
18
+ );
19
+
20
+ child.on('exit', (code) => process.exit(code ?? 1));
21
+ child.on('error', (err) => {
22
+ process.stderr.write(`slides-dev shim failed: ${err.message}\n`);
23
+ process.exit(1);
24
+ });
@@ -0,0 +1,18 @@
1
+ import type { ReactNode } from 'react';
2
+ import { type FakeDeck } from '../core/fake-runtime.js';
3
+ import type { GenerationManifest } from '../core/manifest.js';
4
+ import type { SlideOp } from '../core/runtime.js';
5
+ import type { Template } from '../core/template.js';
6
+ export type ComposeDeckInput = {
7
+ readonly tree: ReactNode;
8
+ readonly template: Template;
9
+ readonly title?: string;
10
+ readonly now?: () => string;
11
+ };
12
+ export type ComposedDeck = {
13
+ readonly deck: FakeDeck;
14
+ readonly ops: readonly SlideOp[];
15
+ readonly manifest: GenerationManifest;
16
+ };
17
+ export declare const composeDeck: (input: ComposeDeckInput) => Promise<ComposedDeck>;
18
+ //# sourceMappingURL=compose-deck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-deck.d.ts","sourceRoot":"","sources":["../../src/dev/compose-deck.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAqB,KAAK,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,SAAS,OAAO,EAAE,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;CACvC,CAAC;AAIF,eAAO,MAAM,WAAW,GAAU,OAAO,gBAAgB,KAAG,OAAO,CAAC,YAAY,CAiB/E,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { renderToOps } from '../core/reconciler.js';
2
+ import { FakeSlidesRuntime } from '../core/fake-runtime.js';
3
+ const DECK_ID = 'dev-deck';
4
+ export const composeDeck = async (input) => {
5
+ const runtime = new FakeSlidesRuntime({ fixedDeckId: DECK_ID });
6
+ await runtime.createDeckFromMaster(input.template.name, input.title ?? 'Dev deck');
7
+ const reconciled = renderToOps({
8
+ tree: input.tree,
9
+ template: input.template,
10
+ deckId: DECK_ID,
11
+ ...(input.now ? { now: input.now } : {}),
12
+ });
13
+ await runtime.applyOps(DECK_ID, reconciled.ops);
14
+ const deck = runtime.getDeck(DECK_ID);
15
+ if (!deck)
16
+ throw new Error('composeDeck: FakeSlidesRuntime lost track of the dev deck.');
17
+ return { deck, ops: reconciled.ops, manifest: reconciled.manifest };
18
+ };
19
+ //# sourceMappingURL=compose-deck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-deck.js","sourceRoot":"","sources":["../../src/dev/compose-deck.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAiB,MAAM,yBAAyB,CAAC;AAkB3E,MAAM,OAAO,GAAG,UAAU,CAAC;AAE3B,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,KAAuB,EAAyB,EAAE;IAClF,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;IAChE,MAAM,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;IAEnF,MAAM,UAAU,GAAG,WAAW,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,MAAM,EAAE,OAAO;QACf,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAEzF,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC;AACtE,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ReactElement } from 'react';
2
+ import type { FakeDeck } from '../core/fake-runtime.js';
3
+ import type { Template } from '../core/template.js';
4
+ import { type ComposedDeck } from './compose-deck.js';
5
+ export type DeckViewerProps = {
6
+ readonly template: Template;
7
+ };
8
+ export declare const DeckViewer: ({ template }: DeckViewerProps) => ReactElement;
9
+ declare global {
10
+ interface Window {
11
+ __slides?: {
12
+ template: Template;
13
+ deck?: FakeDeck;
14
+ ops?: ComposedDeck['ops'];
15
+ manifest?: ComposedDeck['manifest'];
16
+ };
17
+ }
18
+ }
19
+ //# sourceMappingURL=deck-viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-viewer.d.ts","sourceRoot":"","sources":["../../src/dev/deck-viewer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,OAAO,CAAC;AAiBrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBnE,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B,CAAC;AAOF,eAAO,MAAM,UAAU,GAAI,cAAc,eAAe,KAAG,YAoG1D,CAAC;AA8EF,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,QAAQ,CAAC,EAAE;YACT,QAAQ,EAAE,QAAQ,CAAC;YACnB,IAAI,CAAC,EAAE,QAAQ,CAAC;YAChB,GAAG,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1B,QAAQ,CAAC,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;SACrC,CAAC;KACH;CACF"}
@@ -0,0 +1,237 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
+ import { CircleAlert, Fullscreen, Menu, Minus, Plus, Command, Download, Loader2, TriangleAlert, } from 'lucide-react';
4
+ import { TransformWrapper, TransformComponent, } from 'react-zoom-pan-pinch';
5
+ import { composeDeck } from './compose-deck.js';
6
+ import { deriveAutoPreview } from './auto-examples.js';
7
+ import { SlideCanvas } from './slide-canvas.js';
8
+ import { SHORTCUT_LIST, useKeyboardNav } from './use-keyboard-nav.js';
9
+ import { DEFAULT_URL_STATE, parseUrlState, serializeUrlState, } from './url-state.js';
10
+ import { cn } from './lib/cn.js';
11
+ import { IconButton } from './ui/icon-button.js';
12
+ import { TextButton } from './ui/text-button.js';
13
+ import { Kbd } from './ui/kbd.js';
14
+ const NAV_VISIBLE_KEY = 'slides-dev:nav-visible';
15
+ const THUMB_W = 228;
16
+ const MIN_SCALE = 0.1;
17
+ const MAX_SCALE = 5;
18
+ const ZOOM_STEP = 0.2;
19
+ const ANIMATION_MS = 200;
20
+ const VIEWPORT_PADDING = 48;
21
+ export const DeckViewer = ({ template }) => {
22
+ const [url, setUrl] = useUrlState();
23
+ const [navVisible, setNavVisible] = usePersistedBool(NAV_VISIBLE_KEY, true);
24
+ const [showShortcuts, setShowShortcuts] = useState(false);
25
+ const [scale, setScale] = useState(1);
26
+ const [autoFit, setAutoFit] = useState(true);
27
+ const wrapperRef = useRef(null);
28
+ const containerRef = useRef(null);
29
+ const async = useDeckCompose(template);
30
+ const slideCount = async.status === 'ready' ? async.composed.deck.slideOrder.length : 0;
31
+ const setSlide = useCallback((n) => setUrl({ slide: Math.max(0, Math.min(n, slideCount - 1)) }), [setUrl, slideCount]);
32
+ const fitToViewport = useCallback(() => {
33
+ const wrapper = wrapperRef.current;
34
+ const container = containerRef.current;
35
+ if (!wrapper || !container)
36
+ return;
37
+ const fit = computeFitScale(container, template.canvas);
38
+ const x = (container.clientWidth - template.canvas.w * fit) / 2;
39
+ const y = (container.clientHeight - template.canvas.h * fit) / 2;
40
+ wrapper.setTransform(x, y, fit, ANIMATION_MS, 'easeOut');
41
+ setAutoFit(true);
42
+ }, [template.canvas]);
43
+ const zoomBy = useCallback((dir) => {
44
+ const wrapper = wrapperRef.current;
45
+ if (!wrapper)
46
+ return;
47
+ setAutoFit(false);
48
+ if (dir === 1)
49
+ wrapper.zoomIn(ZOOM_STEP, ANIMATION_MS, 'easeOut');
50
+ else
51
+ wrapper.zoomOut(ZOOM_STEP, ANIMATION_MS, 'easeOut');
52
+ }, []);
53
+ useDebugHandle({ template, async });
54
+ useEffect(() => {
55
+ const container = containerRef.current;
56
+ if (!container || !autoFit)
57
+ return;
58
+ let raf = 0;
59
+ const ro = new ResizeObserver(() => {
60
+ cancelAnimationFrame(raf);
61
+ raf = requestAnimationFrame(() => fitToViewport());
62
+ });
63
+ ro.observe(container);
64
+ return () => {
65
+ ro.disconnect();
66
+ cancelAnimationFrame(raf);
67
+ };
68
+ }, [autoFit, fitToViewport]);
69
+ useKeyboardNav({
70
+ onNext: () => setSlide(url.slide + 1),
71
+ onPrev: () => setSlide(url.slide - 1),
72
+ onFirst: () => setSlide(0),
73
+ onLast: () => setSlide(slideCount - 1),
74
+ onZoomIn: () => zoomBy(1),
75
+ onZoomOut: () => zoomBy(-1),
76
+ onZoomFit: fitToViewport,
77
+ onToggleNav: () => setNavVisible((v) => !v),
78
+ onShowHelp: () => setShowShortcuts((v) => !v),
79
+ });
80
+ return (_jsxs("div", { className: "flex h-dvh flex-col antialiased isolate", children: [_jsx(TopBar, { template: template, navVisible: navVisible, toggleNav: () => setNavVisible((v) => !v), slideIndex: url.slide, slideCount: slideCount, showShortcuts: showShortcuts, toggleShortcuts: () => setShowShortcuts((v) => !v) }), _jsxs("div", { className: "flex min-h-0 flex-1", children: [_jsx(NavRailContainer, { visible: navVisible, children: _jsx(NavRail, { template: template, async: async, slideIndex: url.slide, onSelect: setSlide }) }), _jsx(Viewport, { template: template, async: async, slideIndex: url.slide, containerRef: containerRef, wrapperRef: wrapperRef, onTransform: (_, state) => setScale(state.scale), onUserZoom: () => setAutoFit(false), onClampSlide: setSlide })] }), _jsx(FloatingZoom, { scale: scale, isFit: autoFit, onFit: fitToViewport, onZoomIn: () => zoomBy(1), onZoomOut: () => zoomBy(-1) })] }));
81
+ };
82
+ const computeFitScale = (container, canvas) => {
83
+ const w = container.clientWidth - VIEWPORT_PADDING * 2;
84
+ const h = container.clientHeight - VIEWPORT_PADDING * 2;
85
+ return Math.max(MIN_SCALE, Math.min(w / canvas.w, h / canvas.h));
86
+ };
87
+ const useUrlState = () => {
88
+ const [state, setState] = useState(() => typeof window === 'undefined' ? DEFAULT_URL_STATE : parseUrlState(window.location.hash));
89
+ useEffect(() => {
90
+ const onHashChange = () => setState(parseUrlState(window.location.hash));
91
+ window.addEventListener('hashchange', onHashChange);
92
+ return () => window.removeEventListener('hashchange', onHashChange);
93
+ }, []);
94
+ const setUrl = useCallback((next) => {
95
+ setState(next);
96
+ const serialized = serializeUrlState(next);
97
+ if (typeof window !== 'undefined' && window.location.hash !== serialized) {
98
+ window.history.replaceState(null, '', serialized || window.location.pathname);
99
+ }
100
+ }, []);
101
+ return [state, setUrl];
102
+ };
103
+ const usePersistedBool = (key, fallback) => {
104
+ const [state, setState] = useState(() => {
105
+ if (typeof window === 'undefined')
106
+ return fallback;
107
+ const stored = window.localStorage.getItem(key);
108
+ return stored === null ? fallback : stored === 'true';
109
+ });
110
+ const set = useCallback((next) => {
111
+ setState((prev) => {
112
+ const resolved = typeof next === 'function' ? next(prev) : next;
113
+ if (typeof window !== 'undefined')
114
+ window.localStorage.setItem(key, String(resolved));
115
+ return resolved;
116
+ });
117
+ }, [key]);
118
+ return [state, set];
119
+ };
120
+ const useDeckCompose = (template) => {
121
+ const [state, setState] = useState({ status: 'pending' });
122
+ useEffect(() => {
123
+ let cancelled = false;
124
+ setState({ status: 'pending' });
125
+ (async () => {
126
+ try {
127
+ const tree = template.preview ? template.preview() : deriveAutoPreview(template);
128
+ const composed = await composeDeck({ tree, template });
129
+ if (!cancelled)
130
+ setState({ status: 'ready', composed });
131
+ }
132
+ catch (err) {
133
+ if (!cancelled) {
134
+ setState({
135
+ status: 'error',
136
+ error: err instanceof Error ? err : new Error(String(err)),
137
+ });
138
+ }
139
+ }
140
+ })();
141
+ return () => {
142
+ cancelled = true;
143
+ };
144
+ }, [template]);
145
+ return state;
146
+ };
147
+ const useDebugHandle = ({ template, async, }) => {
148
+ useEffect(() => {
149
+ window.__slides = {
150
+ template,
151
+ ...(async.status === 'ready'
152
+ ? {
153
+ deck: async.composed.deck,
154
+ ops: async.composed.ops,
155
+ manifest: async.composed.manifest,
156
+ }
157
+ : {}),
158
+ };
159
+ }, [template, async]);
160
+ };
161
+ const TopBar = ({ template, navVisible, toggleNav, slideIndex, slideCount, showShortcuts, toggleShortcuts, }) => (_jsxs("header", { className: "flex shrink-0 items-center justify-between gap-3 border-b border-border bg-paper px-3 py-2", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-3", children: [_jsx(IconButton, { icon: _jsx(Menu, { className: "size-4" }), label: navVisible ? 'Hide navigation' : 'Show navigation', selected: navVisible, onClick: toggleNav }), _jsx("h1", { className: "inline-flex shrink-0 items-center rounded-md bg-ink/5 px-2 py-1 text-xs font-medium text-ink", children: template.name }), slideCount > 0 && (_jsxs("span", { className: "shrink-0 text-xs font-medium text-text-muted tabular-nums", children: ["Slide ", slideIndex + 1, " of ", slideCount] }))] }), _jsxs("div", { className: "flex items-center gap-1", children: [_jsx(ShortcutsDropdown, { open: showShortcuts, onToggle: toggleShortcuts }), _jsx(ExportButton, { templateName: template.name })] })] }));
162
+ const NavRailContainer = ({ visible, children, }) => (_jsx("div", { inert: !visible, "aria-hidden": !visible, className: cn('h-full shrink-0 overflow-hidden transition-[width] duration-300 ease-out', visible ? 'w-[280px]' : 'w-0'), children: children }));
163
+ const NavRail = ({ template, async, slideIndex, onSelect, }) => (_jsx("nav", { "aria-label": "Slides", className: "h-full w-[280px] shrink-0 overflow-y-auto border-r border-border bg-paper py-5 pr-4 pl-1.5", children: async.status !== 'ready' ? (_jsx("div", { className: "text-sm text-text-muted", children: "Loading\u2026" })) : (_jsx("ul", { role: "list", className: "flex flex-col gap-5", children: async.composed.deck.slideOrder.map((slideId, i) => {
164
+ const slide = async.composed.deck.slides.get(slideId);
165
+ if (!slide)
166
+ return null;
167
+ const isActive = i === slideIndex;
168
+ const thumbH = template.canvas.h * (THUMB_W / template.canvas.w);
169
+ return (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => onSelect(i), "aria-current": isActive ? 'true' : undefined, "aria-label": `Slide ${i + 1}`, className: "group flex w-full items-start gap-4 focus:outline-none focus-visible:outline-none", children: [_jsx("span", { className: cn('w-7 shrink-0 pt-0.5 text-right text-sm font-medium tabular-nums', isActive ? 'text-ink' : 'text-text-muted'), children: i + 1 }), _jsx("div", { className: cn('overflow-hidden rounded-lg bg-surface transition-shadow', isActive
170
+ ? 'ring-3 ring-focus'
171
+ : 'ring-1 ring-border group-hover:ring-border-strong group-focus-visible:ring-3 group-focus-visible:ring-focus'), style: { width: THUMB_W, height: thumbH }, children: _jsx("div", { className: "pointer-events-none origin-top-left", style: { transform: `scale(${THUMB_W / template.canvas.w})` }, children: _jsx(SlideCanvas, { slide: slide, deck: async.composed.deck, canvas: template.canvas }) }) })] }) }, slideId));
172
+ }) })) }));
173
+ const Viewport = ({ template, async, slideIndex, containerRef, onUserZoom, wrapperRef, onTransform, onClampSlide, }) => (_jsxs("main", { ref: containerRef, className: "relative min-w-0 flex-1 overflow-hidden", children: [async.status === 'pending' && (_jsx(Center, { children: _jsx(ViewerStatus, { icon: _jsx(Spinner, {}), message: "Composing deck\u2026" }) })), async.status === 'error' && (_jsx(Center, { children: _jsx(ErrorPanel, { error: async.error }) })), async.status === 'ready' && (_jsx(ActiveSlide, { template: template, deck: async.composed.deck, slideIndex: slideIndex, containerEl: containerRef.current, wrapperRef: wrapperRef, onTransform: onTransform, onUserZoom: onUserZoom, onClampSlide: onClampSlide }))] }));
174
+ const ActiveSlide = ({ template, deck, slideIndex, containerEl, wrapperRef, onTransform, onUserZoom, onClampSlide, }) => {
175
+ const count = deck.slideOrder.length;
176
+ const clamped = Math.max(0, Math.min(slideIndex, count - 1));
177
+ useEffect(() => {
178
+ if (clamped !== slideIndex)
179
+ onClampSlide(clamped);
180
+ }, [clamped, slideIndex, onClampSlide]);
181
+ if (count === 0) {
182
+ return (_jsx(Center, { children: _jsx(ViewerStatus, { icon: _jsx(TriangleAlert, { className: "size-4" }), message: "This template renders zero slides." }) }));
183
+ }
184
+ const slideId = deck.slideOrder[clamped];
185
+ const slide = slideId ? deck.slides.get(slideId) : undefined;
186
+ if (!slide)
187
+ return _jsx(Center, { children: "Slide not found." });
188
+ const initialScale = containerEl ? computeFitScale(containerEl, template.canvas) : 1;
189
+ return (_jsx(TransformWrapper, { ref: wrapperRef, initialScale: initialScale, minScale: MIN_SCALE, maxScale: MAX_SCALE, centerOnInit: true, limitToBounds: false, doubleClick: { disabled: true }, wheel: { step: 0.04 }, onTransform: onTransform, onWheelStart: onUserZoom, onPinchStart: onUserZoom, onZoomStart: onUserZoom, children: _jsx(TransformComponent, { wrapperClass: "!w-full !h-full !cursor-grab active:!cursor-grabbing", contentClass: "!shadow-[0_4px_32px_rgb(0_0_0_/_0.12)] ring-1 ring-black/5 rounded", children: _jsx("div", { style: { width: template.canvas.w, height: template.canvas.h }, children: _jsx(SlideCanvas, { slide: slide, deck: deck, canvas: template.canvas }) }) }) }, clamped));
190
+ };
191
+ const FloatingZoom = ({ scale, isFit, onFit, onZoomIn, onZoomOut, }) => (_jsxs("div", { className: "pointer-events-none fixed right-4 bottom-4 z-10 flex items-center gap-1 rounded-full bg-paper p-1 shadow-[0_6px_24px_rgb(0_0_0_/_0.1),_0_2px_6px_rgb(0_0_0_/_0.06)] ring-1 ring-border [&_*]:pointer-events-auto", children: [_jsx(IconButton, { icon: _jsx(Minus, { className: "size-4" }), label: "Zoom out", onClick: onZoomOut }), _jsx("button", { type: "button", onDoubleClick: onFit, "aria-label": "Reset zoom to fit", title: "Double-click to fit", className: "min-w-12 cursor-default rounded-md px-1 py-2 text-center text-xs font-medium text-text-muted tabular-nums select-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus", children: isFit ? 'Auto' : `${Math.round(scale * 100)}%` }), _jsx(IconButton, { icon: _jsx(Plus, { className: "size-4" }), label: "Zoom in", onClick: onZoomIn }), _jsx(IconButton, { icon: _jsx(Fullscreen, { className: "size-4" }), label: "Fit to viewport", onClick: onFit })] }));
192
+ const ShortcutsDropdown = ({ open, onToggle, }) => {
193
+ const ref = useRef(null);
194
+ useEffect(() => {
195
+ if (!open)
196
+ return;
197
+ const onClick = (e) => {
198
+ if (ref.current && !ref.current.contains(e.target))
199
+ onToggle();
200
+ };
201
+ window.addEventListener('mousedown', onClick);
202
+ return () => window.removeEventListener('mousedown', onClick);
203
+ }, [open, onToggle]);
204
+ return (_jsxs("div", { ref: ref, className: "relative", children: [_jsx(TextButton, { icon: _jsx(Command, { className: "size-4" }), selected: open, onClick: onToggle, "aria-haspopup": "dialog", "aria-expanded": open, children: "Shortcuts" }), open && (_jsxs("div", { role: "dialog", "aria-label": "Keyboard shortcuts", className: "absolute top-full right-0 z-20 mt-2 w-72 rounded-xl bg-paper p-5 shadow-[0_12px_40px_rgb(0_0_0_/_0.12),_0_4px_12px_rgb(0_0_0_/_0.08)] ring-1 ring-border", children: [_jsx("h2", { className: "mb-4 text-xs font-semibold tracking-wide text-text-muted uppercase", children: "Keyboard shortcuts" }), _jsx("ul", { role: "list", className: "flex flex-col gap-3", children: SHORTCUT_LIST.map((s) => (_jsxs("li", { className: "flex items-center justify-between gap-3 text-xs", children: [_jsx("span", { className: "text-ink", children: s.label }), _jsx("span", { className: "flex shrink-0 items-center gap-1.5", children: s.keys.split(' ').map((token, i) => (_jsx(ShortcutToken, { token: token }, i))) })] }, s.label))) })] }))] }));
205
+ };
206
+ const ExportButton = ({ templateName }) => {
207
+ const [exporting, setExporting] = useState(false);
208
+ const handleExport = async () => {
209
+ setExporting(true);
210
+ try {
211
+ const res = await fetch('/api/export.pptx');
212
+ if (!res.ok)
213
+ throw new Error(await res.text());
214
+ const blob = await res.blob();
215
+ const url = URL.createObjectURL(blob);
216
+ const a = document.createElement('a');
217
+ a.href = url;
218
+ a.download = `${templateName}.pptx`;
219
+ a.click();
220
+ URL.revokeObjectURL(url);
221
+ }
222
+ catch (err) {
223
+ console.error('Export failed:', err);
224
+ }
225
+ finally {
226
+ setExporting(false);
227
+ }
228
+ };
229
+ return (_jsxs("button", { type: "button", onClick: handleExport, disabled: exporting, className: "inline-flex h-8 shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-brand px-3 pl-2.5 text-xs font-medium text-paper transition-colors hover:bg-brand/85 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus disabled:cursor-not-allowed", children: [_jsxs("span", { className: "relative inline-flex size-4 shrink-0 items-center justify-center", children: [_jsx(Download, { className: cn('absolute inset-0 size-4 transition-all duration-200', exporting ? 'scale-50 opacity-0' : 'scale-100 opacity-100') }), _jsx(Loader2, { className: cn('absolute inset-0 size-4 animate-spin transition-all duration-200', exporting ? 'scale-100 opacity-100' : 'scale-50 opacity-0') })] }), "Export"] }));
230
+ };
231
+ const SHORTCUT_SEPARATORS = new Set(['/', '·', '•']);
232
+ const ShortcutToken = ({ token }) => SHORTCUT_SEPARATORS.has(token) ? (_jsx("span", { className: "text-xs text-text-muted", children: token })) : (_jsx(Kbd, { children: token }));
233
+ const Center = ({ children }) => (_jsx("div", { className: "flex h-full w-full items-center justify-center", children: children }));
234
+ const ViewerStatus = ({ icon, message }) => (_jsxs("div", { className: "flex items-center gap-3 text-sm text-text-muted", children: [_jsx("span", { className: "text-text-muted", children: icon }), _jsx("span", { children: message })] }));
235
+ const ErrorPanel = ({ error }) => (_jsxs("div", { className: "max-w-xl rounded-lg border border-red-200 bg-red-50 p-4", children: [_jsxs("div", { className: "flex items-center gap-2 text-red-700", children: [_jsx(CircleAlert, { className: "size-4 shrink-0" }), _jsx("h2", { className: "text-sm font-semibold", children: error.name })] }), _jsx("pre", { className: "mt-2 font-mono text-sm whitespace-pre-wrap text-red-800", children: error.message })] }));
236
+ const Spinner = () => (_jsx("span", { "aria-hidden": "true", className: "inline-block size-4 animate-spin rounded-full border-2 border-border border-t-ink" }));
237
+ //# sourceMappingURL=deck-viewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deck-viewer.js","sourceRoot":"","sources":["../../src/dev/deck-viewer.tsx"],"names":[],"mappings":"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"}