@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,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 @@
|
|
|
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 @@
|
|
|
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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"}
|