@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.
- package/LICENSE +201 -0
- package/README.md +51 -0
- package/dist/Editor.d.ts +3 -0
- package/dist/Editor.d.ts.map +1 -0
- package/dist/Editor.js +73 -0
- package/dist/Editor.js.map +1 -0
- package/dist/ExportDialog.d.ts +12 -0
- package/dist/ExportDialog.d.ts.map +1 -0
- package/dist/ExportDialog.js +30 -0
- package/dist/ExportDialog.js.map +1 -0
- package/dist/MotionPathOverlay.d.ts +5 -0
- package/dist/MotionPathOverlay.d.ts.map +1 -0
- package/dist/MotionPathOverlay.js +156 -0
- package/dist/MotionPathOverlay.js.map +1 -0
- package/dist/PerfHud.d.ts +2 -0
- package/dist/PerfHud.d.ts.map +1 -0
- package/dist/PerfHud.js +85 -0
- package/dist/PerfHud.js.map +1 -0
- package/dist/Stage.d.ts +2 -0
- package/dist/Stage.d.ts.map +1 -0
- package/dist/Stage.js +406 -0
- package/dist/Stage.js.map +1 -0
- package/dist/StageOverlay.d.ts +7 -0
- package/dist/StageOverlay.d.ts.map +1 -0
- package/dist/StageOverlay.js +508 -0
- package/dist/StageOverlay.js.map +1 -0
- package/dist/commands.d.ts +18 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +103 -0
- package/dist/commands.js.map +1 -0
- package/dist/configuration.d.ts +9 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +21 -0
- package/dist/configuration.js.map +1 -0
- package/dist/controls/AnimationsStack.d.ts +8 -0
- package/dist/controls/AnimationsStack.d.ts.map +1 -0
- package/dist/controls/AnimationsStack.js +188 -0
- package/dist/controls/AnimationsStack.js.map +1 -0
- package/dist/controls/CameraControl.d.ts +19 -0
- package/dist/controls/CameraControl.d.ts.map +1 -0
- package/dist/controls/CameraControl.js +47 -0
- package/dist/controls/CameraControl.js.map +1 -0
- package/dist/controls/CaptionLengthControl.d.ts +5 -0
- package/dist/controls/CaptionLengthControl.d.ts.map +1 -0
- package/dist/controls/CaptionLengthControl.js +11 -0
- package/dist/controls/CaptionLengthControl.js.map +1 -0
- package/dist/controls/CaptionTranscribe.d.ts +2 -0
- package/dist/controls/CaptionTranscribe.d.ts.map +1 -0
- package/dist/controls/CaptionTranscribe.js +95 -0
- package/dist/controls/CaptionTranscribe.js.map +1 -0
- package/dist/controls/ColorPicker.d.ts +17 -0
- package/dist/controls/ColorPicker.d.ts.map +1 -0
- package/dist/controls/ColorPicker.js +354 -0
- package/dist/controls/ColorPicker.js.map +1 -0
- package/dist/controls/ControlRenderer.d.ts +20 -0
- package/dist/controls/ControlRenderer.d.ts.map +1 -0
- package/dist/controls/ControlRenderer.js +106 -0
- package/dist/controls/ControlRenderer.js.map +1 -0
- package/dist/controls/CropControl.d.ts +2 -0
- package/dist/controls/CropControl.d.ts.map +1 -0
- package/dist/controls/CropControl.js +177 -0
- package/dist/controls/CropControl.js.map +1 -0
- package/dist/controls/EffectsStack.d.ts +8 -0
- package/dist/controls/EffectsStack.d.ts.map +1 -0
- package/dist/controls/EffectsStack.js +89 -0
- package/dist/controls/EffectsStack.js.map +1 -0
- package/dist/controls/GradeControl.d.ts +2 -0
- package/dist/controls/GradeControl.d.ts.map +1 -0
- package/dist/controls/GradeControl.js +120 -0
- package/dist/controls/GradeControl.js.map +1 -0
- package/dist/controls/KeyframeDiamond.d.ts +11 -0
- package/dist/controls/KeyframeDiamond.d.ts.map +1 -0
- package/dist/controls/KeyframeDiamond.js +87 -0
- package/dist/controls/KeyframeDiamond.js.map +1 -0
- package/dist/controls/LightingControls.d.ts +24 -0
- package/dist/controls/LightingControls.d.ts.map +1 -0
- package/dist/controls/LightingControls.js +108 -0
- package/dist/controls/LightingControls.js.map +1 -0
- package/dist/controls/ShapePresetControl.d.ts +4 -0
- package/dist/controls/ShapePresetControl.d.ts.map +1 -0
- package/dist/controls/ShapePresetControl.js +30 -0
- package/dist/controls/ShapePresetControl.js.map +1 -0
- package/dist/controls/ValueField.d.ts +10 -0
- package/dist/controls/ValueField.d.ts.map +1 -0
- package/dist/controls/ValueField.js +158 -0
- package/dist/controls/ValueField.js.map +1 -0
- package/dist/controls/VolumeControl.d.ts +10 -0
- package/dist/controls/VolumeControl.d.ts.map +1 -0
- package/dist/controls/VolumeControl.js +75 -0
- package/dist/controls/VolumeControl.js.map +1 -0
- package/dist/controls/compound.d.ts +46 -0
- package/dist/controls/compound.d.ts.map +1 -0
- package/dist/controls/compound.js +160 -0
- package/dist/controls/compound.js.map +1 -0
- package/dist/controls/layout.d.ts +38 -0
- package/dist/controls/layout.d.ts.map +1 -0
- package/dist/controls/layout.js +162 -0
- package/dist/controls/layout.js.map +1 -0
- package/dist/controls/primitives.d.ts +83 -0
- package/dist/controls/primitives.d.ts.map +1 -0
- package/dist/controls/primitives.js +194 -0
- package/dist/controls/primitives.js.map +1 -0
- package/dist/controls/transcribe.worker.d.ts +2 -0
- package/dist/controls/transcribe.worker.d.ts.map +1 -0
- package/dist/controls/transcribe.worker.js +22 -0
- package/dist/controls/transcribe.worker.js.map +1 -0
- package/dist/frame/AddElementBar.d.ts +2 -0
- package/dist/frame/AddElementBar.d.ts.map +1 -0
- package/dist/frame/AddElementBar.js +103 -0
- package/dist/frame/AddElementBar.js.map +1 -0
- package/dist/frame/Breadcrumbs.d.ts +2 -0
- package/dist/frame/Breadcrumbs.d.ts.map +1 -0
- package/dist/frame/Breadcrumbs.js +32 -0
- package/dist/frame/Breadcrumbs.js.map +1 -0
- package/dist/frame/GroupFlash.d.ts +2 -0
- package/dist/frame/GroupFlash.d.ts.map +1 -0
- package/dist/frame/GroupFlash.js +65 -0
- package/dist/frame/GroupFlash.js.map +1 -0
- package/dist/frame/Resizable.d.ts +12 -0
- package/dist/frame/Resizable.d.ts.map +1 -0
- package/dist/frame/Resizable.js +37 -0
- package/dist/frame/Resizable.js.map +1 -0
- package/dist/frame/Section.d.ts +23 -0
- package/dist/frame/Section.d.ts.map +1 -0
- package/dist/frame/Section.js +23 -0
- package/dist/frame/Section.js.map +1 -0
- package/dist/frame/ZoomControl.d.ts +9 -0
- package/dist/frame/ZoomControl.d.ts.map +1 -0
- package/dist/frame/ZoomControl.js +15 -0
- package/dist/frame/ZoomControl.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/camera-gizmo.d.ts +15 -0
- package/dist/lib/camera-gizmo.d.ts.map +1 -0
- package/dist/lib/camera-gizmo.js +57 -0
- package/dist/lib/camera-gizmo.js.map +1 -0
- package/dist/lib/camera-tool.d.ts +43 -0
- package/dist/lib/camera-tool.d.ts.map +1 -0
- package/dist/lib/camera-tool.js +80 -0
- package/dist/lib/camera-tool.js.map +1 -0
- package/dist/lib/caption-segments.d.ts +17 -0
- package/dist/lib/caption-segments.d.ts.map +1 -0
- package/dist/lib/caption-segments.js +50 -0
- package/dist/lib/caption-segments.js.map +1 -0
- package/dist/lib/group.d.ts +12 -0
- package/dist/lib/group.d.ts.map +1 -0
- package/dist/lib/group.js +61 -0
- package/dist/lib/group.js.map +1 -0
- package/dist/lib/keyframes.d.ts +29 -0
- package/dist/lib/keyframes.d.ts.map +1 -0
- package/dist/lib/keyframes.js +92 -0
- package/dist/lib/keyframes.js.map +1 -0
- package/dist/lib/sfx-preview.d.ts +18 -0
- package/dist/lib/sfx-preview.d.ts.map +1 -0
- package/dist/lib/sfx-preview.js +74 -0
- package/dist/lib/sfx-preview.js.map +1 -0
- package/dist/lib/shape-presets.d.ts +35 -0
- package/dist/lib/shape-presets.d.ts.map +1 -0
- package/dist/lib/shape-presets.js +81 -0
- package/dist/lib/shape-presets.js.map +1 -0
- package/dist/lib/ungroup.d.ts +12 -0
- package/dist/lib/ungroup.d.ts.map +1 -0
- package/dist/lib/ungroup.js +40 -0
- package/dist/lib/ungroup.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/panels/AssetsPanel.d.ts +2 -0
- package/dist/panels/AssetsPanel.d.ts.map +1 -0
- package/dist/panels/AssetsPanel.js +108 -0
- package/dist/panels/AssetsPanel.js.map +1 -0
- package/dist/panels/InspectorPanel.d.ts +2 -0
- package/dist/panels/InspectorPanel.d.ts.map +1 -0
- package/dist/panels/InspectorPanel.js +286 -0
- package/dist/panels/InspectorPanel.js.map +1 -0
- package/dist/panels/InterpolationPanel.d.ts +2 -0
- package/dist/panels/InterpolationPanel.d.ts.map +1 -0
- package/dist/panels/InterpolationPanel.js +226 -0
- package/dist/panels/InterpolationPanel.js.map +1 -0
- package/dist/panels/LayersTree.d.ts +4 -0
- package/dist/panels/LayersTree.d.ts.map +1 -0
- package/dist/panels/LayersTree.js +137 -0
- package/dist/panels/LayersTree.js.map +1 -0
- package/dist/panels/LeftRail.d.ts +6 -0
- package/dist/panels/LeftRail.d.ts.map +1 -0
- package/dist/panels/LeftRail.js +35 -0
- package/dist/panels/LeftRail.js.map +1 -0
- package/dist/panels/SourcePanel.d.ts +2 -0
- package/dist/panels/SourcePanel.d.ts.map +1 -0
- package/dist/panels/SourcePanel.js +470 -0
- package/dist/panels/SourcePanel.js.map +1 -0
- package/dist/panels/TimelinePanel.d.ts +11 -0
- package/dist/panels/TimelinePanel.d.ts.map +1 -0
- package/dist/panels/TimelinePanel.js +98 -0
- package/dist/panels/TimelinePanel.js.map +1 -0
- package/dist/panels/assets/SfxBrowser.d.ts +2 -0
- package/dist/panels/assets/SfxBrowser.d.ts.map +1 -0
- package/dist/panels/assets/SfxBrowser.js +49 -0
- package/dist/panels/assets/SfxBrowser.js.map +1 -0
- package/dist/panels/assets/use-assets.d.ts +11 -0
- package/dist/panels/assets/use-assets.d.ts.map +1 -0
- package/dist/panels/assets/use-assets.js +84 -0
- package/dist/panels/assets/use-assets.js.map +1 -0
- package/dist/panels/assets/use-sfx.d.ts +6 -0
- package/dist/panels/assets/use-sfx.d.ts.map +1 -0
- package/dist/panels/assets/use-sfx.js +47 -0
- package/dist/panels/assets/use-sfx.js.map +1 -0
- package/dist/panels/timeline/CanvasTimeline.d.ts +7 -0
- package/dist/panels/timeline/CanvasTimeline.d.ts.map +1 -0
- package/dist/panels/timeline/CanvasTimeline.js +1536 -0
- package/dist/panels/timeline/CanvasTimeline.js.map +1 -0
- package/dist/panels/timeline/Clip.d.ts +37 -0
- package/dist/panels/timeline/Clip.d.ts.map +1 -0
- package/dist/panels/timeline/Clip.js +176 -0
- package/dist/panels/timeline/Clip.js.map +1 -0
- package/dist/panels/timeline/CurveEditor.d.ts +2 -0
- package/dist/panels/timeline/CurveEditor.d.ts.map +1 -0
- package/dist/panels/timeline/CurveEditor.js +233 -0
- package/dist/panels/timeline/CurveEditor.js.map +1 -0
- package/dist/panels/timeline/MixerRail.d.ts +7 -0
- package/dist/panels/timeline/MixerRail.d.ts.map +1 -0
- package/dist/panels/timeline/MixerRail.js +295 -0
- package/dist/panels/timeline/MixerRail.js.map +1 -0
- package/dist/panels/timeline/Waveform.d.ts +11 -0
- package/dist/panels/timeline/Waveform.d.ts.map +1 -0
- package/dist/panels/timeline/Waveform.js +63 -0
- package/dist/panels/timeline/Waveform.js.map +1 -0
- package/dist/panels/timeline/clip-style.d.ts +10 -0
- package/dist/panels/timeline/clip-style.d.ts.map +1 -0
- package/dist/panels/timeline/clip-style.js +20 -0
- package/dist/panels/timeline/clip-style.js.map +1 -0
- package/dist/panels/timeline/filmstrip.d.ts +7 -0
- package/dist/panels/timeline/filmstrip.d.ts.map +1 -0
- package/dist/panels/timeline/filmstrip.js +135 -0
- package/dist/panels/timeline/filmstrip.js.map +1 -0
- package/dist/panels/timeline/timeline-layout.d.ts +65 -0
- package/dist/panels/timeline/timeline-layout.d.ts.map +1 -0
- package/dist/panels/timeline/timeline-layout.js +118 -0
- package/dist/panels/timeline/timeline-layout.js.map +1 -0
- package/dist/types.d.ts +68 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -0
- package/src/styles.css +185 -0
package/dist/commands.js
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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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"}
|