@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 @@
1
+ {"version":3,"file":"LightingControls.d.ts","sourceRoot":"","sources":["../../src/controls/LightingControls.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAuD7E,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAqEA;AAID,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BA4EA;AAID,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAwCA;AAID,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,WAAW,GAAG,SAAS,CAAC;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAClE,+BAqGA"}
@@ -0,0 +1,108 @@
1
+ // Material / Lights / Environment controls (LIGHTING-PLAN P1.4, §4.8).
2
+ // Custom controls for the per-element `material` field and the Source
3
+ // scope's `lights` (array) and `environment` (gradient) — registered in
4
+ // ControlRenderer, surfaced via the registry overrides. Each edits its
5
+ // whole nested value and writes it back through the patch path.
6
+ //
7
+ // Scalar fields are animatable via inline Keyframe[] arrays (the runtime
8
+ // resolves them). When a field already holds a curve we show an
9
+ // "animated" chip instead of a number well, so this static panel never
10
+ // clobbers a keyframed value.
11
+ 'use client';
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { cn } from '../lib/utils.js';
14
+ import { ColorControl, NumberControl, SelectControl, TextControl } from './primitives.js';
15
+ const BOX = 'flex flex-col w-full border border-border/60 rounded px-2 py-1.5 gap-0.5';
16
+ const ROW = 'flex items-center gap-2 h-8';
17
+ const LABEL = 'text-[10px] text-muted-foreground w-16 shrink-0 truncate';
18
+ const ADD_BTN = 'h-5 px-1.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-card transition';
19
+ const SUBHEAD = 'text-[10px] font-medium text-muted-foreground/80 mt-1 mb-0.5';
20
+ function isAnimated(v) {
21
+ return Array.isArray(v);
22
+ }
23
+ /** Number well, or an "animated" chip when the field holds a curve. */
24
+ function NumOrAnim({ value, fallback, onChange, scrub, ...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 : fallback, fluid: true, stepper: true, onChange: onChange, onScrubStart: scrub.onScrubStart, onScrubEnd: scrub.onScrubEnd, ...rest }));
29
+ }
30
+ // ─── Material (per element) ────────────────────────────────────────────────
31
+ export function MaterialControl({ value, onChange, onScrubStart, onScrubEnd, }) {
32
+ const scrub = { onScrubStart, onScrubEnd };
33
+ if (!value) {
34
+ return (_jsx("button", { type: "button", className: ADD_BTN, onClick: () => onChange({ roughness: 0.4, metalness: 0.6, reflectivity: 1 }, false), children: "+ Add material" }));
35
+ }
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: "Roughness" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.roughness, fallback: 0.4, min: 0.02, max: 1, step: 0.01, scrub: scrub, onChange: (v, live) => set({ roughness: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Metalness" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.metalness, fallback: 0.6, min: 0, max: 1, step: 0.01, scrub: scrub, onChange: (v, live) => set({ metalness: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Reflectivity" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.reflectivity, fallback: 1, min: 0, max: 2, step: 0.05, scrub: scrub, onChange: (v, live) => set({ reflectivity: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Emissive" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.emissive, fallback: 0, min: 0, max: 1, step: 0.05, scrub: scrub, onChange: (v, live) => set({ emissive: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Normal map" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(TextControl, { value: value.normal_map ?? '', fluid: true, onChange: (v) => set({ normal_map: v || undefined }, false) }) })] }), value.normal_map ? (_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Nrm scale" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.normal_scale, fallback: 1, min: 0, max: 4, step: 0.05, scrub: scrub, onChange: (v, live) => set({ normal_scale: v }, live) }) })] })) : null, _jsx("div", { className: "flex pt-0.5", children: _jsx("button", { type: "button", className: cn(ADD_BTN, 'ml-auto'), onClick: () => onChange(undefined, false), children: "Remove" }) })] }));
38
+ }
39
+ // ─── Lights (Source) ───────────────────────────────────────────────────────
40
+ export function LightsControl({ value, onChange, onScrubStart, onScrubEnd, }) {
41
+ const scrub = { onScrubStart, onScrubEnd };
42
+ const lights = value ?? [];
43
+ const setAt = (i, patch, live) => {
44
+ const next = lights.map((l, j) => (j === i ? { ...l, ...patch } : l));
45
+ onChange(next, live);
46
+ };
47
+ const removeAt = (i) => {
48
+ const next = lights.filter((_, j) => j !== i);
49
+ onChange(next.length ? next : undefined, false);
50
+ };
51
+ const add = (light) => onChange([...lights, light], false);
52
+ return (_jsxs("div", { className: BOX, children: [lights.map((l, i) => (_jsxs("div", { className: "border-b border-border/40 last:border-0 pb-1 mb-1 last:pb-0 last:mb-0", children: [_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Type" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(SelectControl, { value: l.type, options: ['ambient', 'directional'], fluid: true, onChange: (v) => {
53
+ // Switching type: keep color/intensity, drop/add the
54
+ // directional-only angle fields with sane defaults.
55
+ if (v === 'directional')
56
+ setAt(i, { type: 'directional', azimuth: 30, elevation: 45 }, false);
57
+ else
58
+ setAt(i, { type: 'ambient' }, false);
59
+ } }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), onClick: () => removeAt(i), children: "Remove" })] })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Color" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(ColorControl, { value: l.color ?? '#ffffff', fluid: true, onChange: (v) => setAt(i, { color: v }, false) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Intensity" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: l.intensity, fallback: 1, min: 0, max: 10, step: 0.1, scrub: scrub, onChange: (v, live) => setAt(i, { intensity: v }, live) }) })] }), l.type === 'directional' && (_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Direction" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-2 gap-2", children: [_jsx(NumOrAnim, { value: l.azimuth, fallback: 30, suffix: "\u00B0", prefix: "Az", scrub: scrub, onChange: (v, live) => setAt(i, { azimuth: v }, live) }), _jsx(NumOrAnim, { value: l.elevation, fallback: 45, suffix: "\u00B0", prefix: "El", scrub: scrub, onChange: (v, live) => setAt(i, { elevation: v }, live) })] })] }))] }, i))), _jsxs("div", { className: "flex gap-1 pt-0.5", children: [_jsx("button", { type: "button", className: ADD_BTN, onClick: () => add({ type: 'ambient', color: '#ffffff', intensity: 0.6 }), children: "+ Ambient" }), _jsx("button", { type: "button", className: ADD_BTN, onClick: () => add({ type: 'directional', color: '#ffffff', intensity: 2, azimuth: 30, elevation: 45 }), children: "+ Directional" })] })] }));
60
+ }
61
+ // ─── Bloom (Source) ────────────────────────────────────────────────────────
62
+ export function BloomControl({ value, onChange, onScrubStart, onScrubEnd, }) {
63
+ const scrub = { onScrubStart, onScrubEnd };
64
+ if (!value) {
65
+ return (_jsx("button", { type: "button", className: ADD_BTN, onClick: () => onChange({ threshold: 0.75, intensity: 1, radius: 24 }, false), children: "+ Add bloom" }));
66
+ }
67
+ const set = (patch, live) => onChange({ ...value, ...patch }, live);
68
+ return (_jsxs("div", { className: BOX, children: [_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Threshold" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.threshold, fallback: 0.75, min: 0, max: 1, step: 0.01, scrub: scrub, onChange: (v, live) => set({ threshold: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Intensity" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(NumOrAnim, { value: value.intensity, fallback: 1, min: 0, max: 4, step: 0.05, scrub: scrub, onChange: (v, live) => set({ intensity: v }, live) }) })] }), _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Radius" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(NumOrAnim, { value: value.radius, fallback: 24, min: 1, max: 200, step: 1, scrub: scrub, onChange: (v, live) => set({ radius: v }, live) }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), onClick: () => onChange(undefined, false), children: "Remove" })] })] })] }));
69
+ }
70
+ // ─── Environment (Source) ──────────────────────────────────────────────────
71
+ export function EnvironmentControl({ value, onChange, }) {
72
+ if (!value) {
73
+ return (_jsx("button", { type: "button", className: ADD_BTN, onClick: () => onChange({ type: 'gradient', stops: [
74
+ { offset: 0, color: '#0a0e16' },
75
+ { offset: 1, color: '#7fb4ff' },
76
+ ] }, false), children: "+ Add environment" }));
77
+ }
78
+ // Type selector — gradient sky vs equirect image. Switching swaps to a
79
+ // sensible default of the other type.
80
+ const typeRow = (_jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Type" }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(SelectControl, { value: value.type, options: ['gradient', 'image'], fluid: true, onChange: (v) => {
81
+ if (v === 'image')
82
+ onChange({ type: 'image', src: '' }, false);
83
+ else
84
+ onChange({ type: 'gradient', stops: [
85
+ { offset: 0, color: '#0a0e16' }, { offset: 1, color: '#7fb4ff' },
86
+ ] }, false);
87
+ } }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), onClick: () => onChange(undefined, false), children: "Remove" })] })] }));
88
+ if (value.type === 'image') {
89
+ return (_jsxs("div", { className: BOX, children: [typeRow, _jsxs("div", { className: ROW, children: [_jsx("span", { className: LABEL, children: "Image URL" }), _jsx("div", { className: "flex-1 min-w-0", children: _jsx(TextControl, { value: value.src ?? '', fluid: true, onChange: (v) => onChange({ type: 'image', src: v }, false) }) })] }), _jsx("div", { className: SUBHEAD, children: "Equirectangular (2:1) \u2014 surfaces mirror it." })] }));
90
+ }
91
+ const stops = value.stops ?? [];
92
+ const setStop = (i, patch) => {
93
+ const next = stops.map((s, j) => (j === i ? { ...s, ...patch } : s));
94
+ onChange({ type: 'gradient', stops: next }, false);
95
+ };
96
+ const removeStop = (i) => {
97
+ if (stops.length <= 2)
98
+ return; // a gradient needs ≥2 stops
99
+ onChange({ type: 'gradient', stops: stops.filter((_, j) => j !== i) }, false);
100
+ };
101
+ const addStop = () => {
102
+ if (stops.length >= 4)
103
+ return; // shader samples up to 4
104
+ onChange({ type: 'gradient', stops: [...stops, { offset: 0.5, color: '#3a4a66' }] }, false);
105
+ };
106
+ return (_jsxs("div", { className: BOX, children: [typeRow, _jsx("div", { className: SUBHEAD, children: "Gradient sky (offset 0 = down, 1 = up)" }), stops.map((s, i) => (_jsxs("div", { className: ROW, children: [_jsx("div", { className: "w-16 shrink-0", children: _jsx(ColorControl, { value: s.color ?? '#ffffff', fluid: true, onChange: (v) => setStop(i, { color: v }) }) }), _jsxs("div", { className: "flex-1 min-w-0 grid grid-cols-[1fr_auto] gap-2 items-center", children: [_jsx(NumberControl, { value: typeof s.offset === 'number' ? s.offset : 0, min: 0, max: 1, step: 0.01, fluid: true, stepper: true, onChange: (v) => setStop(i, { offset: v }) }), _jsx("button", { type: "button", className: cn(ADD_BTN, 'justify-self-end'), disabled: stops.length <= 2, onClick: () => removeStop(i), children: "\u2715" })] })] }, i))), _jsx("div", { className: "flex gap-1 pt-0.5", children: _jsx("button", { type: "button", className: ADD_BTN, disabled: stops.length >= 4, onClick: addStop, children: "+ Stop" }) })] }));
107
+ }
108
+ //# sourceMappingURL=LightingControls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LightingControls.js","sourceRoot":"","sources":["../../src/controls/LightingControls.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function ShapePresetControl({ fluid }: {
2
+ fluid?: boolean;
3
+ }): import("react").JSX.Element;
4
+ //# sourceMappingURL=ShapePresetControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShapePresetControl.d.ts","sourceRoot":"","sources":["../../src/controls/ShapePresetControl.tsx"],"names":[],"mappings":"AAcA,wBAAgB,kBAAkB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,+BAqBhE"}
@@ -0,0 +1,30 @@
1
+ // ShapePresetControl — the inspector's shape picker. Picking a preset patches
2
+ // the selected element between primitive (rectangle/ellipse) and path form
3
+ // (triangle/star/line/…) in one undoable edit. Geometry lives in
4
+ // lib/shape-presets (shared with the add-bar's Shape dropdown).
5
+ 'use client';
6
+ import { jsx as _jsx } from "react/jsx-runtime";
7
+ import { useEditor, useEditorStore } from '@clipkit/editor-core';
8
+ import { SelectControl } from './primitives.js';
9
+ import { SHAPE_PRESETS, presetFields, detectPreset } from '../lib/shape-presets.js';
10
+ const LABELS = SHAPE_PRESETS.map((p) => p.label);
11
+ export function ShapePresetControl({ fluid }) {
12
+ const { updateElement } = useEditor();
13
+ const selId = useEditorStore((s) => s.selection[0]);
14
+ const el = useEditorStore((s) => s.source.elements.find((e) => e.id === selId));
15
+ const color = (typeof el?.fill_color === 'string' && el.fill_color) ||
16
+ (typeof el?.paths?.[0]?.fill === 'string' && el.paths[0].fill) ||
17
+ '#6366f1';
18
+ const currentId = detectPreset(el);
19
+ const currentLabel = SHAPE_PRESETS.find((p) => p.id === currentId)?.label ?? 'Rectangle';
20
+ const onChange = (label) => {
21
+ if (!selId)
22
+ return;
23
+ const p = SHAPE_PRESETS.find((x) => x.label === label);
24
+ if (!p)
25
+ return;
26
+ updateElement(selId, presetFields(p, color));
27
+ };
28
+ return _jsx(SelectControl, { value: currentLabel, options: LABELS, fluid: fluid, onChange: onChange });
29
+ }
30
+ //# sourceMappingURL=ShapePresetControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShapePresetControl.js","sourceRoot":"","sources":["../../src/controls/ShapePresetControl.tsx"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,iEAAiE;AACjE,gEAAgE;AAEhE,YAAY,CAAC;;AAGb,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEpF,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEjD,MAAM,UAAU,kBAAkB,CAAC,EAAE,KAAK,EAAuB;IAC/D,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAA6B,CAAC;IAE5G,MAAM,KAAK,GACT,CAAC,OAAO,EAAE,EAAE,UAAU,KAAK,QAAQ,IAAI,EAAE,CAAC,UAAU,CAAC;QACrD,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC/D,SAAS,CAAC;IAEZ,MAAM,SAAS,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,KAAK,IAAI,WAAW,CAAC;IAEzF,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE;QACjC,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC,EAAE,KAAK,CAAqB,CAAC,CAAC;IACnE,CAAC,CAAC;IAEF,OAAO,KAAC,aAAa,IAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAAC;AACnG,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { type FieldSpec } from '@clipkit/editor-core';
2
+ export declare function ValueField({ spec, value, elementId, animated, onScrubStart, onScrubEnd, }: {
3
+ spec: FieldSpec;
4
+ value: unknown;
5
+ elementId: string | null;
6
+ animated: boolean;
7
+ onScrubStart?: () => void;
8
+ onScrubEnd?: () => void;
9
+ }): import("react").JSX.Element;
10
+ //# sourceMappingURL=ValueField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueField.d.ts","sourceRoot":"","sources":["../../src/controls/ValueField.tsx"],"names":[],"mappings":"AAYA,OAAO,EAA4D,KAAK,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAwBhH,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAoLA"}
@@ -0,0 +1,158 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // The default knob for an animatable numeric / length property.
3
+ //
4
+ // Layout: [ label ] [ inputinput… unit▾ ] [ ◆ ]
5
+ // └─ the dropdown is PART of the input well (right segment,
6
+ // rounded, looks continuous). It picks the input TYPE:
7
+ // px / % (units) or Expression. NEVER keyframes.
8
+ // The plain label scrubs on drag. The keyframe diamond is its own affordance and
9
+ // shows in value mode (hidden for expressions) — keyframing is the diamond, not a
10
+ // dropdown option.
11
+ import { useRef, useState } from 'react';
12
+ import { createPortal } from 'react-dom';
13
+ import { elementTime, useEditor, useEditorContext, useEditorStore } from '@clipkit/editor-core';
14
+ import { compileExpr } from '@clipkit/runtime';
15
+ import { findElementById, sampleAnimation, setKeyframeValueAt } from '../lib/keyframes.js';
16
+ import { KeyframeDiamond } from './KeyframeDiamond.js';
17
+ import { cn } from '../lib/utils.js';
18
+ const UNITS = ['px', '%']; // the units we actually read in the editor
19
+ const isExprVal = (v) => typeof v === 'object' && v !== null && typeof v.expr === 'string';
20
+ /** Split a length value into number + unit ("50%" → {n:50,u:'%'}, 100 → {n:100,u:'px'}). */
21
+ function splitLen(v) {
22
+ if (typeof v === 'number')
23
+ return { n: v, u: 'px' };
24
+ if (typeof v === 'string') {
25
+ const m = /^(-?\d*\.?\d+)\s*(px|%)?$/.exec(v.trim());
26
+ if (m)
27
+ return { n: parseFloat(m[1]), u: m[2] ?? 'px' };
28
+ const num = parseFloat(v);
29
+ if (Number.isFinite(num))
30
+ return { n: num, u: 'px' };
31
+ }
32
+ return { n: 0, u: 'px' };
33
+ }
34
+ const joinLen = (n, u) => (u === 'px' ? n : `${n}${u}`);
35
+ export function ValueField({ spec, value, elementId, animated, onScrubStart, onScrubEnd, }) {
36
+ const { store } = useEditorContext();
37
+ const actions = useEditor();
38
+ const path = spec.path;
39
+ const hasUnits = spec.control === 'length';
40
+ const isPercent = spec.control === 'percent';
41
+ const isExpr = isExprVal(value);
42
+ // Sampled value at the playhead (when keyframed).
43
+ const sampled = useEditorStore((s) => {
44
+ if (!animated || !elementId)
45
+ return undefined;
46
+ const el = findElementById(s.source.elements, elementId);
47
+ const anim = el?.keyframe_animations?.find((a) => a.property === path);
48
+ if (!el || !anim)
49
+ return undefined;
50
+ const v = sampleAnimation(anim, Math.max(0, s.playback.time - elementTime(el)));
51
+ return Array.isArray(v) ? undefined : v;
52
+ });
53
+ const shown = sampled !== undefined ? sampled : value;
54
+ const curUnit = hasUnits ? splitLen(shown).u : 'px';
55
+ const asNumber = () => typeof shown === 'number' ? shown
56
+ : typeof shown === 'string' ? splitLen(shown).n
57
+ : isExprVal(shown) ? (parseFloat(shown.expr) || 0)
58
+ : 0;
59
+ // ── write the VALUE (keyframe-aware: write the keyframe when animated) ───────
60
+ const writeValue = (v, live) => {
61
+ if (!elementId)
62
+ return;
63
+ if (animated) {
64
+ const st = store.getState();
65
+ const el = findElementById(st.source.elements, elementId);
66
+ const anims = el?.keyframe_animations ?? [];
67
+ const ai = anims.findIndex((a) => a.property === path);
68
+ if (el && ai >= 0) {
69
+ const local = Math.round(Math.max(0, st.playback.time - elementTime(el)) * 1000) / 1000;
70
+ const patch = { keyframe_animations: setKeyframeValueAt(anims, ai, local, v) };
71
+ if (live)
72
+ actions.moveElements([{ id: elementId, patch }], { skipHistory: true });
73
+ else
74
+ actions.updateElement(elementId, patch);
75
+ return;
76
+ }
77
+ }
78
+ const patch = { [path]: v };
79
+ if (live)
80
+ actions.moveElements([{ id: elementId, patch }], { skipHistory: true });
81
+ else
82
+ actions.updateElement(elementId, patch);
83
+ };
84
+ // ── dropdown: pick the input TYPE (unit, or Expression) ─────────────────────
85
+ const toValue = (unit) => {
86
+ if (!elementId)
87
+ return;
88
+ const num = asNumber();
89
+ actions.updateElement(elementId, { [path]: hasUnits ? joinLen(num, unit) : num });
90
+ };
91
+ const toExpression = () => {
92
+ if (!elementId)
93
+ return;
94
+ const st = store.getState();
95
+ const el = findElementById(st.source.elements, elementId);
96
+ const anims = (el?.keyframe_animations ?? []).filter((a) => a.property !== path);
97
+ actions.updateElement(elementId, { keyframe_animations: anims, [path]: { expr: String(asNumber()) } });
98
+ };
99
+ // ── label scrub (drag the LABEL; number tracks live) ────────────────────────
100
+ const drag = useRef(null);
101
+ const labelScrub = !isExpr ? {
102
+ onPointerDown: (e) => { drag.current = { x: e.clientX, v: asNumber(), on: false }; e.currentTarget.setPointerCapture(e.pointerId); },
103
+ onPointerMove: (e) => {
104
+ const d = drag.current;
105
+ if (!d)
106
+ return;
107
+ const dx = e.clientX - d.x;
108
+ if (!d.on && Math.abs(dx) < 3)
109
+ return;
110
+ if (!d.on) {
111
+ d.on = true;
112
+ onScrubStart?.();
113
+ }
114
+ const step = spec.step ?? 1;
115
+ const next = Math.round((d.v + (dx / 2) * step) / step) * step;
116
+ writeValue(hasUnits ? joinLen(next, curUnit) : next, true);
117
+ },
118
+ onPointerUp: () => { if (drag.current?.on)
119
+ onScrubEnd?.(); drag.current = null; },
120
+ } : {};
121
+ // ── input + dropdown well ────────────────────────────────────────────────────
122
+ const [text, setText] = useState(null);
123
+ const [menu, setMenu] = useState(false);
124
+ const inputCls = 'flex-1 min-w-0 w-full bg-transparent text-[11px] font-mono tabular-nums text-foreground/90 outline-none px-1.5';
125
+ // the dropdown button label: current unit, or "fx" in expression mode
126
+ const token = isExpr ? 'fx' : hasUnits ? curUnit : isPercent ? '%' : '';
127
+ const btnRef = useRef(null);
128
+ const [pos, setPos] = useState(null);
129
+ const openMenu = () => {
130
+ const r = btnRef.current?.getBoundingClientRect();
131
+ if (r)
132
+ setPos({ top: r.bottom + 4, right: Math.max(4, window.innerWidth - r.right) });
133
+ setMenu((m) => !m);
134
+ };
135
+ const dropdown = (_jsxs("div", { className: "shrink-0 self-stretch flex", children: [_jsxs("button", { ref: btnRef, type: "button", onClick: openMenu, className: "flex items-center gap-0.5 pl-1.5 pr-1 border-l border-border/60 text-[10px] text-muted-foreground hover:text-foreground hover:bg-field-hover rounded-r-md transition-colors", title: "px / % / expression", children: [token && _jsx("span", { className: "tabular-nums", children: token }), _jsx("svg", { width: "7", height: "7", viewBox: "0 0 8 8", className: "opacity-60", children: _jsx("path", { d: "M1 2.5 4 5.5 7 2.5", stroke: "currentColor", fill: "none", strokeWidth: "1.2" }) })] }), menu && pos && createPortal(_jsxs(_Fragment, { children: [_jsx("div", { className: "fixed inset-0 z-[60]", onPointerDown: () => setMenu(false) }), _jsxs("div", { className: "fixed z-[61] w-28 rounded-md border border-border bg-popover shadow-md py-1 text-[11px]", style: { top: pos.top, right: pos.right }, children: [(hasUnits ? UNITS : ['value']).map((u) => (_jsx("button", { type: "button", onClick: () => { toValue(u === 'value' ? 'px' : u); setMenu(false); }, className: cn('w-full text-left px-2 py-1 hover:bg-field-hover', !isExpr && (u === 'value' || u === curUnit) && 'text-primary'), children: u === 'value' ? 'Value' : u }, u))), _jsx("div", { className: "my-1 border-t border-border" }), _jsx("button", { type: "button", onClick: () => { toExpression(); setMenu(false); }, className: cn('w-full text-left px-2 py-1 hover:bg-field-hover', isExpr && 'text-primary'), children: "Expression" })] })] }), document.body)] }));
136
+ let well;
137
+ if (isExpr) {
138
+ const exprStr = isExprVal(value) ? value.expr : '';
139
+ const valid = exprStr.trim() === '' || compileExpr(exprStr) !== null;
140
+ well = (_jsxs("div", { className: "h-6 flex items-center bg-field hover:bg-field-hover focus-within:ring-1 focus-within:ring-ring rounded-md transition-colors flex-1 min-w-0", children: [_jsx("span", { className: cn('text-[10px] shrink-0 pl-1.5', valid ? 'text-green-500' : 'text-red-500'), title: valid ? 'valid' : 'parse error', children: "\u25CF" }), _jsx("input", { className: cn(inputCls, 'text-left'), spellCheck: false, placeholder: "960 + sin(t*PI)*40", value: text ?? exprStr, onChange: (e) => { setText(e.target.value); if (elementId)
141
+ actions.moveElements([{ id: elementId, patch: { [path]: { expr: e.target.value } } }], { skipHistory: true }); }, onBlur: (e) => { if (elementId)
142
+ actions.updateElement(elementId, { [path]: { expr: e.target.value } }); setText(null); } }), dropdown] }));
143
+ }
144
+ else {
145
+ const { n } = splitLen(shown);
146
+ const display = text ?? String(Math.round(n * 1000) / 1000);
147
+ well = (_jsxs("div", { className: "h-6 flex items-center bg-field hover:bg-field-hover focus-within:ring-1 focus-within:ring-ring rounded-md transition-colors flex-1 min-w-0", children: [_jsx("input", { className: cn(inputCls, 'text-right'), inputMode: "decimal", value: display, onChange: (e) => { if (/^-?\d*\.?\d*$/.test(e.target.value))
148
+ setText(e.target.value); }, onFocus: () => setText(String(n)), onBlur: (e) => { const p = parseFloat(e.target.value); if (Number.isFinite(p))
149
+ writeValue(hasUnits ? joinLen(p, curUnit) : p, false); setText(null); }, onKeyDown: (e) => { if (e.key === 'Enter')
150
+ e.target.blur(); if (e.key === 'Escape') {
151
+ setText(null);
152
+ e.target.blur();
153
+ } } }), dropdown] }));
154
+ }
155
+ // ── row: label · input-with-dropdown · keyframe diamond (value mode only) ────
156
+ return (_jsxs("div", { className: "flex items-center gap-2 h-8", children: [_jsx("span", { className: cn('w-16 shrink-0 text-[11px] text-muted-foreground truncate select-none', !isExpr && 'cursor-ew-resize'), ...labelScrub, title: !isExpr ? 'drag to scrub' : undefined, children: spec.label }), _jsxs("div", { className: "flex-1 flex items-center gap-1 min-w-0", children: [well, !isExpr && spec.animatable && elementId ? (_jsx(KeyframeDiamond, { elementId: elementId, property: path, animated: animated, current: shown })) : null] })] }));
157
+ }
158
+ //# sourceMappingURL=ValueField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValueField.js","sourceRoot":"","sources":["../../src/controls/ValueField.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type ScrubHandlers } from './primitives.js';
2
+ export declare function VolumeControl({ elementId, value, commit, trailing, ...scrub }: {
3
+ elementId: string;
4
+ /** The element's `volume` (number %, Keyframe[], or unauthored). */
5
+ value: unknown;
6
+ commit: (patch: Record<string, unknown>, live: boolean) => void;
7
+ /** The ◇ keyframe diamond from the inspector. */
8
+ trailing?: React.ReactNode;
9
+ } & ScrubHandlers): import("react").JSX.Element;
10
+ //# sourceMappingURL=VolumeControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeControl.d.ts","sourceRoot":"","sources":["../../src/controls/VolumeControl.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAgC,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMnF,wBAAgB,aAAa,CAAC,EAC5B,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,EACR,GAAG,KAAK,EACT,EAAE;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChE,iDAAiD;IACjD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,GAAG,aAAa,+BAiHhB"}
@@ -0,0 +1,75 @@
1
+ // Volume block (Ian's reference HTML, M/S dropped by ruling — they're
2
+ // preview-only and don't map to the document; the mixer rail keeps
3
+ // them) — the audio section's `volume` composite: a fluid number well
4
+ // in the left half-column, a rotary KNOB in the right (270° sweep,
5
+ // drag to scrub on the one-undo-step contract), and live peak meters
6
+ // underneath (engine.getAudioLevels() on rAF, painted out-of-band).
7
+ 'use client';
8
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
9
+ import { useEffect, useRef } from 'react';
10
+ import { useEditorContext } from '@clipkit/editor-core';
11
+ import { cn } from '../lib/utils.js';
12
+ import { KeyframedChip, NumberControl } from './primitives.js';
13
+ const SWEEP = 270; // degrees of knob travel for 0..VOL_MAX
14
+ const VOL_MAX = 200; // unity (100% = 0 dB) is not the ceiling — allow boost
15
+ const C = 2 * Math.PI * 13; // arc circumference (r=13 in a 28px dial)
16
+ export function VolumeControl({ elementId, value, commit, trailing, ...scrub }) {
17
+ const animated = Array.isArray(value);
18
+ const volume = typeof value === 'number' ? value : 100;
19
+ // ── Knob drag (vertical scrub, standard one-undo-step contract) ──
20
+ const dragRef = useRef(null);
21
+ const onKnobDown = (e) => {
22
+ if (animated)
23
+ return;
24
+ dragRef.current = { startY: e.clientY, startV: volume, scrubbed: false };
25
+ e.currentTarget.setPointerCapture(e.pointerId);
26
+ };
27
+ const onKnobMove = (e) => {
28
+ const d = dragRef.current;
29
+ if (!d)
30
+ return;
31
+ const dy = d.startY - e.clientY;
32
+ if (!d.scrubbed && Math.abs(dy) < 3)
33
+ return;
34
+ if (!d.scrubbed) {
35
+ d.scrubbed = true;
36
+ scrub.onScrubStart?.();
37
+ }
38
+ const next = Math.round(Math.min(VOL_MAX, Math.max(0, d.startV + dy * 0.6)));
39
+ commit({ volume: next }, true);
40
+ };
41
+ const onKnobUp = () => {
42
+ const d = dragRef.current;
43
+ dragRef.current = null;
44
+ if (d?.scrubbed)
45
+ scrub.onScrubEnd?.();
46
+ };
47
+ const angle = -SWEEP / 2 + (volume / VOL_MAX) * SWEEP;
48
+ const dash = (volume / VOL_MAX) * (SWEEP / 360) * C;
49
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-start gap-2 py-1", children: [_jsx("span", { className: "w-16 shrink-0 text-[11px] text-muted-foreground pt-1.5 truncate", children: "Volume" }), _jsxs("div", { className: "flex-1 grid grid-cols-2 gap-2 min-w-0 items-stretch", children: [_jsx("div", { className: "flex flex-col gap-2 min-w-0", children: animated ? (_jsxs("div", { className: "flex items-center gap-1 h-6", children: [_jsx(KeyframedChip, {}), trailing] })) : (_jsx(NumberControl, { value: volume, min: 0, max: VOL_MAX, step: 1, suffix: "%", fluid: true, trailing: trailing, onChange: (v, live) => commit({ volume: v }, live), ...scrub })) }), _jsxs("div", { className: cn('relative h-14 bg-field rounded-md min-w-0 select-none touch-none', animated ? 'opacity-50' : 'cursor-ns-resize'), onPointerDown: onKnobDown, onPointerMove: onKnobMove, onPointerUp: onKnobUp, title: animated ? 'Volume is keyframed' : `Volume ${volume}%`, role: "slider", "aria-valuemin": 0, "aria-valuemax": VOL_MAX, "aria-valuenow": volume, "aria-label": "Volume knob", children: [_jsxs("div", { className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-[28px] h-[28px] bg-secondary rounded-full", children: [_jsxs("svg", { "aria-hidden": "true", viewBox: "0 0 28 28", className: "absolute inset-0", style: { color: 'var(--color-playhead)' }, children: [_jsx("circle", { cx: "14", cy: "14", r: "13", fill: "none", stroke: "var(--color-border)", strokeWidth: "2", strokeDasharray: `${(SWEEP / 360) * C} ${C}`, transform: "rotate(135 14 14)" }), _jsx("circle", { cx: "14", cy: "14", r: "13", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeDasharray: `${dash} ${C}`, transform: "rotate(135 14 14)" })] }), _jsx("div", { className: "absolute inset-[3px] rounded-full bg-secondary" })] }), _jsx("div", { className: "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-9 h-9 pointer-events-none", children: _jsx("div", { className: "w-full h-full", style: { transform: `rotate(${angle}deg)` }, children: _jsx("div", { className: "absolute left-1/2 top-[9px] -translate-x-1/2 w-[2px] h-[7px] rounded-full bg-foreground" }) }) })] })] })] }), _jsxs("div", { className: "flex items-center gap-2 h-5", children: [_jsx("span", { className: "w-16 shrink-0" }), _jsxs("div", { className: "flex-1 min-w-0 flex flex-col gap-1", children: [_jsx(MeterBar, { elementId: elementId }), _jsx(MeterBar, { elementId: elementId, lag: true })] })] })] }));
50
+ }
51
+ /** A 2px zoned bar (green→amber→red) with a cover revealing the level. */
52
+ function MeterBar({ elementId, lag }) {
53
+ const { engine } = useEditorContext();
54
+ const coverRef = useRef(null);
55
+ useEffect(() => {
56
+ const el = coverRef.current;
57
+ if (!el || !engine)
58
+ return;
59
+ let raf = 0;
60
+ let smoothed = 0;
61
+ const paint = () => {
62
+ const levels = engine.getAudioLevels();
63
+ const peak = levels.elements[elementId];
64
+ const v = peak ? Math.min(1, Math.max(peak.l, peak.r)) : 0;
65
+ // The second bar trails slightly so the pair reads stereo-ish.
66
+ smoothed = lag ? smoothed * 0.6 + v * 0.4 : v;
67
+ el.style.width = `${Math.round((1 - smoothed) * 100)}%`;
68
+ raf = requestAnimationFrame(paint);
69
+ };
70
+ paint();
71
+ return () => cancelAnimationFrame(raf);
72
+ }, [engine, elementId, lag]);
73
+ return (_jsxs("div", { className: "relative h-[2px] bg-field rounded-sm overflow-hidden", children: [_jsx("div", { className: "absolute inset-y-0 left-0", style: { width: '60%', background: 'oklch(0.7 0.17 150)' } }), _jsx("div", { className: "absolute inset-y-0", style: { left: '60%', width: '20%', background: 'oklch(0.78 0.16 80)' } }), _jsx("div", { className: "absolute inset-y-0 right-0", style: { width: '20%', background: 'var(--color-destructive)' } }), _jsx("div", { ref: coverRef, className: "absolute inset-y-0 right-0 bg-field", style: { width: '100%' } })] }));
74
+ }
75
+ //# sourceMappingURL=VolumeControl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VolumeControl.js","sourceRoot":"","sources":["../../src/controls/VolumeControl.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { CaptionWord, LinearGradient, RadialGradient, TextMask, TextSpan } from '@clipkit/protocol';
2
+ type Gradient = LinearGradient | RadialGradient;
3
+ export declare function GradientControl({ value, onChange, onScrubStart, onScrubEnd, }: {
4
+ value: Gradient | undefined;
5
+ onChange: (next: Gradient | undefined, live?: boolean) => void;
6
+ onScrubStart?: () => void;
7
+ onScrubEnd?: () => void;
8
+ }): import("react").JSX.Element;
9
+ export declare function BoxShadowControl({ value, onChange, }: {
10
+ value: {
11
+ color: string;
12
+ offset_x?: number;
13
+ offset_y?: number;
14
+ blur?: number;
15
+ } | undefined;
16
+ onChange: (next: typeof value) => void;
17
+ }): import("react").JSX.Element;
18
+ export declare function TextBackgroundControl({ color, radius, padding, commit, }: {
19
+ color: string | undefined;
20
+ radius: number | undefined;
21
+ padding: number | [number, number] | undefined;
22
+ commit: (patch: Record<string, unknown>, live: boolean) => void;
23
+ }): import("react").JSX.Element;
24
+ export declare function TextMaskControl({ value, onChange, }: {
25
+ value: TextMask | undefined;
26
+ onChange: (next: TextMask | undefined) => void;
27
+ }): import("react").JSX.Element;
28
+ export declare function CaptionWordsControl({ value, onChange, }: {
29
+ value: CaptionWord[] | undefined;
30
+ onChange: (next: CaptionWord[]) => void;
31
+ }): import("react").JSX.Element;
32
+ export declare function TextSpansControl({ value, onChange, onScrubStart, onScrubEnd, }: {
33
+ value: TextSpan[] | undefined;
34
+ onChange: (next: TextSpan[] | undefined, live?: boolean) => void;
35
+ onScrubStart?: () => void;
36
+ onScrubEnd?: () => void;
37
+ }): import("react").JSX.Element;
38
+ export declare function TextareaControl({ value, onChange, onScrubStart, onScrubEnd, }: {
39
+ value: string;
40
+ /** `live` true while typing (skip history); commit happens on blur. */
41
+ onChange: (next: string, live: boolean) => void;
42
+ onScrubStart?: () => void;
43
+ onScrubEnd?: () => void;
44
+ }): import("react").JSX.Element;
45
+ export {};
46
+ //# sourceMappingURL=compound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compound.d.ts","sourceRoot":"","sources":["../../src/controls/compound.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,WAAW,EAEX,cAAc,EACd,cAAc,EACd,QAAQ,EACR,QAAQ,EACT,MAAM,mBAAmB,CAAC;AAE3B,KAAK,QAAQ,GAAG,cAAc,GAAG,cAAc,CAAC;AAuChD,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/D,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BA+KA;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC1F,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC;CACxC,+BAyDA;AAID,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,MAAM,EACN,OAAO,EACP,MAAM,GACP,EAAE;IACD,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC/C,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACjE,+BAkDA;AAID,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,KAAK,IAAI,CAAC;CAChD,+BAuDA;AAID,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;CACzC,+BAiDA;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACjE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BAqDA;AAID,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,UAAU,GACX,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,+BA2BA"}