@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.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/components/brand/brand.d.ts +9 -0
- package/dist/components/brand/brand.d.ts.map +1 -0
- package/dist/components/brand/brand.js +11 -0
- package/dist/components/brand/brand.js.map +1 -0
- package/dist/components/button/button.d.ts +21 -0
- package/dist/components/button/button.d.ts.map +1 -0
- package/dist/components/button/button.js +20 -0
- package/dist/components/button/button.js.map +1 -0
- package/dist/components/button/icon-button.d.ts +27 -0
- package/dist/components/button/icon-button.d.ts.map +1 -0
- package/dist/components/button/icon-button.js +19 -0
- package/dist/components/button/icon-button.js.map +1 -0
- package/dist/components/header/header-title.d.ts +8 -0
- package/dist/components/header/header-title.d.ts.map +1 -0
- package/dist/components/header/header-title.js +7 -0
- package/dist/components/header/header-title.js.map +1 -0
- package/dist/components/header/header.d.ts +7 -0
- package/dist/components/header/header.d.ts.map +1 -0
- package/dist/components/header/header.js +7 -0
- package/dist/components/header/header.js.map +1 -0
- package/dist/components/header/zoom.d.ts +3 -0
- package/dist/components/header/zoom.d.ts.map +1 -0
- package/dist/components/header/zoom.js +16 -0
- package/dist/components/header/zoom.js.map +1 -0
- package/dist/components/icon/icon.d.ts +11 -0
- package/dist/components/icon/icon.d.ts.map +1 -0
- package/dist/components/icon/icon.js +7 -0
- package/dist/components/icon/icon.js.map +1 -0
- package/dist/components/icon/paths.d.ts +47 -0
- package/dist/components/icon/paths.d.ts.map +1 -0
- package/dist/components/icon/paths.js +54 -0
- package/dist/components/icon/paths.js.map +1 -0
- package/dist/components/left-panel/library.d.ts +8 -0
- package/dist/components/left-panel/library.d.ts.map +1 -0
- package/dist/components/left-panel/library.js +49 -0
- package/dist/components/left-panel/library.js.map +1 -0
- package/dist/components/left-panel/sidebar-group.d.ts +12 -0
- package/dist/components/left-panel/sidebar-group.d.ts.map +1 -0
- package/dist/components/left-panel/sidebar-group.js +11 -0
- package/dist/components/left-panel/sidebar-group.js.map +1 -0
- package/dist/components/left-panel/sidebar-item.d.ts +17 -0
- package/dist/components/left-panel/sidebar-item.d.ts.map +1 -0
- package/dist/components/left-panel/sidebar-item.js +12 -0
- package/dist/components/left-panel/sidebar-item.js.map +1 -0
- package/dist/components/left-panel/sidebar.d.ts +8 -0
- package/dist/components/left-panel/sidebar.d.ts.map +1 -0
- package/dist/components/left-panel/sidebar.js +8 -0
- package/dist/components/left-panel/sidebar.js.map +1 -0
- package/dist/components/primitives/dialog.d.ts +33 -0
- package/dist/components/primitives/dialog.d.ts.map +1 -0
- package/dist/components/primitives/dialog.js +30 -0
- package/dist/components/primitives/dialog.js.map +1 -0
- package/dist/components/primitives/menu.d.ts +25 -0
- package/dist/components/primitives/menu.d.ts.map +1 -0
- package/dist/components/primitives/menu.js +31 -0
- package/dist/components/primitives/menu.js.map +1 -0
- package/dist/components/primitives/number-field.d.ts +12 -0
- package/dist/components/primitives/number-field.d.ts.map +1 -0
- package/dist/components/primitives/number-field.js +7 -0
- package/dist/components/primitives/number-field.js.map +1 -0
- package/dist/components/primitives/portal-context.d.ts +9 -0
- package/dist/components/primitives/portal-context.d.ts.map +1 -0
- package/dist/components/primitives/portal-context.js +10 -0
- package/dist/components/primitives/portal-context.js.map +1 -0
- package/dist/components/primitives/select.d.ts +14 -0
- package/dist/components/primitives/select.d.ts.map +1 -0
- package/dist/components/primitives/select.js +11 -0
- package/dist/components/primitives/select.js.map +1 -0
- package/dist/components/primitives/slider.d.ts +10 -0
- package/dist/components/primitives/slider.d.ts.map +1 -0
- package/dist/components/primitives/slider.js +7 -0
- package/dist/components/primitives/slider.js.map +1 -0
- package/dist/components/primitives/switch.d.ts +5 -0
- package/dist/components/primitives/switch.d.ts.map +1 -0
- package/dist/components/primitives/switch.js +6 -0
- package/dist/components/primitives/switch.js.map +1 -0
- package/dist/components/primitives/tabs.d.ts +23 -0
- package/dist/components/primitives/tabs.d.ts.map +1 -0
- package/dist/components/primitives/tabs.js +17 -0
- package/dist/components/primitives/tabs.js.map +1 -0
- package/dist/components/primitives/tooltip.d.ts +9 -0
- package/dist/components/primitives/tooltip.d.ts.map +1 -0
- package/dist/components/primitives/tooltip.js +11 -0
- package/dist/components/primitives/tooltip.js.map +1 -0
- package/dist/components/render/export-frame-dialog.d.ts +8 -0
- package/dist/components/render/export-frame-dialog.d.ts.map +1 -0
- package/dist/components/render/export-frame-dialog.js +60 -0
- package/dist/components/render/export-frame-dialog.js.map +1 -0
- package/dist/components/render/render-dialog.d.ts +8 -0
- package/dist/components/render/render-dialog.d.ts.map +1 -0
- package/dist/components/render/render-dialog.js +95 -0
- package/dist/components/render/render-dialog.js.map +1 -0
- package/dist/components/render/render-queue.d.ts +5 -0
- package/dist/components/render/render-queue.d.ts.map +1 -0
- package/dist/components/render/render-queue.js +40 -0
- package/dist/components/render/render-queue.js.map +1 -0
- package/dist/components/right-panel/panel-handle.d.ts +3 -0
- package/dist/components/right-panel/panel-handle.d.ts.map +1 -0
- package/dist/components/right-panel/panel-handle.js +9 -0
- package/dist/components/right-panel/panel-handle.js.map +1 -0
- package/dist/components/right-panel/panel-tabs.d.ts +3 -0
- package/dist/components/right-panel/panel-tabs.d.ts.map +1 -0
- package/dist/components/right-panel/panel-tabs.js +26 -0
- package/dist/components/right-panel/panel-tabs.js.map +1 -0
- package/dist/components/right-panel/panel.d.ts +8 -0
- package/dist/components/right-panel/panel.d.ts.map +1 -0
- package/dist/components/right-panel/panel.js +16 -0
- package/dist/components/right-panel/panel.js.map +1 -0
- package/dist/components/schema-form/field.d.ts +9 -0
- package/dist/components/schema-form/field.d.ts.map +1 -0
- package/dist/components/schema-form/field.js +102 -0
- package/dist/components/schema-form/field.js.map +1 -0
- package/dist/components/schema-form/schema-form.d.ts +3 -0
- package/dist/components/schema-form/schema-form.d.ts.map +1 -0
- package/dist/components/schema-form/schema-form.js +18 -0
- package/dist/components/schema-form/schema-form.js.map +1 -0
- package/dist/components/stage/stage.d.ts +12 -0
- package/dist/components/stage/stage.d.ts.map +1 -0
- package/dist/components/stage/stage.js +103 -0
- package/dist/components/stage/stage.js.map +1 -0
- package/dist/components/studio/features.d.ts +4 -0
- package/dist/components/studio/features.d.ts.map +1 -0
- package/dist/components/studio/features.js +18 -0
- package/dist/components/studio/features.js.map +1 -0
- package/dist/components/studio/layout.d.ts +19 -0
- package/dist/components/studio/layout.d.ts.map +1 -0
- package/dist/components/studio/layout.js +17 -0
- package/dist/components/studio/layout.js.map +1 -0
- package/dist/components/studio/studio-context.d.ts +53 -0
- package/dist/components/studio/studio-context.d.ts.map +1 -0
- package/dist/components/studio/studio-context.js +3 -0
- package/dist/components/studio/studio-context.js.map +1 -0
- package/dist/components/studio/studio.d.ts +21 -0
- package/dist/components/studio/studio.d.ts.map +1 -0
- package/dist/components/studio/studio.js +38 -0
- package/dist/components/studio/studio.js.map +1 -0
- package/dist/components/timeline/layered-body.d.ts +8 -0
- package/dist/components/timeline/layered-body.d.ts.map +1 -0
- package/dist/components/timeline/layered-body.js +75 -0
- package/dist/components/timeline/layered-body.js.map +1 -0
- package/dist/components/timeline/region-handles.d.ts +8 -0
- package/dist/components/timeline/region-handles.d.ts.map +1 -0
- package/dist/components/timeline/region-handles.js +13 -0
- package/dist/components/timeline/region-handles.js.map +1 -0
- package/dist/components/timeline/ruler.d.ts +7 -0
- package/dist/components/timeline/ruler.d.ts.map +1 -0
- package/dist/components/timeline/ruler.js +19 -0
- package/dist/components/timeline/ruler.js.map +1 -0
- package/dist/components/timeline/scrubber.d.ts +6 -0
- package/dist/components/timeline/scrubber.d.ts.map +1 -0
- package/dist/components/timeline/scrubber.js +25 -0
- package/dist/components/timeline/scrubber.js.map +1 -0
- package/dist/components/timeline/timeline-header.d.ts +3 -0
- package/dist/components/timeline/timeline-header.d.ts.map +1 -0
- package/dist/components/timeline/timeline-header.js +36 -0
- package/dist/components/timeline/timeline-header.js.map +1 -0
- package/dist/components/timeline/timeline.d.ts +5 -0
- package/dist/components/timeline/timeline.d.ts.map +1 -0
- package/dist/components/timeline/timeline.js +16 -0
- package/dist/components/timeline/timeline.js.map +1 -0
- package/dist/components/timeline/transport.d.ts +5 -0
- package/dist/components/timeline/transport.d.ts.map +1 -0
- package/dist/components/timeline/transport.js +21 -0
- package/dist/components/timeline/transport.js.map +1 -0
- package/dist/components/timeline/use-scrub-surface.d.ts +20 -0
- package/dist/components/timeline/use-scrub-surface.d.ts.map +1 -0
- package/dist/components/timeline/use-scrub-surface.js +56 -0
- package/dist/components/timeline/use-scrub-surface.js.map +1 -0
- package/dist/components/toasts/toasts.d.ts +4 -0
- package/dist/components/toasts/toasts.d.ts.map +1 -0
- package/dist/components/toasts/toasts.js +22 -0
- package/dist/components/toasts/toasts.js.map +1 -0
- package/dist/hooks/use-composition.d.ts +10 -0
- package/dist/hooks/use-composition.d.ts.map +1 -0
- package/dist/hooks/use-composition.js +13 -0
- package/dist/hooks/use-composition.js.map +1 -0
- package/dist/hooks/use-layers.d.ts +9 -0
- package/dist/hooks/use-layers.d.ts.map +1 -0
- package/dist/hooks/use-layers.js +34 -0
- package/dist/hooks/use-layers.js.map +1 -0
- package/dist/hooks/use-playback.d.ts +15 -0
- package/dist/hooks/use-playback.d.ts.map +1 -0
- package/dist/hooks/use-playback.js +38 -0
- package/dist/hooks/use-playback.js.map +1 -0
- package/dist/hooks/use-props-form.d.ts +15 -0
- package/dist/hooks/use-props-form.d.ts.map +1 -0
- package/dist/hooks/use-props-form.js +22 -0
- package/dist/hooks/use-props-form.js.map +1 -0
- package/dist/hooks/use-real-fps.d.ts +3 -0
- package/dist/hooks/use-real-fps.d.ts.map +1 -0
- package/dist/hooks/use-real-fps.js +27 -0
- package/dist/hooks/use-real-fps.js.map +1 -0
- package/dist/hooks/use-shortcuts.d.ts +7 -0
- package/dist/hooks/use-shortcuts.d.ts.map +1 -0
- package/dist/hooks/use-shortcuts.js +53 -0
- package/dist/hooks/use-shortcuts.js.map +1 -0
- package/dist/hooks/use-studio.d.ts +4 -0
- package/dist/hooks/use-studio.d.ts.map +1 -0
- package/dist/hooks/use-studio.js +10 -0
- package/dist/hooks/use-studio.js.map +1 -0
- package/dist/index.d.ts +145 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +117 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cn.d.ts +3 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +8 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/constants.d.ts +28 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +38 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/cva.d.ts +25 -0
- package/dist/lib/cva.d.ts.map +1 -0
- package/dist/lib/cva.js +23 -0
- package/dist/lib/cva.js.map +1 -0
- package/dist/lib/format.d.ts +13 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +25 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/ids.d.ts +3 -0
- package/dist/lib/ids.d.ts.map +1 -0
- package/dist/lib/ids.js +6 -0
- package/dist/lib/ids.js.map +1 -0
- package/dist/registry/define-registry.d.ts +8 -0
- package/dist/registry/define-registry.d.ts.map +1 -0
- package/dist/registry/define-registry.js +71 -0
- package/dist/registry/define-registry.js.map +1 -0
- package/dist/registry/props-signal.d.ts +9 -0
- package/dist/registry/props-signal.d.ts.map +1 -0
- package/dist/registry/props-signal.js +25 -0
- package/dist/registry/props-signal.js.map +1 -0
- package/dist/schema/kf.d.ts +28 -0
- package/dist/schema/kf.d.ts.map +1 -0
- package/dist/schema/kf.js +82 -0
- package/dist/schema/kf.js.map +1 -0
- package/dist/schema/types.d.ts +69 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +4 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +7 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/map.d.ts +19 -0
- package/dist/server/map.d.ts.map +1 -0
- package/dist/server/map.js +63 -0
- package/dist/server/map.js.map +1 -0
- package/dist/server/render-queue.d.ts +46 -0
- package/dist/server/render-queue.d.ts.map +1 -0
- package/dist/server/render-queue.js +147 -0
- package/dist/server/render-queue.js.map +1 -0
- package/dist/server/temp-storage.d.ts +13 -0
- package/dist/server/temp-storage.d.ts.map +1 -0
- package/dist/server/temp-storage.js +55 -0
- package/dist/server/temp-storage.js.map +1 -0
- package/dist/server/types.d.ts +57 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/signals/signal-bridge.d.ts +18 -0
- package/dist/signals/signal-bridge.d.ts.map +1 -0
- package/dist/signals/signal-bridge.js +39 -0
- package/dist/signals/signal-bridge.js.map +1 -0
- package/dist/store/store.d.ts +74 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +276 -0
- package/dist/store/store.js.map +1 -0
- package/dist/styles/studio.css +2 -0
- package/dist/types.d.ts +112 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage.js","sourceRoot":"","sources":["../../../src/components/stage/stage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.d.ts","sourceRoot":"","sources":["../../../src/components/studio/features.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,qEAAqE;AACrE,eAAO,MAAM,gBAAgB,EAAE,cAe9B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Every region defaults on; a host sets a flag false to drop it. */
|
|
2
|
+
export const DEFAULT_FEATURES = {
|
|
3
|
+
leftPanel: true,
|
|
4
|
+
rightPanel: true,
|
|
5
|
+
timeline: true,
|
|
6
|
+
toolbar: true,
|
|
7
|
+
search: true,
|
|
8
|
+
zoom: true,
|
|
9
|
+
render: true,
|
|
10
|
+
exportFrame: true,
|
|
11
|
+
renderQueue: true,
|
|
12
|
+
layeredTimeline: true,
|
|
13
|
+
loopRegion: true,
|
|
14
|
+
volume: true,
|
|
15
|
+
loop: true,
|
|
16
|
+
fullscreen: true,
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=features.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/components/studio/features.ts"],"names":[],"mappings":"AAEA,qEAAqE;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAmB;IAC9C,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;IACd,OAAO,EAAE,IAAI;IACb,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,IAAI;IACjB,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,IAAI;CACjB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
/** The horizontal band between header and footer that holds sidebar/stage/panel. */
|
|
3
|
+
export declare function Body({ children, className }: {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
className?: string;
|
|
6
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
/** The center column (header + stage + timeline, or the queue). */
|
|
8
|
+
export declare function Main({ children, className }: {
|
|
9
|
+
children: ReactNode;
|
|
10
|
+
className?: string;
|
|
11
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
/** A small padded section, e.g. wrapping a top-level nav item in the sidebar. */
|
|
13
|
+
export declare function Section({ children, className }: {
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
/** A flexible gap that pushes following content to the end. */
|
|
18
|
+
export declare const Spacer: () => import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/components/studio/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,oFAAoF;AACpF,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAExF;AAED,mEAAmE;AACnE,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAExF;AAED,iFAAiF;AACjF,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAE3F;AAED,+DAA+D;AAC/D,eAAO,MAAM,MAAM,+CAAmC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../lib/cn.js";
|
|
3
|
+
/** The horizontal band between header and footer that holds sidebar/stage/panel. */
|
|
4
|
+
export function Body({ children, className }) {
|
|
5
|
+
return _jsx("div", { className: cn("flex-1 min-h-0 flex", className), children: children });
|
|
6
|
+
}
|
|
7
|
+
/** The center column (header + stage + timeline, or the queue). */
|
|
8
|
+
export function Main({ children, className }) {
|
|
9
|
+
return _jsx("div", { className: cn("flex-1 min-w-0 flex flex-col bg-bg-0", className), children: children });
|
|
10
|
+
}
|
|
11
|
+
/** A small padded section, e.g. wrapping a top-level nav item in the sidebar. */
|
|
12
|
+
export function Section({ children, className }) {
|
|
13
|
+
return _jsx("div", { className: cn("px-2 pt-2", className), children: children });
|
|
14
|
+
}
|
|
15
|
+
/** A flexible gap that pushes following content to the end. */
|
|
16
|
+
export const Spacer = () => _jsx("div", { className: "flex-1" });
|
|
17
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/components/studio/layout.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AAErC,oFAAoF;AACpF,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAA+C;IACvF,OAAO,cAAK,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAO,CAAC;AAChF,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAA+C;IACvF,OAAO,cAAK,SAAS,EAAE,EAAE,CAAC,sCAAsC,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAO,CAAC;AACjG,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAA+C;IAC1F,OAAO,cAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC,YAAG,QAAQ,GAAO,CAAC;AACtE,CAAC;AAED,+DAA+D;AAC/D,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,cAAK,SAAS,EAAC,QAAQ,GAAG,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export declare const StudioContext: import("react").Context<{
|
|
2
|
+
registry: import("../../types.js").Registry;
|
|
3
|
+
entries: import("../../types.js").RegistryEntry<Record<string, unknown>>[];
|
|
4
|
+
getEntry: (id: string) => import("../../types.js").RegistryEntry | undefined;
|
|
5
|
+
getPropsSignal: (id: string) => import("../../types.js").WritableSignal<Record<string, unknown>>;
|
|
6
|
+
selectedId: import("signal-polyfill").Signal.State<string>;
|
|
7
|
+
composition: import("signal-polyfill").Signal.State<import("@smoove/core").Composition<Record<string, unknown>> | null>;
|
|
8
|
+
player: import("signal-polyfill").Signal.State<import("@smoove/player").PlayerApi | null>;
|
|
9
|
+
loadStatus: import("signal-polyfill").Signal.State<Record<string, import("../../store/store.js").LoadStatus>>;
|
|
10
|
+
loadError: import("signal-polyfill").Signal.State<string | null>;
|
|
11
|
+
tlMode: import("signal-polyfill").Signal.State<import("../../store/store.js").TlMode>;
|
|
12
|
+
panelOpen: import("signal-polyfill").Signal.State<boolean>;
|
|
13
|
+
panelTab: import("signal-polyfill").Signal.State<import("../../store/store.js").PanelTab>;
|
|
14
|
+
zoom: import("signal-polyfill").Signal.State<import("../../store/store.js").ZoomValue>;
|
|
15
|
+
fitScale: import("signal-polyfill").Signal.State<number>;
|
|
16
|
+
timelineZoom: import("signal-polyfill").Signal.State<number>;
|
|
17
|
+
region: import("signal-polyfill").Signal.State<import("../../store/store.js").Region>;
|
|
18
|
+
layerOff: import("signal-polyfill").Signal.State<Record<string, Set<number>>>;
|
|
19
|
+
jobs: import("signal-polyfill").Signal.State<import("../../types.js").RenderJob[]>;
|
|
20
|
+
toasts: import("signal-polyfill").Signal.State<import("../../types.js").Toast[]>;
|
|
21
|
+
queueCount: import("signal-polyfill").Signal.Computed<number>;
|
|
22
|
+
select: (id: string) => void;
|
|
23
|
+
syncSelected: (id: string) => void;
|
|
24
|
+
loadActive: () => Promise<void>;
|
|
25
|
+
takeRestore: () => {
|
|
26
|
+
frame: number;
|
|
27
|
+
playing: boolean;
|
|
28
|
+
} | null;
|
|
29
|
+
setPlayer: (api: import("@smoove/player").PlayerApi | null) => void;
|
|
30
|
+
setToastSink: (fn: ((title: string, icon?: import("../icon/paths.js").IconName) => void) | null) => void;
|
|
31
|
+
setTlMode: (m: import("../../store/store.js").TlMode) => void;
|
|
32
|
+
setPanelOpen: (open: boolean) => void;
|
|
33
|
+
setPanelTab: (t: import("../../store/store.js").PanelTab) => void;
|
|
34
|
+
setZoom: (z: import("../../store/store.js").ZoomValue) => void;
|
|
35
|
+
setFitScale: (s: number) => void;
|
|
36
|
+
setTimelineZoom: (z: number) => void;
|
|
37
|
+
setRegion: (r: import("../../store/store.js").Region) => void;
|
|
38
|
+
setRegionIn: (frame: number) => void;
|
|
39
|
+
setRegionOut: (frame: number) => void;
|
|
40
|
+
clearRegion: () => void;
|
|
41
|
+
isLayerOff: (id: string, index: number) => boolean;
|
|
42
|
+
toggleLayer: (index: number) => void;
|
|
43
|
+
addToast: (title: string, icon?: import("../icon/paths.js").IconName) => void;
|
|
44
|
+
dismissToast: (id: string) => void;
|
|
45
|
+
updateJob: (jobId: string, patch: Partial<import("../../types.js").RenderJob>) => void;
|
|
46
|
+
startRender: (req: import("../../types.js").RenderRequest) => string;
|
|
47
|
+
exportFrame: (req: import("../../types.js").RenderRequest) => string;
|
|
48
|
+
cancelJob: (jobId: string) => void;
|
|
49
|
+
removeJob: (jobId: string) => void;
|
|
50
|
+
clearDone: () => void;
|
|
51
|
+
downloadJob: (job: import("../../types.js").RenderJob) => void;
|
|
52
|
+
} | null>;
|
|
53
|
+
//# sourceMappingURL=studio-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-context.d.ts","sourceRoot":"","sources":["../../../src/components/studio/studio-context.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4CACkkP,CAAC;;;;;;;;;;;;;;;;;;;;;;SADzhP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-context.js","sourceRoot":"","sources":["../../../src/components/studio/studio-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAGtC,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAqB,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import type { Registry, RenderBackend } from "../../types.js";
|
|
3
|
+
export type StudioProps = {
|
|
4
|
+
registry: Registry;
|
|
5
|
+
/** Injected render transport (the package ships none). */
|
|
6
|
+
render?: RenderBackend;
|
|
7
|
+
/** Active composition id, typically synced from the route param. */
|
|
8
|
+
selectedId?: string;
|
|
9
|
+
/** Called when a composition is selected, so a router can sync the URL. */
|
|
10
|
+
onNavigate?: (id: string) => void;
|
|
11
|
+
className?: string;
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The compound root. Owns the central store + context, the Base UI Tooltip/Toast
|
|
16
|
+
* providers, the `.smoove-studio` themed frame, and a studio-owned portal container
|
|
17
|
+
* so Base UI popups inherit the scope + theme. Which regions appear is decided
|
|
18
|
+
* purely by what you compose as children — there are no feature flags.
|
|
19
|
+
*/
|
|
20
|
+
export declare function StudioRoot({ registry, render, selectedId, onNavigate, className, children, }: StudioProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=studio.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio.d.ts","sourceRoot":"","sources":["../../../src/components/studio/studio.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAGpE,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI9D,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,MAAM,EACN,UAAU,EACV,UAAU,EACV,SAAS,EACT,QAAQ,GACT,EAAE,WAAW,2CA2Cb"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Toast } from "@base-ui/react/toast";
|
|
3
|
+
import { Tooltip } from "@base-ui/react/tooltip";
|
|
4
|
+
import { useEffect, useRef, useState } from "react";
|
|
5
|
+
import { cn } from "../../lib/cn.js";
|
|
6
|
+
import { createStore } from "../../store/store.js";
|
|
7
|
+
import { PortalContainerContext } from "../primitives/portal-context.js";
|
|
8
|
+
import { StudioContext } from "./studio-context.js";
|
|
9
|
+
/**
|
|
10
|
+
* The compound root. Owns the central store + context, the Base UI Tooltip/Toast
|
|
11
|
+
* providers, the `.smoove-studio` themed frame, and a studio-owned portal container
|
|
12
|
+
* so Base UI popups inherit the scope + theme. Which regions appear is decided
|
|
13
|
+
* purely by what you compose as children — there are no feature flags.
|
|
14
|
+
*/
|
|
15
|
+
export function StudioRoot({ registry, render, selectedId, onNavigate, className, children, }) {
|
|
16
|
+
const [portalEl, setPortalEl] = useState(null);
|
|
17
|
+
// Keep onNavigate fresh without rebuilding the store.
|
|
18
|
+
const navRef = useRef(onNavigate);
|
|
19
|
+
navRef.current = onNavigate;
|
|
20
|
+
const storeRef = useRef(null);
|
|
21
|
+
if (!storeRef.current) {
|
|
22
|
+
storeRef.current = createStore({
|
|
23
|
+
registry,
|
|
24
|
+
render,
|
|
25
|
+
initialId: selectedId,
|
|
26
|
+
onNavigate: (id) => navRef.current?.(id),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
const store = storeRef.current;
|
|
30
|
+
// Sync the active id from the route (selection itself happens in the route).
|
|
31
|
+
// biome-ignore lint/correctness/useExhaustiveDependencies: store is stable.
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (selectedId)
|
|
34
|
+
store.syncSelected(selectedId);
|
|
35
|
+
}, [selectedId]);
|
|
36
|
+
return (_jsx(StudioContext.Provider, { value: store, children: _jsx(Tooltip.Provider, { delay: 400, closeDelay: 80, children: _jsx(Toast.Provider, { children: _jsx(PortalContainerContext.Provider, { value: portalEl, children: _jsxs("div", { className: cn("smoove-studio h-full w-full flex flex-col bg-bg-0 text-ink-1 font-sans select-none overflow-hidden", className), children: [children, _jsx("div", { className: "smoove-studio-portal", ref: setPortalEl })] }) }) }) }) }));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=studio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio.js","sourceRoot":"","sources":["../../../src/components/studio/studio.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAkB,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,WAAW,EAAoB,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAcpD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,EACzB,QAAQ,EACR,MAAM,EACN,UAAU,EACV,UAAU,EACV,SAAS,EACT,QAAQ,GACI;IACZ,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAEtE,sDAAsD;IACtD,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAClC,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC;IAE5B,MAAM,QAAQ,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtB,QAAQ,CAAC,OAAO,GAAG,WAAW,CAAC;YAC7B,QAAQ;YACR,MAAM;YACN,SAAS,EAAE,UAAU;YACrB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;SACzC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;IAE/B,6EAA6E;IAC7E,4EAA4E;IAC5E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU;YAAE,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEjB,OAAO,CACL,KAAC,aAAa,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAClC,KAAC,OAAO,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE,YAC1C,KAAC,KAAK,CAAC,QAAQ,cACb,KAAC,sBAAsB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ,YAC9C,eACE,SAAS,EAAE,EAAE,CACX,oGAAoG,EACpG,SAAS,CACV,aAEA,QAAQ,EACT,cAAK,SAAS,EAAC,sBAAsB,EAAC,GAAG,EAAE,WAAW,GAAI,IACtD,GAC0B,GACnB,GACA,GACI,CAC1B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered timeline. One scroll container holds the names column and the track
|
|
3
|
+
* lane side by side, so vertical scroll stays in sync. The ruler (top) and the
|
|
4
|
+
* names column (left) are sticky; the playhead + loop region span the full track
|
|
5
|
+
* height. Horizontal zoom widens the lane and scrolls horizontally.
|
|
6
|
+
*/
|
|
7
|
+
export declare function LayeredBody(): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=layered-body.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layered-body.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/layered-body.tsx"],"names":[],"mappings":"AAoBA;;;;;GAKG;AACH,wBAAgB,WAAW,4CAkL1B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { useComposition } from "../../hooks/use-composition.js";
|
|
4
|
+
import { deriveLayers } from "../../hooks/use-layers.js";
|
|
5
|
+
import { usePlayback } from "../../hooks/use-playback.js";
|
|
6
|
+
import { useStudio } from "../../hooks/use-studio.js";
|
|
7
|
+
import { cn } from "../../lib/cn.js";
|
|
8
|
+
import { LAYER_KINDS } from "../../lib/constants.js";
|
|
9
|
+
import { clamp01 } from "../../lib/format.js";
|
|
10
|
+
import { useSignalValue } from "../../signals/signal-bridge.js";
|
|
11
|
+
import { Icon } from "../icon/icon.js";
|
|
12
|
+
import { RegionHandles } from "./region-handles.js";
|
|
13
|
+
import { Ruler } from "./ruler.js";
|
|
14
|
+
import { useScrubSurface } from "./use-scrub-surface.js";
|
|
15
|
+
const ROW = 30;
|
|
16
|
+
const HEADER = 24;
|
|
17
|
+
const NAMES_W = 196;
|
|
18
|
+
const MAX_H = 210;
|
|
19
|
+
const EMPTY = new Set();
|
|
20
|
+
/**
|
|
21
|
+
* Layered timeline. One scroll container holds the names column and the track
|
|
22
|
+
* lane side by side, so vertical scroll stays in sync. The ruler (top) and the
|
|
23
|
+
* names column (left) are sticky; the playhead + loop region span the full track
|
|
24
|
+
* height. Horizontal zoom widens the lane and scrolls horizontally.
|
|
25
|
+
*/
|
|
26
|
+
export function LayeredBody() {
|
|
27
|
+
const store = useStudio();
|
|
28
|
+
const { composition: comp, entry, selectedId } = useComposition();
|
|
29
|
+
const { frame, total, fps, durSec } = usePlayback();
|
|
30
|
+
const layerOffMap = useSignalValue(store.layerOff);
|
|
31
|
+
const region = useSignalValue(store.region);
|
|
32
|
+
const zoom = useSignalValue(store.timelineZoom);
|
|
33
|
+
const off = layerOffMap[selectedId] ?? EMPTY;
|
|
34
|
+
const layers = useMemo(() => entry?.layers ?? (comp ? deriveLayers(comp) : []), [entry, comp]);
|
|
35
|
+
// Measure the lane viewport so zoom 1 = fit-width (no horizontal scroll).
|
|
36
|
+
const scrollRef = useRef(null);
|
|
37
|
+
const [viewportW, setViewportW] = useState(0);
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
const el = scrollRef.current;
|
|
40
|
+
if (!el)
|
|
41
|
+
return;
|
|
42
|
+
const ro = new ResizeObserver(() => setViewportW(el.clientWidth));
|
|
43
|
+
ro.observe(el);
|
|
44
|
+
setViewportW(el.clientWidth);
|
|
45
|
+
return () => ro.disconnect();
|
|
46
|
+
}, []);
|
|
47
|
+
const laneViewport = Math.max(0, viewportW - NAMES_W);
|
|
48
|
+
const tracksW = Math.max(1, laneViewport * zoom);
|
|
49
|
+
const s = useScrubSurface(total);
|
|
50
|
+
const pct = clamp01(frame / s.den);
|
|
51
|
+
const inFrac = clamp01(s.inFrame / s.den);
|
|
52
|
+
const outFrac = clamp01(s.outFrame / s.den);
|
|
53
|
+
const regionActive = region.in != null || region.out != null;
|
|
54
|
+
const bodyH = layers.length * ROW;
|
|
55
|
+
return (_jsx("div", { className: "flex flex-col min-h-0 border-b border-line", children: _jsx("div", { ref: scrollRef, className: "relative overflow-auto scroll", style: { maxHeight: MAX_H }, children: _jsxs("div", { className: "relative", style: { width: NAMES_W + tracksW }, children: [_jsxs("div", { className: "flex sticky top-0 z-30", style: { height: HEADER }, children: [_jsxs("div", { className: "sticky left-0 z-40 flex-none flex items-center gap-1.5 px-3 text-[10px] font-bold tracking-[.08em] uppercase text-ink-3 bg-bg-1 border-r border-b border-line", style: { width: NAMES_W }, children: ["Layers", _jsx("span", { className: "font-mono text-[10px] text-ink-3 bg-bg-2 border border-line rounded-full px-1.5 tracking-normal", children: layers.length })] }), _jsx("div", { className: "relative bg-bg-1 border-b border-line", style: { width: tracksW }, children: _jsx(Ruler, { durSec: durSec, fps: fps, total: total }) })] }), _jsxs("div", { className: "flex", children: [_jsx("div", { className: "sticky left-0 z-20 flex-none bg-bg-1 border-r border-line", style: { width: NAMES_W }, children: layers.map((l, i) => {
|
|
56
|
+
const kind = LAYER_KINDS[l.kind] ?? LAYER_KINDS.sequence;
|
|
57
|
+
const disabled = off.has(i);
|
|
58
|
+
return (_jsxs("div", { className: cn("flex items-center gap-2 px-2.5 border-b border-line", disabled && "opacity-45"), style: { height: ROW }, children: [_jsx("button", { type: "button", onClick: () => store.toggleLayer(i), className: "size-[22px] grid place-items-center rounded-[5px] text-ink-2 hover:bg-bg-3 hover:text-ink-1 flex-none", title: disabled ? "Enable" : "Disable", children: _jsx(Icon, { name: disabled ? "eyeOff" : "eye", size: 14 }) }), _jsx("span", { className: "size-2 rounded-sm flex-none", style: { background: kind.color } }), _jsx("span", { className: cn("flex-1 min-w-0 truncate text-[12px] font-medium text-ink-1", disabled && "line-through text-ink-3"), children: l.name }), _jsx("span", { className: "text-ink-3", children: _jsx(Icon, { name: kind.icon, size: 12 }) })] }, i));
|
|
59
|
+
}) }), _jsxs("div", { ref: s.ref, className: "relative cursor-pointer outline-0", style: { width: tracksW, height: bodyH }, role: "slider", "aria-label": "Seek", "aria-valuemin": 0, "aria-valuemax": total, "aria-valuenow": frame, tabIndex: 0, onMouseDown: (e) => {
|
|
60
|
+
s.setDrag("seek");
|
|
61
|
+
s.seekTo(e.clientX);
|
|
62
|
+
}, children: [regionActive && (_jsx("div", { className: "absolute top-0 bottom-0 bg-accent/13 border-x border-accent/55 pointer-events-none z-[1]", style: { left: `${inFrac * 100}%`, width: `${(outFrac - inFrac) * 100}%` } })), layers.map((l, i) => {
|
|
63
|
+
const kind = LAYER_KINDS[l.kind] ?? LAYER_KINDS.sequence;
|
|
64
|
+
const disabled = off.has(i);
|
|
65
|
+
return (_jsx("div", { className: cn("relative border-b border-line", i % 2 === 1 && "bg-white/[.012]", disabled &&
|
|
66
|
+
"bg-[repeating-linear-gradient(45deg,transparent,transparent_7px,rgba(255,255,255,.02)_7px,rgba(255,255,255,.02)_14px)]"), style: { height: ROW }, children: _jsx("div", { className: cn("absolute top-1 bottom-1 rounded-[5px] min-w-[6px] flex items-center overflow-hidden z-[2] shadow-[0_1px_4px_rgba(0,0,0,.3)]", disabled && "opacity-30 saturate-50"), style: {
|
|
67
|
+
left: `${l.start * 100}%`,
|
|
68
|
+
width: `${(l.end - l.start) * 100}%`,
|
|
69
|
+
background: `color-mix(in oklab, ${kind.color} 30%, #14141a)`,
|
|
70
|
+
border: `1px solid color-mix(in oklab, ${kind.color} 65%, transparent)`,
|
|
71
|
+
borderLeft: `3px solid ${kind.color}`,
|
|
72
|
+
}, children: _jsx("span", { className: "text-[10.5px] font-semibold text-white/90 px-2 truncate", children: l.name }) }) }, i));
|
|
73
|
+
}), _jsx(RegionHandles, { inFrac: inFrac, outFrac: outFrac, active: regionActive, onStart: (w) => s.setDrag(w) }), _jsx("div", { className: "absolute top-0 bottom-0 w-0.5 bg-white -translate-x-1/2 z-[8] pointer-events-none shadow-[0_0_8px_rgba(255,255,255,.5)]", style: { left: `${pct * 100}%` }, children: _jsx("span", { className: "absolute -top-px left-1/2 -translate-x-1/2 w-[11px] h-2 bg-white rounded-b-[3px]" }) })] })] })] }) }) }));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=layered-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layered-body.js","sourceRoot":"","sources":["../../../src/components/timeline/layered-body.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,GAAG,GAAG,EAAE,CAAC;AACf,MAAM,MAAM,GAAG,EAAE,CAAC;AAClB,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,KAAK,GAAG,GAAG,CAAC;AAClB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,cAAc,EAAE,CAAC;IAClE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACpD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;IAE7C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/F,0EAA0E;IAC1E,MAAM,SAAS,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;QAClE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACf,YAAY,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC,CAAC;IAEjD,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC;IAElC,OAAO,CACL,cAAK,SAAS,EAAC,4CAA4C,YACzD,cAAK,GAAG,EAAE,SAAS,EAAE,SAAS,EAAC,+BAA+B,EAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,YACxF,eAAK,SAAS,EAAC,UAAU,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,EAAE,aAE3D,eAAK,SAAS,EAAC,wBAAwB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,aAC/D,eACE,SAAS,EAAC,+JAA+J,EACzK,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,uBAGzB,eAAM,SAAS,EAAC,iGAAiG,YAC9G,MAAM,CAAC,MAAM,GACT,IACH,EACN,cAAK,SAAS,EAAC,uCAAuC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,YAC9E,KAAC,KAAK,IAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,GAAI,GAC7C,IACF,EAGN,eAAK,SAAS,EAAC,MAAM,aAEnB,cACE,SAAS,EAAC,2DAA2D,EACrE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,YAExB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oCACnB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC;oCACzD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oCAC5B,OAAO,CACL,eAGE,SAAS,EAAE,EAAE,CACX,qDAAqD,EACrD,QAAQ,IAAI,YAAY,CACzB,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,aAEtB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EACnC,SAAS,EAAC,uGAAuG,EACjH,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,YAEtC,KAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAI,GAC9C,EACT,eACE,SAAS,EAAC,6BAA6B,EACvC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,GACjC,EACF,eACE,SAAS,EAAE,EAAE,CACX,4DAA4D,EAC5D,QAAQ,IAAI,yBAAyB,CACtC,YAEA,CAAC,CAAC,IAAI,GACF,EACP,eAAM,SAAS,EAAC,YAAY,YAC1B,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAI,GAC9B,KA7BF,CAAC,CA8BF,CACP,CAAC;gCACJ,CAAC,CAAC,GACE,EAKN,eACE,GAAG,EAAE,CAAC,CAAC,GAAG,EACV,SAAS,EAAC,mCAAmC,EAC7C,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,EACxC,IAAI,EAAC,QAAQ,gBACF,MAAM,mBACF,CAAC,mBACD,KAAK,mBACL,KAAK,EACpB,QAAQ,EAAE,CAAC,EACX,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;oCACjB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oCAClB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gCACtB,CAAC,aAEA,YAAY,IAAI,CACf,cACE,SAAS,EAAC,0FAA0F,EACpG,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,GAC1E,CACH,EACA,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wCACnB,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC;wCACzD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wCAC5B,OAAO,CACL,cAGE,SAAS,EAAE,EAAE,CACX,+BAA+B,EAC/B,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,iBAAiB,EAChC,QAAQ;gDACN,wHAAwH,CAC3H,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,YAEtB,cACE,SAAS,EAAE,EAAE,CACX,6HAA6H,EAC7H,QAAQ,IAAI,wBAAwB,CACrC,EACD,KAAK,EAAE;oDACL,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,GAAG;oDACzB,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;oDACpC,UAAU,EAAE,uBAAuB,IAAI,CAAC,KAAK,gBAAgB;oDAC7D,MAAM,EAAE,iCAAiC,IAAI,CAAC,KAAK,oBAAoB;oDACvE,UAAU,EAAE,aAAa,IAAI,CAAC,KAAK,EAAE;iDACtC,YAED,eAAM,SAAS,EAAC,yDAAyD,YACtE,CAAC,CAAC,IAAI,GACF,GACH,IAzBD,CAAC,CA0BF,CACP,CAAC;oCACJ,CAAC,CAAC,EAEF,KAAC,aAAa,IACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAC5B,EACF,cACE,SAAS,EAAC,yHAAyH,EACnI,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,YAEhC,eAAM,SAAS,EAAC,kFAAkF,GAAG,GACjG,IACF,IACF,IACF,GACF,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DragKind } from "./use-scrub-surface.js";
|
|
2
|
+
export declare function RegionHandles({ inFrac, outFrac, active, onStart, }: {
|
|
3
|
+
inFrac: number;
|
|
4
|
+
outFrac: number;
|
|
5
|
+
active: boolean;
|
|
6
|
+
onStart: (which: DragKind, e: React.MouseEvent) => void;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=region-handles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"region-handles.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/region-handles.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AA6BvD,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,MAAM,EACN,OAAO,GACR,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;CACzD,2CAaA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/** A draggable loop in/out grip. Module-level so it isn't remounted as the
|
|
3
|
+
scrubber re-renders on the playhead clock (clicks would otherwise be lost). */
|
|
4
|
+
function RegionHandle({ which, frac, onStart, }) {
|
|
5
|
+
return (_jsx("button", { className: "absolute top-0 bottom-0 w-2.75 -translate-x-1/2 z-5 cursor-ew-resize flex outline-0 items-start justify-center group/h", style: { left: `${frac * 100}%` }, type: "button", onMouseDown: (e) => {
|
|
6
|
+
e.stopPropagation();
|
|
7
|
+
onStart(which, e);
|
|
8
|
+
}, title: which === "in" ? "Loop start" : "Loop end", children: _jsx("span", { className: "w-0.75 h-full bg-accent rounded-sm shadow-[0_0_6px_var(--color-accent-soft)] group-hover/h:w-1 group-hover/h:bg-accent-2" }) }));
|
|
9
|
+
}
|
|
10
|
+
export function RegionHandles({ inFrac, outFrac, active, onStart, }) {
|
|
11
|
+
return (_jsxs(_Fragment, { children: [active && (_jsx("div", { className: "absolute top-0 bottom-0 bg-accent/13 border-x border-accent/55 pointer-events-none z-[1]", style: { left: `${inFrac * 100}%`, width: `${(outFrac - inFrac) * 100}%` } })), _jsx(RegionHandle, { which: "in", frac: inFrac, onStart: onStart }), _jsx(RegionHandle, { which: "out", frac: outFrac, onStart: onStart })] }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=region-handles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"region-handles.js","sourceRoot":"","sources":["../../../src/components/timeline/region-handles.tsx"],"names":[],"mappings":";AAEA;kFACkF;AAClF,SAAS,YAAY,CAAC,EACpB,KAAK,EACL,IAAI,EACJ,OAAO,GAKR;IACC,OAAO,CACL,iBACE,SAAS,EAAC,wHAAwH,EAClI,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,EAAE,EACjC,IAAI,EAAC,QAAQ,EACb,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;YACjB,CAAC,CAAC,eAAe,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpB,CAAC,EACD,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,YAEjD,eAAM,SAAS,EAAC,0HAA0H,GAAG,GACtI,CACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,MAAM,EACN,OAAO,GAMR;IACC,OAAO,CACL,8BACG,MAAM,IAAI,CACT,cACE,SAAS,EAAC,0FAA0F,EACpG,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,EAAE,GAC1E,CACH,EACD,KAAC,YAAY,IAAC,KAAK,EAAC,IAAI,EAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAI,EAC3D,KAAC,YAAY,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAI,IAC5D,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruler.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/ruler.tsx"],"names":[],"mappings":"AAiBA,oEAAoE;AACpE,wBAAgB,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,2CAmB3F"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../lib/cn.js";
|
|
3
|
+
import { clamp01, fmtTime } from "../../lib/format.js";
|
|
4
|
+
function rulerTicks(durSec, fps, total) {
|
|
5
|
+
const ticks = [];
|
|
6
|
+
const step = durSec > 9 ? 2 : 1;
|
|
7
|
+
for (let s = 0; s <= durSec + 0.001; s += step) {
|
|
8
|
+
ticks.push({ at: clamp01((s * fps) / total), label: fmtTime(s), major: true });
|
|
9
|
+
if (s + step / 2 <= durSec) {
|
|
10
|
+
ticks.push({ at: clamp01(((s + step / 2) * fps) / total), major: false });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return ticks;
|
|
14
|
+
}
|
|
15
|
+
/** Time ruler: labeled major ticks per step, minor tick between. */
|
|
16
|
+
export function Ruler({ durSec, fps, total }) {
|
|
17
|
+
return (_jsx("div", { className: "relative h-full", children: rulerTicks(durSec, fps, total).map((t, i) => (_jsx("div", { className: cn("absolute top-0 bottom-0 w-px", t.major ? "bg-line-2" : "bg-line"), style: { left: `${t.at * 100}%` }, children: t.major && (_jsx("span", { className: "absolute top-[3px] left-1 font-mono text-[9.5px] text-ink-3 whitespace-nowrap", children: t.label })) }, i))) }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=ruler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ruler.js","sourceRoot":"","sources":["../../../src/components/timeline/ruler.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAIvD,SAAS,UAAU,CAAC,MAAc,EAAE,GAAW,EAAE,KAAa;IAC5D,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAkD;IAC1F,OAAO,CACL,cAAK,SAAS,EAAC,iBAAiB,YAC7B,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC5C,cAGE,SAAS,EAAE,EAAE,CAAC,8BAA8B,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,EAChF,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,YAEhC,CAAC,CAAC,KAAK,IAAI,CACV,eAAM,SAAS,EAAC,+EAA+E,YAC5F,CAAC,CAAC,KAAK,GACH,CACR,IARI,CAAC,CASF,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrubber.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/scrubber.tsx"],"names":[],"mappings":"AASA,oEAAoE;AACpE,wBAAgB,QAAQ,CAAC,EACvB,SAAgB,EAChB,SAAS,GACV,EAAE;IACD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAuEA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { usePlayback } from "../../hooks/use-playback.js";
|
|
3
|
+
import { useStudio } from "../../hooks/use-studio.js";
|
|
4
|
+
import { cn } from "../../lib/cn.js";
|
|
5
|
+
import { clamp01, fmtTime } from "../../lib/format.js";
|
|
6
|
+
import { useSignalValue } from "../../signals/signal-bridge.js";
|
|
7
|
+
import { RegionHandles } from "./region-handles.js";
|
|
8
|
+
import { Ruler } from "./ruler.js";
|
|
9
|
+
import { useScrubSurface } from "./use-scrub-surface.js";
|
|
10
|
+
/** Progress-mode scrubber: ruler + seekable track + loop region. */
|
|
11
|
+
export function Scrubber({ showRuler = true, className, }) {
|
|
12
|
+
const store = useStudio();
|
|
13
|
+
const { frame, total, fps, durSec } = usePlayback();
|
|
14
|
+
const region = useSignalValue(store.region);
|
|
15
|
+
const s = useScrubSurface(total);
|
|
16
|
+
const pct = clamp01(frame / s.den);
|
|
17
|
+
const inFrac = clamp01(s.inFrame / s.den);
|
|
18
|
+
const outFrac = clamp01(s.outFrame / s.den);
|
|
19
|
+
const regionActive = region.in != null || region.out != null;
|
|
20
|
+
return (_jsxs("div", { className: cn("relative", className), children: [showRuler && (_jsx("div", { className: "h-[18px] relative", children: _jsx(Ruler, { durSec: durSec, fps: fps, total: total }) })), _jsxs("div", { ref: s.ref, className: "relative h-6.5 flex items-center cursor-pointer group outline-0", role: "slider", "aria-label": "Seek", "aria-valuemin": 0, "aria-valuemax": total, "aria-valuenow": frame, tabIndex: 0, onMouseDown: (e) => {
|
|
21
|
+
s.setDrag("seek");
|
|
22
|
+
s.seekTo(e.clientX);
|
|
23
|
+
}, onMouseMove: (e) => s.setHover(s.frac(e.clientX)), onMouseLeave: () => s.setHover(null), children: [_jsxs("div", { className: "relative w-full h-[5px] rounded-full bg-white/13 group-hover:h-[7px] transition-[height]", children: [s.hover != null && (_jsx("div", { className: "absolute inset-y-0 left-0 bg-white/20 rounded-full", style: { width: `${s.hover * 100}%` } })), _jsx("div", { className: "absolute inset-y-0 left-0 bg-accent rounded-full z-[2]", style: { width: `${pct * 100}%` } })] }), _jsx(RegionHandles, { inFrac: inFrac, outFrac: outFrac, active: regionActive, onStart: (w) => s.setDrag(w) }), _jsx("div", { className: "absolute top-1/2 -translate-x-1/2 -translate-y-1/2 size-[14px] rounded-full bg-accent-2 shadow-[0_0_0_1px_rgba(0,0,0,.35),0_1px_5px_rgba(0,0,0,.5)] z-[6] pointer-events-none", style: { left: `${pct * 100}%` } }), s.hover != null && !s.drag && (_jsx("div", { className: "absolute bottom-[26px] -translate-x-1/2 bg-black border border-line-2 font-mono text-[11px] text-white px-1.5 py-0.5 rounded-[5px] pointer-events-none z-[7]", style: { left: `${s.hover * 100}%` }, children: fmtTime(s.hover * durSec) }))] })] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=scrubber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrubber.js","sourceRoot":"","sources":["../../../src/components/timeline/scrubber.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-header.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/timeline-header.tsx"],"names":[],"mappings":"AA0CA,uFAAuF;AACvF,wBAAgB,cAAc,4CAoJ7B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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 { usePlayback } from "../../hooks/use-playback.js";
|
|
4
|
+
import { useRealFps } from "../../hooks/use-real-fps.js";
|
|
5
|
+
import { useStudio } from "../../hooks/use-studio.js";
|
|
6
|
+
import { cn } from "../../lib/cn.js";
|
|
7
|
+
import { fmtTime, fpsHealth } 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
|
+
/** Module-level so it isn't remounted each frame while the header re-renders. */
|
|
12
|
+
function ModeButton({ id, icon, label, active, onClick, }) {
|
|
13
|
+
return (_jsxs("button", { type: "button", onClick: () => onClick(id), className: cn("flex items-center gap-1.5 text-[12px] font-semibold px-2.5 py-[5px] rounded-[6px]", active
|
|
14
|
+
? "bg-bg-0 text-ink-1 shadow-[0_1px_4px_rgba(0,0,0,.3)]"
|
|
15
|
+
: "text-ink-3 hover:text-ink-1"), children: [_jsx(Icon, { name: icon, size: 14, className: active ? "text-accent-2" : "" }), " ", label] }));
|
|
16
|
+
}
|
|
17
|
+
/** Timeline header: mode toggle + loop region tools + resolution/fps/frame readout. */
|
|
18
|
+
export function TimelineHeader() {
|
|
19
|
+
const store = useStudio();
|
|
20
|
+
const tlMode = useSignalValue(store.tlMode);
|
|
21
|
+
const tlZoom = useSignalValue(store.timelineZoom);
|
|
22
|
+
const region = useSignalValue(store.region);
|
|
23
|
+
const { player, frame, total, fps } = usePlayback();
|
|
24
|
+
const realFps = useRealFps();
|
|
25
|
+
const { composition } = useComposition();
|
|
26
|
+
const w = composition?.width() ?? 1280;
|
|
27
|
+
const h = composition?.height() ?? 720;
|
|
28
|
+
const den = Math.max(1, total - 1);
|
|
29
|
+
const regionActive = region.in != null || region.out != null;
|
|
30
|
+
const inSec = (region.in ?? 0) / fps;
|
|
31
|
+
const outSec = (region.out ?? den) / fps;
|
|
32
|
+
const health = fpsHealth(realFps, fps);
|
|
33
|
+
const curFps = realFps ? Math.min(realFps, fps) : null;
|
|
34
|
+
return (_jsxs("div", { className: "flex items-center gap-3.5 h-[42px] flex-none px-3 border-b border-line", children: [_jsxs("div", { className: "flex bg-bg-2 border border-line rounded-ui p-[3px] gap-0.5", children: [_jsx(ModeButton, { id: "progress", icon: "progress", label: "Progress", active: tlMode === "progress", onClick: store.setTlMode }), _jsx(ModeButton, { id: "layered", icon: "layers", label: "Timeline", active: tlMode === "layered", onClick: store.setTlMode })] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(Button, { size: "sm", tone: "default", icon: "markIn", onClick: () => player && store.setRegionIn(player.getCurrentFrame()), title: "Set loop start (I)", children: "In" }), _jsx(Button, { size: "sm", tone: "default", icon: "markOut", onClick: () => player && store.setRegionOut(player.getCurrentFrame()), title: "Set loop end (O)", children: "Out" }), regionActive ? (_jsxs("span", { className: "flex items-center gap-1.5 font-mono text-[11.5px] text-ink-1 bg-accent-soft border border-accent/35 rounded-full pl-3 pr-1 py-[3px]", children: [fmtTime(inSec), _jsx("span", { className: "text-ink-3", children: "\u2013" }), fmtTime(outSec), _jsxs("span", { className: "text-accent-2 text-[10.5px] pl-1", children: [(outSec - inSec).toFixed(1), "s"] }), _jsx("button", { type: "button", onClick: store.clearRegion, className: "size-[18px] grid place-items-center rounded-full text-ink-2 hover:bg-white/12 hover:text-white", children: _jsx(Icon, { name: "close", size: 12 }) })] })) : (_jsx("span", { className: "text-[11.5px] text-ink-3 italic", children: "No loop region" }))] }), _jsx("div", { className: "flex-1" }), tlMode === "layered" && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center h-[26px] bg-bg-2 border border-line rounded-control overflow-hidden", children: [_jsx("button", { type: "button", onClick: () => store.setTimelineZoom(tlZoom / 1.5), className: "w-[24px] h-full grid place-items-center text-ink-3 hover:bg-bg-3 hover:text-ink-1", title: "Zoom out", children: _jsx(Icon, { name: "minus", size: 13 }) }), _jsxs("button", { type: "button", onClick: () => store.setTimelineZoom(1), className: "h-full px-1.5 min-w-[40px] text-center font-mono text-[10.5px] text-ink-2 hover:text-ink-1 border-x border-line tabular-nums", title: "Reset zoom", children: [Math.round(tlZoom * 100), "%"] }), _jsx("button", { type: "button", onClick: () => store.setTimelineZoom(tlZoom * 1.5), className: "w-[24px] h-full grid place-items-center text-ink-3 hover:bg-bg-3 hover:text-ink-1", title: "Zoom in", children: _jsx(Icon, { name: "plus", size: 13 }) })] }), _jsx("span", { className: "w-px h-[15px] bg-line-2" })] })), _jsxs("div", { className: "flex items-center gap-2.5 font-mono text-[11.5px] text-ink-2 tabular-nums", children: [_jsxs("span", { className: "inline-flex items-center gap-1.5", children: [_jsx(Icon, { name: "layout", size: 12, className: "text-ink-3" }), w, _jsx("span", { className: "text-ink-3", children: "\u00D7" }), h] }), _jsx("span", { className: "w-px h-[15px] bg-line-2" }), _jsxs("span", { className: cn("inline-flex items-center gap-1 font-semibold", health === "good" && "text-good", health === "ok" && "text-warn", health === "low" && "text-danger"), children: [_jsx("span", { className: "inline-block text-right", style: { minWidth: "2ch" }, children: curFps == null ? "—" : curFps }), _jsx("span", { className: "text-ink-3", children: "/" }), _jsx("span", { className: "text-ink-2", children: fps }), _jsx("i", { className: "not-italic text-[9.5px] text-ink-3 ml-0.5", children: "fps" })] }), _jsx("span", { className: "w-px h-[15px] bg-line-2" }), _jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(Icon, { name: "camera", size: 12, className: "text-ink-3" }), _jsx("span", { className: "text-ink-1 inline-block text-right", style: { minWidth: `${String(total).length}ch` }, children: frame }), _jsx("span", { className: "text-ink-3", children: "/" }), total, _jsx("i", { className: "not-italic text-[9.5px] text-ink-3 ml-0.5", children: "f" })] })] })] }));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=timeline-header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline-header.js","sourceRoot":"","sources":["../../../src/components/timeline/timeline-header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGvC,iFAAiF;AACjF,SAAS,UAAU,CAAC,EAClB,EAAE,EACF,IAAI,EACJ,KAAK,EACL,MAAM,EACN,OAAO,GAOR;IACC,OAAO,CACL,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,EAC1B,SAAS,EAAE,EAAE,CACX,mFAAmF,EACnF,MAAM;YACJ,CAAC,CAAC,sDAAsD;YACxD,CAAC,CAAC,6BAA6B,CAClC,aAED,KAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,GAAI,OAAE,KAAK,IACxE,CACV,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,cAAc;IAC5B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IACpD,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAC7B,MAAM,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAC;IAEzC,MAAM,CAAC,GAAG,WAAW,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC;IACvC,MAAM,CAAC,GAAG,WAAW,EAAE,MAAM,EAAE,IAAI,GAAG,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,IAAI,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC;IAC7D,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;IACrC,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;IACzC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvD,OAAO,CACL,eAAK,SAAS,EAAC,wEAAwE,aACrF,eAAK,SAAS,EAAC,4DAA4D,aACzE,KAAC,UAAU,IACT,EAAE,EAAC,UAAU,EACb,IAAI,EAAC,UAAU,EACf,KAAK,EAAC,UAAU,EAChB,MAAM,EAAE,MAAM,KAAK,UAAU,EAC7B,OAAO,EAAE,KAAK,CAAC,SAAS,GACxB,EACF,KAAC,UAAU,IACT,EAAE,EAAC,SAAS,EACZ,IAAI,EAAC,QAAQ,EACb,KAAK,EAAC,UAAU,EAChB,MAAM,EAAE,MAAM,KAAK,SAAS,EAC5B,OAAO,EAAE,KAAK,CAAC,SAAS,GACxB,IACE,EAEN,eAAK,SAAS,EAAC,2BAA2B,aACxC,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,EACpE,KAAK,EAAC,oBAAoB,mBAGnB,EACT,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,IAAI,EAAC,SAAS,EACd,IAAI,EAAC,SAAS,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,EACrE,KAAK,EAAC,kBAAkB,oBAGjB,EACR,YAAY,CAAC,CAAC,CAAC,CACd,gBAAM,SAAS,EAAC,qIAAqI,aAClJ,OAAO,CAAC,KAAK,CAAC,EACf,eAAM,SAAS,EAAC,YAAY,uBAAS,EACpC,OAAO,CAAC,MAAM,CAAC,EAChB,gBAAM,SAAS,EAAC,kCAAkC,aAAE,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EACxF,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,KAAK,CAAC,WAAW,EAC1B,SAAS,EAAC,gGAAgG,YAE1G,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAE,EAAE,GAAI,GACxB,IACJ,CACR,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,iCAAiC,+BAAsB,CACxE,IACG,EAEN,cAAK,SAAS,EAAC,QAAQ,GAAG,EAEzB,MAAM,KAAK,SAAS,IAAI,CACvB,8BACE,eAAK,SAAS,EAAC,uFAAuF,aACpG,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,GAAG,CAAC,EAClD,SAAS,EAAC,mFAAmF,EAC7F,KAAK,EAAC,UAAU,YAEhB,KAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAE,EAAE,GAAI,GACxB,EACT,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EACvC,SAAS,EAAC,8HAA8H,EACxI,KAAK,EAAC,YAAY,aAEjB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,SAClB,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,GAAG,CAAC,EAClD,SAAS,EAAC,mFAAmF,EAC7F,KAAK,EAAC,SAAS,YAEf,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAE,EAAE,GAAI,GACvB,IACL,EACN,eAAM,SAAS,EAAC,yBAAyB,GAAG,IAC3C,CACJ,EAED,eAAK,SAAS,EAAC,2EAA2E,aACxF,gBAAM,SAAS,EAAC,kCAAkC,aAChD,KAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,YAAY,GAAG,EACtD,CAAC,EACF,eAAM,SAAS,EAAC,YAAY,uBAAS,EACpC,CAAC,IACG,EACP,eAAM,SAAS,EAAC,yBAAyB,GAAG,EAC5C,gBACE,SAAS,EAAE,EAAE,CACX,8CAA8C,EAC9C,MAAM,KAAK,MAAM,IAAI,WAAW,EAChC,MAAM,KAAK,IAAI,IAAI,WAAW,EAC9B,MAAM,KAAK,KAAK,IAAI,aAAa,CAClC,aAED,eAAM,SAAS,EAAC,yBAAyB,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YACjE,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GACzB,EACP,eAAM,SAAS,EAAC,YAAY,kBAAS,EACrC,eAAM,SAAS,EAAC,YAAY,YAAE,GAAG,GAAQ,EACzC,YAAG,SAAS,EAAC,2CAA2C,oBAAQ,IAC3D,EACP,eAAM,SAAS,EAAC,yBAAyB,GAAG,EAC5C,gBAAM,SAAS,EAAC,gCAAgC,aAC9C,KAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,YAAY,GAAG,EACvD,eACE,SAAS,EAAC,oCAAoC,EAC9C,KAAK,EAAE,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,IAAI,EAAE,YAE/C,KAAK,GACD,EACP,eAAM,SAAS,EAAC,YAAY,kBAAS,EACpC,KAAK,EACN,YAAG,SAAS,EAAC,2CAA2C,kBAAM,IACzD,IACH,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/timeline.tsx"],"names":[],"mappings":"AAQA,2FAA2F;AAC3F,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAiB7D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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 { useSignalValue } from "../../signals/signal-bridge.js";
|
|
5
|
+
import { LayeredBody } from "./layered-body.js";
|
|
6
|
+
import { Scrubber } from "./scrubber.js";
|
|
7
|
+
import { TimelineHeader } from "./timeline-header.js";
|
|
8
|
+
import { Transport } from "./transport.js";
|
|
9
|
+
/** The full timeline dock: header (mode + readout), body (progress|layered), transport. */
|
|
10
|
+
export function Timeline({ className }) {
|
|
11
|
+
const store = useStudio();
|
|
12
|
+
const tlMode = useSignalValue(store.tlMode);
|
|
13
|
+
const layered = tlMode === "layered";
|
|
14
|
+
return (_jsxs("div", { className: cn("flex flex-col flex-none bg-bg-1 border-t border-line", className), children: [_jsx(TimelineHeader, {}), layered ? (_jsx(LayeredBody, {})) : (_jsx("div", { className: "px-3 pt-1 pb-2", children: _jsx(Scrubber, {}) })), _jsx(Transport, {})] }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=timeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.js","sourceRoot":"","sources":["../../../src/components/timeline/timeline.tsx"],"names":[],"mappings":";AAAA,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,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,2FAA2F;AAC3F,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAA0B;IAC5D,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,KAAK,SAAS,CAAC;IACrC,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,sDAAsD,EAAE,SAAS,CAAC,aACnF,KAAC,cAAc,KAAG,EACjB,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,WAAW,KAAG,CAChB,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,gBAAgB,YAC7B,KAAC,QAAQ,KAAG,GACR,CACP,EACD,KAAC,SAAS,KAAG,IACT,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/components/timeline/transport.tsx"],"names":[],"mappings":"AASA,gEAAgE;AAChE,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CA6E9D"}
|