deio-scroll 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/dist/api/server.d.ts +3 -0
  4. package/dist/api/server.d.ts.map +1 -0
  5. package/dist/api/server.js +393 -0
  6. package/dist/api/server.js.map +1 -0
  7. package/dist/artifacts/store.d.ts +24 -0
  8. package/dist/artifacts/store.d.ts.map +1 -0
  9. package/dist/artifacts/store.js +43 -0
  10. package/dist/artifacts/store.js.map +1 -0
  11. package/dist/browser/componentInteraction.d.ts +24 -0
  12. package/dist/browser/componentInteraction.d.ts.map +1 -0
  13. package/dist/browser/componentInteraction.js +328 -0
  14. package/dist/browser/componentInteraction.js.map +1 -0
  15. package/dist/browser/composition.d.ts +42 -0
  16. package/dist/browser/composition.d.ts.map +1 -0
  17. package/dist/browser/composition.js +132 -0
  18. package/dist/browser/composition.js.map +1 -0
  19. package/dist/browser/cookies.d.ts +3 -0
  20. package/dist/browser/cookies.d.ts.map +1 -0
  21. package/dist/browser/cookies.js +20 -0
  22. package/dist/browser/cookies.js.map +1 -0
  23. package/dist/browser/curves.d.ts +4 -0
  24. package/dist/browser/curves.d.ts.map +1 -0
  25. package/dist/browser/curves.js +35 -0
  26. package/dist/browser/curves.js.map +1 -0
  27. package/dist/browser/detectScrollMode.d.ts +5 -0
  28. package/dist/browser/detectScrollMode.d.ts.map +1 -0
  29. package/dist/browser/detectScrollMode.js +61 -0
  30. package/dist/browser/detectScrollMode.js.map +1 -0
  31. package/dist/browser/directionGuardrails.d.ts +22 -0
  32. package/dist/browser/directionGuardrails.d.ts.map +1 -0
  33. package/dist/browser/directionGuardrails.js +99 -0
  34. package/dist/browser/directionGuardrails.js.map +1 -0
  35. package/dist/browser/goto.d.ts +9 -0
  36. package/dist/browser/goto.d.ts.map +1 -0
  37. package/dist/browser/goto.js +62 -0
  38. package/dist/browser/goto.js.map +1 -0
  39. package/dist/browser/hydrate.d.ts +8 -0
  40. package/dist/browser/hydrate.d.ts.map +1 -0
  41. package/dist/browser/hydrate.js +73 -0
  42. package/dist/browser/hydrate.js.map +1 -0
  43. package/dist/browser/mediaClock.d.ts +9 -0
  44. package/dist/browser/mediaClock.d.ts.map +1 -0
  45. package/dist/browser/mediaClock.js +86 -0
  46. package/dist/browser/mediaClock.js.map +1 -0
  47. package/dist/browser/motion.d.ts +21 -0
  48. package/dist/browser/motion.d.ts.map +1 -0
  49. package/dist/browser/motion.js +42 -0
  50. package/dist/browser/motion.js.map +1 -0
  51. package/dist/browser/networkPolicy.d.ts +11 -0
  52. package/dist/browser/networkPolicy.d.ts.map +1 -0
  53. package/dist/browser/networkPolicy.js +119 -0
  54. package/dist/browser/networkPolicy.js.map +1 -0
  55. package/dist/browser/prime.d.ts +3 -0
  56. package/dist/browser/prime.d.ts.map +1 -0
  57. package/dist/browser/prime.js +13 -0
  58. package/dist/browser/prime.js.map +1 -0
  59. package/dist/browser/sanitize.d.ts +3 -0
  60. package/dist/browser/sanitize.d.ts.map +1 -0
  61. package/dist/browser/sanitize.js +37 -0
  62. package/dist/browser/sanitize.js.map +1 -0
  63. package/dist/browser/scroll.d.ts +29 -0
  64. package/dist/browser/scroll.d.ts.map +1 -0
  65. package/dist/browser/scroll.js +420 -0
  66. package/dist/browser/scroll.js.map +1 -0
  67. package/dist/browser/scrollEasing.d.ts +5 -0
  68. package/dist/browser/scrollEasing.d.ts.map +1 -0
  69. package/dist/browser/scrollEasing.js +40 -0
  70. package/dist/browser/scrollEasing.js.map +1 -0
  71. package/dist/browser/scrollReadiness.d.ts +25 -0
  72. package/dist/browser/scrollReadiness.d.ts.map +1 -0
  73. package/dist/browser/scrollReadiness.js +105 -0
  74. package/dist/browser/scrollReadiness.js.map +1 -0
  75. package/dist/browser/urlGuard.d.ts +4 -0
  76. package/dist/browser/urlGuard.d.ts.map +1 -0
  77. package/dist/browser/urlGuard.js +22 -0
  78. package/dist/browser/urlGuard.js.map +1 -0
  79. package/dist/browser/virtualScroll.d.ts +19 -0
  80. package/dist/browser/virtualScroll.d.ts.map +1 -0
  81. package/dist/browser/virtualScroll.js +50 -0
  82. package/dist/browser/virtualScroll.js.map +1 -0
  83. package/dist/capture/detectMargins.d.ts +6 -0
  84. package/dist/capture/detectMargins.d.ts.map +1 -0
  85. package/dist/capture/detectMargins.js +145 -0
  86. package/dist/capture/detectMargins.js.map +1 -0
  87. package/dist/capture/frameRecorder.d.ts +29 -0
  88. package/dist/capture/frameRecorder.d.ts.map +1 -0
  89. package/dist/capture/frameRecorder.js +74 -0
  90. package/dist/capture/frameRecorder.js.map +1 -0
  91. package/dist/capture/stitchFrames.d.ts +9 -0
  92. package/dist/capture/stitchFrames.d.ts.map +1 -0
  93. package/dist/capture/stitchFrames.js +62 -0
  94. package/dist/capture/stitchFrames.js.map +1 -0
  95. package/dist/cli.d.ts +3 -0
  96. package/dist/cli.d.ts.map +1 -0
  97. package/dist/cli.js +329 -0
  98. package/dist/cli.js.map +1 -0
  99. package/dist/config/browserLaunch.d.ts +13 -0
  100. package/dist/config/browserLaunch.d.ts.map +1 -0
  101. package/dist/config/browserLaunch.js +63 -0
  102. package/dist/config/browserLaunch.js.map +1 -0
  103. package/dist/config/recordingProfile.d.ts +10 -0
  104. package/dist/config/recordingProfile.d.ts.map +1 -0
  105. package/dist/config/recordingProfile.js +25 -0
  106. package/dist/config/recordingProfile.js.map +1 -0
  107. package/dist/config/runtimeMode.d.ts +2 -0
  108. package/dist/config/runtimeMode.d.ts.map +1 -0
  109. package/dist/config/runtimeMode.js +4 -0
  110. package/dist/config/runtimeMode.js.map +1 -0
  111. package/dist/config/virtualScroll.d.ts +8 -0
  112. package/dist/config/virtualScroll.d.ts.map +1 -0
  113. package/dist/config/virtualScroll.js +19 -0
  114. package/dist/config/virtualScroll.js.map +1 -0
  115. package/dist/contracts.d.ts +157 -0
  116. package/dist/contracts.d.ts.map +1 -0
  117. package/dist/contracts.js +136 -0
  118. package/dist/contracts.js.map +1 -0
  119. package/dist/editor/compileVideo.d.ts +21 -0
  120. package/dist/editor/compileVideo.d.ts.map +1 -0
  121. package/dist/editor/compileVideo.js +104 -0
  122. package/dist/editor/compileVideo.js.map +1 -0
  123. package/dist/editor/composeComparison.d.ts +30 -0
  124. package/dist/editor/composeComparison.d.ts.map +1 -0
  125. package/dist/editor/composeComparison.js +315 -0
  126. package/dist/editor/composeComparison.js.map +1 -0
  127. package/dist/editor/composeResponsiveness.d.ts +19 -0
  128. package/dist/editor/composeResponsiveness.d.ts.map +1 -0
  129. package/dist/editor/composeResponsiveness.js +198 -0
  130. package/dist/editor/composeResponsiveness.js.map +1 -0
  131. package/dist/editor/frameVideo.d.ts +11 -0
  132. package/dist/editor/frameVideo.d.ts.map +1 -0
  133. package/dist/editor/frameVideo.js +181 -0
  134. package/dist/editor/frameVideo.js.map +1 -0
  135. package/dist/index.d.ts +3 -0
  136. package/dist/index.d.ts.map +1 -0
  137. package/dist/index.js +2 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/inspection/inspectWebsite.d.ts +21 -0
  140. package/dist/inspection/inspectWebsite.d.ts.map +1 -0
  141. package/dist/inspection/inspectWebsite.js +412 -0
  142. package/dist/inspection/inspectWebsite.js.map +1 -0
  143. package/dist/jobs/manager.d.ts +123 -0
  144. package/dist/jobs/manager.d.ts.map +1 -0
  145. package/dist/jobs/manager.js +378 -0
  146. package/dist/jobs/manager.js.map +1 -0
  147. package/dist/jobs/store.d.ts +150 -0
  148. package/dist/jobs/store.d.ts.map +1 -0
  149. package/dist/jobs/store.js +446 -0
  150. package/dist/jobs/store.js.map +1 -0
  151. package/dist/jobs/thumbnail.d.ts +2 -0
  152. package/dist/jobs/thumbnail.d.ts.map +1 -0
  153. package/dist/jobs/thumbnail.js +36 -0
  154. package/dist/jobs/thumbnail.js.map +1 -0
  155. package/dist/pipeline/processRecordingRequest.d.ts +4 -0
  156. package/dist/pipeline/processRecordingRequest.d.ts.map +1 -0
  157. package/dist/pipeline/processRecordingRequest.js +17 -0
  158. package/dist/pipeline/processRecordingRequest.js.map +1 -0
  159. package/dist/pipeline/recordComparison.d.ts +4 -0
  160. package/dist/pipeline/recordComparison.d.ts.map +1 -0
  161. package/dist/pipeline/recordComparison.js +99 -0
  162. package/dist/pipeline/recordComparison.js.map +1 -0
  163. package/dist/pipeline/recordResponsiveness.d.ts +4 -0
  164. package/dist/pipeline/recordResponsiveness.d.ts.map +1 -0
  165. package/dist/pipeline/recordResponsiveness.js +122 -0
  166. package/dist/pipeline/recordResponsiveness.js.map +1 -0
  167. package/dist/pipeline/recordWebsite.d.ts +11 -0
  168. package/dist/pipeline/recordWebsite.d.ts.map +1 -0
  169. package/dist/pipeline/recordWebsite.js +446 -0
  170. package/dist/pipeline/recordWebsite.js.map +1 -0
  171. package/dist/pipeline/styleRecording.d.ts +12 -0
  172. package/dist/pipeline/styleRecording.d.ts.map +1 -0
  173. package/dist/pipeline/styleRecording.js +59 -0
  174. package/dist/pipeline/styleRecording.js.map +1 -0
  175. package/dist/transcode/ffmpeg.d.ts +4 -0
  176. package/dist/transcode/ffmpeg.d.ts.map +1 -0
  177. package/dist/transcode/ffmpeg.js +62 -0
  178. package/dist/transcode/ffmpeg.js.map +1 -0
  179. package/dist/transcode/probe.d.ts +7 -0
  180. package/dist/transcode/probe.d.ts.map +1 -0
  181. package/dist/transcode/probe.js +91 -0
  182. package/dist/transcode/probe.js.map +1 -0
  183. package/dist/transcode/quality.d.ts +8 -0
  184. package/dist/transcode/quality.d.ts.map +1 -0
  185. package/dist/transcode/quality.js +13 -0
  186. package/dist/transcode/quality.js.map +1 -0
  187. package/dist/types.d.ts +302 -0
  188. package/dist/types.d.ts.map +1 -0
  189. package/dist/types.js +2 -0
  190. package/dist/types.js.map +1 -0
  191. package/dist/worker.d.ts +3 -0
  192. package/dist/worker.d.ts.map +1 -0
  193. package/dist/worker.js +22 -0
  194. package/dist/worker.js.map +1 -0
  195. package/package.json +63 -0
  196. package/public/assets/index-C63t4P1L.css +1 -0
  197. package/public/assets/index-Sfgf7dSH.js +9 -0
  198. package/public/background_presets/gray_noise_gradient.png +0 -0
  199. package/public/background_presets/paper_blue.png +0 -0
  200. package/public/background_presets/red_blocks_gradient.png +0 -0
  201. package/public/deio-scroll-mark.svg +12 -0
  202. package/public/favicon.svg +1 -0
  203. package/public/icons.svg +24 -0
  204. package/public/index.html +16 -0
  205. package/public/scrollizard-mark.png +0 -0
@@ -0,0 +1,157 @@
1
+ import { z } from "zod";
2
+ import type { RecordRequest, StyleRequest } from "./types.js";
3
+ export declare const recordRequestSchema: z.ZodObject<{
4
+ targetUrl: z.ZodString;
5
+ exportFormat: z.ZodOptional<z.ZodLiteral<"mp4">>;
6
+ videoConfig: z.ZodObject<{
7
+ framerate: z.ZodOptional<z.ZodNumber>;
8
+ qualityPreset: z.ZodOptional<z.ZodEnum<{
9
+ high: "high";
10
+ medium: "medium";
11
+ low: "low";
12
+ }>>;
13
+ viewport: z.ZodObject<{
14
+ width: z.ZodNumber;
15
+ height: z.ZodNumber;
16
+ deviceScaleFactor: z.ZodOptional<z.ZodNumber>;
17
+ }, z.core.$strip>;
18
+ }, z.core.$strip>;
19
+ animationConfig: z.ZodOptional<z.ZodObject<{
20
+ pixelsPerFrame: z.ZodOptional<z.ZodNumber>;
21
+ preRecordingDelayMs: z.ZodOptional<z.ZodNumber>;
22
+ removeOverlayElements: z.ZodOptional<z.ZodBoolean>;
23
+ pauseTriggers: z.ZodOptional<z.ZodArray<z.ZodObject<{
24
+ selector: z.ZodString;
25
+ durationMs: z.ZodNumber;
26
+ }, z.core.$strip>>>;
27
+ scrollCurve: z.ZodOptional<z.ZodObject<{
28
+ preset: z.ZodOptional<z.ZodEnum<{
29
+ linear: "linear";
30
+ "ease-in": "ease-in";
31
+ "ease-out": "ease-out";
32
+ "ease-in-out": "ease-in-out";
33
+ "ease-in-cubic": "ease-in-cubic";
34
+ "ease-out-cubic": "ease-out-cubic";
35
+ "ease-in-out-cubic": "ease-in-out-cubic";
36
+ custom: "custom";
37
+ }>>;
38
+ bezier: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
39
+ }, z.core.$strip>>;
40
+ durationMs: z.ZodOptional<z.ZodNumber>;
41
+ heroHoldMs: z.ZodOptional<z.ZodNumber>;
42
+ scrollMode: z.ZodOptional<z.ZodEnum<{
43
+ auto: "auto";
44
+ document: "document";
45
+ virtual: "virtual";
46
+ }>>;
47
+ virtualScrollCycles: z.ZodOptional<z.ZodNumber>;
48
+ virtualScrollDurationMs: z.ZodOptional<z.ZodNumber>;
49
+ fastMode: z.ZodOptional<z.ZodBoolean>;
50
+ captureMode: z.ZodOptional<z.ZodEnum<{
51
+ preview: "preview";
52
+ export: "export";
53
+ }>>;
54
+ direction: z.ZodOptional<z.ZodObject<{
55
+ startHoldMs: z.ZodOptional<z.ZodNumber>;
56
+ beats: z.ZodArray<z.ZodObject<{
57
+ target: z.ZodDiscriminatedUnion<[z.ZodObject<{
58
+ type: z.ZodLiteral<"selector">;
59
+ selector: z.ZodString;
60
+ align: z.ZodOptional<z.ZodEnum<{
61
+ top: "top";
62
+ center: "center";
63
+ bottom: "bottom";
64
+ }>>;
65
+ offsetPx: z.ZodOptional<z.ZodNumber>;
66
+ fallbackProgress: z.ZodOptional<z.ZodNumber>;
67
+ }, z.core.$strip>, z.ZodObject<{
68
+ type: z.ZodLiteral<"progress">;
69
+ value: z.ZodNumber;
70
+ }, z.core.$strip>, z.ZodObject<{
71
+ type: z.ZodLiteral<"page-end">;
72
+ }, z.core.$strip>], "type">;
73
+ transitionMs: z.ZodNumber;
74
+ curve: z.ZodOptional<z.ZodObject<{
75
+ preset: z.ZodOptional<z.ZodEnum<{
76
+ linear: "linear";
77
+ "ease-in": "ease-in";
78
+ "ease-out": "ease-out";
79
+ "ease-in-out": "ease-in-out";
80
+ "ease-in-cubic": "ease-in-cubic";
81
+ "ease-out-cubic": "ease-out-cubic";
82
+ "ease-in-out-cubic": "ease-in-out-cubic";
83
+ custom: "custom";
84
+ }>>;
85
+ bezier: z.ZodOptional<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
86
+ }, z.core.$strip>>;
87
+ holdMs: z.ZodOptional<z.ZodNumber>;
88
+ interaction: z.ZodOptional<z.ZodObject<{
89
+ action: z.ZodEnum<{
90
+ hover: "hover";
91
+ focus: "focus";
92
+ click: "click";
93
+ }>;
94
+ candidateId: z.ZodOptional<z.ZodString>;
95
+ label: z.ZodOptional<z.ZodString>;
96
+ role: z.ZodOptional<z.ZodString>;
97
+ zoomScale: z.ZodOptional<z.ZodNumber>;
98
+ showCursor: z.ZodOptional<z.ZodBoolean>;
99
+ }, z.core.$strip>>;
100
+ }, z.core.$strip>>;
101
+ }, z.core.$strip>>;
102
+ }, z.core.$strip>>;
103
+ backgroundPreset: z.ZodOptional<z.ZodEnum<{
104
+ none: "none";
105
+ gray_noise_gradient: "gray_noise_gradient";
106
+ paper_blue: "paper_blue";
107
+ red_blocks_gradient: "red_blocks_gradient";
108
+ }>>;
109
+ addShadow: z.ZodOptional<z.ZodBoolean>;
110
+ roundedCorners: z.ZodOptional<z.ZodBoolean>;
111
+ comparison: z.ZodOptional<z.ZodObject<{
112
+ targetUrl: z.ZodString;
113
+ primaryLabel: z.ZodString;
114
+ secondaryLabel: z.ZodString;
115
+ primaryLogo: z.ZodOptional<z.ZodString>;
116
+ secondaryLogo: z.ZodOptional<z.ZodString>;
117
+ primaryLogoDataUrl: z.ZodOptional<z.ZodString>;
118
+ secondaryLogoDataUrl: z.ZodOptional<z.ZodString>;
119
+ layout: z.ZodOptional<z.ZodLiteral<"side-by-side">>;
120
+ }, z.core.$strip>>;
121
+ responsiveness: z.ZodOptional<z.ZodObject<{
122
+ desktopLabel: z.ZodOptional<z.ZodString>;
123
+ mobileLabel: z.ZodOptional<z.ZodString>;
124
+ desktopWidth: z.ZodOptional<z.ZodNumber>;
125
+ desktopHeight: z.ZodOptional<z.ZodNumber>;
126
+ mobileWidth: z.ZodOptional<z.ZodNumber>;
127
+ mobileHeight: z.ZodOptional<z.ZodNumber>;
128
+ }, z.core.$strip>>;
129
+ }, z.core.$strip>;
130
+ export declare const inspectRequestSchema: z.ZodObject<{
131
+ targetUrl: z.ZodString;
132
+ viewport: z.ZodOptional<z.ZodObject<{
133
+ height: z.ZodNumber;
134
+ width: z.ZodNumber;
135
+ }, z.core.$strip>>;
136
+ }, z.core.$strip>;
137
+ export declare const styleRequestSchema: z.ZodObject<{
138
+ jobId: z.ZodString;
139
+ backgroundPreset: z.ZodOptional<z.ZodEnum<{
140
+ none: "none";
141
+ gray_noise_gradient: "gray_noise_gradient";
142
+ paper_blue: "paper_blue";
143
+ red_blocks_gradient: "red_blocks_gradient";
144
+ }>>;
145
+ addShadow: z.ZodOptional<z.ZodBoolean>;
146
+ roundedCorners: z.ZodOptional<z.ZodBoolean>;
147
+ }, z.core.$strip>;
148
+ export declare function parseRecordRequest(value: unknown): RecordRequest;
149
+ export declare function parseInspectRequest(value: unknown): {
150
+ targetUrl: string;
151
+ viewport?: {
152
+ height: number;
153
+ width: number;
154
+ } | undefined;
155
+ };
156
+ export declare function parseStyleRequest(value: unknown): StyleRequest;
157
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA0E9D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgD9B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;iBAG/B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;iBAO7B,CAAC;AAEH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAEhE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO;;;;;;EAEjD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAE9D"}
@@ -0,0 +1,136 @@
1
+ import { z } from "zod";
2
+ const httpUrl = z.string().url().refine((value) => {
3
+ const protocol = new URL(value).protocol;
4
+ return protocol === "http:" || protocol === "https:";
5
+ }, "Only HTTP(S) URLs are supported");
6
+ const viewportSchema = z.object({
7
+ width: z.number().int().min(320).max(3840),
8
+ height: z.number().int().min(240).max(2160),
9
+ deviceScaleFactor: z.number().min(0.5).max(2).optional(),
10
+ });
11
+ const scrollCurveSchema = z.object({
12
+ preset: z.enum([
13
+ "linear", "ease-in", "ease-out", "ease-in-out", "ease-in-cubic",
14
+ "ease-out-cubic", "ease-in-out-cubic", "custom",
15
+ ]).optional(),
16
+ bezier: z.tuple([z.number(), z.number(), z.number(), z.number()]).optional(),
17
+ }).superRefine((curve, context) => {
18
+ if (curve.preset === "custom" && !curve.bezier) {
19
+ context.addIssue({ code: "custom", message: "A custom curve requires bezier control points" });
20
+ }
21
+ });
22
+ const motionTargetSchema = z.discriminatedUnion("type", [
23
+ z.object({
24
+ type: z.literal("selector"),
25
+ selector: z.string().min(1).max(2_000),
26
+ align: z.enum(["top", "center", "bottom"]).optional(),
27
+ offsetPx: z.number().int().min(-4_000).max(4_000).optional(),
28
+ fallbackProgress: z.number().min(0).max(1).optional(),
29
+ }),
30
+ z.object({ type: z.literal("progress"), value: z.number().min(0).max(1) }),
31
+ z.object({ type: z.literal("page-end") }),
32
+ ]);
33
+ const interactionSchema = z.object({
34
+ action: z.enum(["hover", "focus", "click"]),
35
+ candidateId: z.string().min(1).max(80).optional(),
36
+ label: z.string().min(1).max(120).optional(),
37
+ role: z.string().min(1).max(40).optional(),
38
+ zoomScale: z.number().min(1).max(1.8).optional(),
39
+ showCursor: z.boolean().optional(),
40
+ });
41
+ const animationSchema = z.object({
42
+ pixelsPerFrame: z.number().min(0.25).max(200).optional(),
43
+ preRecordingDelayMs: z.number().int().min(0).max(30_000).optional(),
44
+ removeOverlayElements: z.boolean().optional(),
45
+ pauseTriggers: z.array(z.object({
46
+ selector: z.string().min(1).max(2_000),
47
+ durationMs: z.number().int().min(0).max(15_000),
48
+ })).max(12).optional(),
49
+ scrollCurve: scrollCurveSchema.optional(),
50
+ durationMs: z.number().int().min(1_000).max(300_000).optional(),
51
+ heroHoldMs: z.number().int().min(0).max(15_000).optional(),
52
+ scrollMode: z.enum(["auto", "document", "virtual"]).optional(),
53
+ virtualScrollCycles: z.number().min(0.25).max(100).optional(),
54
+ virtualScrollDurationMs: z.number().int().min(1_000).max(300_000).optional(),
55
+ fastMode: z.boolean().optional(),
56
+ captureMode: z.enum(["preview", "export"]).optional(),
57
+ direction: z.object({
58
+ startHoldMs: z.number().int().min(0).max(15_000).optional(),
59
+ beats: z.array(z.object({
60
+ target: motionTargetSchema,
61
+ transitionMs: z.number().int().min(250).max(60_000),
62
+ curve: scrollCurveSchema.optional(),
63
+ holdMs: z.number().int().min(0).max(15_000).optional(),
64
+ interaction: interactionSchema.optional(),
65
+ })).min(1).max(12),
66
+ }).optional(),
67
+ }).optional();
68
+ export const recordRequestSchema = z.object({
69
+ targetUrl: httpUrl,
70
+ exportFormat: z.literal("mp4").optional(),
71
+ videoConfig: z.object({
72
+ framerate: z.number().int().min(1).max(120).optional(),
73
+ qualityPreset: z.enum(["high", "medium", "low"]).optional(),
74
+ viewport: viewportSchema,
75
+ }),
76
+ animationConfig: animationSchema,
77
+ backgroundPreset: z.enum([
78
+ "none", "gray_noise_gradient", "paper_blue", "red_blocks_gradient",
79
+ ]).optional(),
80
+ addShadow: z.boolean().optional(),
81
+ roundedCorners: z.boolean().optional(),
82
+ comparison: z.object({
83
+ targetUrl: httpUrl,
84
+ primaryLabel: z.string().trim().min(1).max(48),
85
+ secondaryLabel: z.string().trim().min(1).max(48),
86
+ primaryLogo: z.string().trim().max(8).optional(),
87
+ secondaryLogo: z.string().trim().max(8).optional(),
88
+ primaryLogoDataUrl: z.string()
89
+ .refine((v) => /^data:image\/(png|jpeg|webp|svg\+xml);base64,/.test(v), "primaryLogoDataUrl must be a base64 image data URI (PNG, JPEG, WebP, or SVG)")
90
+ .refine((v) => v.length <= 700_000, "primaryLogoDataUrl must be smaller than 512 KB")
91
+ .optional(),
92
+ secondaryLogoDataUrl: z.string()
93
+ .refine((v) => /^data:image\/(png|jpeg|webp|svg\+xml);base64,/.test(v), "secondaryLogoDataUrl must be a base64 image data URI (PNG, JPEG, WebP, or SVG)")
94
+ .refine((v) => v.length <= 700_000, "secondaryLogoDataUrl must be smaller than 512 KB")
95
+ .optional(),
96
+ layout: z.literal("side-by-side").optional(),
97
+ }).optional(),
98
+ responsiveness: z.object({
99
+ desktopLabel: z.string().trim().min(1).max(48).optional(),
100
+ mobileLabel: z.string().trim().min(1).max(48).optional(),
101
+ desktopWidth: z.number().int().min(320).max(3840).optional(),
102
+ desktopHeight: z.number().int().min(240).max(2160).optional(),
103
+ mobileWidth: z.number().int().min(320).max(3840).optional(),
104
+ mobileHeight: z.number().int().min(240).max(2160).optional(),
105
+ }).optional(),
106
+ }).superRefine((request, context) => {
107
+ const direction = request.animationConfig?.direction;
108
+ if (!direction)
109
+ return;
110
+ const duration = (direction.startHoldMs ?? 1_500) + direction.beats.reduce((total, beat) => total + beat.transitionMs + (beat.holdMs ?? 0), 0);
111
+ if (duration > 300_000) {
112
+ context.addIssue({ code: "custom", message: "The directed timeline cannot exceed 300000ms" });
113
+ }
114
+ });
115
+ export const inspectRequestSchema = z.object({
116
+ targetUrl: httpUrl,
117
+ viewport: viewportSchema.pick({ width: true, height: true }).optional(),
118
+ });
119
+ export const styleRequestSchema = z.object({
120
+ jobId: z.string().regex(/^[a-zA-Z0-9._-]+$/),
121
+ backgroundPreset: z.enum([
122
+ "none", "gray_noise_gradient", "paper_blue", "red_blocks_gradient",
123
+ ]).optional(),
124
+ addShadow: z.boolean().optional(),
125
+ roundedCorners: z.boolean().optional(),
126
+ });
127
+ export function parseRecordRequest(value) {
128
+ return recordRequestSchema.parse(value);
129
+ }
130
+ export function parseInspectRequest(value) {
131
+ return inspectRequestSchema.parse(value);
132
+ }
133
+ export function parseStyleRequest(value) {
134
+ return styleRequestSchema.parse(value);
135
+ }
136
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { BezierControlPoints } from "../browser/curves.js";
2
+ export declare function applyBezierCurve(linearProgress: number, bezier: BezierControlPoints): number;
3
+ export interface CompileVideoOptions {
4
+ framesDir: string;
5
+ metadataPath: string;
6
+ outputPath: string;
7
+ durationMs: number;
8
+ fps: number;
9
+ bezier: BezierControlPoints;
10
+ pauses?: Array<{
11
+ atMs: number;
12
+ holdMs: number;
13
+ }>;
14
+ initialHoldFrameCount?: number;
15
+ width?: number;
16
+ height?: number;
17
+ preset?: string;
18
+ crf?: number;
19
+ }
20
+ export declare function compileVideoFromFrames(options: CompileVideoOptions): Promise<void>;
21
+ //# sourceMappingURL=compileVideo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compileVideo.d.ts","sourceRoot":"","sources":["../../src/editor/compileVideo.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,wBAAgB,gBAAgB,CAC9B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CA8BR;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,mBAAmB,CAAC;IAC5B,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwGxF"}
@@ -0,0 +1,104 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { stitchFramesToVideo } from "../capture/stitchFrames.js";
4
+ export function applyBezierCurve(linearProgress, bezier) {
5
+ const [x1, y1, x2, y2] = bezier;
6
+ if (linearProgress <= 0)
7
+ return 0;
8
+ if (linearProgress >= 1)
9
+ return 1;
10
+ const sampleX = (t) => {
11
+ const inv = 1 - t;
12
+ return 3 * inv * inv * t * x1 + 3 * inv * t * t * x2 + t * t * t;
13
+ };
14
+ const sampleY = (t) => {
15
+ const inv = 1 - t;
16
+ return 3 * inv * inv * t * y1 + 3 * inv * t * t * y2 + t * t * t;
17
+ };
18
+ const sampleDx = (t) => 3 * (1 - t) * (1 - t) * x1 +
19
+ 6 * (1 - t) * t * (x2 - x1) +
20
+ 3 * t * t * (1 - x2);
21
+ let start = 0;
22
+ let end = 1;
23
+ let param = linearProgress;
24
+ for (let i = 0; i < 8; i++) {
25
+ param = (start + end) / 2;
26
+ if (sampleX(param) < linearProgress)
27
+ start = param;
28
+ else
29
+ end = param;
30
+ }
31
+ param = (start + end) / 2;
32
+ const dx = sampleDx(param);
33
+ if (Math.abs(dx) > 1e-6)
34
+ param -= (sampleX(param) - linearProgress) / dx;
35
+ return sampleY(Math.min(1, Math.max(0, param)));
36
+ }
37
+ export async function compileVideoFromFrames(options) {
38
+ const { framesDir, metadataPath, outputPath, durationMs, fps, bezier, pauses = [], initialHoldFrameCount = 0, width, height, preset, crf, } = options;
39
+ const metadataContent = await fs.readFile(metadataPath, "utf-8");
40
+ const metadata = JSON.parse(metadataContent);
41
+ const maxScroll = metadata.maxScroll;
42
+ const sourceFrames = metadata.frames; // Array of { file, y, progress }
43
+ const scrollStrategy = metadata.scrollStrategy;
44
+ const totalOutputFrames = Math.max(1, Math.round((durationMs / 1000) * fps));
45
+ const holdOutputFrames = Math.min(totalOutputFrames, Math.max(0, initialHoldFrameCount));
46
+ const initialHoldMs = (holdOutputFrames / fps) * 1000;
47
+ const tempDir = await fs.mkdtemp(path.join(path.dirname(framesDir), "websiterecorder-stitch-"));
48
+ try {
49
+ const outputFrameFiles = [];
50
+ const sortedPauses = [...pauses].sort((a, b) => a.atMs - b.atMs);
51
+ for (let f = 0; f < totalOutputFrames; f++) {
52
+ const t = (f / fps) * 1000;
53
+ let scrollTime = t;
54
+ let isHolding = false;
55
+ let accumulatedPauseMs = 0;
56
+ for (const pause of sortedPauses) {
57
+ const pauseStart = pause.atMs + accumulatedPauseMs;
58
+ const pauseEnd = pauseStart + pause.holdMs;
59
+ if (t >= pauseStart && t < pauseEnd) {
60
+ scrollTime = pause.atMs;
61
+ isHolding = true;
62
+ break;
63
+ }
64
+ else if (t >= pauseEnd) {
65
+ accumulatedPauseMs += pause.holdMs;
66
+ }
67
+ }
68
+ if (!isHolding) {
69
+ scrollTime = t - accumulatedPauseMs;
70
+ }
71
+ let frameIndex = 0;
72
+ if (f < holdOutputFrames && initialHoldFrameCount > 0) {
73
+ const holdProgress = holdOutputFrames <= 1 ? 0 : f / (holdOutputFrames - 1);
74
+ frameIndex = Math.min(initialHoldFrameCount - 1, Math.round(holdProgress * (initialHoldFrameCount - 1)));
75
+ }
76
+ else {
77
+ const scrollDurationMs = Math.max(100, durationMs - initialHoldMs - accumulatedPauseMs);
78
+ const linearProgress = Math.min(1, Math.max(0, (scrollTime - initialHoldMs) / scrollDurationMs));
79
+ const easedProgress = applyBezierCurve(linearProgress, bezier);
80
+ const scrollFrameCount = Math.max(1, sourceFrames.length - initialHoldFrameCount);
81
+ frameIndex = Math.min(sourceFrames.length - 1, initialHoldFrameCount + Math.round(easedProgress * (scrollFrameCount - 1)));
82
+ }
83
+ const selectedFrame = sourceFrames[frameIndex];
84
+ outputFrameFiles.push(selectedFrame.file);
85
+ }
86
+ // Link/copy files to temp directory
87
+ for (let i = 0; i < outputFrameFiles.length; i++) {
88
+ const srcPath = path.join(framesDir, outputFrameFiles[i]);
89
+ const destPath = path.join(tempDir, `frame-${String(i).padStart(6, "0")}.jpg`);
90
+ await fs.link(srcPath, destPath).catch(() => fs.copyFile(srcPath, destPath));
91
+ }
92
+ // Stitch
93
+ await stitchFramesToVideo(tempDir, outputPath, fps, {
94
+ width,
95
+ height,
96
+ preset,
97
+ crf,
98
+ });
99
+ }
100
+ finally {
101
+ await fs.rm(tempDir, { recursive: true, force: true }).catch(() => undefined);
102
+ }
103
+ }
104
+ //# sourceMappingURL=compileVideo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compileVideo.js","sourceRoot":"","sources":["../../src/editor/compileVideo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,MAAM,UAAU,gBAAgB,CAC9B,cAAsB,EACtB,MAA2B;IAE3B,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC;IAChC,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,IAAI,cAAc,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAElC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAC7B,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;QAC1B,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;QAC3B,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAEvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,cAAc,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,KAAK,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,cAAc;YAAE,KAAK,GAAG,KAAK,CAAC;;YAC9C,GAAG,GAAG,KAAK,CAAC;IACnB,CAAC;IACD,KAAK,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI;QAAE,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC;IACzE,OAAO,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAiBD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAA4B;IACvE,MAAM,EACJ,SAAS,EACT,YAAY,EACZ,UAAU,EACV,UAAU,EACV,GAAG,EACH,MAAM,EACN,MAAM,GAAG,EAAE,EACX,qBAAqB,GAAG,CAAC,EACzB,KAAK,EACL,MAAM,EACN,MAAM,EACN,GAAG,GACJ,GAAG,OAAO,CAAC;IAEZ,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;IACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,iCAAiC;IACvE,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;IAE/C,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC7E,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAC/B,iBAAiB,EACjB,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC,CACnC,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC;IAEhG,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAa,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;QAEjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,iBAAiB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;YAE3B,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAE3B,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;gBACjC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,GAAG,kBAAkB,CAAC;gBACnD,MAAM,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;gBAE3C,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;oBACpC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC;oBACxB,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM;gBACR,CAAC;qBAAM,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;oBACzB,kBAAkB,IAAI,KAAK,CAAC,MAAM,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,UAAU,GAAG,CAAC,GAAG,kBAAkB,CAAC;YACtC,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,GAAG,gBAAgB,IAAI,qBAAqB,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,YAAY,GAAG,gBAAgB,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;gBAC5E,UAAU,GAAG,IAAI,CAAC,GAAG,CACnB,qBAAqB,GAAG,CAAC,EACzB,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,CACvD,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAC/B,GAAG,EACH,UAAU,GAAG,aAAa,GAAG,kBAAkB,CAChD,CAAC;gBACF,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,UAAU,GAAG,aAAa,CAAC,GAAG,gBAAgB,CAAC,CAC7D,CAAC;gBACF,MAAM,aAAa,GAAG,gBAAgB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;gBAC/D,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,GAAG,qBAAqB,CAAC,CAAC;gBAClF,UAAU,GAAG,IAAI,CAAC,GAAG,CACnB,YAAY,CAAC,MAAM,GAAG,CAAC,EACvB,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,CAC3E,CAAC;YACJ,CAAC;YACD,MAAM,aAAa,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;YAE/C,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QAED,oCAAoC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/E,MAAM,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/E,CAAC;QAED,SAAS;QACT,MAAM,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE;YAClD,KAAK;YACL,MAAM;YACN,MAAM;YACN,GAAG;SACJ,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAChF,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ interface ComposeComparisonOptions {
2
+ primaryPath: string;
3
+ secondaryPath: string;
4
+ outputPath: string;
5
+ width: number;
6
+ height: number;
7
+ fps: number;
8
+ durationMs: number;
9
+ primaryLabel: string;
10
+ secondaryLabel: string;
11
+ primaryLogo?: string;
12
+ secondaryLogo?: string;
13
+ /** Base64 data URI (PNG/JPEG/WebP/SVG) — when present, rendered as an image badge instead of text. */
14
+ primaryLogoDataUrl?: string;
15
+ /** Base64 data URI (PNG/JPEG/WebP/SVG) — when present, rendered as an image badge instead of text. */
16
+ secondaryLogoDataUrl?: string;
17
+ signal?: AbortSignal;
18
+ }
19
+ /**
20
+ * Presents two captures as equal cards on one editorial canvas. Both websites
21
+ * are still recorded at the selected full viewport; composition happens only
22
+ * after capture, so the comparison never changes either responsive breakpoint.
23
+ *
24
+ * When primaryLogoDataUrl / secondaryLogoDataUrl are provided, the image is
25
+ * decoded and placed as a scaled overlay in the header bar instead of the
26
+ * coloured text badge. The text label beside it is always shown.
27
+ */
28
+ export declare function composeComparison(options: ComposeComparisonOptions): Promise<void>;
29
+ export {};
30
+ //# sourceMappingURL=composeComparison.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composeComparison.d.ts","sourceRoot":"","sources":["../../src/editor/composeComparison.ts"],"names":[],"mappings":"AAIA,UAAU,wBAAwB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sGAAsG;IACtG,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sGAAsG;IACtG,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,iBAmQxE"}