@clipkit/editor 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 (248) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +51 -0
  3. package/dist/Editor.d.ts +3 -0
  4. package/dist/Editor.d.ts.map +1 -0
  5. package/dist/Editor.js +73 -0
  6. package/dist/Editor.js.map +1 -0
  7. package/dist/ExportDialog.d.ts +12 -0
  8. package/dist/ExportDialog.d.ts.map +1 -0
  9. package/dist/ExportDialog.js +30 -0
  10. package/dist/ExportDialog.js.map +1 -0
  11. package/dist/MotionPathOverlay.d.ts +5 -0
  12. package/dist/MotionPathOverlay.d.ts.map +1 -0
  13. package/dist/MotionPathOverlay.js +156 -0
  14. package/dist/MotionPathOverlay.js.map +1 -0
  15. package/dist/PerfHud.d.ts +2 -0
  16. package/dist/PerfHud.d.ts.map +1 -0
  17. package/dist/PerfHud.js +85 -0
  18. package/dist/PerfHud.js.map +1 -0
  19. package/dist/Stage.d.ts +2 -0
  20. package/dist/Stage.d.ts.map +1 -0
  21. package/dist/Stage.js +406 -0
  22. package/dist/Stage.js.map +1 -0
  23. package/dist/StageOverlay.d.ts +7 -0
  24. package/dist/StageOverlay.d.ts.map +1 -0
  25. package/dist/StageOverlay.js +508 -0
  26. package/dist/StageOverlay.js.map +1 -0
  27. package/dist/commands.d.ts +18 -0
  28. package/dist/commands.d.ts.map +1 -0
  29. package/dist/commands.js +103 -0
  30. package/dist/commands.js.map +1 -0
  31. package/dist/configuration.d.ts +9 -0
  32. package/dist/configuration.d.ts.map +1 -0
  33. package/dist/configuration.js +21 -0
  34. package/dist/configuration.js.map +1 -0
  35. package/dist/controls/AnimationsStack.d.ts +8 -0
  36. package/dist/controls/AnimationsStack.d.ts.map +1 -0
  37. package/dist/controls/AnimationsStack.js +188 -0
  38. package/dist/controls/AnimationsStack.js.map +1 -0
  39. package/dist/controls/CameraControl.d.ts +19 -0
  40. package/dist/controls/CameraControl.d.ts.map +1 -0
  41. package/dist/controls/CameraControl.js +47 -0
  42. package/dist/controls/CameraControl.js.map +1 -0
  43. package/dist/controls/CaptionLengthControl.d.ts +5 -0
  44. package/dist/controls/CaptionLengthControl.d.ts.map +1 -0
  45. package/dist/controls/CaptionLengthControl.js +11 -0
  46. package/dist/controls/CaptionLengthControl.js.map +1 -0
  47. package/dist/controls/CaptionTranscribe.d.ts +2 -0
  48. package/dist/controls/CaptionTranscribe.d.ts.map +1 -0
  49. package/dist/controls/CaptionTranscribe.js +95 -0
  50. package/dist/controls/CaptionTranscribe.js.map +1 -0
  51. package/dist/controls/ColorPicker.d.ts +17 -0
  52. package/dist/controls/ColorPicker.d.ts.map +1 -0
  53. package/dist/controls/ColorPicker.js +354 -0
  54. package/dist/controls/ColorPicker.js.map +1 -0
  55. package/dist/controls/ControlRenderer.d.ts +20 -0
  56. package/dist/controls/ControlRenderer.d.ts.map +1 -0
  57. package/dist/controls/ControlRenderer.js +106 -0
  58. package/dist/controls/ControlRenderer.js.map +1 -0
  59. package/dist/controls/CropControl.d.ts +2 -0
  60. package/dist/controls/CropControl.d.ts.map +1 -0
  61. package/dist/controls/CropControl.js +177 -0
  62. package/dist/controls/CropControl.js.map +1 -0
  63. package/dist/controls/EffectsStack.d.ts +8 -0
  64. package/dist/controls/EffectsStack.d.ts.map +1 -0
  65. package/dist/controls/EffectsStack.js +89 -0
  66. package/dist/controls/EffectsStack.js.map +1 -0
  67. package/dist/controls/GradeControl.d.ts +2 -0
  68. package/dist/controls/GradeControl.d.ts.map +1 -0
  69. package/dist/controls/GradeControl.js +120 -0
  70. package/dist/controls/GradeControl.js.map +1 -0
  71. package/dist/controls/KeyframeDiamond.d.ts +11 -0
  72. package/dist/controls/KeyframeDiamond.d.ts.map +1 -0
  73. package/dist/controls/KeyframeDiamond.js +87 -0
  74. package/dist/controls/KeyframeDiamond.js.map +1 -0
  75. package/dist/controls/LightingControls.d.ts +24 -0
  76. package/dist/controls/LightingControls.d.ts.map +1 -0
  77. package/dist/controls/LightingControls.js +108 -0
  78. package/dist/controls/LightingControls.js.map +1 -0
  79. package/dist/controls/ShapePresetControl.d.ts +4 -0
  80. package/dist/controls/ShapePresetControl.d.ts.map +1 -0
  81. package/dist/controls/ShapePresetControl.js +30 -0
  82. package/dist/controls/ShapePresetControl.js.map +1 -0
  83. package/dist/controls/ValueField.d.ts +10 -0
  84. package/dist/controls/ValueField.d.ts.map +1 -0
  85. package/dist/controls/ValueField.js +158 -0
  86. package/dist/controls/ValueField.js.map +1 -0
  87. package/dist/controls/VolumeControl.d.ts +10 -0
  88. package/dist/controls/VolumeControl.d.ts.map +1 -0
  89. package/dist/controls/VolumeControl.js +75 -0
  90. package/dist/controls/VolumeControl.js.map +1 -0
  91. package/dist/controls/compound.d.ts +46 -0
  92. package/dist/controls/compound.d.ts.map +1 -0
  93. package/dist/controls/compound.js +160 -0
  94. package/dist/controls/compound.js.map +1 -0
  95. package/dist/controls/layout.d.ts +38 -0
  96. package/dist/controls/layout.d.ts.map +1 -0
  97. package/dist/controls/layout.js +162 -0
  98. package/dist/controls/layout.js.map +1 -0
  99. package/dist/controls/primitives.d.ts +83 -0
  100. package/dist/controls/primitives.d.ts.map +1 -0
  101. package/dist/controls/primitives.js +194 -0
  102. package/dist/controls/primitives.js.map +1 -0
  103. package/dist/controls/transcribe.worker.d.ts +2 -0
  104. package/dist/controls/transcribe.worker.d.ts.map +1 -0
  105. package/dist/controls/transcribe.worker.js +22 -0
  106. package/dist/controls/transcribe.worker.js.map +1 -0
  107. package/dist/frame/AddElementBar.d.ts +2 -0
  108. package/dist/frame/AddElementBar.d.ts.map +1 -0
  109. package/dist/frame/AddElementBar.js +103 -0
  110. package/dist/frame/AddElementBar.js.map +1 -0
  111. package/dist/frame/Breadcrumbs.d.ts +2 -0
  112. package/dist/frame/Breadcrumbs.d.ts.map +1 -0
  113. package/dist/frame/Breadcrumbs.js +32 -0
  114. package/dist/frame/Breadcrumbs.js.map +1 -0
  115. package/dist/frame/GroupFlash.d.ts +2 -0
  116. package/dist/frame/GroupFlash.d.ts.map +1 -0
  117. package/dist/frame/GroupFlash.js +65 -0
  118. package/dist/frame/GroupFlash.js.map +1 -0
  119. package/dist/frame/Resizable.d.ts +12 -0
  120. package/dist/frame/Resizable.d.ts.map +1 -0
  121. package/dist/frame/Resizable.js +37 -0
  122. package/dist/frame/Resizable.js.map +1 -0
  123. package/dist/frame/Section.d.ts +23 -0
  124. package/dist/frame/Section.d.ts.map +1 -0
  125. package/dist/frame/Section.js +23 -0
  126. package/dist/frame/Section.js.map +1 -0
  127. package/dist/frame/ZoomControl.d.ts +9 -0
  128. package/dist/frame/ZoomControl.d.ts.map +1 -0
  129. package/dist/frame/ZoomControl.js +15 -0
  130. package/dist/frame/ZoomControl.js.map +1 -0
  131. package/dist/index.d.ts +9 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +13 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/lib/camera-gizmo.d.ts +15 -0
  136. package/dist/lib/camera-gizmo.d.ts.map +1 -0
  137. package/dist/lib/camera-gizmo.js +57 -0
  138. package/dist/lib/camera-gizmo.js.map +1 -0
  139. package/dist/lib/camera-tool.d.ts +43 -0
  140. package/dist/lib/camera-tool.d.ts.map +1 -0
  141. package/dist/lib/camera-tool.js +80 -0
  142. package/dist/lib/camera-tool.js.map +1 -0
  143. package/dist/lib/caption-segments.d.ts +17 -0
  144. package/dist/lib/caption-segments.d.ts.map +1 -0
  145. package/dist/lib/caption-segments.js +50 -0
  146. package/dist/lib/caption-segments.js.map +1 -0
  147. package/dist/lib/group.d.ts +12 -0
  148. package/dist/lib/group.d.ts.map +1 -0
  149. package/dist/lib/group.js +61 -0
  150. package/dist/lib/group.js.map +1 -0
  151. package/dist/lib/keyframes.d.ts +29 -0
  152. package/dist/lib/keyframes.d.ts.map +1 -0
  153. package/dist/lib/keyframes.js +92 -0
  154. package/dist/lib/keyframes.js.map +1 -0
  155. package/dist/lib/sfx-preview.d.ts +18 -0
  156. package/dist/lib/sfx-preview.d.ts.map +1 -0
  157. package/dist/lib/sfx-preview.js +74 -0
  158. package/dist/lib/sfx-preview.js.map +1 -0
  159. package/dist/lib/shape-presets.d.ts +35 -0
  160. package/dist/lib/shape-presets.d.ts.map +1 -0
  161. package/dist/lib/shape-presets.js +81 -0
  162. package/dist/lib/shape-presets.js.map +1 -0
  163. package/dist/lib/ungroup.d.ts +12 -0
  164. package/dist/lib/ungroup.d.ts.map +1 -0
  165. package/dist/lib/ungroup.js +40 -0
  166. package/dist/lib/ungroup.js.map +1 -0
  167. package/dist/lib/utils.d.ts +3 -0
  168. package/dist/lib/utils.d.ts.map +1 -0
  169. package/dist/lib/utils.js +9 -0
  170. package/dist/lib/utils.js.map +1 -0
  171. package/dist/panels/AssetsPanel.d.ts +2 -0
  172. package/dist/panels/AssetsPanel.d.ts.map +1 -0
  173. package/dist/panels/AssetsPanel.js +108 -0
  174. package/dist/panels/AssetsPanel.js.map +1 -0
  175. package/dist/panels/InspectorPanel.d.ts +2 -0
  176. package/dist/panels/InspectorPanel.d.ts.map +1 -0
  177. package/dist/panels/InspectorPanel.js +286 -0
  178. package/dist/panels/InspectorPanel.js.map +1 -0
  179. package/dist/panels/InterpolationPanel.d.ts +2 -0
  180. package/dist/panels/InterpolationPanel.d.ts.map +1 -0
  181. package/dist/panels/InterpolationPanel.js +226 -0
  182. package/dist/panels/InterpolationPanel.js.map +1 -0
  183. package/dist/panels/LayersTree.d.ts +4 -0
  184. package/dist/panels/LayersTree.d.ts.map +1 -0
  185. package/dist/panels/LayersTree.js +137 -0
  186. package/dist/panels/LayersTree.js.map +1 -0
  187. package/dist/panels/LeftRail.d.ts +6 -0
  188. package/dist/panels/LeftRail.d.ts.map +1 -0
  189. package/dist/panels/LeftRail.js +35 -0
  190. package/dist/panels/LeftRail.js.map +1 -0
  191. package/dist/panels/SourcePanel.d.ts +2 -0
  192. package/dist/panels/SourcePanel.d.ts.map +1 -0
  193. package/dist/panels/SourcePanel.js +470 -0
  194. package/dist/panels/SourcePanel.js.map +1 -0
  195. package/dist/panels/TimelinePanel.d.ts +11 -0
  196. package/dist/panels/TimelinePanel.d.ts.map +1 -0
  197. package/dist/panels/TimelinePanel.js +98 -0
  198. package/dist/panels/TimelinePanel.js.map +1 -0
  199. package/dist/panels/assets/SfxBrowser.d.ts +2 -0
  200. package/dist/panels/assets/SfxBrowser.d.ts.map +1 -0
  201. package/dist/panels/assets/SfxBrowser.js +49 -0
  202. package/dist/panels/assets/SfxBrowser.js.map +1 -0
  203. package/dist/panels/assets/use-assets.d.ts +11 -0
  204. package/dist/panels/assets/use-assets.d.ts.map +1 -0
  205. package/dist/panels/assets/use-assets.js +84 -0
  206. package/dist/panels/assets/use-assets.js.map +1 -0
  207. package/dist/panels/assets/use-sfx.d.ts +6 -0
  208. package/dist/panels/assets/use-sfx.d.ts.map +1 -0
  209. package/dist/panels/assets/use-sfx.js +47 -0
  210. package/dist/panels/assets/use-sfx.js.map +1 -0
  211. package/dist/panels/timeline/CanvasTimeline.d.ts +7 -0
  212. package/dist/panels/timeline/CanvasTimeline.d.ts.map +1 -0
  213. package/dist/panels/timeline/CanvasTimeline.js +1536 -0
  214. package/dist/panels/timeline/CanvasTimeline.js.map +1 -0
  215. package/dist/panels/timeline/Clip.d.ts +37 -0
  216. package/dist/panels/timeline/Clip.d.ts.map +1 -0
  217. package/dist/panels/timeline/Clip.js +176 -0
  218. package/dist/panels/timeline/Clip.js.map +1 -0
  219. package/dist/panels/timeline/CurveEditor.d.ts +2 -0
  220. package/dist/panels/timeline/CurveEditor.d.ts.map +1 -0
  221. package/dist/panels/timeline/CurveEditor.js +233 -0
  222. package/dist/panels/timeline/CurveEditor.js.map +1 -0
  223. package/dist/panels/timeline/MixerRail.d.ts +7 -0
  224. package/dist/panels/timeline/MixerRail.d.ts.map +1 -0
  225. package/dist/panels/timeline/MixerRail.js +295 -0
  226. package/dist/panels/timeline/MixerRail.js.map +1 -0
  227. package/dist/panels/timeline/Waveform.d.ts +11 -0
  228. package/dist/panels/timeline/Waveform.d.ts.map +1 -0
  229. package/dist/panels/timeline/Waveform.js +63 -0
  230. package/dist/panels/timeline/Waveform.js.map +1 -0
  231. package/dist/panels/timeline/clip-style.d.ts +10 -0
  232. package/dist/panels/timeline/clip-style.d.ts.map +1 -0
  233. package/dist/panels/timeline/clip-style.js +20 -0
  234. package/dist/panels/timeline/clip-style.js.map +1 -0
  235. package/dist/panels/timeline/filmstrip.d.ts +7 -0
  236. package/dist/panels/timeline/filmstrip.d.ts.map +1 -0
  237. package/dist/panels/timeline/filmstrip.js +135 -0
  238. package/dist/panels/timeline/filmstrip.js.map +1 -0
  239. package/dist/panels/timeline/timeline-layout.d.ts +65 -0
  240. package/dist/panels/timeline/timeline-layout.d.ts.map +1 -0
  241. package/dist/panels/timeline/timeline-layout.js +118 -0
  242. package/dist/panels/timeline/timeline-layout.js.map +1 -0
  243. package/dist/types.d.ts +68 -0
  244. package/dist/types.d.ts.map +1 -0
  245. package/dist/types.js +3 -0
  246. package/dist/types.js.map +1 -0
  247. package/package.json +56 -0
  248. package/src/styles.css +185 -0
@@ -0,0 +1,103 @@
1
+ // Command registry + keyboard map. Commands are DATA (id, title,
2
+ // shortcut, run) so the keyboard handler, menus, and a future command
3
+ // palette all read one table. Shortcuts follow the editor convention:
4
+ // space = transport, arrows = frame stepping, cmd/ctrl+z = history.
5
+ 'use client';
6
+ import { useEffect } from 'react';
7
+ export const EDITOR_COMMANDS = [
8
+ {
9
+ id: 'transport.toggle-play',
10
+ title: 'Play / pause',
11
+ shortcut: 'Space',
12
+ run: ({ actions }) => void actions.togglePlay(),
13
+ },
14
+ {
15
+ id: 'transport.step-back',
16
+ title: 'Previous frame',
17
+ shortcut: 'ArrowLeft',
18
+ run: ({ engine }) => engine?.stepFrame(-1),
19
+ },
20
+ {
21
+ id: 'transport.step-forward',
22
+ title: 'Next frame',
23
+ shortcut: 'ArrowRight',
24
+ run: ({ engine }) => engine?.stepFrame(1),
25
+ },
26
+ {
27
+ id: 'transport.go-start',
28
+ title: 'Go to start',
29
+ shortcut: 'Home',
30
+ run: ({ actions }) => actions.seek(0),
31
+ },
32
+ {
33
+ id: 'history.undo',
34
+ title: 'Undo',
35
+ shortcut: 'Mod+Z',
36
+ run: ({ actions }) => actions.undo(),
37
+ },
38
+ {
39
+ id: 'history.redo',
40
+ title: 'Redo',
41
+ shortcut: 'Shift+Mod+Z',
42
+ run: ({ actions }) => actions.redo(),
43
+ },
44
+ {
45
+ id: 'selection.clear',
46
+ title: 'Clear selection',
47
+ shortcut: 'Escape',
48
+ run: ({ actions }) => actions.clearSelection(),
49
+ },
50
+ {
51
+ id: 'selection.delete',
52
+ title: 'Delete selected',
53
+ shortcut: 'Backspace',
54
+ run: ({ store, actions }) => {
55
+ for (const id of store.getState().selection)
56
+ actions.removeElement(id);
57
+ },
58
+ },
59
+ ];
60
+ function matches(shortcut, e) {
61
+ const parts = shortcut.split('+');
62
+ const key = parts[parts.length - 1];
63
+ const needMod = parts.includes('Mod');
64
+ const needShift = parts.includes('Shift');
65
+ const mod = e.metaKey || e.ctrlKey;
66
+ if (needMod !== mod)
67
+ return false;
68
+ if (needShift !== e.shiftKey)
69
+ return false;
70
+ if (e.altKey)
71
+ return false;
72
+ const k = e.key === ' ' ? 'Space' : e.key;
73
+ return k.toLowerCase() === key.toLowerCase();
74
+ }
75
+ function isTypingTarget(e) {
76
+ const t = e.target;
77
+ if (!(t instanceof HTMLElement))
78
+ return false;
79
+ return (t.tagName === 'INPUT' ||
80
+ t.tagName === 'TEXTAREA' ||
81
+ t.tagName === 'SELECT' ||
82
+ t.isContentEditable);
83
+ }
84
+ /** Bind the command table to the window. One listener per editor. */
85
+ export function useKeyboardCommands(ctx) {
86
+ const { store, engine, actions } = ctx;
87
+ useEffect(() => {
88
+ const onKey = (e) => {
89
+ if (isTypingTarget(e))
90
+ return;
91
+ for (const cmd of EDITOR_COMMANDS) {
92
+ if (cmd.shortcut && matches(cmd.shortcut, e)) {
93
+ e.preventDefault();
94
+ cmd.run({ store, engine, actions });
95
+ return;
96
+ }
97
+ }
98
+ };
99
+ window.addEventListener('keydown', onKey);
100
+ return () => window.removeEventListener('keydown', onKey);
101
+ }, [store, engine, actions]);
102
+ }
103
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type EditorConfiguration, type EditorRegistry } from '@clipkit/editor-core';
2
+ export interface ConfigurationContextValue {
3
+ configuration: EditorConfiguration;
4
+ registry: EditorRegistry;
5
+ }
6
+ export declare const ConfigurationContext: import("react").Context<ConfigurationContextValue | null>;
7
+ export declare function useConfiguration(): ConfigurationContextValue;
8
+ export declare function getRegistry(): EditorRegistry;
9
+ //# sourceMappingURL=configuration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.d.ts","sourceRoot":"","sources":["../src/configuration.tsx"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,mBAAmB,CAAC;IACnC,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,eAAO,MAAM,oBAAoB,2DACsB,CAAC;AAExD,wBAAgB,gBAAgB,IAAI,yBAAyB,CAM5D;AAKD,wBAAgB,WAAW,IAAI,cAAc,CAG5C"}
@@ -0,0 +1,21 @@
1
+ // ConfigurationContext — the EditorConfiguration for this editor
2
+ // instance, plus the resolved registry it filters. Provided once by
3
+ // the root; every panel reads it instead of hard-coding what exists.
4
+ import { createContext, useContext } from 'react';
5
+ import { buildEditorRegistry, } from '@clipkit/editor-core';
6
+ export const ConfigurationContext = createContext(null);
7
+ export function useConfiguration() {
8
+ const ctx = useContext(ConfigurationContext);
9
+ if (!ctx) {
10
+ throw new Error('useConfiguration must be used inside <Editor>.');
11
+ }
12
+ return ctx;
13
+ }
14
+ /** The registry is pure data derived from the protocol — build once
15
+ * per module, shared by every editor instance. */
16
+ let cachedRegistry = null;
17
+ export function getRegistry() {
18
+ cachedRegistry ??= buildEditorRegistry();
19
+ return cachedRegistry;
20
+ }
21
+ //# sourceMappingURL=configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.tsx"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,oEAAoE;AACpE,qEAAqE;AAErE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,EACL,mBAAmB,GAGpB,MAAM,sBAAsB,CAAC;AAO9B,MAAM,CAAC,MAAM,oBAAoB,GAC/B,aAAa,CAAmC,IAAI,CAAC,CAAC;AAExD,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;kDACkD;AAClD,IAAI,cAAc,GAA0B,IAAI,CAAC;AACjD,MAAM,UAAU,WAAW;IACzB,cAAc,KAAK,mBAAmB,EAAE,CAAC;IACzC,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type Animation } from '@clipkit/protocol';
2
+ export declare function AnimationsStackControl({ value, onChange, onScrubStart, onScrubEnd, }: {
3
+ value: Animation[] | undefined;
4
+ onChange: (next: Animation[] | undefined, live: boolean) => void;
5
+ onScrubStart?: () => void;
6
+ onScrubEnd?: () => void;
7
+ }): import("react").JSX.Element;
8
+ //# sourceMappingURL=AnimationsStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationsStack.d.ts","sourceRoot":"","sources":["../../src/controls/AnimationsStack.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAmB,KAAK,SAAS,EAAsB,MAAM,mBAAmB,CAAC;AA0FxF,wBAAgB,sBAAsB,CAAC,EACrC,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAuOA"}
@@ -0,0 +1,188 @@
1
+ // Animations stack (EDITORS B11) — browse / apply / stack the
2
+ // protocol's preset animations (ANIMATION_TYPES — "the 30 presets").
3
+ // Same FX-row pattern as the effects stack: family-hued type chip,
4
+ // expand to params, reorder, ×, grouped "+ Animation" picker. Params
5
+ // render from the registry's `animation` scope through ControlRenderer,
6
+ // FILTERED to the params the preset actually reads (per PROTOCOL §6.2)
7
+ // so a `seed` knob never shows on a fade. Unauthored params display
8
+ // the runtime's normative defaults (presets.ts / text-animation.ts).
9
+ //
10
+ // Entrance/exit anchoring: `time` renders as a Start / End / At-s
11
+ // segmented control; adding an exit-family preset writes `time: "end"`
12
+ // EXPLICITLY (the protocol stays literal — no hidden anchor semantics).
13
+ // Families derive from the type names, so a future 31st preset appears
14
+ // in the picker with zero UI work (D2).
15
+ 'use client';
16
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
17
+ import { useState } from 'react';
18
+ import { ANIMATION_TYPES } from '@clipkit/protocol';
19
+ import { cn } from '../lib/utils.js';
20
+ import { useConfiguration } from '../configuration.js';
21
+ import { ControlRenderer } from './ControlRenderer.js';
22
+ import { NumberControl, SelectControl } from './primitives.js';
23
+ function familyOf(type) {
24
+ if (type.startsWith('text-'))
25
+ return 'text';
26
+ if (type.endsWith('-in'))
27
+ return 'entrance';
28
+ if (type.endsWith('-out'))
29
+ return 'exit';
30
+ if (type === 'drift' || type === 'breathe' || type === 'orbit')
31
+ return 'ambient';
32
+ return 'accent';
33
+ }
34
+ const FAMILY_LABEL = {
35
+ entrance: 'Entrance',
36
+ exit: 'Exit',
37
+ accent: 'Accent',
38
+ ambient: 'Ambient',
39
+ text: 'Text',
40
+ };
41
+ const FAMILY_ORDER = ['entrance', 'exit', 'accent', 'ambient', 'text'];
42
+ const CHIP_CLS = {
43
+ entrance: 'bg-emerald-500/20 text-emerald-300',
44
+ exit: 'bg-rose-500/20 text-rose-300',
45
+ accent: 'bg-amber-500/20 text-amber-300',
46
+ ambient: 'bg-sky-500/20 text-sky-300',
47
+ text: 'bg-violet-500/20 text-violet-300',
48
+ };
49
+ /** Params each preset actually reads (PROTOCOL §6.2 / §6.5). */
50
+ function paramsFor(type) {
51
+ const p = ['duration', 'easing'];
52
+ if (type.startsWith('text-'))
53
+ p.push('split', 'stagger');
54
+ if (['shake', 'wiggle', 'drift', 'breathe', 'orbit', 'text-wave'].includes(type))
55
+ p.push('frequency');
56
+ if (['spin', 'wiggle', 'text-flip'].includes(type))
57
+ p.push('rotation');
58
+ if (type === 'text-flip')
59
+ p.push('axis');
60
+ if (['pan', 'shift', 'shake', 'drift', 'orbit', 'text-slide', 'text-fly', 'text-wave'].includes(type))
61
+ p.push('distance');
62
+ if (['pan', 'shift', 'orbit', 'text-slide', 'text-fly'].includes(type))
63
+ p.push('direction');
64
+ if (['squash', 'breathe'].includes(type))
65
+ p.push('scale');
66
+ if (type === 'drift')
67
+ p.push('seed');
68
+ return p;
69
+ }
70
+ /** Runs the element's full life when untimed — duration shows "auto". */
71
+ const FULL_LENGTH = new Set(['spin', 'shake', 'wiggle', 'pan', 'drift', 'breathe', 'orbit', 'text-wave']);
72
+ /** Display defaults mirroring the runtime's normative fallbacks. */
73
+ function defaultFor(type, param) {
74
+ switch (param) {
75
+ case 'duration':
76
+ return FULL_LENGTH.has(type) ? undefined : 0.5;
77
+ case 'easing':
78
+ return 'ease-out';
79
+ case 'split':
80
+ return type === 'text-typewriter' || type === 'text-wave' || type === 'text-flip'
81
+ ? 'letter'
82
+ : 'word';
83
+ case 'stagger':
84
+ return defaultFor(type, 'split') === 'word' ? 0.09 : 0.035;
85
+ case 'frequency':
86
+ return { shake: 8, wiggle: 2, drift: 0.5, breathe: 0.4, orbit: 0.5, 'text-wave': 1.5 }[type];
87
+ case 'rotation':
88
+ return { spin: 360, wiggle: 8, 'text-flip': 90 }[type];
89
+ case 'distance':
90
+ return {
91
+ shake: 24, drift: 30, orbit: 40, pan: 200, shift: 200,
92
+ 'text-slide': 40, 'text-fly': 140, 'text-wave': 12,
93
+ }[type];
94
+ case 'direction':
95
+ return type === 'text-slide' || type === 'text-fly' ? 'up' : 'right';
96
+ case 'scale':
97
+ return { squash: 0.3, breathe: 0.05 }[type];
98
+ case 'seed':
99
+ return 0;
100
+ default:
101
+ return undefined;
102
+ }
103
+ }
104
+ const NAMED_EASINGS = [
105
+ 'linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out',
106
+ 'ease-in-cubic', 'ease-out-cubic', 'ease-in-out-cubic',
107
+ 'ease-out-quart', 'ease-out-expo', 'ease-out-back', 'spring',
108
+ 'elastic-out', 'bounce-out',
109
+ ];
110
+ export function AnimationsStackControl({ value, onChange, onScrubStart, onScrubEnd, }) {
111
+ const { registry } = useConfiguration();
112
+ const [expanded, setExpanded] = useState(null);
113
+ const [adding, setAdding] = useState(false);
114
+ const animations = value ?? [];
115
+ const commit = (next, live = false) => onChange(next.length > 0 ? next : undefined, live);
116
+ const setAnim = (i, patch, live) => commit(animations.map((a, j) => {
117
+ if (j !== i)
118
+ return a;
119
+ const next = { ...a, ...patch };
120
+ // Unauthored params stay unauthored (byte-clean documents).
121
+ for (const k of Object.keys(next))
122
+ if (next[k] === undefined)
123
+ delete next[k];
124
+ return next;
125
+ }), live);
126
+ const move = (i, dir) => {
127
+ const j = i + dir;
128
+ if (j < 0 || j >= animations.length)
129
+ return;
130
+ const next = [...animations];
131
+ [next[i], next[j]] = [next[j], next[i]];
132
+ commit(next);
133
+ setExpanded(null);
134
+ };
135
+ return (_jsxs("div", { className: "flex flex-col gap-0.5 w-full", children: [animations.map((anim, i) => {
136
+ const family = familyOf(anim.type);
137
+ const open = expanded === i;
138
+ const params = paramsFor(anim.type);
139
+ const specs = registry.animation.fields.filter((s) => params.includes(s.path));
140
+ return (_jsxs("div", { className: "border border-border/60 rounded", children: [_jsxs("div", { className: "flex items-center gap-1 h-7 px-1", children: [_jsxs("button", { type: "button", className: "flex items-center gap-1.5 flex-1 min-w-0 text-left", onClick: () => setExpanded(open ? null : i), "aria-expanded": open, children: [_jsx("svg", { width: "6", height: "6", viewBox: "0 0 8 8", "aria-hidden": "true", className: cn('text-muted-foreground shrink-0 transition-transform', open && 'rotate-90'), children: _jsx("path", { d: "M2 1 L6 4 L2 7 Z", fill: "currentColor" }) }), _jsx("span", { className: cn('px-1.5 py-px rounded text-[10px] font-medium truncate', CHIP_CLS[family]), children: anim.type }), _jsx("span", { className: "text-[9px] text-muted-foreground/60 truncate", children: anim.time === 'end' ? 'end' : typeof anim.time === 'number' ? `${anim.time}s` : 'start' })] }), _jsx("button", { type: "button", className: "w-4 h-4 grid place-items-center text-muted-foreground/50 hover:text-foreground text-[9px] disabled:opacity-20", disabled: i === 0, onClick: () => move(i, -1), "aria-label": "Move up", children: "\u25B2" }), _jsx("button", { type: "button", className: "w-4 h-4 grid place-items-center text-muted-foreground/50 hover:text-foreground text-[9px] disabled:opacity-20", disabled: i === animations.length - 1, onClick: () => move(i, 1), "aria-label": "Move down", children: "\u25BC" }), _jsx("button", { type: "button", className: "w-4 h-4 grid place-items-center text-muted-foreground/50 hover:text-foreground text-[11px]", onClick: () => {
141
+ commit(animations.filter((_, j) => j !== i));
142
+ setExpanded(null);
143
+ }, "aria-label": "Remove animation", children: "\u00D7" })] }), open && (_jsxs("div", { className: "px-2 pb-2 flex flex-col", children: [_jsxs("div", { className: "flex items-center gap-2 h-8", children: [_jsx("span", { className: "w-16 shrink-0 text-[10px] text-muted-foreground truncate", children: "Anchor" }), _jsxs("div", { className: "flex-1 min-w-0 flex items-center gap-2", children: [_jsx("div", { className: "flex flex-1 min-w-0 h-6 gap-px rounded-md overflow-hidden", children: ['start', 'end', 'at'].map((mode) => {
144
+ const active = mode === 'at'
145
+ ? typeof anim.time === 'number'
146
+ : mode === 'end'
147
+ ? anim.time === 'end'
148
+ : anim.time === 'start' || anim.time === undefined;
149
+ return (_jsx("button", { type: "button", className: cn('flex-1 h-6 text-[10px] capitalize transition-colors', active
150
+ ? 'bg-secondary text-foreground'
151
+ : 'bg-field text-muted-foreground hover:text-foreground hover:bg-field-hover'), onClick: () => setAnim(i, {
152
+ time: mode === 'start'
153
+ ? undefined
154
+ : mode === 'end'
155
+ ? 'end'
156
+ : typeof anim.time === 'number'
157
+ ? anim.time
158
+ : 0,
159
+ }, false), children: mode }, mode));
160
+ }) }), typeof anim.time === 'number' && (_jsx(NumberControl, { value: anim.time, min: 0, step: 0.05, suffix: "s", width: 64, onChange: (v, live) => setAnim(i, { time: v }, live), onScrubStart: onScrubStart, onScrubEnd: onScrubEnd }))] })] }), specs.map((spec) => {
161
+ const raw = anim[spec.path];
162
+ const fallback = defaultFor(anim.type, spec.path);
163
+ if (spec.path === 'easing') {
164
+ const cur = typeof raw === 'string' ? raw : fallback;
165
+ const opts = NAMED_EASINGS.includes(cur) ? NAMED_EASINGS : [cur, ...NAMED_EASINGS];
166
+ return (_jsxs("div", { className: "flex items-center gap-2 h-8", children: [_jsx("span", { className: "w-16 shrink-0 text-[10px] text-muted-foreground truncate", children: "Easing" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(SelectControl, { value: cur, options: opts, fluid: true, onChange: (v) => setAnim(i, { easing: v }, false) }) })] }, spec.path));
167
+ }
168
+ const shown = raw ??
169
+ (spec.path === 'duration' && FULL_LENGTH.has(anim.type) ? undefined : fallback);
170
+ return (_jsxs("div", { className: "flex items-center gap-2 h-8", children: [_jsx("span", { className: "w-16 shrink-0 text-[10px] text-muted-foreground truncate", title: spec.path === 'duration' && FULL_LENGTH.has(anim.type)
171
+ ? 'Defaults to the element’s full duration when untimed'
172
+ : undefined, children: spec.label }), _jsx("div", { className: "flex-1 min-w-0 flex items-center gap-2", children: _jsx(ControlRenderer, { spec: spec, value: shown, fluid: true, onChange: (v, live) => setAnim(i, { [spec.path]: v }, live), onScrubStart: onScrubStart, onScrubEnd: onScrubEnd }) })] }, spec.path));
173
+ })] }))] }, i));
174
+ }), adding ? (_jsxs("select", { autoFocus: true, className: "h-6 bg-field hover:bg-field-hover rounded-md px-1 text-[11px] text-foreground outline-none cursor-pointer transition-colors", defaultValue: "", onBlur: () => setAdding(false), onChange: (e) => {
175
+ const type = e.target.value;
176
+ if (type) {
177
+ const anim = { type };
178
+ // Exit presets anchor to the element's end — written
179
+ // EXPLICITLY so the document carries the semantics.
180
+ if (familyOf(type) === 'exit')
181
+ anim.time = 'end';
182
+ commit([...animations, anim]);
183
+ setExpanded(animations.length);
184
+ }
185
+ setAdding(false);
186
+ }, children: [_jsx("option", { value: "", disabled: true, children: "Add animation\u2026" }), FAMILY_ORDER.map((fam) => (_jsx("optgroup", { label: FAMILY_LABEL[fam], children: ANIMATION_TYPES.filter((t) => familyOf(t) === fam).map((t) => (_jsx("option", { value: t, children: t }, t))) }, fam)))] })) : (_jsx("button", { type: "button", className: "self-start h-5 px-1.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-card transition", onClick: () => setAdding(true), children: "+ Animation" }))] }));
187
+ }
188
+ //# sourceMappingURL=AnimationsStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnimationsStack.js","sourceRoot":"","sources":["../../src/controls/AnimationsStack.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Camera } from '@clipkit/protocol';
2
+ export declare function CameraControl({ value, onChange, onScrubStart, onScrubEnd, }: {
3
+ value: Camera | undefined;
4
+ onChange: (next: Camera | undefined, live: boolean) => void;
5
+ onScrubStart?: () => void;
6
+ onScrubEnd?: () => void;
7
+ }): import("react").JSX.Element;
8
+ interface MotionBlur {
9
+ samples?: number;
10
+ shutter?: number;
11
+ }
12
+ export declare function MotionBlurControl({ value, onChange, onScrubStart, onScrubEnd, }: {
13
+ value: MotionBlur | undefined;
14
+ onChange: (next: MotionBlur | undefined, live: boolean) => void;
15
+ onScrubStart?: () => void;
16
+ onScrubEnd?: () => void;
17
+ }): import("react").JSX.Element;
18
+ export {};
19
+ //# sourceMappingURL=CameraControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraControl.d.ts","sourceRoot":"","sources":["../../src/controls/CameraControl.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAoDhD,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BA0EA;AAED,UAAU,UAAU;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAqDA"}
@@ -0,0 +1,47 @@
1
+ // Camera + Motion Blur controls (CAMERA-PLAN item 4). These are custom
2
+ // per-field controls for the Source scope's nested-object fields
3
+ // `source.camera` and `source.motion_blur` — registered in
4
+ // ControlRenderer, surfaced via FIELD_OVERRIDES.source. Each edits the
5
+ // whole nested object and writes it back through the source patch.
6
+ //
7
+ // Camera fields are animatable via INLINE Keyframe[] arrays (the runtime
8
+ // resolves them in cameraMatrix). When a field already holds a keyframe
9
+ // array we show an "animated" chip rather than a number well, so we
10
+ // never clobber a curve from this static panel — keyframing the camera
11
+ // from the stage lands with the camera tools (item 7).
12
+ 'use client';
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ import { cn } from '../lib/utils.js';
15
+ import { NumberControl, SelectControl } from './primitives.js';
16
+ const BOX = 'flex flex-col w-full border border-border/60 rounded px-2 py-1.5';
17
+ const ROW = 'flex items-center gap-2 h-8';
18
+ const LABEL = 'text-[10px] text-muted-foreground w-16 shrink-0 truncate';
19
+ const ADD_BTN = 'h-5 px-1.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-card transition';
20
+ function isAnimated(v) {
21
+ return Array.isArray(v);
22
+ }
23
+ /** A number well, or an "animated" chip when the field holds a curve. */
24
+ function NumOrAnim({ value, onChange, scrub, stepper = false, ...rest }) {
25
+ if (isAnimated(value)) {
26
+ return (_jsx("span", { className: "flex-1 min-w-0 h-7 grid place-items-center rounded bg-field text-[10px] text-muted-foreground/70", children: "animated" }));
27
+ }
28
+ return (_jsx(NumberControl, { value: typeof value === 'number' ? value : 0, fluid: true, stepper: stepper, onChange: onChange, onScrubStart: scrub.onScrubStart, onScrubEnd: scrub.onScrubEnd, ...rest }));
29
+ }
30
+ export function CameraControl({ value, onChange, onScrubStart, onScrubEnd, }) {
31
+ const scrub = { onScrubStart, onScrubEnd };
32
+ if (!value) {
33
+ return (_jsx("button", { type: "button", className: ADD_BTN, onClick: () => onChange({ perspective: 1200 }, false), children: "+ Add camera" }));
34
+ }
35
+ // Merge helper — write the whole object back each edit.
36
+ const set = (patch, live) => onChange({ ...value, ...patch }, live);
37
+ return (_jsxs("div", { className: BOX, children: [_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Perspective" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.perspective, min: 1, suffix: "px", stepper: true, scrub: scrub, onChange: (v, live) => set({ perspective: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Position" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-3 gap-2", children: [_jsx(NumOrAnim, { value: value.x, prefix: "X", suffix: "px", scrub: scrub, onChange: (v, live) => set({ x: v }, live) }), _jsx(NumOrAnim, { value: value.y, prefix: "Y", suffix: "px", scrub: scrub, onChange: (v, live) => set({ y: v }, live) }), _jsx(NumOrAnim, { value: value.z, prefix: "Z", suffix: "px", scrub: scrub, onChange: (v, live) => set({ z: v }, live) })] })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Orientation" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-3 gap-2", children: [_jsx(NumOrAnim, { value: value.x_rotation, prefix: "X", suffix: "\u00B0", scrub: scrub, onChange: (v, live) => set({ x_rotation: v }, live) }), _jsx(NumOrAnim, { value: value.y_rotation, prefix: "Y", suffix: "\u00B0", scrub: scrub, onChange: (v, live) => set({ y_rotation: v }, live) }), _jsx(NumOrAnim, { value: value.z_rotation, prefix: "Z", suffix: "\u00B0", scrub: scrub, onChange: (v, live) => set({ z_rotation: v }, live) })] })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Occlusion" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(SelectControl, { value: value.sort ?? 'depth', options: ['depth', 'paint'], fluid: true, onChange: (v) => set({ sort: v }, false) }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), onClick: () => onChange(undefined, false), children: "Remove" })] })] })] }));
38
+ }
39
+ export function MotionBlurControl({ value, onChange, onScrubStart, onScrubEnd, }) {
40
+ const scrub = { onScrubStart, onScrubEnd };
41
+ if (!value) {
42
+ return (_jsx("button", { type: "button", className: ADD_BTN, onClick: () => onChange({ samples: 8, shutter: 0.5 }, false), children: "+ Add motion blur" }));
43
+ }
44
+ const set = (patch, live) => onChange({ ...value, ...patch }, live);
45
+ return (_jsxs("div", { className: BOX, children: [_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Samples" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumberControl, { value: value.samples ?? 8, min: 1, max: 32, step: 1, fluid: true, stepper: true, onChange: (v, live) => set({ samples: v }, live), ...scrub }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Shutter" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(NumberControl, { value: value.shutter ?? 0.5, min: 0, max: 1, step: 0.05, fluid: true, stepper: true, onChange: (v, live) => set({ shutter: v }, live), ...scrub }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), onClick: () => onChange(undefined, false), children: "Remove" })] })] })] }));
46
+ }
47
+ //# sourceMappingURL=CameraControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CameraControl.js","sourceRoot":"","sources":["../../src/controls/CameraControl.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function CaptionLengthControl({ value, onChange, }: {
2
+ value: number | 'auto' | undefined;
3
+ onChange: (next: number) => void;
4
+ }): import("react").JSX.Element;
5
+ //# sourceMappingURL=CaptionLengthControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptionLengthControl.d.ts","sourceRoot":"","sources":["../../src/controls/CaptionLengthControl.tsx"],"names":[],"mappings":"AAOA,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC,+BAaA"}
@@ -0,0 +1,11 @@
1
+ // Caption windowing control — `caption.max_length` as a simple letter count:
2
+ // how many letters of the transcript show on screen at once (a chunk grows
3
+ // word-by-word until the next word would exceed this). Captions always window;
4
+ // there's no "show all" in the editor. Default 16.
5
+ 'use client';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ export function CaptionLengthControl({ value, onChange, }) {
8
+ const letters = typeof value === 'number' ? value : 16;
9
+ return (_jsx("input", { type: "number", min: 1, max: 200, value: letters, title: "Max letters shown on screen at once", onChange: (e) => onChange(Math.max(1, Math.min(200, Number(e.target.value) || 16))), className: "w-14 h-6 px-1.5 rounded-sm bg-secondary text-foreground text-[11px] text-right tabular-nums outline-none" }));
10
+ }
11
+ //# sourceMappingURL=CaptionLengthControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptionLengthControl.js","sourceRoot":"","sources":["../../src/controls/CaptionLengthControl.tsx"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,mDAAmD;AAEnD,YAAY,CAAC;;AAEb,MAAM,UAAU,oBAAoB,CAAC,EACnC,KAAK,EACL,QAAQ,GAIT;IACC,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,OAAO,CACL,gBACE,IAAI,EAAC,QAAQ,EACb,GAAG,EAAE,CAAC,EACN,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,OAAO,EACd,KAAK,EAAC,qCAAqC,EAC3C,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EACnF,SAAS,EAAC,0GAA0G,GACpH,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function CaptionTranscribe(): import("react").JSX.Element;
2
+ //# sourceMappingURL=CaptionTranscribe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptionTranscribe.d.ts","sourceRoot":"","sources":["../../src/controls/CaptionTranscribe.tsx"],"names":[],"mappings":"AA4CA,wBAAgB,iBAAiB,gCAsFhC"}
@@ -0,0 +1,95 @@
1
+ // "Transcribe" affordance for a caption element — turns an audio/video element
2
+ // on the timeline into the caption's words, running Whisper IN THE BROWSER.
3
+ //
4
+ // The caption is ONE element holding the whole transcript; `max_length` windows
5
+ // it (a few words / N letters at a time) at render. Whisper runs in a Web WORKER
6
+ // (transcribe.worker.ts) so inference never freezes the editor; the heavy model
7
+ // only loads when you transcribe.
8
+ 'use client';
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ import { useState } from 'react';
11
+ import { useEditor, useEditorStore } from '@clipkit/editor-core';
12
+ import { cn } from '../lib/utils.js';
13
+ const MODEL = 'Xenova/whisper-base'; // multilingual, ~75 MB; cached after first run.
14
+ const num = (v, d) => (typeof v === 'number' && Number.isFinite(v) ? v : d);
15
+ /** Run Whisper inference in a Web Worker. Resolves the transcript result. */
16
+ function runWorker(audio, onStatus) {
17
+ return new Promise((resolve, reject) => {
18
+ const worker = new Worker(new URL('./transcribe.worker.js', import.meta.url), { type: 'module' });
19
+ worker.onmessage = (e) => {
20
+ const m = e.data;
21
+ if (m.type === 'progress') {
22
+ if (m.info?.status === 'progress' && m.info.progress != null)
23
+ onStatus(`downloading model ${m.info.progress.toFixed(0)}%`);
24
+ else if (m.info?.status === 'ready')
25
+ onStatus('transcribing…');
26
+ }
27
+ else if (m.type === 'result' && m.result) {
28
+ worker.terminate();
29
+ resolve(m.result);
30
+ }
31
+ else if (m.type === 'error') {
32
+ worker.terminate();
33
+ reject(new Error(m.message ?? 'transcription failed'));
34
+ }
35
+ };
36
+ worker.onerror = (e) => { worker.terminate(); reject(new Error(e.message || 'worker error')); };
37
+ // Transfer the PCM buffer (zero-copy) so the main thread isn't blocked copying it.
38
+ worker.postMessage({ samples: audio.samples, sampleRate: audio.sampleRate, model: MODEL }, [audio.samples.buffer]);
39
+ });
40
+ }
41
+ export function CaptionTranscribe() {
42
+ const { updateElement } = useEditor();
43
+ const selId = useEditorStore((s) => s.selection[0]);
44
+ const elements = useEditorStore((s) => s.source.elements);
45
+ const caption = elements.find((e) => e.id === selId && e.type === 'caption');
46
+ const sources = elements.filter((e) => (e.type === 'video' || e.type === 'audio') && typeof e.source === 'string');
47
+ const [busy, setBusy] = useState(false);
48
+ const [status, setStatus] = useState(null);
49
+ const [pickedId, setPickedId] = useState('');
50
+ const picked = sources.find((s) => (s.id ?? s.source) === pickedId);
51
+ const transcribeFrom = async (src) => {
52
+ if (!caption || typeof caption.id !== 'string')
53
+ return;
54
+ setBusy(true);
55
+ setStatus('loading…');
56
+ try {
57
+ const res = await fetch(src.source);
58
+ if (!res.ok)
59
+ throw new Error('could not read the source media');
60
+ const blob = await res.blob();
61
+ const browser = await import('@clipkit/speech-to-text/browser');
62
+ const core = await import('@clipkit/speech-to-text');
63
+ setStatus('decoding audio…');
64
+ const audio = await browser.decodeAudioBlob(blob);
65
+ setStatus('transcribing…');
66
+ const result = await runWorker(audio, setStatus);
67
+ const words = core.toCaptionWords(result);
68
+ if (words.length === 0) {
69
+ setStatus('no speech detected');
70
+ return;
71
+ }
72
+ // Fill THIS caption with the whole transcript + window it (auto chunks by
73
+ // a few words). The source's timeline position offsets the caption so it
74
+ // syncs to the media.
75
+ const offset = num(src.time, 0);
76
+ const patch = {
77
+ words,
78
+ // Window by default so a transcript never dumps on screen at once.
79
+ max_length: typeof caption.max_length === 'number' ? caption.max_length : 16,
80
+ ...(offset ? { time: offset } : {}),
81
+ };
82
+ updateElement(caption.id, patch);
83
+ setStatus(`${words.length} words`);
84
+ setTimeout(() => setStatus(null), 1500);
85
+ }
86
+ catch (e) {
87
+ setStatus(e instanceof Error ? e.message : 'transcription failed');
88
+ }
89
+ finally {
90
+ setBusy(false);
91
+ }
92
+ };
93
+ return (_jsxs("div", { className: "flex flex-col gap-1 pb-1.5 mb-1 border-b border-border", children: [_jsx("span", { className: "text-[10px] font-medium text-muted-foreground", children: "Transcribe from" }), sources.length === 0 ? (_jsx("span", { className: "text-[10px] text-muted-foreground/70", children: "Add an audio or video element to transcribe its speech into captions." })) : (_jsxs("div", { className: "flex items-center gap-1", children: [_jsxs("select", { value: pickedId, disabled: busy, onChange: (e) => setPickedId(e.target.value), className: cn('h-6 flex-1 min-w-0 bg-field hover:bg-field-hover rounded-md px-1.5 text-[11px] text-foreground/90 outline-none cursor-pointer transition-colors disabled:opacity-40'), children: [_jsx("option", { value: "", children: "Select a source\u2026" }), sources.map((s) => (_jsxs("option", { value: s.id ?? s.source, children: [s.type === 'video' ? '▶ ' : '♪ ', s.name ?? s.type] }, s.id ?? s.source)))] }), _jsx("button", { type: "button", disabled: busy || !picked, onClick: () => picked && void transcribeFrom(picked), className: cn('h-6 px-2.5 rounded-md bg-primary text-primary-foreground text-[11px] font-medium hover:opacity-90 transition-opacity disabled:opacity-40 disabled:pointer-events-none shrink-0'), children: busy ? '…' : 'Transcribe' })] })), status && _jsx("span", { className: "text-[10px] text-muted-foreground tabular-nums", children: status })] }));
94
+ }
95
+ //# sourceMappingURL=CaptionTranscribe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CaptionTranscribe.js","sourceRoot":"","sources":["../../src/controls/CaptionTranscribe.tsx"],"names":[],"mappings":"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"}