@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,233 @@
1
+ // Curve editor (EDITORS B7) — the design-refs Interpolation panel: a
2
+ // value-vs-time graph of ONE animated property. Strictly a VIEW of
3
+ // `keyframe_animations` (D4): points drag time+value, each segment's
4
+ // easing edits as Hold / Linear / a named preset / Custom
5
+ // cubic-bezier with draggable handles — everything written back as
6
+ // plain protocol keyframes. The drawn curve IS the render: segments
7
+ // sample the runtime's normative applyEasing.
8
+ 'use client';
9
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
10
+ import { useMemo, useRef, useState } from 'react';
11
+ import { applyEasing } from '@clipkit/runtime';
12
+ import { useEditor, useEditorStore } from '@clipkit/editor-core';
13
+ import { cn } from '../../lib/utils.js';
14
+ const PAD_X = 36;
15
+ const PAD_Y = 14;
16
+ const NAMED_PRESETS = [
17
+ 'linear', 'ease', 'ease-in', 'ease-out', 'ease-in-out',
18
+ 'ease-in-cubic', 'ease-out-cubic', 'ease-in-out-cubic',
19
+ 'ease-out-quart', 'ease-out-expo', 'ease-out-back', 'spring',
20
+ 'elastic-out', 'bounce-out',
21
+ ];
22
+ const DEFAULT_BEZIER = [0.42, 0, 0.58, 1];
23
+ export function CurveEditor() {
24
+ const actions = useEditor();
25
+ const source = useEditorStore((s) => s.source);
26
+ const target = useEditorStore((s) => s.ui.curveTarget);
27
+ const [selectedSeg, setSelectedSeg] = useState(0);
28
+ const svgRef = useRef(null);
29
+ const el = target ? findById(source.elements, target.elementId) : null;
30
+ const animIndex = el?.keyframe_animations?.findIndex((a) => a.property === target?.property) ?? -1;
31
+ const anim = animIndex >= 0 ? el.keyframe_animations[animIndex] : null;
32
+ const kfs = useMemo(() => (anim?.keyframes ?? [])
33
+ .map((k) => ({
34
+ time: numOf(k.time),
35
+ value: typeof k.value === 'number' ? k.value : 0,
36
+ easing: k.easing,
37
+ raw: k,
38
+ }))
39
+ .filter((k) => typeof k.raw.value === 'number'), [anim]);
40
+ if (!target || !el || !anim || kfs.length === 0)
41
+ return null;
42
+ const scalar = kfs.length === (anim.keyframes?.length ?? 0);
43
+ // ── Graph space ────────────────────────────────────────────────────
44
+ const t0 = kfs[0].time;
45
+ const t1 = Math.max(kfs[kfs.length - 1].time, t0 + 0.001);
46
+ let vMin = Math.min(...kfs.map((k) => k.value));
47
+ let vMax = Math.max(...kfs.map((k) => k.value));
48
+ if (vMax - vMin < 1e-9) {
49
+ vMin -= 1;
50
+ vMax += 1;
51
+ }
52
+ const span = vMax - vMin;
53
+ vMin -= span * 0.12;
54
+ vMax += span * 0.12;
55
+ const W = 560;
56
+ const H = 168;
57
+ const gx = (t) => PAD_X + ((t - t0) / (t1 - t0)) * (W - PAD_X * 2);
58
+ const gy = (v) => H - PAD_Y - ((v - vMin) / (vMax - vMin)) * (H - PAD_Y * 2);
59
+ const fromGx = (x) => t0 + ((x - PAD_X) / (W - PAD_X * 2)) * (t1 - t0);
60
+ const fromGy = (y) => vMin + ((H - PAD_Y - y) / (H - PAD_Y * 2)) * (vMax - vMin);
61
+ // ── Write-back (whole keyframe array, one undo step per gesture) ──
62
+ const writeKeyframes = (next, live) => {
63
+ const nextAnims = el.keyframe_animations.map((a, i) => i === animIndex ? { ...a, keyframes: next } : a);
64
+ if (live) {
65
+ actions.moveElements([{ id: el.id, patch: { keyframe_animations: nextAnims } }], { skipHistory: true });
66
+ }
67
+ else {
68
+ actions.updateElement(el.id, {
69
+ keyframe_animations: nextAnims,
70
+ });
71
+ }
72
+ };
73
+ const dragPoint = (e, ki) => {
74
+ if (e.button !== 0)
75
+ return;
76
+ e.preventDefault();
77
+ const svg = svgRef.current;
78
+ if (!svg)
79
+ return;
80
+ const rect = svg.getBoundingClientRect();
81
+ let started = false;
82
+ const onMove = (ev) => {
83
+ if (!started) {
84
+ started = true;
85
+ actions.pushHistory();
86
+ actions.setInteractive(true);
87
+ }
88
+ const x = ((ev.clientX - rect.left) / rect.width) * W;
89
+ const y = ((ev.clientY - rect.top) / rect.height) * H;
90
+ const nt = Math.max(0, round3(fromGx(x)));
91
+ const nv = round3(fromGy(y));
92
+ const next = anim.keyframes.map((k, i) => i === ki ? { ...k, time: nt, value: nv } : k);
93
+ writeKeyframes(next, true);
94
+ };
95
+ const onUp = () => {
96
+ window.removeEventListener('mousemove', onMove);
97
+ window.removeEventListener('mouseup', onUp);
98
+ if (started) {
99
+ // Keep keyframes monotonic after a horizontal drag.
100
+ writeKeyframes([...anim.keyframes].sort(byTime), true);
101
+ actions.flushPendingSource();
102
+ actions.setInteractive(false);
103
+ }
104
+ };
105
+ window.addEventListener('mousemove', onMove);
106
+ window.addEventListener('mouseup', onUp);
107
+ };
108
+ // ── Segment easing controls ────────────────────────────────────────
109
+ const seg = Math.max(0, Math.min(selectedSeg, kfs.length - 2));
110
+ const segB = kfs[seg + 1] ?? null;
111
+ const segEasing = segB?.easing;
112
+ const bez = parseBezier(typeof segEasing === 'string' ? segEasing : undefined);
113
+ const mode = typeof segEasing === 'string' && segEasing.startsWith('steps')
114
+ ? 'hold'
115
+ : bez
116
+ ? 'custom'
117
+ : 'named';
118
+ const setSegEasing = (easing) => {
119
+ const targetIndex = anim.keyframes.indexOf(kfs[seg + 1].raw);
120
+ if (targetIndex < 0)
121
+ return;
122
+ const next = anim.keyframes.map((k, i) => i === targetIndex ? { ...k, easing: easing } : k);
123
+ writeKeyframes(next, false);
124
+ };
125
+ // Sample each segment through the NORMATIVE evaluator.
126
+ const segmentPath = (a, b) => {
127
+ const STEPS = 36;
128
+ let d = `M ${gx(a.time)} ${gy(a.value)}`;
129
+ for (let i = 1; i <= STEPS; i++) {
130
+ const p = i / STEPS;
131
+ const eased = applyEasing(b.easing, p);
132
+ d += ` L ${gx(a.time + (b.time - a.time) * p)} ${gy(a.value + (b.value - a.value) * eased)}`;
133
+ }
134
+ return d;
135
+ };
136
+ // Bezier handle positions for the selected custom segment.
137
+ const segA = kfs[seg];
138
+ const handles = mode === 'custom' && bez && segB
139
+ ? {
140
+ h1: { x: gx(segA.time + (segB.time - segA.time) * bez[0]), y: gy(segA.value + (segB.value - segA.value) * bez[1]) },
141
+ h2: { x: gx(segA.time + (segB.time - segA.time) * bez[2]), y: gy(segA.value + (segB.value - segA.value) * bez[3]) },
142
+ }
143
+ : null;
144
+ const dragHandle = (e, which) => {
145
+ if (e.button !== 0 || !segB || !bez)
146
+ return;
147
+ e.preventDefault();
148
+ const svg = svgRef.current;
149
+ if (!svg)
150
+ return;
151
+ const rect = svg.getBoundingClientRect();
152
+ let started = false;
153
+ const onMove = (ev) => {
154
+ if (!started) {
155
+ started = true;
156
+ actions.pushHistory();
157
+ actions.setInteractive(true);
158
+ }
159
+ const x = ((ev.clientX - rect.left) / rect.width) * W;
160
+ const y = ((ev.clientY - rect.top) / rect.height) * H;
161
+ const px = clamp01((fromGx(x) - segA.time) / Math.max(1e-6, segB.time - segA.time));
162
+ const py = (fromGy(y) - segA.value) / (Math.abs(segB.value - segA.value) < 1e-9 ? 1 : segB.value - segA.value);
163
+ const next = [...bez];
164
+ if (which === 1) {
165
+ next[0] = round2(px);
166
+ next[1] = round2(py);
167
+ }
168
+ else {
169
+ next[2] = round2(px);
170
+ next[3] = round2(py);
171
+ }
172
+ const targetIndex = anim.keyframes.indexOf(segB.raw);
173
+ const nextKfs = anim.keyframes.map((k, i) => i === targetIndex
174
+ ? { ...k, easing: `cubic-bezier(${next.join(', ')})` }
175
+ : k);
176
+ writeKeyframes(nextKfs, true);
177
+ };
178
+ const onUp = () => {
179
+ window.removeEventListener('mousemove', onMove);
180
+ window.removeEventListener('mouseup', onUp);
181
+ if (started) {
182
+ actions.flushPendingSource();
183
+ actions.setInteractive(false);
184
+ }
185
+ };
186
+ window.addEventListener('mousemove', onMove);
187
+ window.addEventListener('mouseup', onUp);
188
+ };
189
+ return (_jsxs("div", { className: "shrink-0 border-t border-border bg-background", children: [_jsxs("div", { className: "flex items-center gap-2 h-8 px-3 border-b border-border/60", children: [_jsxs("span", { className: "text-[11px] font-medium", children: [el.name ?? el.id, " \u00B7 ", _jsx("span", { className: "font-mono", children: anim.property })] }), !scalar && (_jsx("span", { className: "text-[10px] text-muted-foreground italic", children: "non-scalar keyframes shown as points only" })), _jsx("span", { className: "flex-1" }), _jsx("div", { className: "flex items-center gap-0.5 text-[10px]", children: ['hold', 'named', 'custom'].map((m) => (_jsx("button", { type: "button", className: cn('h-5 px-2 rounded transition', mode === m
190
+ ? 'bg-card text-foreground ring-1 ring-border'
191
+ : 'text-muted-foreground hover:text-foreground'), onClick: () => {
192
+ if (m === 'hold')
193
+ setSegEasing('steps(1)');
194
+ else if (m === 'named')
195
+ setSegEasing('ease-out');
196
+ else
197
+ setSegEasing(`cubic-bezier(${DEFAULT_BEZIER.join(', ')})`);
198
+ }, children: m === 'hold' ? 'Hold' : m === 'named' ? 'Ease' : 'Custom' }, m))) }), mode === 'named' && (_jsx("select", { className: "h-5 bg-transparent border border-border rounded px-1 text-[10px] text-foreground outline-none", value: typeof segEasing === 'string' ? segEasing : 'linear', onChange: (e) => setSegEasing(e.target.value), children: NAMED_PRESETS.map((n) => (_jsx("option", { value: n, children: n }, n))) })), mode === 'custom' && bez && (_jsx("span", { className: "font-mono text-[10px] text-muted-foreground tabular-nums", children: bez.map((v) => v.toFixed(2)).join(', ') })), _jsx("button", { type: "button", className: "w-5 h-5 grid place-items-center text-muted-foreground hover:text-foreground", onClick: () => actions.setUiState({ curveTarget: null }), "aria-label": "Close curve editor", children: "\u00D7" })] }), _jsxs("svg", { ref: svgRef, viewBox: `0 0 ${W} ${H}`, className: "w-full", style: { height: H }, children: [[0, 0.5, 1].map((f) => {
199
+ const v = vMin + (vMax - vMin) * f;
200
+ return (_jsxs("g", { children: [_jsx("line", { x1: PAD_X, x2: W - PAD_X, y1: gy(v), y2: gy(v), stroke: "var(--color-border)", strokeOpacity: 0.4 }), _jsx("text", { x: 4, y: gy(v) + 3, fontSize: 8, fill: "var(--color-muted-foreground)", fontFamily: "monospace", children: round2(v) })] }, f));
201
+ }), kfs.slice(0, -1).map((a, i) => (_jsx("path", { d: segmentPath(a, kfs[i + 1]), fill: "none", stroke: i === seg ? 'var(--color-primary)' : 'var(--color-muted-foreground)', strokeWidth: i === seg ? 1.6 : 1.1, strokeOpacity: i === seg ? 1 : 0.6, className: "cursor-pointer", onClick: () => setSelectedSeg(i) }, i))), handles && segB && (_jsxs("g", { children: [_jsx("line", { x1: gx(segA.time), y1: gy(segA.value), x2: handles.h1.x, y2: handles.h1.y, stroke: "var(--color-primary)", strokeOpacity: 0.5 }), _jsx("line", { x1: gx(segB.time), y1: gy(segB.value), x2: handles.h2.x, y2: handles.h2.y, stroke: "var(--color-primary)", strokeOpacity: 0.5 }), _jsx("circle", { cx: handles.h1.x, cy: handles.h1.y, r: 3.5, fill: "var(--color-primary)", className: "cursor-grab", onMouseDown: (e) => dragHandle(e, 1) }), _jsx("circle", { cx: handles.h2.x, cy: handles.h2.y, r: 3.5, fill: "var(--color-primary)", className: "cursor-grab", onMouseDown: (e) => dragHandle(e, 2) })] })), kfs.map((k, i) => (_jsxs("g", { children: [_jsx("rect", { x: gx(k.time) - 3.5, y: gy(k.value) - 3.5, width: 7, height: 7, transform: `rotate(45 ${gx(k.time)} ${gy(k.value)})`, fill: "var(--color-primary)", stroke: "var(--color-background)", className: "cursor-move", onMouseDown: (e) => dragPoint(e, anim.keyframes.indexOf(k.raw)) }), _jsxs("text", { x: gx(k.time), y: H - 2, fontSize: 8, textAnchor: "middle", fill: "var(--color-muted-foreground)", fontFamily: "monospace", children: [round2(k.time), "s"] })] }, i)))] })] }));
202
+ }
203
+ // ── helpers ──────────────────────────────────────────────────────────
204
+ function findById(elements, id) {
205
+ for (const el of elements) {
206
+ if (el.id === id)
207
+ return el;
208
+ if (el.type === 'group') {
209
+ const nested = findById(el.elements, id);
210
+ if (nested)
211
+ return nested;
212
+ }
213
+ }
214
+ return null;
215
+ }
216
+ function parseBezier(easing) {
217
+ if (!easing)
218
+ return null;
219
+ const m = easing.match(/^cubic-bezier\(\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*,\s*(-?[\d.]+)\s*\)$/);
220
+ if (!m)
221
+ return null;
222
+ return [parseFloat(m[1]), parseFloat(m[2]), parseFloat(m[3]), parseFloat(m[4])];
223
+ }
224
+ function byTime(a, b) {
225
+ return numOf(a.time) - numOf(b.time);
226
+ }
227
+ function numOf(v) {
228
+ return typeof v === 'number' ? v : parseFloat(v) || 0;
229
+ }
230
+ const clamp01 = (v) => Math.max(0, Math.min(1, v));
231
+ const round2 = (v) => Math.round(v * 100) / 100;
232
+ const round3 = (v) => Math.round(v * 1000) / 1000;
233
+ //# sourceMappingURL=CurveEditor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CurveEditor.js","sourceRoot":"","sources":["../../../src/panels/timeline/CurveEditor.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function MixerRail({ open, onToggle, }: {
2
+ /** Collapsed = just the Master meter. Owned by TimelinePanel so the
3
+ transport's fader button and the Master strip stay in sync. */
4
+ open: boolean;
5
+ onToggle: () => void;
6
+ }): import("react").JSX.Element;
7
+ //# sourceMappingURL=MixerRail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MixerRail.d.ts","sourceRoot":"","sources":["../../../src/panels/timeline/MixerRail.tsx"],"names":[],"mappings":"AAyEA,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,QAAQ,GACT,EAAE;IACD;sEACkE;IAClE,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,+BAyOA"}
@@ -0,0 +1,295 @@
1
+ // Mixer dock (EDITORS B6, re-ruled by Ian) — docked RIGHT of the timeline at
2
+ // timeline height. Collapsed = a thin Master meter; clicking Master expands
3
+ // the per-LAYER channel strips. Each strip is a pro-style channel: a dB volume
4
+ // FADER, a shared dB scale, and a STEREO (L/R) level meter — three separate
5
+ // things, never the old merged bar. Expanded width is drag-resizable from the
6
+ // left edge so the mixer can grow to overtake the timeline.
7
+ //
8
+ // The lens rule, enforced: VOLUME edits the document (element.volume via
9
+ // updateElement); MUTE/SOLO are preview-only (per-element gains pushed to the
10
+ // engine, never serialized). The dB readout/scale are display-only — volume is
11
+ // still stored as the linear 0..100(+) value, so nothing here touches the
12
+ // protocol. Meters poll engine.getAudioLevels() on rAF, painted out-of-band
13
+ // (no React re-render per frame).
14
+ 'use client';
15
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
16
+ import { useEffect, useMemo, useRef, useState } from 'react';
17
+ import { useEditor, useEditorContext, useEditorStore } from '@clipkit/editor-core';
18
+ import { cn } from '../../lib/utils.js';
19
+ const COLLAPSED_W = 40;
20
+ const STRIP_W = 88;
21
+ // dB scale shared by the fader and the meter. 0 dB = unity (volume 100); the
22
+ // top is +12 dB (~400%, Ian's call); the very bottom is -∞ (silence). FLOOR_DB
23
+ // is the position the -∞ end maps to — peaks/volumes below it sit at the bottom.
24
+ const TOP_DB = 12;
25
+ const FLOOR_DB = -48;
26
+ const DB_RANGE = TOP_DB - FLOOR_DB;
27
+ // Labelled gridlines (no '+' on the scale; the readout up top carries the sign).
28
+ const SCALE_TICKS = [12, 6, 0, -6, -12, -18, -24, -30, -36];
29
+ // Fader ruler ticks every 3 dB; the SCALE_TICKS ones are drawn longer.
30
+ const FADER_TICKS = (() => {
31
+ const out = [];
32
+ for (let d = TOP_DB; d >= -36; d -= 3)
33
+ out.push(d);
34
+ return out;
35
+ })();
36
+ // Meter colour zones, in dB: green ≤ -6, amber -6..0, red > 0 (over 0 dBFS).
37
+ const AMBER_DB = -6;
38
+ const RED_DB = 0;
39
+ // Peak-hold cap fall per frame, as a fraction of bar height (~slow decay).
40
+ const PEAK_DECAY = 0.004;
41
+ const GREEN = 'oklch(0.7 0.17 150)';
42
+ const AMBER = 'oklch(0.78 0.16 80)';
43
+ const clamp01 = (x) => Math.max(0, Math.min(1, x));
44
+ /** Fraction up the bar (0 = bottom, 1 = top) for a dB value. */
45
+ const fracFromDb = (db) => clamp01((db - FLOOR_DB) / DB_RANGE);
46
+ /** dB for a linear peak amplitude (0 → -∞). */
47
+ const dbFromPeak = (p) => (p > 0 ? 20 * Math.log10(p) : -Infinity);
48
+ /** Volume % → dB (0 dB = unity = 100%). */
49
+ const dbFromVol = (vol) => (vol > 0 ? 20 * Math.log10(vol / 100) : -Infinity);
50
+ /** dB → volume %. */
51
+ const volFromDb = (db) => 100 * Math.pow(10, db / 20);
52
+ /** Max volume the fader reaches (+12 dB ≈ 398%). */
53
+ const MAX_VOL = Math.round(volFromDb(TOP_DB));
54
+ /** Format a volume as a dB readout: "+3 dB", "-5 dB", "0 dB", "-∞". */
55
+ function fmtDb(vol) {
56
+ if (vol <= 0)
57
+ return '-∞';
58
+ const db = Math.round(dbFromVol(vol));
59
+ return db > 0 ? `+${db} dB` : `${db} dB`;
60
+ }
61
+ export function MixerRail({ open, onToggle, }) {
62
+ const { engine } = useEditorContext();
63
+ const actions = useEditor();
64
+ const source = useEditorStore((s) => s.source);
65
+ // Preview-only state (never serialized — the lens rule).
66
+ const mutedArr = useEditorStore((s) => s.ui.audioMuted);
67
+ const soloArr = useEditorStore((s) => s.ui.audioSolo);
68
+ const muted = useMemo(() => new Set(mutedArr), [mutedArr]);
69
+ const solo = useMemo(() => new Set(soloArr), [soloArr]);
70
+ const setMuted = (next) => actions.setUiState({ audioMuted: [...next] });
71
+ const setSolo = (next) => actions.setUiState({ audioSolo: [...next] });
72
+ const audioEls = useMemo(() => source.elements.filter((el) => (el.type === 'audio' || el.type === 'video') && !!el.id), [source]);
73
+ // One strip per LAYER (like a pro mixer), grouped by the `layer` integer —
74
+ // not one strip per clip. A layer's M/S govern every clip on it; the meter
75
+ // shows the loudest member. Layer volume binds to the clip when a layer has
76
+ // exactly one (the common case); multi-clip layers edit volume per clip in
77
+ // the inspector (no layer-gain concept — that would need the protocol).
78
+ const layerGroups = useMemo(() => {
79
+ const byLayer = new Map();
80
+ for (const el of audioEls) {
81
+ const layer = typeof el.layer === 'number' ? el.layer : 0;
82
+ let g = byLayer.get(layer);
83
+ if (!g) {
84
+ g = { layer, els: [], ids: [] };
85
+ byLayer.set(layer, g);
86
+ }
87
+ g.els.push(el);
88
+ g.ids.push(el.id);
89
+ }
90
+ return [...byLayer.values()].sort((a, b) => a.layer - b.layer);
91
+ }, [audioEls]);
92
+ // Effective preview gains: any solo ⇒ everything non-solo is silent;
93
+ // mute always silences. Pushed to the engine whenever state changes.
94
+ useEffect(() => {
95
+ if (!engine)
96
+ return;
97
+ const gains = {};
98
+ const soloing = solo.size > 0;
99
+ for (const el of audioEls) {
100
+ const id = el.id;
101
+ gains[id] = muted.has(id) || (soloing && !solo.has(id)) ? 0 : 1;
102
+ }
103
+ engine.setPreviewGains(gains);
104
+ }, [engine, audioEls, muted, solo]);
105
+ // Expanded width is drag-resizable (editor-only, lens rule). Null = the
106
+ // natural width (all strips + master, capped so it doesn't auto-overtake).
107
+ const [widthOverride, setWidthOverride] = useState(null);
108
+ const naturalW = (layerGroups.length + 1) * STRIP_W;
109
+ const expandedW = widthOverride ?? Math.min(naturalW, STRIP_W * 4.5);
110
+ const beginResize = (e) => {
111
+ e.preventDefault();
112
+ e.stopPropagation();
113
+ const startX = e.clientX;
114
+ const startW = expandedW;
115
+ const onMove = (ev) => {
116
+ // Handle is on the LEFT edge; dragging left grows the rail.
117
+ const next = Math.max(STRIP_W, Math.min(1400, startW + (startX - ev.clientX)));
118
+ setWidthOverride(next);
119
+ };
120
+ const onUp = () => {
121
+ window.removeEventListener('mousemove', onMove);
122
+ window.removeEventListener('mouseup', onUp);
123
+ };
124
+ window.addEventListener('mousemove', onMove);
125
+ window.addEventListener('mouseup', onUp);
126
+ };
127
+ const noAudio = audioEls.length === 0;
128
+ return (_jsxs("div", { className: "relative shrink-0 border-l border-border bg-background flex", style: { width: open ? expandedW : COLLAPSED_W }, children: [open && (_jsx("div", { className: "absolute left-0 top-0 bottom-0 w-1.5 -ml-0.5 z-20 cursor-col-resize hover:bg-border/80 transition-colors", onMouseDown: beginResize, title: "Drag to resize the mixer" })), _jsxs("div", { className: "flex-1 flex overflow-x-auto overflow-y-hidden", children: [open &&
129
+ layerGroups.map((g) => {
130
+ // Layer M/S act on every clip on the layer. The layer is "on" when
131
+ // all its clips are — single-clip layers are 1:1, so this reuses
132
+ // the per-element preview-gain effect unchanged.
133
+ const single = g.els.length === 1 ? g.els[0] : null;
134
+ const isMuted = g.ids.every((id) => muted.has(id));
135
+ const isSolo = g.ids.every((id) => solo.has(id));
136
+ const silenced = isMuted || (solo.size > 0 && !isSolo);
137
+ const vol = single && typeof single.volume === 'number' ? single.volume : 100;
138
+ return (_jsxs("div", { className: "flex flex-col items-stretch gap-1.5 px-2 pt-2 pb-2 border-r border-border/40 shrink-0", style: { width: STRIP_W }, children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("span", { className: "text-center text-[10px] font-mono tabular-nums rounded bg-field/70 px-1 py-0.5 text-foreground/85 truncate", title: single ? 'Volume (dB)' : `${g.els.length} clips`, children: single ? fmtDb(vol) : `${g.els.length}×` }), _jsxs("div", { className: "flex items-center justify-center gap-1", children: [_jsx(MixButton, { label: "Mute layer (preview-only)", active: isMuted, tone: "mute", onClick: () => setMuted(toggleAll(muted, g.ids, isMuted)), children: "M" }), _jsx(MixButton, { label: "Solo layer (preview-only)", active: isSolo, tone: "solo", onClick: () => setSolo(toggleAll(solo, g.ids, isSolo)), children: "S" })] })] }), _jsxs("div", { className: cn('flex-1 flex items-stretch justify-center gap-1 min-h-20 mt-3', silenced && 'opacity-50'), children: [_jsx(Fader, { value: vol, disabled: !single, onChange: single
139
+ ? (v, live) => {
140
+ if (live) {
141
+ actions.moveElements([{ id: single.id, patch: { volume: v } }], { skipHistory: true });
142
+ }
143
+ else {
144
+ actions.updateElement(single.id, { volume: v });
145
+ }
146
+ }
147
+ : undefined, onScrubStart: () => {
148
+ actions.pushHistory();
149
+ actions.setInteractive(true);
150
+ }, onScrubEnd: () => {
151
+ actions.flushPendingSource();
152
+ actions.setInteractive(false);
153
+ } }), _jsx(ScaleLabels, {}), _jsx(StereoMeter, { ids: g.ids })] }), _jsx("span", { className: "text-[9px] font-mono text-muted-foreground truncate text-center", title: single ? single.id : `Layer ${g.layer} · ${g.els.length} clips`, children: single ? (single.name ?? single.id) : `Layer ${g.layer}` })] }, g.layer));
154
+ }), _jsxs("button", { type: "button", disabled: noAudio, onClick: onToggle, "aria-expanded": open, "aria-label": open ? 'Collapse mixer' : 'Expand mixer', title: noAudio
155
+ ? 'No audio in this composition'
156
+ : open
157
+ ? 'Collapse mixer'
158
+ : `Expand mixer (${layerGroups.length} ${layerGroups.length === 1 ? 'layer' : 'layers'})`, className: cn('group flex flex-col items-stretch gap-1.5 px-2 pt-2 pb-2 shrink-0 transition-colors', !noAudio && 'hover:bg-card/60 cursor-pointer', noAudio && 'opacity-40 cursor-default'), style: { width: open ? STRIP_W : COLLAPSED_W }, children: [_jsx("span", { className: cn('font-mono text-muted-foreground group-hover:text-foreground transition-colors text-center', open ? 'text-[10px]' : 'text-[8px]'), children: open ? 'Master' : 'MIX' }), _jsxs("div", { className: "flex-1 flex items-stretch justify-center gap-1 min-h-20 mt-3", children: [open && _jsx(ScaleLabels, {}), _jsx(StereoMeter, { ids: "master" })] }), open && layerGroups.length > 0 && (_jsx("span", { className: "text-[8px] text-muted-foreground/60 tabular-nums text-center", children: layerGroups.length }))] })] })] }));
159
+ }
160
+ /** Flip a whole layer's clip ids on or off in the mute/solo set at once. */
161
+ function toggleAll(prev, ids, allOn) {
162
+ const next = new Set(prev);
163
+ for (const id of ids) {
164
+ if (allOn)
165
+ next.delete(id);
166
+ else
167
+ next.add(id);
168
+ }
169
+ return next;
170
+ }
171
+ /** Right-aligned dB gridline labels, positioned by dB. Shared between the
172
+ * fader (left) and the meter (right). */
173
+ function ScaleLabels() {
174
+ return (_jsxs("div", { className: "relative w-6 shrink-0 select-none", children: [SCALE_TICKS.map((t) => (_jsx("span", { className: "absolute right-0 text-[9px] font-mono leading-none tabular-nums text-muted-foreground/70", style: { top: `${(1 - fracFromDb(t)) * 100}%`, transform: 'translateY(-50%)' }, children: t }, t))), _jsx("span", { className: "absolute right-0 bottom-0 text-[9px] font-mono leading-none text-muted-foreground/40", children: "-\u221E" })] }));
175
+ }
176
+ /**
177
+ * Vertical dB volume fader: a dashed ruler with a white thumb. Position maps
178
+ * through dB (0 dB = unity), so the throw matches the meter beside it. The
179
+ * stored value stays linear %. Double-click resets to unity. Disabled (no
180
+ * thumb, no drag) for multi-clip layers.
181
+ */
182
+ function Fader({ value, disabled = false, onChange, onScrubStart, onScrubEnd, }) {
183
+ const trackRef = useRef(null);
184
+ const frac = value > 0 ? fracFromDb(dbFromVol(value)) : 0;
185
+ const begin = (e) => {
186
+ if (disabled || !onChange)
187
+ return;
188
+ const apply = onChange; // captured so the closures keep the narrowed type
189
+ e.preventDefault();
190
+ e.stopPropagation();
191
+ const track = trackRef.current;
192
+ if (!track)
193
+ return;
194
+ onScrubStart?.();
195
+ const rect = track.getBoundingClientRect();
196
+ const setFromY = (clientY) => {
197
+ const f = clamp01(1 - (clientY - rect.top) / rect.height); // 0 bottom .. 1 top
198
+ const vol = f <= 0.003 ? 0 : Math.min(MAX_VOL, Math.round(volFromDb(FLOOR_DB + f * DB_RANGE)));
199
+ apply(vol, true);
200
+ };
201
+ setFromY(e.clientY);
202
+ const onMove = (ev) => setFromY(ev.clientY);
203
+ const onUp = () => {
204
+ window.removeEventListener('mousemove', onMove);
205
+ window.removeEventListener('mouseup', onUp);
206
+ onScrubEnd?.();
207
+ };
208
+ window.addEventListener('mousemove', onMove);
209
+ window.addEventListener('mouseup', onUp);
210
+ };
211
+ const resetUnity = () => {
212
+ if (disabled || !onChange)
213
+ return;
214
+ onScrubStart?.();
215
+ onChange(100, false);
216
+ onScrubEnd?.();
217
+ };
218
+ return (_jsxs("div", { ref: trackRef, onMouseDown: begin, onDoubleClick: resetUnity, className: cn('relative w-4 shrink-0', disabled ? 'cursor-default' : 'cursor-ns-resize'), title: disabled
219
+ ? 'Multiple clips on this layer — set volume per clip in the inspector'
220
+ : `${fmtDb(value)} — drag · double-click for unity`, children: [FADER_TICKS.map((t) => (_jsx("div", { className: cn('absolute left-0 h-px pointer-events-none', SCALE_TICKS.includes(t) ? 'bg-muted-foreground/75' : 'bg-muted-foreground/35'), style: { top: `${(1 - fracFromDb(t)) * 100}%`, width: SCALE_TICKS.includes(t) ? '100%' : '55%' } }, t))), !disabled && (_jsx("div", { className: "absolute inset-x-0 h-2 rounded-[2px] bg-foreground shadow-sm pointer-events-none", style: { top: `${(1 - frac) * 100}%`, transform: 'translateY(-50%)' } }))] }));
221
+ }
222
+ /**
223
+ * Stereo (L/R) peak meter. `ids` = a layer's clip ids (max wins, the layer
224
+ * sum) or 'master' for the master bus. Each bar shows fixed green/amber/red
225
+ * zones revealed up to the live level, plus a falling peak-hold cap. Painted
226
+ * out-of-band on rAF (no React re-render per frame).
227
+ */
228
+ function StereoMeter({ ids }) {
229
+ const { engine } = useEditorContext();
230
+ const lCover = useRef(null);
231
+ const rCover = useRef(null);
232
+ const lCap = useRef(null);
233
+ const rCap = useRef(null);
234
+ const key = ids === 'master' ? 'master' : ids.join(',');
235
+ useEffect(() => {
236
+ if (!engine)
237
+ return;
238
+ let raf = 0;
239
+ let lHold = 0;
240
+ let rHold = 0;
241
+ const idList = ids === 'master' ? null : key ? key.split(',') : [];
242
+ const apply = (cover, cap, peak, hold) => {
243
+ const lf = fracFromDb(dbFromPeak(peak));
244
+ if (cover)
245
+ cover.style.height = `${(1 - lf) * 100}%`;
246
+ const next = Math.max(lf, hold - PEAK_DECAY);
247
+ if (cap) {
248
+ cap.style.bottom = `${next * 100}%`;
249
+ cap.style.opacity = next > 0.02 ? '1' : '0';
250
+ }
251
+ return next;
252
+ };
253
+ const paint = () => {
254
+ const levels = engine.getAudioLevels();
255
+ let l = 0;
256
+ let r = 0;
257
+ if (idList === null) {
258
+ l = levels.master.l;
259
+ r = levels.master.r;
260
+ }
261
+ else {
262
+ for (const id of idList) {
263
+ const p = levels.elements[id];
264
+ if (p) {
265
+ if (p.l > l)
266
+ l = p.l;
267
+ if (p.r > r)
268
+ r = p.r;
269
+ }
270
+ }
271
+ }
272
+ lHold = apply(lCover.current, lCap.current, l, lHold);
273
+ rHold = apply(rCover.current, rCap.current, r, rHold);
274
+ raf = requestAnimationFrame(paint);
275
+ };
276
+ paint();
277
+ return () => cancelAnimationFrame(raf);
278
+ }, [engine, key]);
279
+ return (_jsxs("div", { className: "flex items-stretch gap-px shrink-0", children: [_jsx(MeterBar, { coverRef: lCover, capRef: lCap }), _jsx(MeterBar, { coverRef: rCover, capRef: rCap })] }));
280
+ }
281
+ /** One meter channel: fixed colour zones + a cover that hides everything above
282
+ * the live level + a peak-hold cap. The refs are driven by StereoMeter's rAF. */
283
+ function MeterBar({ coverRef, capRef, }) {
284
+ const amber = fracFromDb(AMBER_DB);
285
+ const red = fracFromDb(RED_DB);
286
+ return (_jsxs("div", { className: "relative w-[5px] min-h-20 rounded-[1px] overflow-hidden bg-field border border-border/50", children: [_jsx("div", { className: "absolute bottom-0 inset-x-0", style: { height: `${amber * 100}%`, background: GREEN } }), _jsx("div", { className: "absolute inset-x-0", style: { bottom: `${amber * 100}%`, height: `${(red - amber) * 100}%`, background: AMBER } }), _jsx("div", { className: "absolute top-0 inset-x-0", style: { height: `${(1 - red) * 100}%`, background: 'var(--color-destructive)' } }), _jsx("div", { ref: coverRef, className: "absolute top-0 inset-x-0 bg-field", style: { height: '100%' } }), _jsx("div", { ref: capRef, className: "absolute inset-x-0 h-px bg-foreground", style: { bottom: '0%', opacity: 0 } })] }));
287
+ }
288
+ function MixButton({ label, active, tone, onClick, children, }) {
289
+ return (_jsx("button", { type: "button", className: cn('w-6 h-5 grid place-items-center rounded text-[10px] font-bold transition shrink-0 border', active
290
+ ? tone === 'mute'
291
+ ? 'border-transparent text-black'
292
+ : 'border-transparent bg-primary text-primary-foreground'
293
+ : 'border-border bg-foreground/10 text-foreground/70 hover:bg-foreground/25 hover:text-foreground'), style: active && tone === 'mute' ? { background: AMBER } : undefined, title: label, "aria-pressed": active, onClick: onClick, children: children }));
294
+ }
295
+ //# sourceMappingURL=MixerRail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MixerRail.js","sourceRoot":"","sources":["../../../src/panels/timeline/MixerRail.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function Waveform({ url, trimStart, mediaWindow, color, className, }: {
2
+ url: string;
3
+ /** Seconds into the media where the clip starts. */
4
+ trimStart?: number;
5
+ /** Seconds of media the clip shows (defaults to the rest). */
6
+ mediaWindow?: number;
7
+ /** Peak tint (clip-type colored per design/refs). */
8
+ color?: string;
9
+ className?: string;
10
+ }): import("react").JSX.Element;
11
+ //# sourceMappingURL=Waveform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Waveform.d.ts","sourceRoot":"","sources":["../../../src/panels/timeline/Waveform.tsx"],"names":[],"mappings":"AASA,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EACH,SAAa,EACb,WAAW,EACX,KAAK,EACL,SAAS,GACV,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BA2BA"}