playwright-director 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 (122) hide show
  1. package/README.md +860 -0
  2. package/dist/Tutorial.d.ts +108 -0
  3. package/dist/Tutorial.d.ts.map +1 -0
  4. package/dist/Tutorial.js +767 -0
  5. package/dist/Tutorial.js.map +1 -0
  6. package/dist/bin/export-transcript.d.ts +3 -0
  7. package/dist/bin/export-transcript.d.ts.map +1 -0
  8. package/dist/bin/export-transcript.js +111 -0
  9. package/dist/bin/export-transcript.js.map +1 -0
  10. package/dist/cursor.d.ts +24 -0
  11. package/dist/cursor.d.ts.map +1 -0
  12. package/dist/cursor.js +96 -0
  13. package/dist/cursor.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +12 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/init.d.ts +3 -0
  19. package/dist/init.d.ts.map +1 -0
  20. package/dist/init.js +183 -0
  21. package/dist/init.js.map +1 -0
  22. package/dist/merge.d.ts +26 -0
  23. package/dist/merge.d.ts.map +1 -0
  24. package/dist/merge.js +65 -0
  25. package/dist/merge.js.map +1 -0
  26. package/dist/music.d.ts +29 -0
  27. package/dist/music.d.ts.map +1 -0
  28. package/dist/music.js +107 -0
  29. package/dist/music.js.map +1 -0
  30. package/dist/overlay-html.d.ts +44 -0
  31. package/dist/overlay-html.d.ts.map +1 -0
  32. package/dist/overlay-html.js +150 -0
  33. package/dist/overlay-html.js.map +1 -0
  34. package/dist/overlay.d.ts +39 -0
  35. package/dist/overlay.d.ts.map +1 -0
  36. package/dist/overlay.js +134 -0
  37. package/dist/overlay.js.map +1 -0
  38. package/dist/postinstall.d.ts +3 -0
  39. package/dist/postinstall.d.ts.map +1 -0
  40. package/dist/postinstall.js +38 -0
  41. package/dist/postinstall.js.map +1 -0
  42. package/dist/reporter.d.ts +22 -0
  43. package/dist/reporter.d.ts.map +1 -0
  44. package/dist/reporter.js +166 -0
  45. package/dist/reporter.js.map +1 -0
  46. package/dist/site/build-site.d.ts +2 -0
  47. package/dist/site/build-site.d.ts.map +1 -0
  48. package/dist/site/build-site.js +82 -0
  49. package/dist/site/build-site.js.map +1 -0
  50. package/dist/site/embed.d.ts +48 -0
  51. package/dist/site/embed.d.ts.map +1 -0
  52. package/dist/site/embed.js +45 -0
  53. package/dist/site/embed.js.map +1 -0
  54. package/dist/site/generate-manifest.d.ts +15 -0
  55. package/dist/site/generate-manifest.d.ts.map +1 -0
  56. package/dist/site/generate-manifest.js +106 -0
  57. package/dist/site/generate-manifest.js.map +1 -0
  58. package/dist/site/scaffold.d.ts +3 -0
  59. package/dist/site/scaffold.d.ts.map +1 -0
  60. package/dist/site/scaffold.js +70 -0
  61. package/dist/site/scaffold.js.map +1 -0
  62. package/dist/site/scan-tutorials.d.ts +12 -0
  63. package/dist/site/scan-tutorials.d.ts.map +1 -0
  64. package/dist/site/scan-tutorials.js +54 -0
  65. package/dist/site/scan-tutorials.js.map +1 -0
  66. package/dist/site/types.d.ts +75 -0
  67. package/dist/site/types.d.ts.map +1 -0
  68. package/dist/site/types.js +2 -0
  69. package/dist/site/types.js.map +1 -0
  70. package/dist/skill-stamp.d.ts +21 -0
  71. package/dist/skill-stamp.d.ts.map +1 -0
  72. package/dist/skill-stamp.js +39 -0
  73. package/dist/skill-stamp.js.map +1 -0
  74. package/dist/slugify.d.ts +19 -0
  75. package/dist/slugify.d.ts.map +1 -0
  76. package/dist/slugify.js +29 -0
  77. package/dist/slugify.js.map +1 -0
  78. package/dist/stage-presets.d.ts +51 -0
  79. package/dist/stage-presets.d.ts.map +1 -0
  80. package/dist/stage-presets.js +45 -0
  81. package/dist/stage-presets.js.map +1 -0
  82. package/dist/styles.css +637 -0
  83. package/dist/timeline.d.ts +87 -0
  84. package/dist/timeline.d.ts.map +1 -0
  85. package/dist/timeline.js +108 -0
  86. package/dist/timeline.js.map +1 -0
  87. package/dist/transcript.d.ts +87 -0
  88. package/dist/transcript.d.ts.map +1 -0
  89. package/dist/transcript.js +291 -0
  90. package/dist/transcript.js.map +1 -0
  91. package/dist/tts-provider.d.ts +69 -0
  92. package/dist/tts-provider.d.ts.map +1 -0
  93. package/dist/tts-provider.js +182 -0
  94. package/dist/tts-provider.js.map +1 -0
  95. package/dist/types.d.ts +109 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/voice-prerender.d.ts +41 -0
  100. package/dist/voice-prerender.d.ts.map +1 -0
  101. package/dist/voice-prerender.js +122 -0
  102. package/dist/voice-prerender.js.map +1 -0
  103. package/dist/voice.d.ts +76 -0
  104. package/dist/voice.d.ts.map +1 -0
  105. package/dist/voice.js +244 -0
  106. package/dist/voice.js.map +1 -0
  107. package/package.json +87 -0
  108. package/skills/tutorialize/SKILL.md +54 -0
  109. package/skills/tutorialize/agent.md +58 -0
  110. package/skills/tutorialize/references/api.md +489 -0
  111. package/skills/tutorialize/references/storytelling.md +193 -0
  112. package/src/styles.css +637 -0
  113. package/templates/site/public/.gitkeep +0 -0
  114. package/templates/site/public/widget.js +273 -0
  115. package/templates/site/src/components/TutorialsHome.astro +141 -0
  116. package/templates/site/src/components/VideoCard.astro +192 -0
  117. package/templates/site/src/components/VideoModal.astro +170 -0
  118. package/templates/site/src/data/.gitkeep +0 -0
  119. package/templates/site/src/layouts/Base.astro +56 -0
  120. package/templates/site/src/pages/[slug].astro +745 -0
  121. package/templates/site/src/pages/index.astro +5 -0
  122. package/templates/site/src/styles/tutorials.css +303 -0
@@ -0,0 +1,108 @@
1
+ import type { Page, Locator, FrameLocator } from '@playwright/test';
2
+ import type { TutorialOptions, StepOptions, ContextOptions, SceneFocus, FocusOptions } from './types.js';
3
+ import { TutorialTimeline } from './timeline.js';
4
+ /**
5
+ * When to start a step's action inside its narration clip (option B of
6
+ * docs/narration-action-overlap.md — one merged clip, computed offset).
7
+ *
8
+ * Two-phase (`doText` known): character-share estimate of where the "do"
9
+ * sentence ends — `duration × (len(do) + 2) / len(full)` (the +2 is the
10
+ * ". " separator). Single-phase: fixed 25% of the clip.
11
+ */
12
+ export declare function narrationActionOffset(durationMs: number, fullText: string, doText?: string): number;
13
+ export declare class Tutorial {
14
+ private page;
15
+ private options;
16
+ private initialized;
17
+ private testName;
18
+ private translateFn;
19
+ private voice;
20
+ private music;
21
+ private cursor;
22
+ private overlay;
23
+ private timeline;
24
+ private pendingItems;
25
+ private stepCounter;
26
+ private videoStartTime;
27
+ private scenes;
28
+ private activeScenes;
29
+ private sceneTransitionMs;
30
+ private variant?;
31
+ /** Mobile multi-scene: every scene stays on stage, focus() only marks the active one. */
32
+ private pinnedSplit;
33
+ constructor(page: Page, options: TutorialOptions);
34
+ private requireScene;
35
+ /**
36
+ * Mount the stage: a tab bar plus one iframe per scene.
37
+ *
38
+ * The parent page is loaded from `audioBaseUrl` first, because setContent
39
+ * keeps the current origin — that is what lets narration audio load without
40
+ * cross-origin friction, with no stage file to deploy.
41
+ */
42
+ stage(): Promise<void>;
43
+ /** A scene is a plain FrameLocator — the whole Playwright locator API. */
44
+ scene(name: string): FrameLocator;
45
+ /** Navigate a scene. Relative paths resolve against its baseUrl; an absolute
46
+ * URL is honoured as-is, so a scene may change origin mid-tutorial. */
47
+ goto(name: string, url: string): Promise<void>;
48
+ /**
49
+ * Bring scene(s) to the stage. One fills it; two share it side by side.
50
+ * The cursor is hidden across the switch so it never streaks between panes.
51
+ */
52
+ focus(target: SceneFocus, options?: FocusOptions): Promise<void>;
53
+ /** What to stamp on a timeline entry: a bare name, or a pair when two
54
+ * scenes shared the stage. Undefined for single-scene tutorials. */
55
+ private get stagedScene();
56
+ private sameFocus;
57
+ static get isEnabled(): boolean;
58
+ private translate;
59
+ clearFields(): void;
60
+ get hasSteps(): boolean;
61
+ get stepCount(): number;
62
+ switchPage(page: Page): void;
63
+ /** @deprecated Total steps are now calculated automatically. */
64
+ setTotalSteps(total: number): void;
65
+ /** @deprecated Voice preloading is now automatic when steps/contexts are added. */
66
+ preloadVoice(texts: string[]): Promise<void>;
67
+ private initialize;
68
+ private ensureStyles;
69
+ context(key: string, options?: ContextOptions): void;
70
+ step(key: string, action: () => Promise<void>, options?: StepOptions): void;
71
+ highlight(selector: string | Locator, duration?: number): Promise<void>;
72
+ unhighlight(selector: string | Locator): Promise<void>;
73
+ moveMouseToElement(locator: Locator): Promise<void>;
74
+ moveMouse(targetX: number, targetY: number): Promise<void>;
75
+ animateClick(): Promise<void>;
76
+ click(selector: string | Locator): Promise<void>;
77
+ fill(selector: string | Locator, value: string): Promise<void>;
78
+ typeSlowly(selector: string | Locator, value: string, delay?: number): Promise<void>;
79
+ /**
80
+ * Type a secret into a field that stays blurred. The blur is applied before
81
+ * the first keystroke and is NOT removed afterwards — the finished value must
82
+ * never become readable, or the whole point is lost. Call `unblur()` if a
83
+ * later step really needs the field legible again.
84
+ */
85
+ typeBlurred(selector: string | Locator, value: string, options?: {
86
+ delay?: number;
87
+ blur?: number;
88
+ reveal?: boolean;
89
+ } | number): Promise<void>;
90
+ /** Remove the blur left by `typeBlurred`. */
91
+ unblur(selector: string | Locator): Promise<void>;
92
+ selectOption(selector: string | Locator, value: string): Promise<void>;
93
+ hideOverlay(): Promise<void>;
94
+ showEmailPreview(options: {
95
+ subject: string;
96
+ from?: string;
97
+ to?: string;
98
+ body: string;
99
+ highlightCode?: string;
100
+ duration?: number;
101
+ }): Promise<void>;
102
+ hideEmailPreview(): Promise<void>;
103
+ complete(message?: string): Promise<void>;
104
+ getTimeline(): ReturnType<TutorialTimeline['getData']>;
105
+ private captureStepScreenshot;
106
+ deleteVideoIfEmpty(): Promise<boolean>;
107
+ }
108
+ //# sourceMappingURL=Tutorial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tutorial.d.ts","sourceRoot":"","sources":["../src/Tutorial.ts"],"names":[],"mappings":"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"}