@smoove/studio 0.1.1

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 (276) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/components/brand/brand.d.ts +9 -0
  4. package/dist/components/brand/brand.d.ts.map +1 -0
  5. package/dist/components/brand/brand.js +11 -0
  6. package/dist/components/brand/brand.js.map +1 -0
  7. package/dist/components/button/button.d.ts +21 -0
  8. package/dist/components/button/button.d.ts.map +1 -0
  9. package/dist/components/button/button.js +20 -0
  10. package/dist/components/button/button.js.map +1 -0
  11. package/dist/components/button/icon-button.d.ts +27 -0
  12. package/dist/components/button/icon-button.d.ts.map +1 -0
  13. package/dist/components/button/icon-button.js +19 -0
  14. package/dist/components/button/icon-button.js.map +1 -0
  15. package/dist/components/header/header-title.d.ts +8 -0
  16. package/dist/components/header/header-title.d.ts.map +1 -0
  17. package/dist/components/header/header-title.js +7 -0
  18. package/dist/components/header/header-title.js.map +1 -0
  19. package/dist/components/header/header.d.ts +7 -0
  20. package/dist/components/header/header.d.ts.map +1 -0
  21. package/dist/components/header/header.js +7 -0
  22. package/dist/components/header/header.js.map +1 -0
  23. package/dist/components/header/zoom.d.ts +3 -0
  24. package/dist/components/header/zoom.d.ts.map +1 -0
  25. package/dist/components/header/zoom.js +16 -0
  26. package/dist/components/header/zoom.js.map +1 -0
  27. package/dist/components/icon/icon.d.ts +11 -0
  28. package/dist/components/icon/icon.d.ts.map +1 -0
  29. package/dist/components/icon/icon.js +7 -0
  30. package/dist/components/icon/icon.js.map +1 -0
  31. package/dist/components/icon/paths.d.ts +47 -0
  32. package/dist/components/icon/paths.d.ts.map +1 -0
  33. package/dist/components/icon/paths.js +54 -0
  34. package/dist/components/icon/paths.js.map +1 -0
  35. package/dist/components/left-panel/library.d.ts +8 -0
  36. package/dist/components/left-panel/library.d.ts.map +1 -0
  37. package/dist/components/left-panel/library.js +49 -0
  38. package/dist/components/left-panel/library.js.map +1 -0
  39. package/dist/components/left-panel/sidebar-group.d.ts +12 -0
  40. package/dist/components/left-panel/sidebar-group.d.ts.map +1 -0
  41. package/dist/components/left-panel/sidebar-group.js +11 -0
  42. package/dist/components/left-panel/sidebar-group.js.map +1 -0
  43. package/dist/components/left-panel/sidebar-item.d.ts +17 -0
  44. package/dist/components/left-panel/sidebar-item.d.ts.map +1 -0
  45. package/dist/components/left-panel/sidebar-item.js +12 -0
  46. package/dist/components/left-panel/sidebar-item.js.map +1 -0
  47. package/dist/components/left-panel/sidebar.d.ts +8 -0
  48. package/dist/components/left-panel/sidebar.d.ts.map +1 -0
  49. package/dist/components/left-panel/sidebar.js +8 -0
  50. package/dist/components/left-panel/sidebar.js.map +1 -0
  51. package/dist/components/primitives/dialog.d.ts +33 -0
  52. package/dist/components/primitives/dialog.d.ts.map +1 -0
  53. package/dist/components/primitives/dialog.js +30 -0
  54. package/dist/components/primitives/dialog.js.map +1 -0
  55. package/dist/components/primitives/menu.d.ts +25 -0
  56. package/dist/components/primitives/menu.d.ts.map +1 -0
  57. package/dist/components/primitives/menu.js +31 -0
  58. package/dist/components/primitives/menu.js.map +1 -0
  59. package/dist/components/primitives/number-field.d.ts +12 -0
  60. package/dist/components/primitives/number-field.d.ts.map +1 -0
  61. package/dist/components/primitives/number-field.js +7 -0
  62. package/dist/components/primitives/number-field.js.map +1 -0
  63. package/dist/components/primitives/portal-context.d.ts +9 -0
  64. package/dist/components/primitives/portal-context.d.ts.map +1 -0
  65. package/dist/components/primitives/portal-context.js +10 -0
  66. package/dist/components/primitives/portal-context.js.map +1 -0
  67. package/dist/components/primitives/select.d.ts +14 -0
  68. package/dist/components/primitives/select.d.ts.map +1 -0
  69. package/dist/components/primitives/select.js +11 -0
  70. package/dist/components/primitives/select.js.map +1 -0
  71. package/dist/components/primitives/slider.d.ts +10 -0
  72. package/dist/components/primitives/slider.d.ts.map +1 -0
  73. package/dist/components/primitives/slider.js +7 -0
  74. package/dist/components/primitives/slider.js.map +1 -0
  75. package/dist/components/primitives/switch.d.ts +5 -0
  76. package/dist/components/primitives/switch.d.ts.map +1 -0
  77. package/dist/components/primitives/switch.js +6 -0
  78. package/dist/components/primitives/switch.js.map +1 -0
  79. package/dist/components/primitives/tabs.d.ts +23 -0
  80. package/dist/components/primitives/tabs.d.ts.map +1 -0
  81. package/dist/components/primitives/tabs.js +17 -0
  82. package/dist/components/primitives/tabs.js.map +1 -0
  83. package/dist/components/primitives/tooltip.d.ts +9 -0
  84. package/dist/components/primitives/tooltip.d.ts.map +1 -0
  85. package/dist/components/primitives/tooltip.js +11 -0
  86. package/dist/components/primitives/tooltip.js.map +1 -0
  87. package/dist/components/render/export-frame-dialog.d.ts +8 -0
  88. package/dist/components/render/export-frame-dialog.d.ts.map +1 -0
  89. package/dist/components/render/export-frame-dialog.js +60 -0
  90. package/dist/components/render/export-frame-dialog.js.map +1 -0
  91. package/dist/components/render/render-dialog.d.ts +8 -0
  92. package/dist/components/render/render-dialog.d.ts.map +1 -0
  93. package/dist/components/render/render-dialog.js +95 -0
  94. package/dist/components/render/render-dialog.js.map +1 -0
  95. package/dist/components/render/render-queue.d.ts +5 -0
  96. package/dist/components/render/render-queue.d.ts.map +1 -0
  97. package/dist/components/render/render-queue.js +40 -0
  98. package/dist/components/render/render-queue.js.map +1 -0
  99. package/dist/components/right-panel/panel-handle.d.ts +3 -0
  100. package/dist/components/right-panel/panel-handle.d.ts.map +1 -0
  101. package/dist/components/right-panel/panel-handle.js +9 -0
  102. package/dist/components/right-panel/panel-handle.js.map +1 -0
  103. package/dist/components/right-panel/panel-tabs.d.ts +3 -0
  104. package/dist/components/right-panel/panel-tabs.d.ts.map +1 -0
  105. package/dist/components/right-panel/panel-tabs.js +26 -0
  106. package/dist/components/right-panel/panel-tabs.js.map +1 -0
  107. package/dist/components/right-panel/panel.d.ts +8 -0
  108. package/dist/components/right-panel/panel.d.ts.map +1 -0
  109. package/dist/components/right-panel/panel.js +16 -0
  110. package/dist/components/right-panel/panel.js.map +1 -0
  111. package/dist/components/schema-form/field.d.ts +9 -0
  112. package/dist/components/schema-form/field.d.ts.map +1 -0
  113. package/dist/components/schema-form/field.js +102 -0
  114. package/dist/components/schema-form/field.js.map +1 -0
  115. package/dist/components/schema-form/schema-form.d.ts +3 -0
  116. package/dist/components/schema-form/schema-form.d.ts.map +1 -0
  117. package/dist/components/schema-form/schema-form.js +18 -0
  118. package/dist/components/schema-form/schema-form.js.map +1 -0
  119. package/dist/components/stage/stage.d.ts +12 -0
  120. package/dist/components/stage/stage.d.ts.map +1 -0
  121. package/dist/components/stage/stage.js +103 -0
  122. package/dist/components/stage/stage.js.map +1 -0
  123. package/dist/components/studio/features.d.ts +4 -0
  124. package/dist/components/studio/features.d.ts.map +1 -0
  125. package/dist/components/studio/features.js +18 -0
  126. package/dist/components/studio/features.js.map +1 -0
  127. package/dist/components/studio/layout.d.ts +19 -0
  128. package/dist/components/studio/layout.d.ts.map +1 -0
  129. package/dist/components/studio/layout.js +17 -0
  130. package/dist/components/studio/layout.js.map +1 -0
  131. package/dist/components/studio/studio-context.d.ts +53 -0
  132. package/dist/components/studio/studio-context.d.ts.map +1 -0
  133. package/dist/components/studio/studio-context.js +3 -0
  134. package/dist/components/studio/studio-context.js.map +1 -0
  135. package/dist/components/studio/studio.d.ts +21 -0
  136. package/dist/components/studio/studio.d.ts.map +1 -0
  137. package/dist/components/studio/studio.js +38 -0
  138. package/dist/components/studio/studio.js.map +1 -0
  139. package/dist/components/timeline/layered-body.d.ts +8 -0
  140. package/dist/components/timeline/layered-body.d.ts.map +1 -0
  141. package/dist/components/timeline/layered-body.js +75 -0
  142. package/dist/components/timeline/layered-body.js.map +1 -0
  143. package/dist/components/timeline/region-handles.d.ts +8 -0
  144. package/dist/components/timeline/region-handles.d.ts.map +1 -0
  145. package/dist/components/timeline/region-handles.js +13 -0
  146. package/dist/components/timeline/region-handles.js.map +1 -0
  147. package/dist/components/timeline/ruler.d.ts +7 -0
  148. package/dist/components/timeline/ruler.d.ts.map +1 -0
  149. package/dist/components/timeline/ruler.js +19 -0
  150. package/dist/components/timeline/ruler.js.map +1 -0
  151. package/dist/components/timeline/scrubber.d.ts +6 -0
  152. package/dist/components/timeline/scrubber.d.ts.map +1 -0
  153. package/dist/components/timeline/scrubber.js +25 -0
  154. package/dist/components/timeline/scrubber.js.map +1 -0
  155. package/dist/components/timeline/timeline-header.d.ts +3 -0
  156. package/dist/components/timeline/timeline-header.d.ts.map +1 -0
  157. package/dist/components/timeline/timeline-header.js +36 -0
  158. package/dist/components/timeline/timeline-header.js.map +1 -0
  159. package/dist/components/timeline/timeline.d.ts +5 -0
  160. package/dist/components/timeline/timeline.d.ts.map +1 -0
  161. package/dist/components/timeline/timeline.js +16 -0
  162. package/dist/components/timeline/timeline.js.map +1 -0
  163. package/dist/components/timeline/transport.d.ts +5 -0
  164. package/dist/components/timeline/transport.d.ts.map +1 -0
  165. package/dist/components/timeline/transport.js +21 -0
  166. package/dist/components/timeline/transport.js.map +1 -0
  167. package/dist/components/timeline/use-scrub-surface.d.ts +20 -0
  168. package/dist/components/timeline/use-scrub-surface.d.ts.map +1 -0
  169. package/dist/components/timeline/use-scrub-surface.js +56 -0
  170. package/dist/components/timeline/use-scrub-surface.js.map +1 -0
  171. package/dist/components/toasts/toasts.d.ts +4 -0
  172. package/dist/components/toasts/toasts.d.ts.map +1 -0
  173. package/dist/components/toasts/toasts.js +22 -0
  174. package/dist/components/toasts/toasts.js.map +1 -0
  175. package/dist/hooks/use-composition.d.ts +10 -0
  176. package/dist/hooks/use-composition.d.ts.map +1 -0
  177. package/dist/hooks/use-composition.js +13 -0
  178. package/dist/hooks/use-composition.js.map +1 -0
  179. package/dist/hooks/use-layers.d.ts +9 -0
  180. package/dist/hooks/use-layers.d.ts.map +1 -0
  181. package/dist/hooks/use-layers.js +34 -0
  182. package/dist/hooks/use-layers.js.map +1 -0
  183. package/dist/hooks/use-playback.d.ts +15 -0
  184. package/dist/hooks/use-playback.d.ts.map +1 -0
  185. package/dist/hooks/use-playback.js +38 -0
  186. package/dist/hooks/use-playback.js.map +1 -0
  187. package/dist/hooks/use-props-form.d.ts +15 -0
  188. package/dist/hooks/use-props-form.d.ts.map +1 -0
  189. package/dist/hooks/use-props-form.js +22 -0
  190. package/dist/hooks/use-props-form.js.map +1 -0
  191. package/dist/hooks/use-real-fps.d.ts +3 -0
  192. package/dist/hooks/use-real-fps.d.ts.map +1 -0
  193. package/dist/hooks/use-real-fps.js +27 -0
  194. package/dist/hooks/use-real-fps.js.map +1 -0
  195. package/dist/hooks/use-shortcuts.d.ts +7 -0
  196. package/dist/hooks/use-shortcuts.d.ts.map +1 -0
  197. package/dist/hooks/use-shortcuts.js +53 -0
  198. package/dist/hooks/use-shortcuts.js.map +1 -0
  199. package/dist/hooks/use-studio.d.ts +4 -0
  200. package/dist/hooks/use-studio.d.ts.map +1 -0
  201. package/dist/hooks/use-studio.js +10 -0
  202. package/dist/hooks/use-studio.js.map +1 -0
  203. package/dist/index.d.ts +145 -0
  204. package/dist/index.d.ts.map +1 -0
  205. package/dist/index.js +117 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/lib/cn.d.ts +3 -0
  208. package/dist/lib/cn.d.ts.map +1 -0
  209. package/dist/lib/cn.js +8 -0
  210. package/dist/lib/cn.js.map +1 -0
  211. package/dist/lib/constants.d.ts +28 -0
  212. package/dist/lib/constants.d.ts.map +1 -0
  213. package/dist/lib/constants.js +38 -0
  214. package/dist/lib/constants.js.map +1 -0
  215. package/dist/lib/cva.d.ts +25 -0
  216. package/dist/lib/cva.d.ts.map +1 -0
  217. package/dist/lib/cva.js +23 -0
  218. package/dist/lib/cva.js.map +1 -0
  219. package/dist/lib/format.d.ts +13 -0
  220. package/dist/lib/format.d.ts.map +1 -0
  221. package/dist/lib/format.js +25 -0
  222. package/dist/lib/format.js.map +1 -0
  223. package/dist/lib/ids.d.ts +3 -0
  224. package/dist/lib/ids.d.ts.map +1 -0
  225. package/dist/lib/ids.js +6 -0
  226. package/dist/lib/ids.js.map +1 -0
  227. package/dist/registry/define-registry.d.ts +8 -0
  228. package/dist/registry/define-registry.d.ts.map +1 -0
  229. package/dist/registry/define-registry.js +71 -0
  230. package/dist/registry/define-registry.js.map +1 -0
  231. package/dist/registry/props-signal.d.ts +9 -0
  232. package/dist/registry/props-signal.d.ts.map +1 -0
  233. package/dist/registry/props-signal.js +25 -0
  234. package/dist/registry/props-signal.js.map +1 -0
  235. package/dist/schema/kf.d.ts +28 -0
  236. package/dist/schema/kf.d.ts.map +1 -0
  237. package/dist/schema/kf.js +82 -0
  238. package/dist/schema/kf.js.map +1 -0
  239. package/dist/schema/types.d.ts +69 -0
  240. package/dist/schema/types.d.ts.map +1 -0
  241. package/dist/schema/types.js +4 -0
  242. package/dist/schema/types.js.map +1 -0
  243. package/dist/server/index.d.ts +6 -0
  244. package/dist/server/index.d.ts.map +1 -0
  245. package/dist/server/index.js +7 -0
  246. package/dist/server/index.js.map +1 -0
  247. package/dist/server/map.d.ts +19 -0
  248. package/dist/server/map.d.ts.map +1 -0
  249. package/dist/server/map.js +63 -0
  250. package/dist/server/map.js.map +1 -0
  251. package/dist/server/render-queue.d.ts +46 -0
  252. package/dist/server/render-queue.d.ts.map +1 -0
  253. package/dist/server/render-queue.js +147 -0
  254. package/dist/server/render-queue.js.map +1 -0
  255. package/dist/server/temp-storage.d.ts +13 -0
  256. package/dist/server/temp-storage.d.ts.map +1 -0
  257. package/dist/server/temp-storage.js +55 -0
  258. package/dist/server/temp-storage.js.map +1 -0
  259. package/dist/server/types.d.ts +57 -0
  260. package/dist/server/types.d.ts.map +1 -0
  261. package/dist/server/types.js +2 -0
  262. package/dist/server/types.js.map +1 -0
  263. package/dist/signals/signal-bridge.d.ts +18 -0
  264. package/dist/signals/signal-bridge.d.ts.map +1 -0
  265. package/dist/signals/signal-bridge.js +39 -0
  266. package/dist/signals/signal-bridge.js.map +1 -0
  267. package/dist/store/store.d.ts +74 -0
  268. package/dist/store/store.d.ts.map +1 -0
  269. package/dist/store/store.js +276 -0
  270. package/dist/store/store.js.map +1 -0
  271. package/dist/styles/studio.css +2 -0
  272. package/dist/types.d.ts +112 -0
  273. package/dist/types.d.ts.map +1 -0
  274. package/dist/types.js +2 -0
  275. package/dist/types.js.map +1 -0
  276. package/package.json +66 -0
@@ -0,0 +1,95 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { useComposition } from "../../hooks/use-composition.js";
4
+ import { useStudio } from "../../hooks/use-studio.js";
5
+ import { cn } from "../../lib/cn.js";
6
+ import { estMB, FORMATS, prettyMB, QUALITY, RES_PRESETS } from "../../lib/constants.js";
7
+ import { fmtTime } from "../../lib/format.js";
8
+ import { useSignalValue } from "../../signals/signal-bridge.js";
9
+ import { Button } from "../button/button.js";
10
+ import { Icon } from "../icon/icon.js";
11
+ import { StDialog } from "../primitives/dialog.js";
12
+ import { StNumberField } from "../primitives/number-field.js";
13
+ import { StSelect } from "../primitives/select.js";
14
+ const Field = ({ label, children }) => (_jsxs("div", { className: "mb-4", children: [_jsx("span", { className: "block text-[11.5px] font-semibold text-ink-2 mb-1.5", children: label }), children] }));
15
+ /** Server-render dialog (mocked): format/quality/resolution/fps/range → enqueue. */
16
+ export function RenderDialog({ open, onOpenChange, onSubmitted, }) {
17
+ const store = useStudio();
18
+ const { composition: comp, entry } = useComposition();
19
+ const region = useSignalValue(store.region);
20
+ const compFps = comp?.fps ?? 30;
21
+ const total = comp ? comp.durationInFrames.get() : 0;
22
+ const baseW = comp?.width() ?? 1280;
23
+ const baseH = comp?.height() ?? 720;
24
+ const durSec = total / compFps;
25
+ const [format, setFormat] = useState("mp4");
26
+ const [quality, setQuality] = useState("standard");
27
+ const [preset, setPreset] = useState("720p");
28
+ const [w, setW] = useState(baseW);
29
+ const [h, setH] = useState(baseH);
30
+ const [rfps, setRfps] = useState(compFps);
31
+ const [range, setRange] = useState("full");
32
+ const hasRegion = region.in != null || region.out != null;
33
+ useEffect(() => {
34
+ if (open) {
35
+ setRfps(compFps);
36
+ setRange("full");
37
+ setW(baseW);
38
+ setH(baseH);
39
+ }
40
+ }, [open, compFps, baseW, baseH]);
41
+ const applyPreset = (p) => {
42
+ setPreset(p);
43
+ const f = RES_PRESETS.find((x) => x.value === p);
44
+ if (f?.w && f?.h) {
45
+ setW(f.w);
46
+ setH(f.h);
47
+ }
48
+ };
49
+ const editDim = (which, val) => {
50
+ const v = Math.max(16, Math.min(7680, Math.round(val || 0)));
51
+ if (which === "w")
52
+ setW(v);
53
+ else
54
+ setH(v);
55
+ setPreset("custom");
56
+ };
57
+ const den = Math.max(1, total - 1);
58
+ const inFrame = region.in ?? 0;
59
+ const outFrame = region.out ?? den;
60
+ const rangeDurSec = range === "region" && hasRegion ? (outFrame - inFrame) / compFps : durSec;
61
+ const frames = Math.max(1, Math.round(rangeDurSec * rfps));
62
+ const qf = QUALITY.find((q) => q.value === quality)?.f ?? 0.16;
63
+ const mul = FORMATS.find((x) => x.value === format)?.mul ?? 1;
64
+ const mb = estMB(w, h, frames, qf, mul);
65
+ const title = entry?.title ?? entry?.id ?? "Composition";
66
+ const submit = () => {
67
+ store.startRender({
68
+ id: store.selectedId.get(),
69
+ kind: "video",
70
+ comp: title,
71
+ // The live props drive the preview; send them so the render matches it.
72
+ props: comp?.props.get(),
73
+ format,
74
+ quality,
75
+ w,
76
+ h,
77
+ fps: rfps,
78
+ frames,
79
+ ...(range === "region" && hasRegion ? { from: inFrame, to: outFrame } : {}),
80
+ rangeLabel: range === "region" && hasRegion
81
+ ? `${fmtTime(inFrame / compFps)}–${fmtTime(outFrame / compFps)}`
82
+ : `Full · ${fmtTime(durSec)}`,
83
+ sizeEst: mb,
84
+ });
85
+ onOpenChange(false);
86
+ onSubmitted?.();
87
+ };
88
+ const D = StDialog;
89
+ return (_jsx(D, { open: open, onOpenChange: onOpenChange, children: _jsxs(D.Popup, { width: 500, children: [_jsx(D.Header, { icon: "server", title: "Render on server" }), _jsxs(D.Body, { children: [_jsxs("div", { className: "flex items-center gap-3 p-3 bg-bg-2 border border-line rounded-ui mb-4.5", children: [_jsx("span", { className: "size-8 flex-none grid place-items-center rounded-ui bg-bg-1 border border-line text-accent-2", children: _jsx(Icon, { name: "film", size: 15 }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "text-[13.5px] font-bold text-ink-1 truncate", children: title }), _jsxs("div", { className: "text-[11px] text-ink-3 font-mono mt-0.5 truncate", children: [entry?.group ?? "Compositions", " \u00B7 ", durSec.toFixed(1), "s source"] })] })] }), _jsx(Field, { label: "Format", children: _jsx(StSelect, { value: format, onValueChange: setFormat, options: FORMATS }) }), _jsx(Field, { label: "Quality", children: _jsx(StSelect, { value: quality, onValueChange: setQuality, options: QUALITY }) }), _jsxs(Field, { label: "Resolution", children: [_jsx(StSelect, { value: preset, onValueChange: applyPreset, options: RES_PRESETS }), _jsxs("div", { className: "flex items-center gap-2 mt-2.5", children: [_jsx(StNumberField, { value: w, onValueChange: (v) => editDim("w", v), suffix: "W", min: 16, max: 7680 }), _jsx("span", { className: "text-ink-3", children: _jsx(Icon, { name: "close", size: 12 }) }), _jsx(StNumberField, { value: h, onValueChange: (v) => editDim("h", v), suffix: "H", min: 16, max: 7680 })] })] }), _jsxs("div", { className: "flex gap-3.5", children: [_jsx(Field, { label: "Frame rate", children: _jsx(StNumberField, { value: rfps, onValueChange: (v) => setRfps(Math.max(1, Math.min(120, v))), suffix: "fps", min: 1, max: 120 }) }), _jsx(Field, { label: "Range", children: _jsxs("div", { className: "flex bg-bg-2 border border-line rounded-control p-[3px] gap-[3px]", children: [_jsx("button", { type: "button", onClick: () => setRange("full"), className: cn("flex-1 text-[12px] font-semibold py-[7px] rounded-[5px]", range === "full"
90
+ ? "bg-bg-0 text-ink-1 shadow-[0_1px_4px_rgba(0,0,0,.3)]"
91
+ : "text-ink-3 hover:text-ink-1"), children: "Full" }), _jsx("button", { type: "button", onClick: () => hasRegion && setRange("region"), disabled: !hasRegion, title: hasRegion ? "" : "Set In/Out first", className: cn("flex-1 text-[12px] font-semibold py-[7px] rounded-[5px] disabled:opacity-40 disabled:cursor-not-allowed", range === "region"
92
+ ? "bg-bg-0 text-ink-1 shadow-[0_1px_4px_rgba(0,0,0,.3)]"
93
+ : "text-ink-3 hover:text-ink-1"), children: "Loop region" })] }) })] })] }), _jsxs(D.Footer, { children: [_jsxs("div", { className: "flex items-center gap-1.5 font-mono text-[11.5px] text-ink-2 whitespace-nowrap", children: [_jsx(Icon, { name: "film", size: 13, className: "text-ink-3" }), _jsxs("span", { children: [frames.toLocaleString(), " frames \u00B7 ~", prettyMB(mb)] })] }), _jsxs("div", { className: "flex items-center gap-2 ml-auto shrink-0", children: [_jsx(D.Close, { render: _jsx(Button, { tone: "ghost", children: "Cancel" }) }), _jsx(Button, { tone: "primary", icon: "server", onClick: submit, children: "Render" })] })] })] }) }));
94
+ }
95
+ //# sourceMappingURL=render-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-dialog.js","sourceRoot":"","sources":["../../../src/components/render/render-dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Render queue view: job list with live progress + download/cancel/remove. */
2
+ export declare function RenderQueue({ className }: {
3
+ className?: string;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=render-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-queue.d.ts","sourceRoot":"","sources":["../../../src/components/render/render-queue.tsx"],"names":[],"mappings":"AAuBA,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CA6IhE"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useStudio } from "../../hooks/use-studio.js";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { prettyMB } from "../../lib/constants.js";
5
+ import { useSignalValue } from "../../signals/signal-bridge.js";
6
+ import { Button } from "../button/button.js";
7
+ import { IconButton } from "../button/icon-button.js";
8
+ import { Icon } from "../icon/icon.js";
9
+ import { StTooltip } from "../primitives/tooltip.js";
10
+ const STATUS = {
11
+ queued: { label: "Queued", icon: "clock", cls: "text-ink-2 bg-bg-2 border-line" },
12
+ rendering: {
13
+ label: "Rendering",
14
+ icon: "loader",
15
+ cls: "text-accent-2 bg-accent-soft border-accent/35",
16
+ },
17
+ done: { label: "Ready", icon: "check", cls: "text-good bg-good/12 border-good/30" },
18
+ canceled: { label: "Canceled", icon: "close", cls: "text-ink-3 bg-bg-2 border-line" },
19
+ error: { label: "Failed", icon: "close", cls: "text-danger bg-danger/12 border-danger/30" },
20
+ };
21
+ /** Render queue view: job list with live progress + download/cancel/remove. */
22
+ export function RenderQueue({ className }) {
23
+ const store = useStudio();
24
+ const jobs = useSignalValue(store.jobs);
25
+ const active = jobs.filter((j) => j.status === "queued" || j.status === "rendering").length;
26
+ const done = jobs.filter((j) => j.status === "done").length;
27
+ return (_jsxs("div", { className: cn("flex-1 min-h-0 flex flex-col", className), style: {
28
+ background: "radial-gradient(120% 90% at 50% 0%, #16151c 0%, var(--color-bg-0) 70%)",
29
+ }, children: [_jsxs("div", { className: "flex items-center gap-4 px-5.5 py-3.5 border-b border-line", children: [_jsxs("div", { className: "flex items-center gap-4.5 text-[12px] text-ink-3", children: [_jsxs("span", { children: [_jsx("b", { className: "font-mono text-[14px] text-ink-1 mr-1", children: active }), "active"] }), _jsxs("span", { children: [_jsx("b", { className: "font-mono text-[14px] text-ink-1 mr-1", children: done }), "ready"] }), _jsxs("span", { children: [_jsx("b", { className: "font-mono text-[14px] text-ink-1 mr-1", children: jobs.length }), "total"] })] }), _jsx("div", { className: "flex-1" }), done > 0 && (_jsx(Button, { size: "sm", tone: "ghost", icon: "trash", onClick: store.clearDone, children: "Clear ready" }))] }), _jsx("div", { className: "flex-1 min-h-0 overflow-y-auto scroll px-5.5 py-4 flex flex-col gap-2.5", children: jobs.length === 0 ? (_jsxs("div", { className: "flex flex-col items-center justify-center text-center h-full text-ink-3 gap-3", children: [_jsx("div", { className: "size-[52px] rounded-2xl bg-bg-2 grid place-items-center border border-line text-ink-3", children: _jsx(Icon, { name: "server", size: 22 }) }), _jsx("h4", { className: "m-0 mt-1 text-[15px] font-bold text-ink-1", children: "No render jobs yet" }), _jsx("p", { className: "m-0 text-[13px] leading-relaxed max-w-[260px]", children: "Renders and frame exports you queue will appear here with live progress." })] })) : (jobs.map((j) => {
30
+ const sm = STATUS[j.status];
31
+ const isStill = j.kind === "still";
32
+ return (_jsxs("div", { className: cn("flex items-center gap-3.5 bg-bg-1 border rounded-ui p-3.5", j.status === "done" ? "border-good/20" : "border-line"), children: [_jsx("div", { className: "size-[46px] flex-none rounded-[9px] grid place-items-center border border-line-2", style: {
33
+ background: isStill
34
+ ? "linear-gradient(140deg,#4d2f1a,#16161b)"
35
+ : "linear-gradient(140deg,#3a1f1a,#16161b)",
36
+ color: "var(--color-accent-2)",
37
+ }, children: _jsx(Icon, { name: isStill ? "camera" : "film", size: 18 }) }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2.5", children: [_jsx("span", { className: "text-[13.5px] font-bold text-ink-1 truncate", children: j.comp }), _jsxs("span", { className: cn("inline-flex items-center gap-1 text-[10.5px] font-semibold px-2 py-0.5 rounded-full border", sm.cls), children: [_jsx(Icon, { name: sm.icon, size: 11, className: j.status === "rendering" ? "spin" : "" }), sm.label] })] }), _jsxs("div", { className: "flex items-center gap-2 text-[11px] font-mono text-ink-3 mt-1.5 flex-wrap", children: [_jsx("span", { children: j.format.toUpperCase() }), _jsx("span", { className: "text-line-2", children: "\u00B7" }), _jsxs("span", { children: [j.w, "\u00D7", j.h] }), _jsx("span", { className: "text-line-2", children: "\u00B7" }), _jsxs("span", { children: [j.fps, "fps"] }), _jsx("span", { className: "text-line-2", children: "\u00B7" }), _jsxs("span", { children: [j.frames.toLocaleString(), "f"] }), _jsx("span", { className: "text-line-2", children: "\u00B7" }), _jsx("span", { children: j.rangeLabel }), _jsx("span", { className: "text-line-2", children: "\u00B7" }), _jsxs("span", { children: ["~", prettyMB(j.sizeEst)] })] }), !isStill && (j.status === "queued" || j.status === "rendering") && (_jsxs("div", { className: "flex items-center gap-2.5 mt-2", children: [_jsx("div", { className: "flex-1 h-1 rounded-full bg-bg-3 overflow-hidden", children: _jsx("div", { className: "h-full bg-accent rounded-full transition-[width]", style: { width: `${Math.round(j.progress * 100)}%` } }) }), _jsxs("span", { className: "font-mono text-[10.5px] text-ink-2 w-9 text-right", children: [Math.round(j.progress * 100), "%"] })] }))] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [j.status === "done" && (_jsx(StTooltip, { content: "Download", children: _jsx(IconButton, { size: "sm", icon: "download", onClick: () => store.downloadJob(j) }) })), (j.status === "queued" || j.status === "rendering") && (_jsx(StTooltip, { content: "Cancel", children: _jsx(IconButton, { size: "sm", icon: "close", onClick: () => store.cancelJob(j.jobId) }) })), _jsx(StTooltip, { content: "Remove", children: _jsx(IconButton, { size: "sm", tone: "danger", icon: "trash", iconSize: 15, onClick: () => store.removeJob(j.jobId) }) })] })] }, j.jobId));
38
+ })) })] }));
39
+ }
40
+ //# sourceMappingURL=render-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-queue.js","sourceRoot":"","sources":["../../../src/components/render/render-queue.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,MAAM,MAAM,GAAyE;IACnF,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,gCAAgC,EAAE;IACjF,SAAS,EAAE;QACT,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,QAAQ;QACd,GAAG,EAAE,+CAA+C;KACrD;IACD,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,qCAAqC,EAAE;IACnF,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,gCAAgC,EAAE;IACrF,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,2CAA2C,EAAE;CAC5F,CAAC;AAEF,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,EAA0B;IAC/D,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IAC5F,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAE5D,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CAAC,8BAA8B,EAAE,SAAS,CAAC,EACxD,KAAK,EAAE;YACL,UAAU,EAAE,wEAAwE;SACrF,aAED,eAAK,SAAS,EAAC,4DAA4D,aACzE,eAAK,SAAS,EAAC,kDAAkD,aAC/D,2BACE,YAAG,SAAS,EAAC,uCAAuC,YAAE,MAAM,GAAK,cAC5D,EACP,2BACE,YAAG,SAAS,EAAC,uCAAuC,YAAE,IAAI,GAAK,aAC1D,EACP,2BACE,YAAG,SAAS,EAAC,uCAAuC,YAAE,IAAI,CAAC,MAAM,GAAK,aACjE,IACH,EACN,cAAK,SAAS,EAAC,QAAQ,GAAG,EACzB,IAAI,GAAG,CAAC,IAAI,CACX,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,KAAK,CAAC,SAAS,4BAE3D,CACV,IACG,EAEN,cAAK,SAAS,EAAC,yEAAyE,YACrF,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACnB,eAAK,SAAS,EAAC,+EAA+E,aAC5F,cAAK,SAAS,EAAC,uFAAuF,YACpG,KAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAE,EAAE,GAAI,GAC5B,EACN,aAAI,SAAS,EAAC,2CAA2C,mCAAwB,EACjF,YAAG,SAAS,EAAC,+CAA+C,yFAExD,IACA,CACP,CAAC,CAAC,CAAC,CACF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;oBACb,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;oBAC5B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;oBACnC,OAAO,CACL,eAEE,SAAS,EAAE,EAAE,CACX,2DAA2D,EAC3D,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CACvD,aAED,cACE,SAAS,EAAC,kFAAkF,EAC5F,KAAK,EAAE;oCACL,UAAU,EAAE,OAAO;wCACjB,CAAC,CAAC,yCAAyC;wCAC3C,CAAC,CAAC,yCAAyC;oCAC7C,KAAK,EAAE,uBAAuB;iCAC/B,YAED,KAAC,IAAI,IAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,GAAI,GACjD,EACN,eAAK,SAAS,EAAC,gBAAgB,aAC7B,eAAK,SAAS,EAAC,2BAA2B,aACxC,eAAM,SAAS,EAAC,6CAA6C,YAAE,CAAC,CAAC,IAAI,GAAQ,EAC7E,gBACE,SAAS,EAAE,EAAE,CACX,4FAA4F,EAC5F,EAAE,CAAC,GAAG,CACP,aAED,KAAC,IAAI,IACH,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,IAAI,EAAE,EAAE,EACR,SAAS,EAAE,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GACjD,EACD,EAAE,CAAC,KAAK,IACJ,IACH,EACN,eAAK,SAAS,EAAC,2EAA2E,aACxF,yBAAO,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,GAAQ,EACrC,eAAM,SAAS,EAAC,aAAa,uBAAS,EACtC,2BACG,CAAC,CAAC,CAAC,YAAG,CAAC,CAAC,CAAC,IACL,EACP,eAAM,SAAS,EAAC,aAAa,uBAAS,EACtC,2BAAO,CAAC,CAAC,GAAG,WAAW,EACvB,eAAM,SAAS,EAAC,aAAa,uBAAS,EACtC,2BAAO,CAAC,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,EACzC,eAAM,SAAS,EAAC,aAAa,uBAAS,EACtC,yBAAO,CAAC,CAAC,UAAU,GAAQ,EAC3B,eAAM,SAAS,EAAC,aAAa,uBAAS,EACtC,gCAAQ,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAQ,IAC/B,EACL,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,IAAI,CAClE,eAAK,SAAS,EAAC,gCAAgC,aAC7C,cAAK,SAAS,EAAC,iDAAiD,YAC9D,cACE,SAAS,EAAC,kDAAkD,EAC5D,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,GACpD,GACE,EACN,gBAAM,SAAS,EAAC,mDAAmD,aAChE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,SACxB,IACH,CACP,IACG,EACN,eAAK,SAAS,EAAC,2BAA2B,aACvC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CACtB,KAAC,SAAS,IAAC,OAAO,EAAC,UAAU,YAC3B,KAAC,UAAU,IAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,UAAU,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,GAAI,GACnE,CACb,EACA,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,IAAI,CACtD,KAAC,SAAS,IAAC,OAAO,EAAC,QAAQ,YACzB,KAAC,UAAU,IAAC,IAAI,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAI,GACpE,CACb,EACD,KAAC,SAAS,IAAC,OAAO,EAAC,QAAQ,YACzB,KAAC,UAAU,IACT,IAAI,EAAC,IAAI,EACT,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,OAAO,EACZ,QAAQ,EAAE,EAAE,EACZ,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GACvC,GACQ,IACR,KAnFD,CAAC,CAAC,KAAK,CAoFR,CACP,CAAC;gBACJ,CAAC,CAAC,CACH,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The collapsed right-panel rail. */
2
+ export declare function PanelHandle(): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=panel-handle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-handle.d.ts","sourceRoot":"","sources":["../../../src/components/right-panel/panel-handle.tsx"],"names":[],"mappings":"AAGA,sCAAsC;AACtC,wBAAgB,WAAW,4CAqB1B"}
@@ -0,0 +1,9 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useStudio } from "../../hooks/use-studio.js";
3
+ import { Icon } from "../icon/icon.js";
4
+ /** The collapsed right-panel rail. */
5
+ export function PanelHandle() {
6
+ const store = useStudio();
7
+ return (_jsxs("div", { className: "w-[26px] flex-none bg-bg-1 border-l border-line flex flex-col items-center pt-3 gap-3.5", children: [_jsx("button", { type: "button", onClick: () => store.setPanelOpen(true), className: "size-[26px] grid place-items-center text-ink-3 rounded-[6px] hover:text-ink-1 hover:bg-bg-2", title: "Open panel", children: _jsx(Icon, { name: "panelRight", size: 16 }) }), _jsx("button", { type: "button", onClick: () => store.setPanelOpen(true), className: "[writing-mode:vertical-rl] text-[10.5px] font-bold tracking-[.12em] uppercase text-ink-3 hover:text-ink-2 mt-1", children: "Inspector" })] }));
8
+ }
9
+ //# sourceMappingURL=panel-handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-handle.js","sourceRoot":"","sources":["../../../src/components/right-panel/panel-handle.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,sCAAsC;AACtC,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,OAAO,CACL,eAAK,SAAS,EAAC,yFAAyF,aACtG,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EACvC,SAAS,EAAC,6FAA6F,EACvG,KAAK,EAAC,YAAY,YAElB,KAAC,IAAI,IAAC,IAAI,EAAC,YAAY,EAAC,IAAI,EAAE,EAAE,GAAI,GAC7B,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EACvC,SAAS,EAAC,gHAAgH,0BAGnH,IACL,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Props (schema form) / Info tabs for the active composition. */
2
+ export declare function PanelTabs(): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=panel-tabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-tabs.d.ts","sourceRoot":"","sources":["../../../src/components/right-panel/panel-tabs.tsx"],"names":[],"mappings":"AAQA,kEAAkE;AAClE,wBAAgB,SAAS,4CAwDxB"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useComposition } from "../../hooks/use-composition.js";
3
+ import { useStudio } from "../../hooks/use-studio.js";
4
+ import { useSignalValue } from "../../signals/signal-bridge.js";
5
+ import { IconButton } from "../button/icon-button.js";
6
+ import { StTabs, Tab, TabList, TabPanel } from "../primitives/tabs.js";
7
+ import { StTooltip } from "../primitives/tooltip.js";
8
+ import { SchemaForm } from "../schema-form/schema-form.js";
9
+ /** Props (schema form) / Info tabs for the active composition. */
10
+ export function PanelTabs() {
11
+ const store = useStudio();
12
+ const tab = useSignalValue(store.panelTab);
13
+ const { composition: comp, entry } = useComposition();
14
+ return (_jsxs(StTabs, { value: tab, onValueChange: (v) => store.setPanelTab(v), children: [_jsxs(TabList, { children: [_jsx(Tab, { value: "props", icon: "sliders", children: "Props" }), _jsx(Tab, { value: "info", icon: "info", children: "Info" }), _jsx("div", { className: "flex-1" }), _jsx("div", { className: "flex items-center pr-1", children: _jsx(StTooltip, { content: "Collapse", children: _jsx(IconButton, { size: "sm", icon: "close", onClick: () => store.setPanelOpen(false) }) }) })] }), _jsx(TabPanel, { value: "props", className: "p-4", children: _jsx(SchemaForm, {}) }), _jsxs(TabPanel, { value: "info", className: "p-4", children: [entry?.description && (_jsx("p", { className: "text-[13px] leading-relaxed text-ink-2 mt-0 mb-4.5", children: entry.description })), (entry?.tags ?? []).length > 0 && (_jsx("div", { className: "flex gap-1.5 flex-wrap mb-4.5", children: entry?.tags?.map((t) => (_jsxs("span", { className: "text-[11px] text-ink-2 bg-bg-2 border border-line rounded-full px-2.5 py-0.5", children: ["#", t] }, t))) })), comp ? (_jsx(InfoRows, { group: entry?.group ?? "Compositions", durationS: comp.durationInFrames.get() / comp.fps, fps: comp.fps, frames: comp.durationInFrames.get(), size: `${comp.width()}×${comp.height()}` })) : (_jsx("div", { className: "text-[12.5px] text-ink-3", children: "Loading\u2026" }))] })] }));
15
+ }
16
+ function InfoRows({ group, durationS, fps, frames, size, }) {
17
+ const rows = [
18
+ ["Subject", group],
19
+ ["Duration", `${durationS.toFixed(1)}s`],
20
+ ["Frame rate", `${fps} fps`],
21
+ ["Frames", String(frames)],
22
+ ["Composition", size],
23
+ ];
24
+ return (_jsx(_Fragment, { children: rows.map(([k, v]) => (_jsxs("div", { className: "flex justify-between py-2.5 border-b border-line last:border-0 text-[13px]", children: [_jsx("span", { className: "text-ink-3", children: k }), _jsx("span", { className: "text-ink-1 font-mono text-[12px]", children: v })] }, k))) }));
25
+ }
26
+ //# sourceMappingURL=panel-tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-tabs.js","sourceRoot":"","sources":["../../../src/components/right-panel/panel-tabs.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from "react";
2
+ /** Right inspector. Collapses to a handle; defaults to the Props/Info tabs. */
3
+ export declare function Panel({ children, width, className, }: {
4
+ children?: ReactNode;
5
+ width?: string;
6
+ className?: string;
7
+ }): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../../src/components/right-panel/panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,EACpB,QAAQ,EACR,KAAK,EACL,SAAS,GACV,EAAE;IACD,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAaA"}
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useStudio } from "../../hooks/use-studio.js";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { useSignalValue } from "../../signals/signal-bridge.js";
5
+ import { PanelHandle } from "./panel-handle.js";
6
+ import { PanelTabs } from "./panel-tabs.js";
7
+ /** Right inspector. Collapses to a handle; defaults to the Props/Info tabs. */
8
+ export function Panel({ children, width, className, }) {
9
+ const store = useStudio();
10
+ const open = useSignalValue(store.panelOpen);
11
+ if (!open)
12
+ return _jsx(PanelHandle, {});
13
+ const w = width ?? "var(--spacing-panel)";
14
+ return (_jsx("div", { className: cn("flex flex-col min-h-0 bg-bg-1 border-l border-line", className), style: { width: w, flex: `0 0 ${w}` }, children: children ?? _jsx(PanelTabs, {}) }));
15
+ }
16
+ //# sourceMappingURL=panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../../src/components/right-panel/panel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,+EAA+E;AAC/E,MAAM,UAAU,KAAK,CAAC,EACpB,QAAQ,EACR,KAAK,EACL,SAAS,GAKV;IACC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAC,WAAW,KAAG,CAAC;IAClC,MAAM,CAAC,GAAG,KAAK,IAAI,sBAAsB,CAAC;IAC1C,OAAO,CACL,cACE,SAAS,EAAE,EAAE,CAAC,oDAAoD,EAAE,SAAS,CAAC,EAC9E,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,YAEpC,QAAQ,IAAI,KAAC,SAAS,KAAG,GACtB,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SmooveField } from "../../schema/types.js";
2
+ type FieldProps = {
3
+ field: SmooveField;
4
+ value: unknown;
5
+ onChange: (value: unknown) => void;
6
+ };
7
+ export declare function Field({ field, value, onChange }: FieldProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../../src/components/schema-form/field.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMzD,KAAK,UAAU,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,CAAC;AAM7F,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,UAAU,2CAsP3D"}
@@ -0,0 +1,102 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/cn.js";
3
+ import { Icon } from "../icon/icon.js";
4
+ import { StSelect } from "../primitives/select.js";
5
+ import { StSlider } from "../primitives/slider.js";
6
+ import { StSwitch } from "../primitives/switch.js";
7
+ const labelCls = "text-[12.5px] text-ink-2 font-medium";
8
+ const inputCls = "w-full bg-bg-2 border border-line rounded-control text-[13px] text-ink-1 placeholder:text-ink-3 px-3 py-2 outline-none focus:border-accent focus:shadow-[0_0_0_3px_var(--color-accent-soft)]";
9
+ export function Field({ field, value, onChange }) {
10
+ switch (field.type) {
11
+ case "divider":
12
+ return (_jsxs("div", { className: "flex items-center gap-2.5 mt-5 mb-3 first:mt-0", children: [field.label && (_jsx("span", { className: "text-[10.5px] font-bold tracking-[.08em] uppercase text-ink-3", children: field.label })), _jsx("span", { className: "flex-1 h-px bg-line" })] }));
13
+ case "boolean":
14
+ return (_jsxs("div", { className: "mb-4 flex items-center justify-between gap-3", children: [_jsx("span", { className: labelCls, children: field.label }), _jsx(StSwitch, { checked: Boolean(value), onCheckedChange: onChange })] }));
15
+ case "text":
16
+ return (_jsx(Labeled, { label: field.label, description: field.description, children: _jsx("input", { value: String(value ?? ""), placeholder: field.placeholder, onChange: (e) => onChange(e.target.value), className: inputCls }) }));
17
+ case "multiline":
18
+ return (_jsx(Labeled, { label: field.label, description: field.description, children: _jsx("textarea", { value: String(value ?? ""), placeholder: field.placeholder, rows: field.rows ?? 3, onChange: (e) => onChange(e.target.value), className: cn(inputCls, "resize-y leading-relaxed") }) }));
19
+ case "number": {
20
+ const num = typeof value === "number" ? value : (field.default ?? field.min ?? 0);
21
+ const slider = field.min != null && field.max != null;
22
+ return (_jsxs("div", { className: "mb-4", children: [_jsxs("div", { className: "flex items-center justify-between mb-2", children: [_jsx("span", { className: labelCls, children: field.label }), _jsxs("span", { className: "font-mono text-[11.5px] text-ink-1 bg-bg-2 border border-line px-2 py-0.5 rounded-[5px]", children: [num, field.unit ?? ""] })] }), slider ? (_jsx(StSlider, { value: num, min: field.min, max: field.max, step: field.step ?? 1, onValueChange: onChange })) : (_jsx("input", { type: "number", value: num, step: field.step ?? 1, onChange: (e) => onChange(Number(e.target.value)), className: inputCls }))] }));
23
+ }
24
+ case "color": {
25
+ const swatches = field.swatches ?? ["#ffffff", "#ff5640", "#2bd9c4", "#ff8a3d", "#ff5d8f"];
26
+ const current = String(value ?? field.default ?? "#ffffff");
27
+ return (_jsx(Labeled, { label: field.label, description: field.description, children: _jsxs("div", { className: "flex gap-2 flex-wrap items-center", children: [swatches.map((c) => (_jsx("button", { type: "button", onClick: () => onChange(c), className: cn("size-[26px] rounded-[7px] shadow-[0_0_0_1px_rgba(255,255,255,.1)_inset]", current === c && "ring-2 ring-accent-2 ring-offset-2 ring-offset-bg-1"), style: { background: c } }, c))), _jsx("input", { value: current, onChange: (e) => onChange(e.target.value), className: "w-[88px] bg-bg-2 border border-line rounded-control text-[12px] font-mono text-ink-1 px-2 py-1.5 outline-none focus:border-line-2" })] }) }));
28
+ }
29
+ case "select":
30
+ return (_jsx(Labeled, { label: field.label, description: field.description, children: _jsx(StSelect, { value: String(value ?? field.default ?? field.options[0]?.value ?? ""), onValueChange: onChange, options: field.options }) }));
31
+ case "multiselect": {
32
+ const selected = Array.isArray(value) ? value : [];
33
+ const toggle = (v) => onChange(selected.includes(v) ? selected.filter((x) => x !== v) : [...selected, v]);
34
+ return (_jsx(Labeled, { label: field.label, description: field.description, children: _jsx("div", { className: "flex gap-1.5 flex-wrap", children: field.options.map((o) => {
35
+ const on = selected.includes(o.value);
36
+ return (_jsx("button", { type: "button", onClick: () => toggle(o.value), className: cn("text-[12px] font-medium rounded-full px-2.5 py-1 border transition-colors", on
37
+ ? "bg-accent-soft border-accent-line text-white"
38
+ : "bg-bg-2 border-line text-ink-2 hover:text-ink-1"), children: o.label }, o.value));
39
+ }) }) }));
40
+ }
41
+ case "object": {
42
+ const obj = isObj(value) ? value : {};
43
+ return (_jsxs("div", { className: "mb-4 rounded-ui border border-line bg-bg-2/40 p-3", children: [field.label && (_jsx("div", { className: "text-[11px] font-bold tracking-[.06em] uppercase text-ink-3 mb-2.5", children: field.label })), Object.entries(field.fields).map(([k, f]) => (_jsx(Field, { field: f, value: obj[k], onChange: (v) => onChange({ ...obj, [k]: v }) }, k)))] }));
44
+ }
45
+ case "array": {
46
+ const items = Array.isArray(value) ? value : [];
47
+ const setItem = (i, v) => onChange(items.map((it, idx) => (idx === i ? v : it)));
48
+ const removeItem = (i) => onChange(items.filter((_, idx) => idx !== i));
49
+ const move = (i, dir) => {
50
+ const j = i + dir;
51
+ if (j < 0 || j >= items.length)
52
+ return;
53
+ const next = items.slice();
54
+ const a = next[i];
55
+ const b = next[j];
56
+ next[i] = b;
57
+ next[j] = a;
58
+ onChange(next);
59
+ };
60
+ const add = () => onChange([...items, defaultItem(field.of)]);
61
+ const atMax = field.max != null && items.length >= field.max;
62
+ const atMin = field.min != null && items.length <= field.min;
63
+ return (_jsxs("div", { className: "mb-4", children: [_jsxs("div", { className: "flex items-center justify-between mb-2", children: [_jsx("span", { className: labelCls, children: field.label }), _jsx("span", { className: "text-[10.5px] font-mono text-ink-3", children: items.length })] }), _jsx("div", { className: "flex flex-col gap-2", children: items.map((it, i) => (_jsxs("div", { className: "rounded-control border border-line bg-bg-2/40 p-2.5", children: [_jsxs("div", { className: "flex items-center gap-1 mb-1.5", children: [_jsxs("span", { className: "text-[10.5px] font-mono text-ink-3 flex-1", children: [field.itemLabel ?? "Item", " ", i + 1] }), _jsx("button", { type: "button", onClick: () => move(i, -1), disabled: i === 0, className: "size-6 grid place-items-center rounded text-ink-3 hover:text-ink-1 hover:bg-bg-3 disabled:opacity-30 rotate-180", title: "Move up", children: _jsx(Icon, { name: "chevron", size: 13 }) }), _jsx("button", { type: "button", onClick: () => move(i, 1), disabled: i === items.length - 1, className: "size-6 grid place-items-center rounded text-ink-3 hover:text-ink-1 hover:bg-bg-3 disabled:opacity-30", title: "Move down", children: _jsx(Icon, { name: "chevron", size: 13 }) }), _jsx("button", { type: "button", onClick: () => removeItem(i), disabled: atMin, className: "size-6 grid place-items-center rounded text-ink-3 hover:text-danger hover:bg-danger/12 disabled:opacity-30", title: "Remove", children: _jsx(Icon, { name: "trash", size: 14 }) })] }), _jsx(Field, { field: field.of, value: it, onChange: (v) => setItem(i, v) })] }, i))) }), _jsxs("button", { type: "button", onClick: add, disabled: atMax, className: "mt-2 flex items-center justify-center gap-1.5 w-full text-[12px] font-medium text-ink-2 bg-bg-2 border border-line border-dashed rounded-control py-2 hover:text-ink-1 hover:border-line-2 disabled:opacity-40", children: [_jsx(Icon, { name: "plus", size: 14 }), " Add ", field.itemLabel ?? "item"] })] }));
64
+ }
65
+ }
66
+ }
67
+ function Labeled({ label, description, children, }) {
68
+ return (_jsxs("div", { className: "mb-4", children: [label && _jsx("div", { className: cn(labelCls, "mb-2"), children: label }), children, description && (_jsx("div", { className: "text-[11px] text-ink-3 mt-1.5 leading-relaxed", children: description }))] }));
69
+ }
70
+ function isObj(v) {
71
+ return typeof v === "object" && v !== null && !Array.isArray(v);
72
+ }
73
+ function defaultItem(field) {
74
+ switch (field.type) {
75
+ case "object": {
76
+ const o = {};
77
+ for (const [k, f] of Object.entries(field.fields)) {
78
+ if (f.type !== "divider")
79
+ o[k] = defaultItem(f);
80
+ }
81
+ return o;
82
+ }
83
+ case "text":
84
+ case "multiline":
85
+ return field.default ?? "";
86
+ case "color":
87
+ return field.default ?? "#ffffff";
88
+ case "boolean":
89
+ return field.default ?? false;
90
+ case "number":
91
+ return field.default ?? field.min ?? 0;
92
+ case "select":
93
+ return field.default ?? field.options[0]?.value ?? "";
94
+ case "multiselect":
95
+ return field.default ?? [];
96
+ case "array":
97
+ return field.default ?? [];
98
+ default:
99
+ return undefined;
100
+ }
101
+ }
102
+ //# sourceMappingURL=field.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.js","sourceRoot":"","sources":["../../../src/components/schema-form/field.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Schema-driven props form for the active composition. */
2
+ export declare function SchemaForm(): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=schema-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-form.d.ts","sourceRoot":"","sources":["../../../src/components/schema-form/schema-form.tsx"],"names":[],"mappings":"AAKA,2DAA2D;AAC3D,wBAAgB,UAAU,4CA6CzB"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useComposition } from "../../hooks/use-composition.js";
3
+ import { usePropsForm } from "../../hooks/use-props-form.js";
4
+ import { Icon } from "../icon/icon.js";
5
+ import { Field } from "./field.js";
6
+ /** Schema-driven props form for the active composition. */
7
+ export function SchemaForm() {
8
+ const { selectedId, entry } = useComposition();
9
+ const form = usePropsForm(selectedId);
10
+ const fields = form.schema ? Object.entries(form.schema.fields) : [];
11
+ const hasFields = fields.some(([, f]) => f.type !== "divider");
12
+ if (!hasFields) {
13
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center text-center h-full text-ink-3 gap-3 py-10", children: [_jsx("div", { className: "size-11 rounded-xl bg-bg-2 grid place-items-center border border-line", children: _jsx(Icon, { name: "sliders", size: 20 }) }), _jsx("h4", { className: "m-0 text-[14px] text-ink-2 font-semibold", children: "No props" }), _jsxs("p", { className: "m-0 text-[12.5px] leading-relaxed max-w-[200px]", children: ["\u201C", entry?.title ?? selectedId, "\u201D exposes no overridable settings."] })] }));
14
+ }
15
+ const values = form.values;
16
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center justify-between mb-4", children: [_jsxs("div", { className: "text-[10.5px] font-bold tracking-[.08em] uppercase text-ink-3", children: [entry?.title ?? selectedId, " \u00B7 props"] }), _jsx("button", { type: "button", onClick: form.reset, className: "text-[11px] text-ink-2 bg-bg-2 border border-line rounded-full px-2.5 py-0.5 font-medium hover:text-ink-1 hover:border-line-2", children: "Reset" })] }), fields.map(([key, field]) => (_jsx(Field, { field: field, value: values[key], onChange: (v) => form.setValue(key, v) }, key)))] }));
17
+ }
18
+ //# sourceMappingURL=schema-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-form.js","sourceRoot":"","sources":["../../../src/components/schema-form/schema-form.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,2DAA2D;AAC3D,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAE/D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CACL,eAAK,SAAS,EAAC,qFAAqF,aAClG,cAAK,SAAS,EAAC,uEAAuE,YACpF,KAAC,IAAI,IAAC,IAAI,EAAC,SAAS,EAAC,IAAI,EAAE,EAAE,GAAI,GAC7B,EACN,aAAI,SAAS,EAAC,0CAA0C,yBAAc,EACtE,aAAG,SAAS,EAAC,iDAAiD,uBAC1D,KAAK,EAAE,KAAK,IAAI,UAAU,+CAC1B,IACA,CACP,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3B,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,wCAAwC,aACrD,eAAK,SAAS,EAAC,+DAA+D,aAC3E,KAAK,EAAE,KAAK,IAAI,UAAU,qBACvB,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,IAAI,CAAC,KAAK,EACnB,SAAS,EAAC,+HAA+H,sBAGlI,IACL,EACL,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAC5B,KAAC,KAAK,IAEJ,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAHjC,GAAG,CAIR,CACH,CAAC,IACD,CACJ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type StageProps = {
2
+ className?: string;
3
+ /** Show the corner resolution/frame/scale readout (off by default). */
4
+ showStatus?: boolean;
5
+ };
6
+ /**
7
+ * The composition viewport. Mounts a `<smoove-player>`, registers it with the store,
8
+ * and sizes it to the scaled comp box (fit-to-viewport, or an explicit zoom in
9
+ * an overflow-scroll container). The player letterboxes inside that box.
10
+ */
11
+ export declare function Stage({ className, showStatus }: StageProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=stage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../../src/components/stage/stage.tsx"],"names":[],"mappings":"AAcA,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,UAAkB,EAAE,EAAE,UAAU,2CAkGlE"}
@@ -0,0 +1,103 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { useComposition } from "../../hooks/use-composition.js";
4
+ import { applyLayerVisibility } from "../../hooks/use-layers.js";
5
+ import { useShortcuts } from "../../hooks/use-shortcuts.js";
6
+ import { useStudio } from "../../hooks/use-studio.js";
7
+ import { cn } from "../../lib/cn.js";
8
+ import { fpsHealth } from "../../lib/format.js";
9
+ import { usePlayerSignal, useSignalValue } from "../../signals/signal-bridge.js";
10
+ const PAD = 40;
11
+ const ZERO_SIGNAL = { get: () => 0, subscribe: () => () => { } };
12
+ /**
13
+ * The composition viewport. Mounts a `<smoove-player>`, registers it with the store,
14
+ * and sizes it to the scaled comp box (fit-to-viewport, or an explicit zoom in
15
+ * an overflow-scroll container). The player letterboxes inside that box.
16
+ */
17
+ export function Stage({ className, showStatus = false }) {
18
+ const store = useStudio();
19
+ const { composition: comp } = useComposition();
20
+ const zoom = useSignalValue(store.zoom);
21
+ const layerOffMap = useSignalValue(store.layerOff);
22
+ const selectedId = useSignalValue(store.selectedId);
23
+ useShortcuts();
24
+ const wrapRef = useRef(null);
25
+ const playerRef = useRef(null);
26
+ const [box, setBox] = useState({ w: 0, h: 0 });
27
+ // measure available space
28
+ useEffect(() => {
29
+ const el = wrapRef.current;
30
+ if (!el)
31
+ return;
32
+ const ro = new ResizeObserver((entries) => {
33
+ const r = entries[0]?.contentRect;
34
+ if (r)
35
+ setBox({ w: r.width, h: r.height });
36
+ });
37
+ ro.observe(el);
38
+ return () => ro.disconnect();
39
+ }, []);
40
+ // register the player + base attributes (we own keyboard + click-to-play)
41
+ useEffect(() => {
42
+ const el = playerRef.current;
43
+ if (!el)
44
+ return;
45
+ el.setAttribute("no-keyboard", "");
46
+ el.setAttribute("no-click-to-play", "");
47
+ el.setAttribute("loop", "");
48
+ // No autoplay: a composition loads stopped (paused on frame 0) by default.
49
+ store.setPlayer(el);
50
+ return () => {
51
+ if (store.player.get() === el)
52
+ store.setPlayer(null);
53
+ };
54
+ }, [store]);
55
+ // mount / swap the composition
56
+ useEffect(() => {
57
+ const el = playerRef.current;
58
+ if (!el)
59
+ return;
60
+ el.composition = comp ?? null;
61
+ // After a dev hot-reload, restore the playhead + play state on the rebuilt
62
+ // comp (the player setter mounts synchronously, so seekTo works here).
63
+ if (comp) {
64
+ const restore = store.takeRestore();
65
+ if (restore) {
66
+ el.seekTo(restore.frame);
67
+ if (restore.playing)
68
+ el.play();
69
+ else
70
+ el.pause();
71
+ }
72
+ }
73
+ }, [comp, store]);
74
+ // apply per-layer enable/disable
75
+ useEffect(() => {
76
+ if (comp)
77
+ applyLayerVisibility(comp, layerOffMap[selectedId] ?? new Set());
78
+ }, [comp, layerOffMap, selectedId]);
79
+ const w = comp ? comp.width() : 1280;
80
+ const h = comp ? comp.height() : 720;
81
+ const fit = zoom === "fit";
82
+ const fitScale = box.w
83
+ ? Math.max(0.05, Math.min((box.w - PAD * 2) / w, (box.h - PAD * 2) / h))
84
+ : 0.5;
85
+ useEffect(() => {
86
+ store.setFitScale(fitScale);
87
+ }, [fitScale, store]);
88
+ const scale = fit ? fitScale : zoom;
89
+ const overflow = !fit && (w * scale > box.w - 8 || h * scale > box.h - 8);
90
+ return (_jsxs("div", { ref: wrapRef, className: cn("relative flex-1 min-h-0 overflow-hidden", className), style: {
91
+ background: "radial-gradient(120% 90% at 50% 0%, #16151c 0%, var(--color-stage) 70%)",
92
+ }, children: [_jsx("div", { className: cn("absolute inset-0 flex p-10", overflow ? "overflow-auto scroll" : "items-center justify-center"), children: _jsx("div", { className: "m-auto flex-none relative rounded-[4px] overflow-hidden bg-black shadow-[0_24px_80px_-20px_rgba(0,0,0,.8),0_0_0_1px_rgba(255,255,255,.06)]", style: { width: w * scale, height: h * scale }, children: _jsx("smoove-player", { ref: playerRef, style: { position: "absolute", inset: 0 } }) }) }), showStatus && comp && _jsx(StageStatus, { scale: scale, w: w, h: h })] }));
93
+ }
94
+ function StageStatus({ scale, w, h }) {
95
+ const store = useStudio();
96
+ const player = useSignalValue(store.player);
97
+ const frame = usePlayerSignal(player?.state.frame ?? ZERO_SIGNAL);
98
+ const total = usePlayerSignal(player?.state.duration ?? ZERO_SIGNAL);
99
+ const fps = player?.fps ?? 0;
100
+ const health = fpsHealth(fps, fps || 1);
101
+ return (_jsxs("div", { className: "absolute bottom-3 left-4 z-[5] flex items-center gap-2.5 text-[11px] font-mono text-ink-3 bg-[rgba(16,16,20,.6)] backdrop-blur-md border border-line rounded-control px-2.5 py-1.5 pointer-events-none", children: [_jsx("span", { className: cn("size-[7px] rounded-full", health === "good" ? "bg-good" : health === "ok" ? "bg-warn" : "bg-ink-3/50") }), _jsxs("span", { className: "text-ink-2 font-semibold", children: [w, "\u00D7", h] }), _jsx("span", { className: "text-line-2", children: "\u00B7" }), _jsxs("span", { children: [frame, "/", total, "f"] }), _jsx("span", { className: "text-line-2", children: "\u00B7" }), _jsxs("span", { children: [Math.round(scale * 100), "%"] })] }));
102
+ }
103
+ //# sourceMappingURL=stage.js.map