@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,2 @@
1
+ import '../../styles.css';
2
+ //# sourceMappingURL=entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.d.ts","sourceRoot":"","sources":["../../../../src/dev/dev-server/client/entry.tsx"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import '../../styles.css';
3
+ import { StrictMode } from 'react';
4
+ import { createRoot } from 'react-dom/client';
5
+ import { DeckViewer } from '../../deck-viewer.js';
6
+ // @ts-expect-error -- resolved at runtime by the dev-server Vite plugin
7
+ import { template } from 'virtual:slides-dev/template';
8
+ const node = document.getElementById('root');
9
+ if (!node)
10
+ throw new Error('slides-dev: missing #root in index.html');
11
+ createRoot(node).render(_jsx(StrictMode, { children: _jsx(DeckViewer, { template: template }) }));
12
+ //# sourceMappingURL=entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../../src/dev/dev-server/client/entry.tsx"],"names":[],"mappings":";AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,wEAAwE;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC7C,IAAI,CAAC,IAAI;IAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;AAEtE,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,CACrB,KAAC,UAAU,cACT,KAAC,UAAU,IAAC,QAAQ,EAAE,QAAQ,GAAI,GACvB,CACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const formatBanner: (templateName: string, startedInMs: number) => string;
2
+ export declare const formatReady: (params: {
3
+ url: string;
4
+ templatePath: string;
5
+ host: boolean;
6
+ }) => string;
7
+ export declare const formatStartupError: (err: unknown) => string;
8
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/dev/dev-server/output.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY,GAAI,cAAc,MAAM,EAAE,aAAa,MAAM,KAAG,MAKxE,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,QAAQ;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;CACf,KAAG,MASH,CAAC;AAGF,eAAO,MAAM,kBAAkB,GAAI,KAAK,OAAO,KAAG,MAWjD,CAAC"}
@@ -0,0 +1,32 @@
1
+ import pc from 'picocolors';
2
+ const PKG = 'react-pptx-dev';
3
+ export const formatBanner = (templateName, startedInMs) => {
4
+ const title = pc.bold(pc.magenta('slides-dev'));
5
+ const tmpl = pc.dim('•') + ' ' + pc.cyan(templateName);
6
+ const took = pc.dim(`ready in ${startedInMs}ms`);
7
+ return `\n ${title} ${tmpl} ${took}\n`;
8
+ };
9
+ export const formatReady = (params) => {
10
+ const arrow = pc.green('➜');
11
+ const lines = [];
12
+ lines.push(` ${arrow} ${pc.bold('Local:')} ${pc.cyan(params.url)}`);
13
+ if (!params.host) {
14
+ lines.push(` ${arrow} ${pc.bold('Network:')} ${pc.dim('use --host to expose')}`);
15
+ }
16
+ lines.push(` ${arrow} ${pc.bold('Template:')} ${pc.dim(params.templatePath)}`);
17
+ return lines.join('\n') + '\n';
18
+ };
19
+ const stripResolverPrefix = (message) => message.replace(/^slides-dev:\s*/, '');
20
+ export const formatStartupError = (err) => {
21
+ const message = err instanceof Error ? err.message : String(err);
22
+ return [
23
+ '',
24
+ ` ${pc.red(pc.bold('Failed to start slides-dev'))}`,
25
+ '',
26
+ ` ${stripResolverPrefix(message)}`,
27
+ '',
28
+ ` ${pc.dim(`See ${PKG} --help for usage.`)}`,
29
+ '',
30
+ ].join('\n');
31
+ };
32
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/dev/dev-server/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,GAAG,GAAG,gBAAgB,CAAC;AAC7B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,YAAoB,EAAE,WAAmB,EAAU,EAAE;IAChF,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,WAAW,IAAI,CAAC,CAAC;IACjD,OAAO,OAAO,KAAK,KAAK,IAAI,KAAK,IAAI,IAAI,CAAC;AAC5C,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAI3B,EAAU,EAAE;IACX,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACjF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC,CAAC;AACF,MAAM,mBAAmB,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAExF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAY,EAAU,EAAE;IACzD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO;QACL,EAAE;QACF,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,EAAE;QACpD,EAAE;QACF,KAAK,mBAAmB,CAAC,OAAO,CAAC,EAAE;QACnC,EAAE;QACF,KAAK,EAAE,CAAC,GAAG,CAAC,OAAO,GAAG,oBAAoB,CAAC,EAAE;QAC7C,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare class PptxSlidesRuntime {
2
+ constructor();
3
+ }
4
+ export declare const DEFAULT_PPTX_FONT_SUBSTITUTION: Readonly<Record<string, string>>;
5
+ export declare const translateOpsToPptx: () => never;
6
+ export declare const hexToPptxColor: () => never;
7
+ //# sourceMappingURL=server-only-stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-only-stub.d.ts","sourceRoot":"","sources":["../../../src/dev/dev-server/server-only-stub.ts"],"names":[],"mappings":"AAGA,qBAAa,iBAAiB;;CAI7B;AACD,eAAO,MAAM,8BAA8B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAqB,CAAC;AAElG,eAAO,MAAM,kBAAkB,QAAO,KAA0C,CAAC;AACjF,eAAO,MAAM,cAAc,QAAO,KAAsC,CAAC"}
@@ -0,0 +1,12 @@
1
+ const browserOnly = (name) => {
2
+ throw new Error(`${name} is not available in the slides-dev browser viewer.`);
3
+ };
4
+ export class PptxSlidesRuntime {
5
+ constructor() {
6
+ browserOnly('PptxSlidesRuntime');
7
+ }
8
+ }
9
+ export const DEFAULT_PPTX_FONT_SUBSTITUTION = Object.freeze({});
10
+ export const translateOpsToPptx = () => browserOnly('translateOpsToPptx');
11
+ export const hexToPptxColor = () => browserOnly('hexToPptxColor');
12
+ //# sourceMappingURL=server-only-stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-only-stub.js","sourceRoot":"","sources":["../../../src/dev/dev-server/server-only-stub.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,CAAC,IAAY,EAAS,EAAE;IAC1C,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qDAAqD,CAAC,CAAC;AAChF,CAAC,CAAC;AACF,MAAM,OAAO,iBAAiB;IAC5B;QACE,WAAW,CAAC,mBAAmB,CAAC,CAAC;IACnC,CAAC;CACF;AACD,MAAM,CAAC,MAAM,8BAA8B,GAAqC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElG,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAU,EAAE,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAU,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { type ViteDevServer } from 'vite';
2
+ export type StartDevServerOptions = {
3
+ readonly cwd: string;
4
+ readonly host?: string;
5
+ readonly port?: number;
6
+ };
7
+ export type DevServerHandle = {
8
+ readonly server: ViteDevServer;
9
+ readonly url: string;
10
+ readonly templatePath: string;
11
+ readonly startedInMs: number;
12
+ };
13
+ export declare const startDevServer: (options: StartDevServerOptions) => Promise<DevServerHandle>;
14
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/dev/dev-server/start.ts"],"names":[],"mappings":"AAMA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,MAAM,CAAC;AAKxD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B,CAAC;AAQF,eAAO,MAAM,cAAc,GAAU,SAAS,qBAAqB,KAAG,OAAO,CAAC,eAAe,CAuF5F,CAAC"}
@@ -0,0 +1,135 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { readFile } from 'node:fs/promises';
3
+ import { dirname, resolve as pathResolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import react from '@vitejs/plugin-react';
6
+ import tailwindcss from '@tailwindcss/vite';
7
+ import { createServer } from 'vite';
8
+ const VIRTUAL_ID = 'virtual:slides-dev/template';
9
+ const RESOLVED_VIRTUAL_ID = `\0${VIRTUAL_ID}`;
10
+ const here = dirname(fileURLToPath(import.meta.url));
11
+ const CLIENT_ROOT = pathResolve(here, 'client');
12
+ const SERVER_ONLY_STUB = pathResolve(here, 'server-only-stub.ts');
13
+ const SERVER_ONLY_RE = /\/(core|react-pptx)\/(src|dist)\/(pptx-runtime|op-translator-pptx)\.[tj]s$/;
14
+ export const startDevServer = async (options) => {
15
+ const startedAt = performance.now();
16
+ const templatePath = await resolveTemplatePath(options);
17
+ const templateExportName = pickTemplateExportName(templatePath);
18
+ const server = await createServer({
19
+ root: CLIENT_ROOT,
20
+ server: {
21
+ host: options.host ?? 'localhost',
22
+ port: options.port ?? 5173,
23
+ fs: { allow: [CLIENT_ROOT, options.cwd, pathResolve(options.cwd, '../..')] },
24
+ },
25
+ ssr: {
26
+ noExternal: ['pptxgenjs'],
27
+ },
28
+ plugins: [
29
+ react(),
30
+ tailwindcss(),
31
+ {
32
+ name: 'slides-dev:export',
33
+ configureServer(viteServer) {
34
+ viteServer.middlewares.use('/api/export.pptx', async (_req, res) => {
35
+ try {
36
+ const [mod, reconcilerMod, runtimeMod] = await Promise.all([
37
+ viteServer.ssrLoadModule(templatePath),
38
+ viteServer.ssrLoadModule('react-pptx/reconciler'),
39
+ viteServer.ssrLoadModule('react-pptx/pptx-runtime'),
40
+ ]);
41
+ const { renderToOps } = reconcilerMod;
42
+ const { PptxSlidesRuntime } = runtimeMod;
43
+ const template = mod[templateExportName];
44
+ if (!template)
45
+ throw new Error('Template export not found');
46
+ const tree = template.preview ? template.preview() : null;
47
+ if (!tree)
48
+ throw new Error('Template has no preview()');
49
+ const { ops } = renderToOps({ tree, template, deckId: 'export' });
50
+ const runtime = new PptxSlidesRuntime({});
51
+ const { deckId } = await runtime.createDeckFromMaster(template.name, template.name);
52
+ await runtime.applyOps(deckId, ops);
53
+ const buffer = await runtime.toBuffer(deckId);
54
+ res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.presentationml.presentation');
55
+ res.setHeader('Content-Disposition', `attachment; filename="${template.name}.pptx"`);
56
+ res.end(buffer);
57
+ }
58
+ catch (err) {
59
+ res.statusCode = 500;
60
+ res.setHeader('Content-Type', 'text/plain');
61
+ res.end(err instanceof Error ? err.message : String(err));
62
+ }
63
+ });
64
+ },
65
+ },
66
+ {
67
+ name: 'slides-dev:stub-server-only',
68
+ enforce: 'pre',
69
+ load(id, options) {
70
+ if (options?.ssr)
71
+ return null;
72
+ const cleanId = id.split('?')[0] ?? '';
73
+ if (SERVER_ONLY_RE.test(cleanId)) {
74
+ return { code: readFileSync(SERVER_ONLY_STUB, 'utf8') };
75
+ }
76
+ return null;
77
+ },
78
+ },
79
+ {
80
+ name: 'slides-dev:virtual-template',
81
+ resolveId(source) {
82
+ if (source === VIRTUAL_ID)
83
+ return RESOLVED_VIRTUAL_ID;
84
+ return null;
85
+ },
86
+ load(id) {
87
+ if (id !== RESOLVED_VIRTUAL_ID)
88
+ return null;
89
+ return `export { ${templateExportName} as template } from ${JSON.stringify(templatePath)};`;
90
+ },
91
+ },
92
+ ],
93
+ optimizeDeps: {
94
+ include: ['react', 'react-dom', 'react-dom/client'],
95
+ },
96
+ });
97
+ await server.listen();
98
+ const url = server.resolvedUrls?.local[0] ?? `http://localhost:${options.port ?? 5173}/`;
99
+ const startedInMs = Math.round(performance.now() - startedAt);
100
+ return { server, url, templatePath, startedInMs };
101
+ };
102
+ const resolveTemplatePath = async (options) => {
103
+ const pkgPath = pathResolve(options.cwd, 'package.json');
104
+ if (!existsSync(pkgPath)) {
105
+ throw new Error(`slides-dev: ${options.cwd} has no package.json — run from a template package directory.`);
106
+ }
107
+ const pkg = JSON.parse(await readFile(pkgPath, 'utf8'));
108
+ if (!pkg.main) {
109
+ throw new Error(`slides-dev: ${pkgPath} has no "main" field — point it at the file that exports your Template.`);
110
+ }
111
+ const templatePath = pathResolve(options.cwd, pkg.main);
112
+ if (!existsSync(templatePath)) {
113
+ throw new Error(`slides-dev: template entry "${templatePath}" not found.`);
114
+ }
115
+ return templatePath;
116
+ };
117
+ const pickTemplateExportName = (templatePath) => {
118
+ const patterns = [
119
+ /export\s+const\s+([A-Za-z_$][\w$]*)\s*=\s*defineTemplate\s*\(/,
120
+ /export\s+const\s+([A-Za-z_$][\w$]*)\s*:\s*Template/,
121
+ ];
122
+ try {
123
+ const src = readFileSync(templatePath, 'utf8');
124
+ for (const pattern of patterns) {
125
+ const m = src.match(pattern);
126
+ if (m && m[1])
127
+ return m[1];
128
+ }
129
+ }
130
+ catch {
131
+ /* empty */
132
+ }
133
+ return 'default';
134
+ };
135
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/dev/dev-server/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { composeDeck, type ComposeDeckInput, type ComposedDeck } from './compose-deck.js';
2
+ export { SlideCanvas, type SlideCanvasProps } from './slide-canvas.js';
3
+ export { DeckViewer, type DeckViewerProps } from './deck-viewer.js';
4
+ export { deriveAutoPreview } from './auto-examples.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dev/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { composeDeck } from './compose-deck.js';
2
+ export { SlideCanvas } from './slide-canvas.js';
3
+ export { DeckViewer } from './deck-viewer.js';
4
+ export { deriveAutoPreview } from './auto-examples.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dev/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA4C,MAAM,mBAAmB,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAyB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAwB,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type ClassValue } from 'clsx';
2
+ export declare const cn: (...inputs: ClassValue[]) => string;
3
+ //# sourceMappingURL=cn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../../../src/dev/lib/cn.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAE7C,eAAO,MAAM,EAAE,GAAI,GAAG,QAAQ,UAAU,EAAE,KAAG,MAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import clsx, {} from 'clsx';
2
+ export const cn = (...inputs) => clsx(inputs);
3
+ //# sourceMappingURL=cn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cn.js","sourceRoot":"","sources":["../../../src/dev/lib/cn.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,EAAE,EAAmB,MAAM,MAAM,CAAC;AAE7C,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAoB,EAAU,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { CSSProperties, ReactElement } from 'react';
2
+ import type { Canvas } from '../core/geometry.js';
3
+ import type { FakeDeck, FakeSlide } from '../core/fake-runtime.js';
4
+ export type SlideCanvasProps = {
5
+ readonly slide: FakeSlide;
6
+ readonly deck: FakeDeck;
7
+ readonly canvas: Canvas;
8
+ readonly background?: string;
9
+ readonly style?: CSSProperties;
10
+ };
11
+ export declare const SlideCanvas: ({ slide, deck, canvas, background, style, }: SlideCanvasProps) => ReactElement;
12
+ //# sourceMappingURL=slide-canvas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slide-canvas.d.ts","sourceRoot":"","sources":["../../src/dev/slide-canvas.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,OAAO,KAAK,EAAE,QAAQ,EAAa,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAG9E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,6CAMzB,gBAAgB,KAAG,YAqBrB,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { EMU_PER_POINT } from '../core/geometry.js';
3
+ export const SlideCanvas = ({ slide, deck, canvas, background = '#ffffff', style, }) => {
4
+ const rootStyle = {
5
+ position: 'relative',
6
+ width: `${canvas.w}px`,
7
+ height: `${canvas.h}px`,
8
+ background,
9
+ overflow: 'hidden',
10
+ isolation: 'isolate',
11
+ textAlign: 'left',
12
+ ...style,
13
+ };
14
+ return (_jsx("div", { "data-slide-id": slide.slideId, style: rootStyle, children: slide.shapeIds.map((id) => {
15
+ const shape = deck.shapes.get(id);
16
+ if (!shape)
17
+ return null;
18
+ return _jsx(Shape, { shape: shape }, id);
19
+ }) }));
20
+ };
21
+ const Shape = ({ shape }) => {
22
+ const { x, y, w, h } = emuRectToPt(shape.rect);
23
+ const baseStyle = {
24
+ position: 'absolute',
25
+ left: `${x}px`,
26
+ top: `${y}px`,
27
+ width: `${w}px`,
28
+ height: `${h}px`,
29
+ };
30
+ if (shape.imageUrl) {
31
+ return (_jsx("img", { src: shape.imageUrl, alt: shape.altText ?? '', style: { ...baseStyle, objectFit: 'fill', display: 'block' }, "data-object-id": shape.objectId }));
32
+ }
33
+ const { fillColor, outlineColor, outlineWeight } = shape.shapeProperties;
34
+ const boxStyle = {
35
+ ...baseStyle,
36
+ ...(fillColor ? { background: fillColor } : {}),
37
+ ...(outlineColor ? { border: `${outlineWeight ?? 1}px solid ${outlineColor}` } : {}),
38
+ };
39
+ if (shape.text.length === 0) {
40
+ return _jsx("div", { "data-object-id": shape.objectId, style: boxStyle });
41
+ }
42
+ const paragraphStyle = composeParagraphStyle(shape);
43
+ const segments = composeTextSegments(shape.text, shape.textStyleSpans);
44
+ return (_jsx("div", { "data-object-id": shape.objectId, style: {
45
+ ...boxStyle,
46
+ display: 'flex',
47
+ alignItems: 'flex-start',
48
+ whiteSpace: 'pre-wrap',
49
+ }, children: _jsx("div", { style: { width: '100%', ...paragraphStyle }, children: segments.map((seg, i) => (_jsx("span", { style: textStyleToCss(seg.style), children: seg.text }, i))) }) }));
50
+ };
51
+ const emuRectToPt = (rect) => ({
52
+ x: rect.x / EMU_PER_POINT,
53
+ y: rect.y / EMU_PER_POINT,
54
+ w: rect.w / EMU_PER_POINT,
55
+ h: rect.h / EMU_PER_POINT,
56
+ });
57
+ const composeTextSegments = (text, spans) => {
58
+ if (spans.length === 0)
59
+ return [{ text, style: {} }];
60
+ const cuts = new Set([0, text.length]);
61
+ for (const span of spans) {
62
+ cuts.add(Math.max(0, Math.min(span.range.start, text.length)));
63
+ cuts.add(Math.max(0, Math.min(span.range.end, text.length)));
64
+ }
65
+ const ordered = [...cuts].sort((a, b) => a - b);
66
+ const segments = [];
67
+ for (let i = 0; i < ordered.length - 1; i++) {
68
+ const start = ordered[i];
69
+ const end = ordered[i + 1];
70
+ if (start >= end)
71
+ continue;
72
+ let style = {};
73
+ for (const span of spans) {
74
+ if (span.range.start <= start && span.range.end >= end) {
75
+ style = { ...style, ...span.style };
76
+ }
77
+ }
78
+ segments.push({ text: text.slice(start, end), style });
79
+ }
80
+ return segments;
81
+ };
82
+ const composeParagraphStyle = (shape) => {
83
+ const spans = shape.paragraphStyleSpans;
84
+ if (spans.length === 0)
85
+ return {};
86
+ const merged = spans.reduce((acc, s) => ({ ...acc, ...s.style }), {});
87
+ return paragraphStyleToCss(merged);
88
+ };
89
+ const textStyleToCss = (style) => {
90
+ const css = {};
91
+ if (style.fontFamily) {
92
+ const family = /\s/.test(style.fontFamily) ? `"${style.fontFamily}"` : style.fontFamily;
93
+ css.fontFamily = `${family}, system-ui, sans-serif`;
94
+ }
95
+ if (style.fontSize !== undefined)
96
+ css.fontSize = `${style.fontSize}px`;
97
+ if (style.bold)
98
+ css.fontWeight = 'bold';
99
+ if (style.italic)
100
+ css.fontStyle = 'italic';
101
+ if (style.underline)
102
+ css.textDecoration = 'underline';
103
+ if (style.foregroundColor)
104
+ css.color = style.foregroundColor;
105
+ if (style.backgroundColor)
106
+ css.background = style.backgroundColor;
107
+ return css;
108
+ };
109
+ const paragraphStyleToCss = (style) => {
110
+ const css = {};
111
+ if (style.alignment) {
112
+ const map = { START: 'left', CENTER: 'center', END: 'right', JUSTIFIED: 'justify' };
113
+ css.textAlign = map[style.alignment];
114
+ }
115
+ if (style.lineSpacing !== undefined)
116
+ css.lineHeight = style.lineSpacing;
117
+ if (style.spaceAbove !== undefined)
118
+ css.marginTop = `${style.spaceAbove}px`;
119
+ if (style.spaceBelow !== undefined)
120
+ css.marginBottom = `${style.spaceBelow}px`;
121
+ return css;
122
+ };
123
+ //# sourceMappingURL=slide-canvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slide-canvas.js","sourceRoot":"","sources":["../../src/dev/slide-canvas.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ @import 'tailwindcss';
2
+ @source './**/*.{ts,tsx}';
3
+
4
+ @theme {
5
+ --color-paper: #ffffff;
6
+ --color-ink: #0b0b0b;
7
+ --color-brand: #ff5500;
8
+ --color-focus: #2276fc;
9
+
10
+ --color-surface: #ffffff;
11
+ --color-surface-muted: #f7f7f7;
12
+ --color-border: rgb(11 11 11 / 0.08);
13
+ --color-border-strong: rgb(11 11 11 / 0.16);
14
+ --color-text-muted: rgb(11 11 11 / 0.6);
15
+
16
+ --font-sans:
17
+ InterVariable, Inter, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
18
+ sans-serif;
19
+ }
20
+
21
+ @layer base {
22
+ html,
23
+ body {
24
+ height: 100%;
25
+ }
26
+ body {
27
+ margin: 0;
28
+ background: var(--color-surface-muted);
29
+ color: var(--color-ink);
30
+ font-family: var(--font-sans);
31
+ font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
32
+ -webkit-font-smoothing: antialiased;
33
+ }
34
+ #root {
35
+ height: 100%;
36
+ }
37
+ }
@@ -0,0 +1,12 @@
1
+ import { type ButtonHTMLAttributes, type ReactNode } from 'react';
2
+ export type IconButtonProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> & {
3
+ readonly icon: ReactNode;
4
+ readonly label: string;
5
+ readonly selected?: boolean;
6
+ };
7
+ export declare const IconButton: import("react").ForwardRefExoticComponent<Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children"> & {
8
+ readonly icon: ReactNode;
9
+ readonly label: string;
10
+ readonly selected?: boolean;
11
+ } & import("react").RefAttributes<HTMLButtonElement>>;
12
+ //# sourceMappingURL=icon-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-button.d.ts","sourceRoot":"","sources":["../../../src/dev/ui/icon-button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9E,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,GAAG;IACxF,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,UAAU;mBALN,SAAS;oBACR,MAAM;wBACF,OAAO;qDAuB5B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { cn } from '../lib/cn.js';
4
+ export const IconButton = forwardRef(({ icon, label, selected = false, className, ...rest }, ref) => (_jsx("button", { ref: ref, type: "button", "aria-label": label, "aria-pressed": selected || undefined, "data-selected": selected || undefined, className: cn('relative inline-flex size-8 shrink-0 items-center justify-center rounded-full text-ink/70', 'transition-colors hover:bg-ink/5 hover:text-ink', 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus', 'data-selected:bg-ink/10 data-selected:text-ink data-selected:hover:bg-ink/15', className), ...rest, children: icon })));
5
+ IconButton.displayName = 'IconButton';
6
+ //# sourceMappingURL=icon-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-button.js","sourceRoot":"","sources":["../../../src/dev/ui/icon-button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAA6C,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAQlC,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAClC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAC9D,iBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,gBACD,KAAK,kBACH,QAAQ,IAAI,SAAS,mBACpB,QAAQ,IAAI,SAAS,EACpC,SAAS,EAAE,EAAE,CACX,2FAA2F,EAC3F,iDAAiD,EACjD,oFAAoF,EACpF,8EAA8E,EAC9E,SAAS,CACV,KACG,IAAI,YAEP,IAAI,GACE,CACV,CACF,CAAC;AACF,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ReactNode } from 'react';
2
+ export declare const Kbd: ({ children, className, }: {
3
+ readonly children: ReactNode;
4
+ readonly className?: string;
5
+ }) => import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=kbd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbd.d.ts","sourceRoot":"","sources":["../../../src/dev/ui/kbd.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,eAAO,MAAM,GAAG,GAAI,0BAGjB;IACD,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,4CAUA,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../lib/cn.js';
3
+ export const Kbd = ({ children, className, }) => (_jsx("kbd", { className: cn('inline-flex h-5 min-w-5 items-center justify-center rounded border border-border bg-surface-muted px-1.5', 'font-mono text-xs font-medium text-text-muted', className), children: children }));
4
+ //# sourceMappingURL=kbd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kbd.js","sourceRoot":"","sources":["../../../src/dev/ui/kbd.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,EAClB,QAAQ,EACR,SAAS,GAIV,EAAE,EAAE,CAAC,CACJ,cACE,SAAS,EAAE,EAAE,CACX,0GAA0G,EAC1G,+CAA+C,EAC/C,SAAS,CACV,YAEA,QAAQ,GACL,CACP,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type ButtonHTMLAttributes, type ReactNode } from 'react';
2
+ export type TextButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
3
+ readonly icon?: ReactNode;
4
+ readonly selected?: boolean;
5
+ };
6
+ export declare const TextButton: import("react").ForwardRefExoticComponent<ButtonHTMLAttributes<HTMLButtonElement> & {
7
+ readonly icon?: ReactNode;
8
+ readonly selected?: boolean;
9
+ } & import("react").RefAttributes<HTMLButtonElement>>;
10
+ //# sourceMappingURL=text-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-button.d.ts","sourceRoot":"","sources":["../../../src/dev/ui/text-button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG9E,MAAM,MAAM,eAAe,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACtE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,UAAU;oBAJL,SAAS;wBACL,OAAO;qDAwB5B,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef } from 'react';
3
+ import { cn } from '../lib/cn.js';
4
+ export const TextButton = forwardRef(({ icon, selected = false, className, children, ...rest }, ref) => (_jsxs("button", { ref: ref, type: "button", "aria-pressed": selected || undefined, "data-selected": selected || undefined, className: cn('inline-flex h-8 shrink-0 items-center gap-1.5 rounded-full px-3 text-xs font-medium text-ink/80', 'transition-colors hover:bg-ink/5 hover:text-ink', 'focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-focus', 'data-selected:bg-ink/10 data-selected:text-ink data-selected:hover:bg-ink/15', icon ? 'pl-2.5' : '', className), ...rest, children: [icon ? _jsx("span", { className: "shrink-0 text-ink/60", children: icon }) : null, children] })));
5
+ TextButton.displayName = 'TextButton';
6
+ //# sourceMappingURL=text-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-button.js","sourceRoot":"","sources":["../../../src/dev/ui/text-button.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAA6C,MAAM,OAAO,CAAC;AAC9E,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAOlC,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAClC,CAAC,EAAE,IAAI,EAAE,QAAQ,GAAG,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CACjE,kBACE,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,QAAQ,kBACC,QAAQ,IAAI,SAAS,mBACpB,QAAQ,IAAI,SAAS,EACpC,SAAS,EAAE,EAAE,CACX,iGAAiG,EACjG,iDAAiD,EACjD,oFAAoF,EACpF,8EAA8E,EAC9E,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EACpB,SAAS,CACV,KACG,IAAI,aAEP,IAAI,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,sBAAsB,YAAE,IAAI,GAAQ,CAAC,CAAC,CAAC,IAAI,EAClE,QAAQ,IACF,CACV,CACF,CAAC;AACF,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type ViewerUrlState = {
2
+ readonly slide: number;
3
+ };
4
+ export declare const DEFAULT_URL_STATE: ViewerUrlState;
5
+ export declare const parseUrlState: (hash: string) => ViewerUrlState;
6
+ export declare const serializeUrlState: (state: ViewerUrlState) => string;
7
+ //# sourceMappingURL=url-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-state.d.ts","sourceRoot":"","sources":["../../src/dev/url-state.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,cAA6B,CAAC;AAE9D,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,cAK5C,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,cAAc,KAAG,MAGzD,CAAC"}
@@ -0,0 +1,13 @@
1
+ export const DEFAULT_URL_STATE = { slide: 0 };
2
+ export const parseUrlState = (hash) => {
3
+ const params = new URLSearchParams(hash.replace(/^#/, ''));
4
+ const raw = Number.parseInt(params.get('slide') ?? '', 10);
5
+ const slide = Number.isFinite(raw) && raw >= 0 ? raw : 0;
6
+ return { slide };
7
+ };
8
+ export const serializeUrlState = (state) => {
9
+ if (state.slide === 0)
10
+ return '';
11
+ return `#slide=${state.slide}`;
12
+ };
13
+ //# sourceMappingURL=url-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-state.js","sourceRoot":"","sources":["../../src/dev/url-state.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,iBAAiB,GAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAE9D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAkB,EAAE;IAC5D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAqB,EAAU,EAAE;IACjE,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC;AACjC,CAAC,CAAC"}