@mineo71/showtime 0.0.0-stage → 0.2.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 (41) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/LICENSE +21 -0
  3. package/README.md +365 -2
  4. package/bin/showtime.mjs +5 -0
  5. package/docs/script.schema.json +1346 -0
  6. package/package.json +71 -4
  7. package/skill/SKILL.md +112 -0
  8. package/src/cli/format.ts +19 -0
  9. package/src/cli/main.ts +115 -0
  10. package/src/ffmpeg.ts +72 -0
  11. package/src/paths.ts +30 -0
  12. package/src/pipeline.ts +38 -0
  13. package/src/render/remotion/BrowserBar.tsx +61 -0
  14. package/src/render/remotion/Cursor.tsx +40 -0
  15. package/src/render/remotion/Intro.tsx +29 -0
  16. package/src/render/remotion/Overlays.tsx +95 -0
  17. package/src/render/remotion/Root.tsx +21 -0
  18. package/src/render/remotion/ShowtimeVideo.tsx +92 -0
  19. package/src/render/remotion/index.ts +4 -0
  20. package/src/render/render.ts +46 -0
  21. package/src/runner/browser.ts +122 -0
  22. package/src/runner/capture.ts +53 -0
  23. package/src/runner/check.ts +73 -0
  24. package/src/runner/encode.ts +49 -0
  25. package/src/runner/events.ts +15 -0
  26. package/src/runner/record.ts +96 -0
  27. package/src/runner/steps.ts +217 -0
  28. package/src/runner/time.ts +17 -0
  29. package/src/script/hash.ts +29 -0
  30. package/src/script/load.ts +36 -0
  31. package/src/script/schema.ts +144 -0
  32. package/src/setup.ts +41 -0
  33. package/src/take.ts +24 -0
  34. package/src/timeline/build.ts +103 -0
  35. package/src/timeline/camera.ts +69 -0
  36. package/src/timeline/cursor.ts +59 -0
  37. package/src/timeline/frames.ts +60 -0
  38. package/src/timeline/layout.ts +29 -0
  39. package/src/timeline/math.ts +7 -0
  40. package/src/timeline/timemap.ts +52 -0
  41. package/src/timeline/types.ts +111 -0
@@ -0,0 +1,1346 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "properties": {
5
+ "$schema": {
6
+ "type": "string"
7
+ },
8
+ "version": {
9
+ "type": "number",
10
+ "const": 1
11
+ },
12
+ "meta": {
13
+ "default": {},
14
+ "type": "object",
15
+ "properties": {
16
+ "title": {
17
+ "type": "string"
18
+ },
19
+ "subtitle": {
20
+ "type": "string"
21
+ }
22
+ },
23
+ "additionalProperties": false
24
+ },
25
+ "app": {
26
+ "type": "object",
27
+ "properties": {
28
+ "url": {
29
+ "type": "string",
30
+ "minLength": 1
31
+ },
32
+ "viewport": {
33
+ "default": {
34
+ "width": 1440,
35
+ "height": 900
36
+ },
37
+ "type": "object",
38
+ "properties": {
39
+ "width": {
40
+ "type": "integer",
41
+ "minimum": 320,
42
+ "maximum": 3840
43
+ },
44
+ "height": {
45
+ "type": "integer",
46
+ "minimum": 240,
47
+ "maximum": 2160
48
+ }
49
+ },
50
+ "required": [
51
+ "width",
52
+ "height"
53
+ ],
54
+ "additionalProperties": false
55
+ },
56
+ "deviceScaleFactor": {
57
+ "default": 2,
58
+ "type": "number",
59
+ "minimum": 1,
60
+ "maximum": 3
61
+ },
62
+ "storageState": {
63
+ "type": "string"
64
+ },
65
+ "colorScheme": {
66
+ "type": "string",
67
+ "enum": [
68
+ "light",
69
+ "dark"
70
+ ]
71
+ },
72
+ "locale": {
73
+ "type": "string"
74
+ },
75
+ "timezoneId": {
76
+ "type": "string"
77
+ },
78
+ "mask": {
79
+ "default": [],
80
+ "description": "CSS selectors (not Playwright selectors) of elements to blur in the recording",
81
+ "type": "array",
82
+ "items": {
83
+ "type": "string",
84
+ "minLength": 1
85
+ }
86
+ }
87
+ },
88
+ "required": [
89
+ "url"
90
+ ],
91
+ "additionalProperties": false
92
+ },
93
+ "setup": {
94
+ "default": [],
95
+ "type": "array",
96
+ "items": {
97
+ "oneOf": [
98
+ {
99
+ "type": "object",
100
+ "properties": {
101
+ "do": {
102
+ "type": "string",
103
+ "const": "goto"
104
+ },
105
+ "url": {
106
+ "type": "string",
107
+ "minLength": 1
108
+ },
109
+ "show": {
110
+ "type": "object",
111
+ "properties": {
112
+ "zoom": {
113
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
114
+ "anyOf": [
115
+ {
116
+ "type": "number",
117
+ "minimum": 1,
118
+ "maximum": 4
119
+ },
120
+ {
121
+ "type": "boolean",
122
+ "const": false
123
+ }
124
+ ]
125
+ },
126
+ "caption": {
127
+ "description": "Caption shown while this step plays",
128
+ "type": "string",
129
+ "minLength": 1
130
+ },
131
+ "spotlight": {
132
+ "description": "Dim everything except the target",
133
+ "type": "boolean"
134
+ },
135
+ "hold": {
136
+ "description": "Extra real-time ms after the step",
137
+ "type": "integer",
138
+ "minimum": 0,
139
+ "maximum": 30000
140
+ },
141
+ "speed": {
142
+ "description": "Playback speed for this step",
143
+ "type": "number",
144
+ "minimum": 0.25,
145
+ "maximum": 16
146
+ }
147
+ },
148
+ "additionalProperties": false
149
+ }
150
+ },
151
+ "required": [
152
+ "do",
153
+ "url"
154
+ ],
155
+ "additionalProperties": false
156
+ },
157
+ {
158
+ "type": "object",
159
+ "properties": {
160
+ "do": {
161
+ "type": "string",
162
+ "const": "click"
163
+ },
164
+ "target": {
165
+ "type": "string",
166
+ "minLength": 1,
167
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
168
+ },
169
+ "show": {
170
+ "type": "object",
171
+ "properties": {
172
+ "zoom": {
173
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
174
+ "anyOf": [
175
+ {
176
+ "type": "number",
177
+ "minimum": 1,
178
+ "maximum": 4
179
+ },
180
+ {
181
+ "type": "boolean",
182
+ "const": false
183
+ }
184
+ ]
185
+ },
186
+ "caption": {
187
+ "description": "Caption shown while this step plays",
188
+ "type": "string",
189
+ "minLength": 1
190
+ },
191
+ "spotlight": {
192
+ "description": "Dim everything except the target",
193
+ "type": "boolean"
194
+ },
195
+ "hold": {
196
+ "description": "Extra real-time ms after the step",
197
+ "type": "integer",
198
+ "minimum": 0,
199
+ "maximum": 30000
200
+ },
201
+ "speed": {
202
+ "description": "Playback speed for this step",
203
+ "type": "number",
204
+ "minimum": 0.25,
205
+ "maximum": 16
206
+ }
207
+ },
208
+ "additionalProperties": false
209
+ }
210
+ },
211
+ "required": [
212
+ "do",
213
+ "target"
214
+ ],
215
+ "additionalProperties": false
216
+ },
217
+ {
218
+ "type": "object",
219
+ "properties": {
220
+ "do": {
221
+ "type": "string",
222
+ "const": "type"
223
+ },
224
+ "target": {
225
+ "type": "string",
226
+ "minLength": 1,
227
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
228
+ },
229
+ "text": {
230
+ "type": "string"
231
+ },
232
+ "pace": {
233
+ "default": "human",
234
+ "anyOf": [
235
+ {
236
+ "type": "string",
237
+ "enum": [
238
+ "human",
239
+ "fast"
240
+ ]
241
+ },
242
+ {
243
+ "type": "integer",
244
+ "minimum": 0,
245
+ "maximum": 1000
246
+ }
247
+ ]
248
+ },
249
+ "clear": {
250
+ "default": false,
251
+ "type": "boolean"
252
+ },
253
+ "show": {
254
+ "type": "object",
255
+ "properties": {
256
+ "zoom": {
257
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
258
+ "anyOf": [
259
+ {
260
+ "type": "number",
261
+ "minimum": 1,
262
+ "maximum": 4
263
+ },
264
+ {
265
+ "type": "boolean",
266
+ "const": false
267
+ }
268
+ ]
269
+ },
270
+ "caption": {
271
+ "description": "Caption shown while this step plays",
272
+ "type": "string",
273
+ "minLength": 1
274
+ },
275
+ "spotlight": {
276
+ "description": "Dim everything except the target",
277
+ "type": "boolean"
278
+ },
279
+ "hold": {
280
+ "description": "Extra real-time ms after the step",
281
+ "type": "integer",
282
+ "minimum": 0,
283
+ "maximum": 30000
284
+ },
285
+ "speed": {
286
+ "description": "Playback speed for this step",
287
+ "type": "number",
288
+ "minimum": 0.25,
289
+ "maximum": 16
290
+ }
291
+ },
292
+ "additionalProperties": false
293
+ }
294
+ },
295
+ "required": [
296
+ "do",
297
+ "target",
298
+ "text"
299
+ ],
300
+ "additionalProperties": false
301
+ },
302
+ {
303
+ "type": "object",
304
+ "properties": {
305
+ "do": {
306
+ "type": "string",
307
+ "const": "press"
308
+ },
309
+ "key": {
310
+ "type": "string",
311
+ "minLength": 1
312
+ },
313
+ "show": {
314
+ "type": "object",
315
+ "properties": {
316
+ "zoom": {
317
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
318
+ "anyOf": [
319
+ {
320
+ "type": "number",
321
+ "minimum": 1,
322
+ "maximum": 4
323
+ },
324
+ {
325
+ "type": "boolean",
326
+ "const": false
327
+ }
328
+ ]
329
+ },
330
+ "caption": {
331
+ "description": "Caption shown while this step plays",
332
+ "type": "string",
333
+ "minLength": 1
334
+ },
335
+ "spotlight": {
336
+ "description": "Dim everything except the target",
337
+ "type": "boolean"
338
+ },
339
+ "hold": {
340
+ "description": "Extra real-time ms after the step",
341
+ "type": "integer",
342
+ "minimum": 0,
343
+ "maximum": 30000
344
+ },
345
+ "speed": {
346
+ "description": "Playback speed for this step",
347
+ "type": "number",
348
+ "minimum": 0.25,
349
+ "maximum": 16
350
+ }
351
+ },
352
+ "additionalProperties": false
353
+ }
354
+ },
355
+ "required": [
356
+ "do",
357
+ "key"
358
+ ],
359
+ "additionalProperties": false
360
+ },
361
+ {
362
+ "type": "object",
363
+ "properties": {
364
+ "do": {
365
+ "type": "string",
366
+ "const": "hover"
367
+ },
368
+ "target": {
369
+ "type": "string",
370
+ "minLength": 1,
371
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
372
+ },
373
+ "show": {
374
+ "type": "object",
375
+ "properties": {
376
+ "zoom": {
377
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
378
+ "anyOf": [
379
+ {
380
+ "type": "number",
381
+ "minimum": 1,
382
+ "maximum": 4
383
+ },
384
+ {
385
+ "type": "boolean",
386
+ "const": false
387
+ }
388
+ ]
389
+ },
390
+ "caption": {
391
+ "description": "Caption shown while this step plays",
392
+ "type": "string",
393
+ "minLength": 1
394
+ },
395
+ "spotlight": {
396
+ "description": "Dim everything except the target",
397
+ "type": "boolean"
398
+ },
399
+ "hold": {
400
+ "description": "Extra real-time ms after the step",
401
+ "type": "integer",
402
+ "minimum": 0,
403
+ "maximum": 30000
404
+ },
405
+ "speed": {
406
+ "description": "Playback speed for this step",
407
+ "type": "number",
408
+ "minimum": 0.25,
409
+ "maximum": 16
410
+ }
411
+ },
412
+ "additionalProperties": false
413
+ }
414
+ },
415
+ "required": [
416
+ "do",
417
+ "target"
418
+ ],
419
+ "additionalProperties": false
420
+ },
421
+ {
422
+ "type": "object",
423
+ "properties": {
424
+ "do": {
425
+ "type": "string",
426
+ "const": "select"
427
+ },
428
+ "target": {
429
+ "type": "string",
430
+ "minLength": 1,
431
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
432
+ },
433
+ "value": {
434
+ "type": "string"
435
+ },
436
+ "show": {
437
+ "type": "object",
438
+ "properties": {
439
+ "zoom": {
440
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
441
+ "anyOf": [
442
+ {
443
+ "type": "number",
444
+ "minimum": 1,
445
+ "maximum": 4
446
+ },
447
+ {
448
+ "type": "boolean",
449
+ "const": false
450
+ }
451
+ ]
452
+ },
453
+ "caption": {
454
+ "description": "Caption shown while this step plays",
455
+ "type": "string",
456
+ "minLength": 1
457
+ },
458
+ "spotlight": {
459
+ "description": "Dim everything except the target",
460
+ "type": "boolean"
461
+ },
462
+ "hold": {
463
+ "description": "Extra real-time ms after the step",
464
+ "type": "integer",
465
+ "minimum": 0,
466
+ "maximum": 30000
467
+ },
468
+ "speed": {
469
+ "description": "Playback speed for this step",
470
+ "type": "number",
471
+ "minimum": 0.25,
472
+ "maximum": 16
473
+ }
474
+ },
475
+ "additionalProperties": false
476
+ }
477
+ },
478
+ "required": [
479
+ "do",
480
+ "target",
481
+ "value"
482
+ ],
483
+ "additionalProperties": false
484
+ },
485
+ {
486
+ "type": "object",
487
+ "properties": {
488
+ "do": {
489
+ "type": "string",
490
+ "const": "scroll"
491
+ },
492
+ "target": {
493
+ "type": "string",
494
+ "minLength": 1,
495
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
496
+ },
497
+ "by": {
498
+ "type": "integer",
499
+ "minimum": -9007199254740991,
500
+ "maximum": 9007199254740991
501
+ },
502
+ "show": {
503
+ "type": "object",
504
+ "properties": {
505
+ "zoom": {
506
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
507
+ "anyOf": [
508
+ {
509
+ "type": "number",
510
+ "minimum": 1,
511
+ "maximum": 4
512
+ },
513
+ {
514
+ "type": "boolean",
515
+ "const": false
516
+ }
517
+ ]
518
+ },
519
+ "caption": {
520
+ "description": "Caption shown while this step plays",
521
+ "type": "string",
522
+ "minLength": 1
523
+ },
524
+ "spotlight": {
525
+ "description": "Dim everything except the target",
526
+ "type": "boolean"
527
+ },
528
+ "hold": {
529
+ "description": "Extra real-time ms after the step",
530
+ "type": "integer",
531
+ "minimum": 0,
532
+ "maximum": 30000
533
+ },
534
+ "speed": {
535
+ "description": "Playback speed for this step",
536
+ "type": "number",
537
+ "minimum": 0.25,
538
+ "maximum": 16
539
+ }
540
+ },
541
+ "additionalProperties": false
542
+ }
543
+ },
544
+ "required": [
545
+ "do"
546
+ ],
547
+ "additionalProperties": false
548
+ },
549
+ {
550
+ "type": "object",
551
+ "properties": {
552
+ "do": {
553
+ "type": "string",
554
+ "const": "wait"
555
+ },
556
+ "for": {
557
+ "type": "string",
558
+ "minLength": 1,
559
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
560
+ },
561
+ "ms": {
562
+ "type": "integer",
563
+ "minimum": 0,
564
+ "maximum": 60000
565
+ },
566
+ "show": {
567
+ "type": "object",
568
+ "properties": {
569
+ "zoom": {
570
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
571
+ "anyOf": [
572
+ {
573
+ "type": "number",
574
+ "minimum": 1,
575
+ "maximum": 4
576
+ },
577
+ {
578
+ "type": "boolean",
579
+ "const": false
580
+ }
581
+ ]
582
+ },
583
+ "caption": {
584
+ "description": "Caption shown while this step plays",
585
+ "type": "string",
586
+ "minLength": 1
587
+ },
588
+ "spotlight": {
589
+ "description": "Dim everything except the target",
590
+ "type": "boolean"
591
+ },
592
+ "hold": {
593
+ "description": "Extra real-time ms after the step",
594
+ "type": "integer",
595
+ "minimum": 0,
596
+ "maximum": 30000
597
+ },
598
+ "speed": {
599
+ "description": "Playback speed for this step",
600
+ "type": "number",
601
+ "minimum": 0.25,
602
+ "maximum": 16
603
+ }
604
+ },
605
+ "additionalProperties": false
606
+ }
607
+ },
608
+ "required": [
609
+ "do"
610
+ ],
611
+ "additionalProperties": false
612
+ },
613
+ {
614
+ "type": "object",
615
+ "properties": {
616
+ "do": {
617
+ "type": "string",
618
+ "const": "pause"
619
+ },
620
+ "ms": {
621
+ "type": "integer",
622
+ "minimum": 0,
623
+ "maximum": 60000
624
+ },
625
+ "show": {
626
+ "type": "object",
627
+ "properties": {
628
+ "zoom": {
629
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
630
+ "anyOf": [
631
+ {
632
+ "type": "number",
633
+ "minimum": 1,
634
+ "maximum": 4
635
+ },
636
+ {
637
+ "type": "boolean",
638
+ "const": false
639
+ }
640
+ ]
641
+ },
642
+ "caption": {
643
+ "description": "Caption shown while this step plays",
644
+ "type": "string",
645
+ "minLength": 1
646
+ },
647
+ "spotlight": {
648
+ "description": "Dim everything except the target",
649
+ "type": "boolean"
650
+ },
651
+ "hold": {
652
+ "description": "Extra real-time ms after the step",
653
+ "type": "integer",
654
+ "minimum": 0,
655
+ "maximum": 30000
656
+ },
657
+ "speed": {
658
+ "description": "Playback speed for this step",
659
+ "type": "number",
660
+ "minimum": 0.25,
661
+ "maximum": 16
662
+ }
663
+ },
664
+ "additionalProperties": false
665
+ }
666
+ },
667
+ "required": [
668
+ "do",
669
+ "ms"
670
+ ],
671
+ "additionalProperties": false
672
+ }
673
+ ]
674
+ }
675
+ },
676
+ "style": {
677
+ "default": {},
678
+ "type": "object",
679
+ "properties": {
680
+ "background": {
681
+ "default": "linear-gradient(135deg, #0f172a 0%, #312e81 100%)",
682
+ "type": "string"
683
+ },
684
+ "padding": {
685
+ "default": 0.06,
686
+ "type": "number",
687
+ "minimum": 0,
688
+ "maximum": 0.3
689
+ },
690
+ "radius": {
691
+ "default": 14,
692
+ "type": "number",
693
+ "minimum": 0,
694
+ "maximum": 64
695
+ },
696
+ "shadow": {
697
+ "default": true,
698
+ "type": "boolean"
699
+ },
700
+ "font": {
701
+ "default": "Inter, -apple-system, \"Segoe UI\", system-ui, sans-serif",
702
+ "type": "string"
703
+ },
704
+ "accent": {
705
+ "default": "#6366f1",
706
+ "type": "string"
707
+ },
708
+ "autoZoom": {
709
+ "default": true,
710
+ "type": "boolean"
711
+ },
712
+ "autoSpeed": {
713
+ "default": true,
714
+ "type": "boolean"
715
+ },
716
+ "maxZoom": {
717
+ "default": 1.8,
718
+ "type": "number",
719
+ "minimum": 1,
720
+ "maximum": 4
721
+ },
722
+ "chrome": {
723
+ "default": "browser",
724
+ "description": "Frame the recording in a browser window with an address bar, or show the bare viewport",
725
+ "type": "string",
726
+ "enum": [
727
+ "browser",
728
+ "none"
729
+ ]
730
+ },
731
+ "address": {
732
+ "description": "Address-bar text; defaults to the app URL without its scheme",
733
+ "type": "string"
734
+ }
735
+ },
736
+ "additionalProperties": false
737
+ },
738
+ "scenes": {
739
+ "minItems": 1,
740
+ "type": "array",
741
+ "items": {
742
+ "type": "object",
743
+ "properties": {
744
+ "id": {
745
+ "type": "string",
746
+ "pattern": "^[A-Za-z0-9_-]+$"
747
+ },
748
+ "steps": {
749
+ "minItems": 1,
750
+ "type": "array",
751
+ "items": {
752
+ "oneOf": [
753
+ {
754
+ "type": "object",
755
+ "properties": {
756
+ "do": {
757
+ "type": "string",
758
+ "const": "goto"
759
+ },
760
+ "url": {
761
+ "type": "string",
762
+ "minLength": 1
763
+ },
764
+ "show": {
765
+ "type": "object",
766
+ "properties": {
767
+ "zoom": {
768
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
769
+ "anyOf": [
770
+ {
771
+ "type": "number",
772
+ "minimum": 1,
773
+ "maximum": 4
774
+ },
775
+ {
776
+ "type": "boolean",
777
+ "const": false
778
+ }
779
+ ]
780
+ },
781
+ "caption": {
782
+ "description": "Caption shown while this step plays",
783
+ "type": "string",
784
+ "minLength": 1
785
+ },
786
+ "spotlight": {
787
+ "description": "Dim everything except the target",
788
+ "type": "boolean"
789
+ },
790
+ "hold": {
791
+ "description": "Extra real-time ms after the step",
792
+ "type": "integer",
793
+ "minimum": 0,
794
+ "maximum": 30000
795
+ },
796
+ "speed": {
797
+ "description": "Playback speed for this step",
798
+ "type": "number",
799
+ "minimum": 0.25,
800
+ "maximum": 16
801
+ }
802
+ },
803
+ "additionalProperties": false
804
+ }
805
+ },
806
+ "required": [
807
+ "do",
808
+ "url"
809
+ ],
810
+ "additionalProperties": false
811
+ },
812
+ {
813
+ "type": "object",
814
+ "properties": {
815
+ "do": {
816
+ "type": "string",
817
+ "const": "click"
818
+ },
819
+ "target": {
820
+ "type": "string",
821
+ "minLength": 1,
822
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
823
+ },
824
+ "show": {
825
+ "type": "object",
826
+ "properties": {
827
+ "zoom": {
828
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
829
+ "anyOf": [
830
+ {
831
+ "type": "number",
832
+ "minimum": 1,
833
+ "maximum": 4
834
+ },
835
+ {
836
+ "type": "boolean",
837
+ "const": false
838
+ }
839
+ ]
840
+ },
841
+ "caption": {
842
+ "description": "Caption shown while this step plays",
843
+ "type": "string",
844
+ "minLength": 1
845
+ },
846
+ "spotlight": {
847
+ "description": "Dim everything except the target",
848
+ "type": "boolean"
849
+ },
850
+ "hold": {
851
+ "description": "Extra real-time ms after the step",
852
+ "type": "integer",
853
+ "minimum": 0,
854
+ "maximum": 30000
855
+ },
856
+ "speed": {
857
+ "description": "Playback speed for this step",
858
+ "type": "number",
859
+ "minimum": 0.25,
860
+ "maximum": 16
861
+ }
862
+ },
863
+ "additionalProperties": false
864
+ }
865
+ },
866
+ "required": [
867
+ "do",
868
+ "target"
869
+ ],
870
+ "additionalProperties": false
871
+ },
872
+ {
873
+ "type": "object",
874
+ "properties": {
875
+ "do": {
876
+ "type": "string",
877
+ "const": "type"
878
+ },
879
+ "target": {
880
+ "type": "string",
881
+ "minLength": 1,
882
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
883
+ },
884
+ "text": {
885
+ "type": "string"
886
+ },
887
+ "pace": {
888
+ "default": "human",
889
+ "anyOf": [
890
+ {
891
+ "type": "string",
892
+ "enum": [
893
+ "human",
894
+ "fast"
895
+ ]
896
+ },
897
+ {
898
+ "type": "integer",
899
+ "minimum": 0,
900
+ "maximum": 1000
901
+ }
902
+ ]
903
+ },
904
+ "clear": {
905
+ "default": false,
906
+ "type": "boolean"
907
+ },
908
+ "show": {
909
+ "type": "object",
910
+ "properties": {
911
+ "zoom": {
912
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
913
+ "anyOf": [
914
+ {
915
+ "type": "number",
916
+ "minimum": 1,
917
+ "maximum": 4
918
+ },
919
+ {
920
+ "type": "boolean",
921
+ "const": false
922
+ }
923
+ ]
924
+ },
925
+ "caption": {
926
+ "description": "Caption shown while this step plays",
927
+ "type": "string",
928
+ "minLength": 1
929
+ },
930
+ "spotlight": {
931
+ "description": "Dim everything except the target",
932
+ "type": "boolean"
933
+ },
934
+ "hold": {
935
+ "description": "Extra real-time ms after the step",
936
+ "type": "integer",
937
+ "minimum": 0,
938
+ "maximum": 30000
939
+ },
940
+ "speed": {
941
+ "description": "Playback speed for this step",
942
+ "type": "number",
943
+ "minimum": 0.25,
944
+ "maximum": 16
945
+ }
946
+ },
947
+ "additionalProperties": false
948
+ }
949
+ },
950
+ "required": [
951
+ "do",
952
+ "target",
953
+ "text"
954
+ ],
955
+ "additionalProperties": false
956
+ },
957
+ {
958
+ "type": "object",
959
+ "properties": {
960
+ "do": {
961
+ "type": "string",
962
+ "const": "press"
963
+ },
964
+ "key": {
965
+ "type": "string",
966
+ "minLength": 1
967
+ },
968
+ "show": {
969
+ "type": "object",
970
+ "properties": {
971
+ "zoom": {
972
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
973
+ "anyOf": [
974
+ {
975
+ "type": "number",
976
+ "minimum": 1,
977
+ "maximum": 4
978
+ },
979
+ {
980
+ "type": "boolean",
981
+ "const": false
982
+ }
983
+ ]
984
+ },
985
+ "caption": {
986
+ "description": "Caption shown while this step plays",
987
+ "type": "string",
988
+ "minLength": 1
989
+ },
990
+ "spotlight": {
991
+ "description": "Dim everything except the target",
992
+ "type": "boolean"
993
+ },
994
+ "hold": {
995
+ "description": "Extra real-time ms after the step",
996
+ "type": "integer",
997
+ "minimum": 0,
998
+ "maximum": 30000
999
+ },
1000
+ "speed": {
1001
+ "description": "Playback speed for this step",
1002
+ "type": "number",
1003
+ "minimum": 0.25,
1004
+ "maximum": 16
1005
+ }
1006
+ },
1007
+ "additionalProperties": false
1008
+ }
1009
+ },
1010
+ "required": [
1011
+ "do",
1012
+ "key"
1013
+ ],
1014
+ "additionalProperties": false
1015
+ },
1016
+ {
1017
+ "type": "object",
1018
+ "properties": {
1019
+ "do": {
1020
+ "type": "string",
1021
+ "const": "hover"
1022
+ },
1023
+ "target": {
1024
+ "type": "string",
1025
+ "minLength": 1,
1026
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
1027
+ },
1028
+ "show": {
1029
+ "type": "object",
1030
+ "properties": {
1031
+ "zoom": {
1032
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
1033
+ "anyOf": [
1034
+ {
1035
+ "type": "number",
1036
+ "minimum": 1,
1037
+ "maximum": 4
1038
+ },
1039
+ {
1040
+ "type": "boolean",
1041
+ "const": false
1042
+ }
1043
+ ]
1044
+ },
1045
+ "caption": {
1046
+ "description": "Caption shown while this step plays",
1047
+ "type": "string",
1048
+ "minLength": 1
1049
+ },
1050
+ "spotlight": {
1051
+ "description": "Dim everything except the target",
1052
+ "type": "boolean"
1053
+ },
1054
+ "hold": {
1055
+ "description": "Extra real-time ms after the step",
1056
+ "type": "integer",
1057
+ "minimum": 0,
1058
+ "maximum": 30000
1059
+ },
1060
+ "speed": {
1061
+ "description": "Playback speed for this step",
1062
+ "type": "number",
1063
+ "minimum": 0.25,
1064
+ "maximum": 16
1065
+ }
1066
+ },
1067
+ "additionalProperties": false
1068
+ }
1069
+ },
1070
+ "required": [
1071
+ "do",
1072
+ "target"
1073
+ ],
1074
+ "additionalProperties": false
1075
+ },
1076
+ {
1077
+ "type": "object",
1078
+ "properties": {
1079
+ "do": {
1080
+ "type": "string",
1081
+ "const": "select"
1082
+ },
1083
+ "target": {
1084
+ "type": "string",
1085
+ "minLength": 1,
1086
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
1087
+ },
1088
+ "value": {
1089
+ "type": "string"
1090
+ },
1091
+ "show": {
1092
+ "type": "object",
1093
+ "properties": {
1094
+ "zoom": {
1095
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
1096
+ "anyOf": [
1097
+ {
1098
+ "type": "number",
1099
+ "minimum": 1,
1100
+ "maximum": 4
1101
+ },
1102
+ {
1103
+ "type": "boolean",
1104
+ "const": false
1105
+ }
1106
+ ]
1107
+ },
1108
+ "caption": {
1109
+ "description": "Caption shown while this step plays",
1110
+ "type": "string",
1111
+ "minLength": 1
1112
+ },
1113
+ "spotlight": {
1114
+ "description": "Dim everything except the target",
1115
+ "type": "boolean"
1116
+ },
1117
+ "hold": {
1118
+ "description": "Extra real-time ms after the step",
1119
+ "type": "integer",
1120
+ "minimum": 0,
1121
+ "maximum": 30000
1122
+ },
1123
+ "speed": {
1124
+ "description": "Playback speed for this step",
1125
+ "type": "number",
1126
+ "minimum": 0.25,
1127
+ "maximum": 16
1128
+ }
1129
+ },
1130
+ "additionalProperties": false
1131
+ }
1132
+ },
1133
+ "required": [
1134
+ "do",
1135
+ "target",
1136
+ "value"
1137
+ ],
1138
+ "additionalProperties": false
1139
+ },
1140
+ {
1141
+ "type": "object",
1142
+ "properties": {
1143
+ "do": {
1144
+ "type": "string",
1145
+ "const": "scroll"
1146
+ },
1147
+ "target": {
1148
+ "type": "string",
1149
+ "minLength": 1,
1150
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
1151
+ },
1152
+ "by": {
1153
+ "type": "integer",
1154
+ "minimum": -9007199254740991,
1155
+ "maximum": 9007199254740991
1156
+ },
1157
+ "show": {
1158
+ "type": "object",
1159
+ "properties": {
1160
+ "zoom": {
1161
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
1162
+ "anyOf": [
1163
+ {
1164
+ "type": "number",
1165
+ "minimum": 1,
1166
+ "maximum": 4
1167
+ },
1168
+ {
1169
+ "type": "boolean",
1170
+ "const": false
1171
+ }
1172
+ ]
1173
+ },
1174
+ "caption": {
1175
+ "description": "Caption shown while this step plays",
1176
+ "type": "string",
1177
+ "minLength": 1
1178
+ },
1179
+ "spotlight": {
1180
+ "description": "Dim everything except the target",
1181
+ "type": "boolean"
1182
+ },
1183
+ "hold": {
1184
+ "description": "Extra real-time ms after the step",
1185
+ "type": "integer",
1186
+ "minimum": 0,
1187
+ "maximum": 30000
1188
+ },
1189
+ "speed": {
1190
+ "description": "Playback speed for this step",
1191
+ "type": "number",
1192
+ "minimum": 0.25,
1193
+ "maximum": 16
1194
+ }
1195
+ },
1196
+ "additionalProperties": false
1197
+ }
1198
+ },
1199
+ "required": [
1200
+ "do"
1201
+ ],
1202
+ "additionalProperties": false
1203
+ },
1204
+ {
1205
+ "type": "object",
1206
+ "properties": {
1207
+ "do": {
1208
+ "type": "string",
1209
+ "const": "wait"
1210
+ },
1211
+ "for": {
1212
+ "type": "string",
1213
+ "minLength": 1,
1214
+ "description": "Playwright selector, e.g. role=button[name='Save'], text=Save, #id, [data-testid=x], CSS"
1215
+ },
1216
+ "ms": {
1217
+ "type": "integer",
1218
+ "minimum": 0,
1219
+ "maximum": 60000
1220
+ },
1221
+ "show": {
1222
+ "type": "object",
1223
+ "properties": {
1224
+ "zoom": {
1225
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
1226
+ "anyOf": [
1227
+ {
1228
+ "type": "number",
1229
+ "minimum": 1,
1230
+ "maximum": 4
1231
+ },
1232
+ {
1233
+ "type": "boolean",
1234
+ "const": false
1235
+ }
1236
+ ]
1237
+ },
1238
+ "caption": {
1239
+ "description": "Caption shown while this step plays",
1240
+ "type": "string",
1241
+ "minLength": 1
1242
+ },
1243
+ "spotlight": {
1244
+ "description": "Dim everything except the target",
1245
+ "type": "boolean"
1246
+ },
1247
+ "hold": {
1248
+ "description": "Extra real-time ms after the step",
1249
+ "type": "integer",
1250
+ "minimum": 0,
1251
+ "maximum": 30000
1252
+ },
1253
+ "speed": {
1254
+ "description": "Playback speed for this step",
1255
+ "type": "number",
1256
+ "minimum": 0.25,
1257
+ "maximum": 16
1258
+ }
1259
+ },
1260
+ "additionalProperties": false
1261
+ }
1262
+ },
1263
+ "required": [
1264
+ "do"
1265
+ ],
1266
+ "additionalProperties": false
1267
+ },
1268
+ {
1269
+ "type": "object",
1270
+ "properties": {
1271
+ "do": {
1272
+ "type": "string",
1273
+ "const": "pause"
1274
+ },
1275
+ "ms": {
1276
+ "type": "integer",
1277
+ "minimum": 0,
1278
+ "maximum": 60000
1279
+ },
1280
+ "show": {
1281
+ "type": "object",
1282
+ "properties": {
1283
+ "zoom": {
1284
+ "description": "Zoom depth for this step, or false to disable auto-zoom",
1285
+ "anyOf": [
1286
+ {
1287
+ "type": "number",
1288
+ "minimum": 1,
1289
+ "maximum": 4
1290
+ },
1291
+ {
1292
+ "type": "boolean",
1293
+ "const": false
1294
+ }
1295
+ ]
1296
+ },
1297
+ "caption": {
1298
+ "description": "Caption shown while this step plays",
1299
+ "type": "string",
1300
+ "minLength": 1
1301
+ },
1302
+ "spotlight": {
1303
+ "description": "Dim everything except the target",
1304
+ "type": "boolean"
1305
+ },
1306
+ "hold": {
1307
+ "description": "Extra real-time ms after the step",
1308
+ "type": "integer",
1309
+ "minimum": 0,
1310
+ "maximum": 30000
1311
+ },
1312
+ "speed": {
1313
+ "description": "Playback speed for this step",
1314
+ "type": "number",
1315
+ "minimum": 0.25,
1316
+ "maximum": 16
1317
+ }
1318
+ },
1319
+ "additionalProperties": false
1320
+ }
1321
+ },
1322
+ "required": [
1323
+ "do",
1324
+ "ms"
1325
+ ],
1326
+ "additionalProperties": false
1327
+ }
1328
+ ]
1329
+ }
1330
+ }
1331
+ },
1332
+ "required": [
1333
+ "id",
1334
+ "steps"
1335
+ ],
1336
+ "additionalProperties": false
1337
+ }
1338
+ }
1339
+ },
1340
+ "required": [
1341
+ "version",
1342
+ "app",
1343
+ "scenes"
1344
+ ],
1345
+ "additionalProperties": false
1346
+ }