@velumo/runtime 0.1.0-beta.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 (63) hide show
  1. package/dist/action-dispatcher.d.ts +27 -0
  2. package/dist/action-dispatcher.d.ts.map +1 -0
  3. package/dist/action-dispatcher.js +34 -0
  4. package/dist/action-dispatcher.js.map +1 -0
  5. package/dist/camera.d.ts +51 -0
  6. package/dist/camera.d.ts.map +1 -0
  7. package/dist/camera.js +327 -0
  8. package/dist/camera.js.map +1 -0
  9. package/dist/controller.d.ts +33 -0
  10. package/dist/controller.d.ts.map +1 -0
  11. package/dist/controller.js +109 -0
  12. package/dist/controller.js.map +1 -0
  13. package/dist/cue-dispatcher.d.ts +76 -0
  14. package/dist/cue-dispatcher.d.ts.map +1 -0
  15. package/dist/cue-dispatcher.js +164 -0
  16. package/dist/cue-dispatcher.js.map +1 -0
  17. package/dist/hash.d.ts +8 -0
  18. package/dist/hash.d.ts.map +1 -0
  19. package/dist/hash.js +27 -0
  20. package/dist/hash.js.map +1 -0
  21. package/dist/index.d.ts +13 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +13 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/notes.d.ts +32 -0
  26. package/dist/notes.d.ts.map +1 -0
  27. package/dist/notes.js +132 -0
  28. package/dist/notes.js.map +1 -0
  29. package/dist/registry.d.ts +32 -0
  30. package/dist/registry.d.ts.map +1 -0
  31. package/dist/registry.js +76 -0
  32. package/dist/registry.js.map +1 -0
  33. package/dist/scene-player.d.ts +40 -0
  34. package/dist/scene-player.d.ts.map +1 -0
  35. package/dist/scene-player.js +177 -0
  36. package/dist/scene-player.js.map +1 -0
  37. package/dist/spatial.d.ts +11 -0
  38. package/dist/spatial.d.ts.map +1 -0
  39. package/dist/spatial.js +28 -0
  40. package/dist/spatial.js.map +1 -0
  41. package/dist/theme-bundle.d.ts +32 -0
  42. package/dist/theme-bundle.d.ts.map +1 -0
  43. package/dist/theme-bundle.js +8 -0
  44. package/dist/theme-bundle.js.map +1 -0
  45. package/dist/timeline.d.ts +46 -0
  46. package/dist/timeline.d.ts.map +1 -0
  47. package/dist/timeline.js +217 -0
  48. package/dist/timeline.js.map +1 -0
  49. package/dist/tsconfig.tsbuildinfo +1 -0
  50. package/package.json +19 -0
  51. package/src/action-dispatcher.ts +81 -0
  52. package/src/camera.ts +513 -0
  53. package/src/controller.ts +171 -0
  54. package/src/cue-dispatcher.ts +299 -0
  55. package/src/hash.ts +39 -0
  56. package/src/index.ts +12 -0
  57. package/src/notes.ts +194 -0
  58. package/src/registry.ts +194 -0
  59. package/src/scene-player.ts +244 -0
  60. package/src/spatial.ts +40 -0
  61. package/src/theme-bundle.ts +35 -0
  62. package/src/timeline.ts +323 -0
  63. package/tsconfig.json +10 -0
@@ -0,0 +1,76 @@
1
+ import type { Cue, JsonValue } from "@velumo/core";
2
+ import { type ActionContext } from "./action-dispatcher.js";
3
+ import type { ActionHandler, RuntimeRegistry } from "./registry.js";
4
+ import type { TimelineScheduler } from "./timeline.js";
5
+ export interface CueDispatchEvent extends ActionContext {
6
+ readonly source: "cue";
7
+ readonly cue: Cue;
8
+ readonly cueIndex: number;
9
+ readonly timeMs: number;
10
+ }
11
+ export interface CueDispatcherOptions {
12
+ readonly scheduler: TimelineScheduler;
13
+ readonly registry: RuntimeRegistry<unknown, unknown, CueDispatchEvent>;
14
+ }
15
+ export interface CueDispatcherResult {
16
+ dispose(): void;
17
+ }
18
+ export declare class CueDispatcher implements CueDispatcherResult {
19
+ #private;
20
+ constructor(options: CueDispatcherOptions);
21
+ dispose(): void;
22
+ }
23
+ export declare function createCueDispatcher(options: CueDispatcherOptions): CueDispatcher;
24
+ export type BuiltInActionType = "show" | "hide" | "setClass" | "emit" | "camera" | "fx";
25
+ export interface ShowActionEvent {
26
+ readonly type: "show";
27
+ readonly target: string;
28
+ readonly cue: Cue;
29
+ readonly cueIndex: number;
30
+ readonly timeMs: number;
31
+ }
32
+ export interface HideActionEvent {
33
+ readonly type: "hide";
34
+ readonly target: string;
35
+ readonly cue: Cue;
36
+ readonly cueIndex: number;
37
+ readonly timeMs: number;
38
+ }
39
+ export interface SetClassActionEvent {
40
+ readonly type: "setClass";
41
+ readonly target: string;
42
+ readonly className: string;
43
+ readonly mode: "add" | "remove" | "toggle";
44
+ readonly cue: Cue;
45
+ readonly cueIndex: number;
46
+ readonly timeMs: number;
47
+ }
48
+ export interface EmitActionEvent {
49
+ readonly type: "emit";
50
+ readonly name: string;
51
+ readonly data: JsonValue | undefined;
52
+ readonly cue: Cue;
53
+ readonly cueIndex: number;
54
+ readonly timeMs: number;
55
+ }
56
+ export interface CameraActionEvent {
57
+ readonly type: "camera";
58
+ readonly payload: JsonValue | undefined;
59
+ readonly cue: Cue;
60
+ readonly cueIndex: number;
61
+ readonly timeMs: number;
62
+ }
63
+ export interface FxActionEvent {
64
+ readonly type: "fx";
65
+ readonly payload: JsonValue | undefined;
66
+ readonly cue: Cue;
67
+ readonly cueIndex: number;
68
+ readonly timeMs: number;
69
+ }
70
+ export declare function createShowAction(callback: (event: ShowActionEvent) => void): ActionHandler<CueDispatchEvent>;
71
+ export declare function createHideAction(callback: (event: HideActionEvent) => void): ActionHandler<CueDispatchEvent>;
72
+ export declare function createSetClassAction(callback: (event: SetClassActionEvent) => void): ActionHandler<CueDispatchEvent>;
73
+ export declare function createEmitAction(callback: (event: EmitActionEvent) => void): ActionHandler<CueDispatchEvent>;
74
+ export declare function createCameraAction(callback: (event: CameraActionEvent) => void): ActionHandler<CueDispatchEvent>;
75
+ export declare function createFxAction(callback: (event: FxActionEvent) => void): ActionHandler<CueDispatchEvent>;
76
+ //# sourceMappingURL=cue-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cue-dispatcher.d.ts","sourceRoot":"","sources":["../src/cue-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ import { ActionDispatcher } from "./action-dispatcher.js";
2
+ const ERROR_PREFIX = "CueDispatcher: ";
3
+ export class CueDispatcher {
4
+ #disposeFromScheduler;
5
+ #disposed = false;
6
+ constructor(options) {
7
+ // Both the cue path (here) and the control path route lookup+invoke through
8
+ // the same ActionDispatcher. The dispatcher never throws for a missing
9
+ // handler; the cue path re-imposes its throw-on-unknown contract on false.
10
+ const dispatcher = new ActionDispatcher({
11
+ registry: options.registry,
12
+ });
13
+ this.#disposeFromScheduler = options.scheduler.on("cue:fired", (event) => {
14
+ if (event.type !== "cue:fired") {
15
+ return;
16
+ }
17
+ const actionType = event.cue.action.type;
18
+ const context = {
19
+ action: event.cue.action,
20
+ payload: event.cue.action.payload,
21
+ source: "cue",
22
+ cue: event.cue,
23
+ cueIndex: event.cueIndex,
24
+ timeMs: event.timeMs,
25
+ // Thread the action's top-level target on the cue path too (the control
26
+ // path already does), so a handler branching on context.target sees the
27
+ // same value regardless of which path fired it.
28
+ ...(event.cue.action.target === undefined
29
+ ? {}
30
+ : { target: event.cue.action.target }),
31
+ };
32
+ const handled = dispatcher.dispatch(actionType, context);
33
+ if (!handled) {
34
+ throw new Error(`${ERROR_PREFIX}no action handler registered for type '${actionType}'`);
35
+ }
36
+ });
37
+ }
38
+ dispose() {
39
+ if (this.#disposed) {
40
+ return;
41
+ }
42
+ this.#disposed = true;
43
+ this.#disposeFromScheduler();
44
+ }
45
+ }
46
+ export function createCueDispatcher(options) {
47
+ return new CueDispatcher(options);
48
+ }
49
+ const _builtInActionTypeCheck = "show";
50
+ void _builtInActionTypeCheck;
51
+ function requirePayloadObject(payload, actionType) {
52
+ if (payload === undefined ||
53
+ payload === null ||
54
+ typeof payload !== "object" ||
55
+ Array.isArray(payload)) {
56
+ const describe = payload === undefined
57
+ ? "undefined"
58
+ : payload === null
59
+ ? "null"
60
+ : Array.isArray(payload)
61
+ ? "array"
62
+ : typeof payload;
63
+ throw new Error(`${ERROR_PREFIX}${actionType} action requires payload object; got ${describe}`);
64
+ }
65
+ return payload;
66
+ }
67
+ function requireNonEmptyString(payload, field, actionType) {
68
+ const value = payload[field];
69
+ if (typeof value !== "string" || value.length === 0) {
70
+ throw new Error(`${ERROR_PREFIX}${actionType} action payload.${field} must be a non-empty string; got ${typeof value === "string" ? "''" : String(value)}`);
71
+ }
72
+ return value;
73
+ }
74
+ function readSetClassMode(payload) {
75
+ const mode = payload.mode;
76
+ if (mode === undefined) {
77
+ return "add";
78
+ }
79
+ if (mode === "add" || mode === "remove" || mode === "toggle") {
80
+ return mode;
81
+ }
82
+ throw new Error(`${ERROR_PREFIX}setClass action payload.mode must be 'add' | 'remove' | 'toggle' (or omitted); got ${String(mode)}`);
83
+ }
84
+ export function createShowAction(callback) {
85
+ return (context) => {
86
+ const payload = requirePayloadObject(context.cue.action.payload, "show");
87
+ const target = requireNonEmptyString(payload, "target", "show");
88
+ callback({
89
+ type: "show",
90
+ target,
91
+ cue: context.cue,
92
+ cueIndex: context.cueIndex,
93
+ timeMs: context.timeMs,
94
+ });
95
+ };
96
+ }
97
+ export function createHideAction(callback) {
98
+ return (context) => {
99
+ const payload = requirePayloadObject(context.cue.action.payload, "hide");
100
+ const target = requireNonEmptyString(payload, "target", "hide");
101
+ callback({
102
+ type: "hide",
103
+ target,
104
+ cue: context.cue,
105
+ cueIndex: context.cueIndex,
106
+ timeMs: context.timeMs,
107
+ });
108
+ };
109
+ }
110
+ export function createSetClassAction(callback) {
111
+ return (context) => {
112
+ const payload = requirePayloadObject(context.cue.action.payload, "setClass");
113
+ const target = requireNonEmptyString(payload, "target", "setClass");
114
+ const className = requireNonEmptyString(payload, "className", "setClass");
115
+ const mode = readSetClassMode(payload);
116
+ callback({
117
+ type: "setClass",
118
+ target,
119
+ className,
120
+ mode,
121
+ cue: context.cue,
122
+ cueIndex: context.cueIndex,
123
+ timeMs: context.timeMs,
124
+ });
125
+ };
126
+ }
127
+ export function createEmitAction(callback) {
128
+ return (context) => {
129
+ const payload = requirePayloadObject(context.cue.action.payload, "emit");
130
+ const name = requireNonEmptyString(payload, "name", "emit");
131
+ const data = payload.data;
132
+ callback({
133
+ type: "emit",
134
+ name,
135
+ data,
136
+ cue: context.cue,
137
+ cueIndex: context.cueIndex,
138
+ timeMs: context.timeMs,
139
+ });
140
+ };
141
+ }
142
+ export function createCameraAction(callback) {
143
+ return (context) => {
144
+ callback({
145
+ type: "camera",
146
+ payload: context.cue.action.payload,
147
+ cue: context.cue,
148
+ cueIndex: context.cueIndex,
149
+ timeMs: context.timeMs,
150
+ });
151
+ };
152
+ }
153
+ export function createFxAction(callback) {
154
+ return (context) => {
155
+ callback({
156
+ type: "fx",
157
+ payload: context.cue.action.payload,
158
+ cue: context.cue,
159
+ cueIndex: context.cueIndex,
160
+ timeMs: context.timeMs,
161
+ });
162
+ };
163
+ }
164
+ //# sourceMappingURL=cue-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cue-dispatcher.js","sourceRoot":"","sources":["../src/cue-dispatcher.ts"],"names":[],"mappings":"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"}
package/dist/hash.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { RuntimeState } from "./controller.js";
2
+ export interface RuntimeHashOptions {
3
+ readonly initialSlideId?: string;
4
+ readonly initialFragmentIndex?: number;
5
+ }
6
+ export declare function serializeRuntimeHash(state: RuntimeState): string;
7
+ export declare function parseRuntimeHash(hash: string): RuntimeHashOptions;
8
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAOhE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAUjE"}
package/dist/hash.js ADDED
@@ -0,0 +1,27 @@
1
+ export function serializeRuntimeHash(state) {
2
+ const params = new URLSearchParams({
3
+ slide: state.slideId,
4
+ fragment: String(state.fragmentIndex),
5
+ });
6
+ return `#${params.toString()}`;
7
+ }
8
+ export function parseRuntimeHash(hash) {
9
+ const source = hash.startsWith("#") ? hash.slice(1) : hash;
10
+ const params = new URLSearchParams(source);
11
+ const initialSlideId = params.get("slide") ?? undefined;
12
+ const initialFragmentIndex = parseFragmentIndex(params.get("fragment"));
13
+ return {
14
+ ...(initialSlideId === undefined ? {} : { initialSlideId }),
15
+ ...(initialFragmentIndex === undefined ? {} : { initialFragmentIndex }),
16
+ };
17
+ }
18
+ function parseFragmentIndex(fragment) {
19
+ if (fragment === null) {
20
+ return undefined;
21
+ }
22
+ const parsedFragment = Number(fragment);
23
+ return Number.isInteger(parsedFragment) && parsedFragment >= 0
24
+ ? parsedFragment
25
+ : undefined;
26
+ }
27
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../src/hash.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,oBAAoB,CAAC,KAAmB;IACtD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,KAAK,EAAE,KAAK,CAAC,OAAO;QACpB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;KACtC,CAAC,CAAC;IAEH,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC;IACxD,MAAM,oBAAoB,GAAG,kBAAkB,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAExE,OAAO;QACL,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;QAC3D,GAAG,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAuB;IACjD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAExC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,cAAc,IAAI,CAAC;QAC5D,CAAC,CAAC,cAAc;QAChB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare const runtimePackageName = "@velumo/runtime";
2
+ export * from "./controller.js";
3
+ export * from "./hash.js";
4
+ export * from "./notes.js";
5
+ export * from "./registry.js";
6
+ export * from "./timeline.js";
7
+ export * from "./cue-dispatcher.js";
8
+ export * from "./action-dispatcher.js";
9
+ export * from "./camera.js";
10
+ export * from "./spatial.js";
11
+ export * from "./scene-player.js";
12
+ export * from "./theme-bundle.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export const runtimePackageName = "@velumo/runtime";
2
+ export * from "./controller.js";
3
+ export * from "./hash.js";
4
+ export * from "./notes.js";
5
+ export * from "./registry.js";
6
+ export * from "./timeline.js";
7
+ export * from "./cue-dispatcher.js";
8
+ export * from "./action-dispatcher.js";
9
+ export * from "./camera.js";
10
+ export * from "./spatial.js";
11
+ export * from "./scene-player.js";
12
+ export * from "./theme-bundle.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { Manifest, SlideKind } from "@velumo/core";
2
+ import type { RuntimeController, RuntimeState } from "./controller.js";
3
+ export type SpeakerNoteBlock = {
4
+ readonly type: "heading";
5
+ readonly level: 1 | 2 | 3;
6
+ readonly text: string;
7
+ } | {
8
+ readonly type: "paragraph";
9
+ readonly text: string;
10
+ } | {
11
+ readonly type: "list";
12
+ readonly items: readonly string[];
13
+ } | {
14
+ readonly type: "code";
15
+ readonly text: string;
16
+ };
17
+ export interface SpeakerNotesEntry {
18
+ readonly slideId: string;
19
+ readonly slideIndex: number;
20
+ readonly slideKind: SlideKind;
21
+ readonly raw: string;
22
+ readonly plainText: string;
23
+ readonly hasNotes: boolean;
24
+ readonly blocks: readonly SpeakerNoteBlock[];
25
+ }
26
+ export interface SpeakerNotesModel {
27
+ getBySlideId(slideId: string): SpeakerNotesEntry;
28
+ getForState(state: RuntimeState): SpeakerNotesEntry;
29
+ getForRuntime(runtime: RuntimeController): SpeakerNotesEntry;
30
+ }
31
+ export declare function createSpeakerNotesModel(manifest: Manifest): SpeakerNotesModel;
32
+ //# sourceMappingURL=notes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../src/notes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEvE,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC5D;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACjD,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAAC;IACpD,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,iBAAiB,CAAC;CAC9D;AAMD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,iBAAiB,CAY7E"}
package/dist/notes.js ADDED
@@ -0,0 +1,132 @@
1
+ const speakerNoteCodeFence = "```";
2
+ const speakerNoteHeadingPattern = /^(#{1,3})\s+(.+)$/;
3
+ const speakerNoteListItemPattern = /^[-*]\s+/;
4
+ export function createSpeakerNotesModel(manifest) {
5
+ return {
6
+ getBySlideId(slideId) {
7
+ return notesForSlide(manifest, slideId);
8
+ },
9
+ getForState(state) {
10
+ return notesForSlide(manifest, state.slideId);
11
+ },
12
+ getForRuntime(runtime) {
13
+ return notesForSlide(manifest, runtime.getState().slideId);
14
+ },
15
+ };
16
+ }
17
+ function notesForSlide(manifest, slideId) {
18
+ const slideIndex = manifest.slides.findIndex((slide) => slide.id === slideId);
19
+ const slide = manifest.slides[slideIndex];
20
+ if (slide === undefined) {
21
+ return emptyNotes(slideId);
22
+ }
23
+ const raw = slide.notes ?? "";
24
+ const blocks = raw.trim().length === 0 ? [] : parseSpeakerNoteBlocks(raw);
25
+ return {
26
+ slideId: slide.id,
27
+ slideIndex,
28
+ slideKind: slide.kind,
29
+ raw,
30
+ plainText: blocksToPlainText(blocks),
31
+ hasNotes: raw.trim().length > 0,
32
+ blocks,
33
+ };
34
+ }
35
+ function emptyNotes(slideId) {
36
+ return {
37
+ slideId,
38
+ slideIndex: -1,
39
+ slideKind: "slide",
40
+ raw: "",
41
+ plainText: "",
42
+ hasNotes: false,
43
+ blocks: [],
44
+ };
45
+ }
46
+ function parseSpeakerNoteBlocks(source) {
47
+ const blocks = [];
48
+ const lines = source.replace(/\r\n?/g, "\n").split("\n");
49
+ let index = 0;
50
+ while (index < lines.length) {
51
+ const trimmedLine = lines[index].trim();
52
+ if (trimmedLine.length === 0) {
53
+ index += 1;
54
+ continue;
55
+ }
56
+ if (trimmedLine === speakerNoteCodeFence) {
57
+ const codeLines = [];
58
+ index += 1;
59
+ while (index < lines.length &&
60
+ lines[index].trim() !== speakerNoteCodeFence) {
61
+ codeLines.push(lines[index]);
62
+ index += 1;
63
+ }
64
+ blocks.push({ type: "code", text: codeLines.join("\n") });
65
+ if (index < lines.length) {
66
+ index += 1;
67
+ }
68
+ continue;
69
+ }
70
+ const headingMatch = trimmedLine.match(speakerNoteHeadingPattern);
71
+ if (headingMatch !== null) {
72
+ blocks.push({
73
+ type: "heading",
74
+ level: headingMatch[1].length,
75
+ text: cleanInlineText(headingMatch[2]),
76
+ });
77
+ index += 1;
78
+ continue;
79
+ }
80
+ if (speakerNoteListItemPattern.test(trimmedLine)) {
81
+ const items = [];
82
+ while (index < lines.length &&
83
+ speakerNoteListItemPattern.test(lines[index].trim())) {
84
+ items.push(cleanInlineText(lines[index].trim().replace(speakerNoteListItemPattern, "")));
85
+ index += 1;
86
+ }
87
+ blocks.push({ type: "list", items });
88
+ continue;
89
+ }
90
+ const paragraphLines = [];
91
+ while (index < lines.length && isSpeakerNoteParagraphLine(lines[index])) {
92
+ paragraphLines.push(lines[index].trim());
93
+ index += 1;
94
+ }
95
+ blocks.push({
96
+ type: "paragraph",
97
+ text: cleanInlineText(paragraphLines.join(" ")),
98
+ });
99
+ }
100
+ return blocks;
101
+ }
102
+ function isSpeakerNoteParagraphLine(line) {
103
+ const trimmedLine = line.trim();
104
+ return (trimmedLine.length > 0 &&
105
+ trimmedLine !== speakerNoteCodeFence &&
106
+ trimmedLine.match(speakerNoteHeadingPattern) === null &&
107
+ !speakerNoteListItemPattern.test(trimmedLine));
108
+ }
109
+ function cleanInlineText(source) {
110
+ return source
111
+ .replace(/<script\b[^>]*>([\s\S]*?)<\/script>/gi, "$1")
112
+ .replace(/<\/?[^>]+>/g, "")
113
+ .replace(/`([^`]+)`/g, "$1")
114
+ .replace(/\*\*([^*]+)\*\*/g, "$1")
115
+ .replace(/\*([^*]+)\*/g, "$1")
116
+ .trim();
117
+ }
118
+ function blocksToPlainText(blocks) {
119
+ return blocks
120
+ .map((block) => {
121
+ switch (block.type) {
122
+ case "heading":
123
+ case "paragraph":
124
+ case "code":
125
+ return block.text;
126
+ case "list":
127
+ return block.items.join("\n");
128
+ }
129
+ })
130
+ .join("\n\n");
131
+ }
132
+ //# sourceMappingURL=notes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notes.js","sourceRoot":"","sources":["../src/notes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Manifest } from "@velumo/core";
2
+ export type LayerRenderer<TContext = unknown, TResult = unknown> = (context: TContext) => TResult;
3
+ export type ActionHandler<TContext = unknown> = (context: TContext) => void;
4
+ export type ManifestTransform = (manifest: Manifest) => Manifest;
5
+ export interface PluginSetupContext<TLayerContext = unknown, TLayerResult = unknown, TActionContext = unknown> {
6
+ readonly registry: RuntimeRegistry<TLayerContext, TLayerResult, TActionContext>;
7
+ readonly manifest: Manifest;
8
+ }
9
+ export interface VelumoPlugin<TLayerContext = unknown, TLayerResult = unknown, TActionContext = unknown> {
10
+ readonly id: string;
11
+ setup?(context: PluginSetupContext<TLayerContext, TLayerResult, TActionContext>): void;
12
+ }
13
+ export interface InstallPluginsOptions<TLayerContext = unknown, TLayerResult = unknown, TActionContext = unknown> {
14
+ readonly registry: RuntimeRegistry<TLayerContext, TLayerResult, TActionContext>;
15
+ readonly manifest: Manifest;
16
+ readonly plugins: readonly VelumoPlugin<TLayerContext, TLayerResult, TActionContext>[];
17
+ }
18
+ export declare class RuntimeRegistry<TLayerContext = unknown, TLayerResult = unknown, TActionContext = unknown> {
19
+ #private;
20
+ registerLayerRenderer(type: string, renderer: LayerRenderer<TLayerContext, TLayerResult>): void;
21
+ hasLayerRenderer(type: string): boolean;
22
+ getLayerRenderer(type: string): LayerRenderer<TLayerContext, TLayerResult> | undefined;
23
+ registerActionHandler(type: string, handler: ActionHandler<TActionContext>): void;
24
+ hasActionHandler(type: string): boolean;
25
+ getActionHandler(type: string): ActionHandler<TActionContext> | undefined;
26
+ registerManifestTransform(transform: ManifestTransform): void;
27
+ applyManifestTransforms(manifest: Manifest): Manifest;
28
+ installPlugins(manifest: Manifest, plugins: readonly VelumoPlugin<TLayerContext, TLayerResult, TActionContext>[]): void;
29
+ }
30
+ export declare function createRuntimeRegistry<TLayerContext = unknown, TLayerResult = unknown, TActionContext = unknown>(): RuntimeRegistry<TLayerContext, TLayerResult, TActionContext>;
31
+ export declare function installPlugins<TLayerContext = unknown, TLayerResult = unknown, TActionContext = unknown>(options: InstallPluginsOptions<TLayerContext, TLayerResult, TActionContext>): void;
32
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,MAAM,aAAa,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,CACjE,OAAO,EAAE,QAAQ,KACd,OAAO,CAAC;AAEb,MAAM,MAAM,aAAa,CAAC,QAAQ,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;AAE5E,MAAM,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAEjE,MAAM,WAAW,kBAAkB,CACjC,aAAa,GAAG,OAAO,EACvB,YAAY,GAAG,OAAO,EACtB,cAAc,GAAG,OAAO;IAExB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAChC,aAAa,EACb,YAAY,EACZ,cAAc,CACf,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY,CAC3B,aAAa,GAAG,OAAO,EACvB,YAAY,GAAG,OAAO,EACtB,cAAc,GAAG,OAAO;IAExB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,CACJ,OAAO,EAAE,kBAAkB,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,GACvE,IAAI,CAAC;CACT;AAED,MAAM,WAAW,qBAAqB,CACpC,aAAa,GAAG,OAAO,EACvB,YAAY,GAAG,OAAO,EACtB,cAAc,GAAG,OAAO;IAExB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAChC,aAAa,EACb,YAAY,EACZ,cAAc,CACf,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,CACrC,aAAa,EACb,YAAY,EACZ,cAAc,CACf,EAAE,CAAC;CACL;AAED,qBAAa,eAAe,CAC1B,aAAa,GAAG,OAAO,EACvB,YAAY,GAAG,OAAO,EACtB,cAAc,GAAG,OAAO;;IAUxB,qBAAqB,CACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,CAAC,aAAa,EAAE,YAAY,CAAC,GACnD,IAAI;IAQP,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIvC,gBAAgB,CACd,IAAI,EAAE,MAAM,GACX,aAAa,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,SAAS;IAIzD,qBAAqB,CACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,GACrC,IAAI;IAQP,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIvC,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,cAAc,CAAC,GAAG,SAAS;IAIzE,yBAAyB,CAAC,SAAS,EAAE,iBAAiB,GAAG,IAAI;IAI7D,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IAOrD,cAAc,CACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,SAAS,YAAY,CAC5B,aAAa,EACb,YAAY,EACZ,cAAc,CACf,EAAE,GACF,IAAI;CA6BR;AAED,wBAAgB,qBAAqB,CACnC,aAAa,GAAG,OAAO,EACvB,YAAY,GAAG,OAAO,EACtB,cAAc,GAAG,OAAO,KACrB,eAAe,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,CAEhE;AAED,wBAAgB,cAAc,CAC5B,aAAa,GAAG,OAAO,EACvB,YAAY,GAAG,OAAO,EACtB,cAAc,GAAG,OAAO,EAExB,OAAO,EAAE,qBAAqB,CAAC,aAAa,EAAE,YAAY,EAAE,cAAc,CAAC,GAC1E,IAAI,CAEN"}
@@ -0,0 +1,76 @@
1
+ export class RuntimeRegistry {
2
+ #layerRenderers = new Map();
3
+ #actionHandlers = new Map();
4
+ #manifestTransforms = [];
5
+ #installedPluginIds = new Set();
6
+ registerLayerRenderer(type, renderer) {
7
+ if (this.#layerRenderers.has(type)) {
8
+ throw new Error(`Layer renderer already registered: ${type}`);
9
+ }
10
+ this.#layerRenderers.set(type, renderer);
11
+ }
12
+ hasLayerRenderer(type) {
13
+ return this.#layerRenderers.has(type);
14
+ }
15
+ getLayerRenderer(type) {
16
+ return this.#layerRenderers.get(type);
17
+ }
18
+ registerActionHandler(type, handler) {
19
+ if (this.#actionHandlers.has(type)) {
20
+ throw new Error(`Action handler already registered: ${type}`);
21
+ }
22
+ this.#actionHandlers.set(type, handler);
23
+ }
24
+ hasActionHandler(type) {
25
+ return this.#actionHandlers.has(type);
26
+ }
27
+ getActionHandler(type) {
28
+ return this.#actionHandlers.get(type);
29
+ }
30
+ registerManifestTransform(transform) {
31
+ this.#manifestTransforms.push(transform);
32
+ }
33
+ applyManifestTransforms(manifest) {
34
+ return this.#manifestTransforms.reduce((current, transform) => transform(current), cloneManifest(manifest));
35
+ }
36
+ installPlugins(manifest, plugins) {
37
+ this.#assertPluginsCanInstall(plugins);
38
+ for (const plugin of plugins) {
39
+ plugin.setup?.({ registry: this, manifest });
40
+ this.#installedPluginIds.add(plugin.id);
41
+ }
42
+ }
43
+ #assertPluginsCanInstall(plugins) {
44
+ const nextPluginIds = new Set();
45
+ for (const plugin of plugins) {
46
+ if (this.#installedPluginIds.has(plugin.id) ||
47
+ nextPluginIds.has(plugin.id)) {
48
+ throw new Error(`Plugin already installed: ${plugin.id}`);
49
+ }
50
+ nextPluginIds.add(plugin.id);
51
+ }
52
+ }
53
+ }
54
+ export function createRuntimeRegistry() {
55
+ return new RuntimeRegistry();
56
+ }
57
+ export function installPlugins(options) {
58
+ options.registry.installPlugins(options.manifest, options.plugins);
59
+ }
60
+ function cloneManifest(manifest) {
61
+ const slides = manifest.slides === undefined ? {} : { slides: [...manifest.slides] };
62
+ const assets = manifest.assets === undefined ? {} : { assets: [...manifest.assets] };
63
+ const plugins = manifest.plugins === undefined ? {} : { plugins: [...manifest.plugins] };
64
+ const theme = manifest.theme === undefined ? {} : { theme: { ...manifest.theme } };
65
+ const exportOptions = manifest.export === undefined ? {} : { export: { ...manifest.export } };
66
+ return {
67
+ ...manifest,
68
+ deck: { ...manifest.deck },
69
+ ...slides,
70
+ ...assets,
71
+ ...plugins,
72
+ ...theme,
73
+ ...exportOptions,
74
+ };
75
+ }
76
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}