@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.
- package/README.md +241 -0
- package/SKILL.md +119 -0
- package/dist/cli.d.ts +38 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +386 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/components.d.ts +179 -0
- package/dist/core/components.d.ts.map +1 -0
- package/dist/core/components.js +40 -0
- package/dist/core/components.js.map +1 -0
- package/dist/core/fake-runtime.d.ts +138 -0
- package/dist/core/fake-runtime.d.ts.map +1 -0
- package/dist/core/fake-runtime.js +210 -0
- package/dist/core/fake-runtime.js.map +1 -0
- package/dist/core/font-resolver.d.ts +28 -0
- package/dist/core/font-resolver.d.ts.map +1 -0
- package/dist/core/font-resolver.js +30 -0
- package/dist/core/font-resolver.js.map +1 -0
- package/dist/core/geometry.d.ts +71 -0
- package/dist/core/geometry.d.ts.map +1 -0
- package/dist/core/geometry.js +44 -0
- package/dist/core/geometry.js.map +1 -0
- package/dist/core/index.d.ts +19 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +20 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/manifest.d.ts +123 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +43 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/op-translator-pptx.d.ts +150 -0
- package/dist/core/op-translator-pptx.d.ts.map +1 -0
- package/dist/core/op-translator-pptx.js +245 -0
- package/dist/core/op-translator-pptx.js.map +1 -0
- package/dist/core/pptx-runtime.d.ts +103 -0
- package/dist/core/pptx-runtime.d.ts.map +1 -0
- package/dist/core/pptx-runtime.js +405 -0
- package/dist/core/pptx-runtime.js.map +1 -0
- package/dist/core/reconciler.d.ts +113 -0
- package/dist/core/reconciler.d.ts.map +1 -0
- package/dist/core/reconciler.js +453 -0
- package/dist/core/reconciler.js.map +1 -0
- package/dist/core/runtime.d.ts +161 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +11 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/template.d.ts +32 -0
- package/dist/core/template.d.ts.map +1 -0
- package/dist/core/template.js +3 -0
- package/dist/core/template.js.map +1 -0
- package/dist/dev/auto-examples.d.ts +6 -0
- package/dist/dev/auto-examples.d.ts.map +1 -0
- package/dist/dev/auto-examples.js +79 -0
- package/dist/dev/auto-examples.js.map +1 -0
- package/dist/dev/bin/slides-dev.d.ts +3 -0
- package/dist/dev/bin/slides-dev.d.ts.map +1 -0
- package/dist/dev/bin/slides-dev.js +87 -0
- package/dist/dev/bin/slides-dev.js.map +1 -0
- package/dist/dev/bin/slides-dev.mjs +24 -0
- package/dist/dev/compose-deck.d.ts +18 -0
- package/dist/dev/compose-deck.d.ts.map +1 -0
- package/dist/dev/compose-deck.js +19 -0
- package/dist/dev/compose-deck.js.map +1 -0
- package/dist/dev/deck-viewer.d.ts +19 -0
- package/dist/dev/deck-viewer.d.ts.map +1 -0
- package/dist/dev/deck-viewer.js +237 -0
- package/dist/dev/deck-viewer.js.map +1 -0
- package/dist/dev/dev-server/client/entry.d.ts +2 -0
- package/dist/dev/dev-server/client/entry.d.ts.map +1 -0
- package/dist/dev/dev-server/client/entry.js +12 -0
- package/dist/dev/dev-server/client/entry.js.map +1 -0
- package/dist/dev/dev-server/output.d.ts +8 -0
- package/dist/dev/dev-server/output.d.ts.map +1 -0
- package/dist/dev/dev-server/output.js +32 -0
- package/dist/dev/dev-server/output.js.map +1 -0
- package/dist/dev/dev-server/server-only-stub.d.ts +7 -0
- package/dist/dev/dev-server/server-only-stub.d.ts.map +1 -0
- package/dist/dev/dev-server/server-only-stub.js +12 -0
- package/dist/dev/dev-server/server-only-stub.js.map +1 -0
- package/dist/dev/dev-server/start.d.ts +14 -0
- package/dist/dev/dev-server/start.d.ts.map +1 -0
- package/dist/dev/dev-server/start.js +135 -0
- package/dist/dev/dev-server/start.js.map +1 -0
- package/dist/dev/index.d.ts +5 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +5 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/lib/cn.d.ts +3 -0
- package/dist/dev/lib/cn.d.ts.map +1 -0
- package/dist/dev/lib/cn.js +3 -0
- package/dist/dev/lib/cn.js.map +1 -0
- package/dist/dev/slide-canvas.d.ts +12 -0
- package/dist/dev/slide-canvas.d.ts.map +1 -0
- package/dist/dev/slide-canvas.js +123 -0
- package/dist/dev/slide-canvas.js.map +1 -0
- package/dist/dev/styles.css +37 -0
- package/dist/dev/ui/icon-button.d.ts +12 -0
- package/dist/dev/ui/icon-button.d.ts.map +1 -0
- package/dist/dev/ui/icon-button.js +6 -0
- package/dist/dev/ui/icon-button.js.map +1 -0
- package/dist/dev/ui/kbd.d.ts +6 -0
- package/dist/dev/ui/kbd.d.ts.map +1 -0
- package/dist/dev/ui/kbd.js +4 -0
- package/dist/dev/ui/kbd.js.map +1 -0
- package/dist/dev/ui/text-button.d.ts +10 -0
- package/dist/dev/ui/text-button.d.ts.map +1 -0
- package/dist/dev/ui/text-button.js +6 -0
- package/dist/dev/ui/text-button.js.map +1 -0
- package/dist/dev/url-state.d.ts +7 -0
- package/dist/dev/url-state.d.ts.map +1 -0
- package/dist/dev/url-state.js +13 -0
- package/dist/dev/url-state.js.map +1 -0
- package/dist/dev/use-keyboard-nav.d.ts +17 -0
- package/dist/dev/use-keyboard-nav.d.ts.map +1 -0
- package/dist/dev/use-keyboard-nav.js +53 -0
- package/dist/dev/use-keyboard-nav.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/errors.d.ts +57 -0
- package/dist/mcp/errors.d.ts.map +1 -0
- package/dist/mcp/errors.js +44 -0
- package/dist/mcp/errors.js.map +1 -0
- package/dist/mcp/index.d.ts +29 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +29 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/naming.d.ts +37 -0
- package/dist/mcp/naming.d.ts.map +1 -0
- package/dist/mcp/naming.js +43 -0
- package/dist/mcp/naming.js.map +1 -0
- package/dist/mcp/render.d.ts +45 -0
- package/dist/mcp/render.d.ts.map +1 -0
- package/dist/mcp/render.js +77 -0
- package/dist/mcp/render.js.map +1 -0
- package/dist/mcp/schema.d.ts +54 -0
- package/dist/mcp/schema.d.ts.map +1 -0
- package/dist/mcp/schema.js +55 -0
- package/dist/mcp/schema.js.map +1 -0
- package/dist/mcp/server.d.ts +63 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +196 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/scaffold/index.d.ts +39 -0
- package/dist/scaffold/index.d.ts.map +1 -0
- package/dist/scaffold/index.js +84 -0
- package/dist/scaffold/index.js.map +1 -0
- package/dist/scaffold/template-base/README.md +134 -0
- package/dist/scaffold/template-base/_gitignore +4 -0
- package/dist/scaffold/template-base/package.json +35 -0
- package/dist/scaffold/template-base/src/components/Cover.tsx +30 -0
- package/dist/scaffold/template-base/src/index.ts +27 -0
- package/dist/scaffold/template-base/src/preview.tsx +9 -0
- package/dist/scaffold/template-base/tsconfig.build.json +10 -0
- package/dist/scaffold/template-base/tsconfig.json +18 -0
- package/package.json +164 -0
- package/src/__tests__/fixtures/test-template/index.tsx +77 -0
- package/src/__tests__/pptx-mcp.test.ts +85 -0
- package/src/__tests__/pptx-smoke.test.ts +45 -0
- package/src/__tests__/preview.test.ts +28 -0
- package/src/cli.ts +426 -0
- package/src/core/__snapshots__/reconciler.test.ts.snap +320 -0
- package/src/core/components.test.ts +57 -0
- package/src/core/components.ts +196 -0
- package/src/core/fake-runtime.test.ts +174 -0
- package/src/core/fake-runtime.ts +302 -0
- package/src/core/font-resolver.ts +46 -0
- package/src/core/geometry.test.ts +58 -0
- package/src/core/geometry.ts +91 -0
- package/src/core/index.ts +69 -0
- package/src/core/manifest.test.ts +33 -0
- package/src/core/manifest.ts +150 -0
- package/src/core/op-translator-pptx.test.ts +204 -0
- package/src/core/op-translator-pptx.ts +365 -0
- package/src/core/pptx-runtime.test.ts +137 -0
- package/src/core/pptx-runtime.ts +504 -0
- package/src/core/reconciler.test.ts +644 -0
- package/src/core/reconciler.ts +603 -0
- package/src/core/runtime.ts +150 -0
- package/src/core/template.test.ts +136 -0
- package/src/core/template.ts +37 -0
- package/src/dev/auto-examples.ts +89 -0
- package/src/dev/bin/slides-dev.mjs +24 -0
- package/src/dev/bin/slides-dev.ts +101 -0
- package/src/dev/compose-deck.test.ts +68 -0
- package/src/dev/compose-deck.ts +40 -0
- package/src/dev/deck-viewer.tsx +677 -0
- package/src/dev/dev-server/client/entry.tsx +15 -0
- package/src/dev/dev-server/client/index.html +24 -0
- package/src/dev/dev-server/output.ts +37 -0
- package/src/dev/dev-server/server-only-stub.ts +12 -0
- package/src/dev/dev-server/start.ts +155 -0
- package/src/dev/index.ts +4 -0
- package/src/dev/lib/cn.ts +3 -0
- package/src/dev/slide-canvas.test.tsx +66 -0
- package/src/dev/slide-canvas.tsx +170 -0
- package/src/dev/styles.css +37 -0
- package/src/dev/ui/icon-button.tsx +31 -0
- package/src/dev/ui/kbd.tsx +20 -0
- package/src/dev/ui/text-button.tsx +31 -0
- package/src/dev/url-state.test.ts +22 -0
- package/src/dev/url-state.ts +17 -0
- package/src/dev/use-keyboard-nav.ts +64 -0
- package/src/index.ts +17 -0
- package/src/mcp/errors.test.ts +51 -0
- package/src/mcp/errors.ts +76 -0
- package/src/mcp/index.ts +45 -0
- package/src/mcp/naming.test.ts +39 -0
- package/src/mcp/naming.ts +49 -0
- package/src/mcp/render.ts +110 -0
- package/src/mcp/schema.test.ts +86 -0
- package/src/mcp/schema.ts +93 -0
- package/src/mcp/server.test.ts +309 -0
- package/src/mcp/server.ts +276 -0
- package/src/scaffold/index.ts +102 -0
- package/src/scaffold/template-base/README.md +134 -0
- package/src/scaffold/template-base/_gitignore +4 -0
- package/src/scaffold/template-base/package.json +35 -0
- package/src/scaffold/template-base/src/components/Cover.tsx +30 -0
- package/src/scaffold/template-base/src/index.ts +27 -0
- package/src/scaffold/template-base/src/preview.tsx +9 -0
- package/src/scaffold/template-base/tsconfig.build.json +10 -0
- package/src/scaffold/template-base/tsconfig.json +18 -0
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|