@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,57 @@
|
|
|
1
|
+
import type { Readable } from "node:stream";
|
|
2
|
+
import type { RenderRequest, RenderStatus } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* A render job tracked by the queue. Mirrors the studio-side `RenderJob` but is
|
|
5
|
+
* the server's own record — the request is kept whole so the queue can re-derive
|
|
6
|
+
* encoder options, and progress/result are pushed back to subscribers (the demo
|
|
7
|
+
* turns those into SSE frames). `result` is an OPAQUE key (here: the jobId), not
|
|
8
|
+
* a URL — building download URLs is the host's (HTTP) concern, never the kit's.
|
|
9
|
+
*/
|
|
10
|
+
export interface RenderQueueJob {
|
|
11
|
+
jobId: string;
|
|
12
|
+
status: RenderStatus;
|
|
13
|
+
/** 0..1. */
|
|
14
|
+
progress: number;
|
|
15
|
+
request: RenderRequest;
|
|
16
|
+
/** Storage key for the finished artifact (download via `queue.download`). */
|
|
17
|
+
result?: string;
|
|
18
|
+
error?: string;
|
|
19
|
+
createdAt: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The bytes of a finished render. The kit hands back a Node stream plus the
|
|
23
|
+
* metadata a host needs to build a response — but it sets no headers and knows
|
|
24
|
+
* nothing about HTTP. The demo's download route turns this into a `Response`.
|
|
25
|
+
*/
|
|
26
|
+
export interface StoredArtifact {
|
|
27
|
+
/** A fresh readable stream of the artifact bytes. */
|
|
28
|
+
read(): Readable;
|
|
29
|
+
contentType: string;
|
|
30
|
+
filename: string;
|
|
31
|
+
size?: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Where finished renders live. User-implementable (S3, a DB, a CDN…); the only
|
|
35
|
+
* implementation the package ships is {@link createTempStorage}, which writes to
|
|
36
|
+
* the server's temp dir.
|
|
37
|
+
*/
|
|
38
|
+
export interface RenderStorage {
|
|
39
|
+
/**
|
|
40
|
+
* Reserve a destination for a job. The renderer writes the artifact to the
|
|
41
|
+
* returned `path` (it takes a file path via its `output` option); once written
|
|
42
|
+
* the queue calls `finalize()` so the storage can seal/move/record it.
|
|
43
|
+
*/
|
|
44
|
+
put(jobId: string, o: {
|
|
45
|
+
ext: string;
|
|
46
|
+
contentType: string;
|
|
47
|
+
filename: string;
|
|
48
|
+
}): Promise<{
|
|
49
|
+
path: string;
|
|
50
|
+
finalize: () => Promise<void>;
|
|
51
|
+
}>;
|
|
52
|
+
/** The finished artifact for a job, or null if absent. */
|
|
53
|
+
get(jobId: string): Promise<StoredArtifact | null>;
|
|
54
|
+
/** Drop a job's artifact. */
|
|
55
|
+
remove(jobId: string): Promise<void>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,aAAa,CAAC;IACvB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,IAAI,IAAI,QAAQ,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,GAAG,CACD,KAAK,EAAE,MAAM,EACb,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GACxD,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAC;IAC5D,0DAA0D;IAC1D,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnD,6BAA6B;IAC7B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReadonlySignal } from "@smoove/core";
|
|
2
|
+
import { Signal } from "signal-polyfill";
|
|
3
|
+
type AnySignal<T> = Signal.State<T> | Signal.Computed<T>;
|
|
4
|
+
/**
|
|
5
|
+
* Bridge a signal-polyfill `Signal.State`/`Signal.Computed` into React. A
|
|
6
|
+
* `Watcher` notifies once and then stops until re-armed, so its callback must
|
|
7
|
+
* NOT read signals — it schedules a microtask that tells React to re-read the
|
|
8
|
+
* snapshot and re-arms the watcher.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useSignalValue<T>(signal: AnySignal<T>): T;
|
|
11
|
+
/**
|
|
12
|
+
* Bridge a core/player `ReadonlySignal` (get + subscribe) into React. Used for
|
|
13
|
+
* the player's playback state (`comp.frame`, `state.scale`, …) and the studio's
|
|
14
|
+
* per-composition props signal.
|
|
15
|
+
*/
|
|
16
|
+
export declare function usePlayerSignal<T>(signal: ReadonlySignal<T>): T;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=signal-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-bridge.d.ts","sourceRoot":"","sources":["../../src/signals/signal-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,KAAK,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAsBzD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAM/D"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useCallback, useSyncExternalStore } from "react";
|
|
2
|
+
import { Signal } from "signal-polyfill";
|
|
3
|
+
/**
|
|
4
|
+
* Bridge a signal-polyfill `Signal.State`/`Signal.Computed` into React. A
|
|
5
|
+
* `Watcher` notifies once and then stops until re-armed, so its callback must
|
|
6
|
+
* NOT read signals — it schedules a microtask that tells React to re-read the
|
|
7
|
+
* snapshot and re-arms the watcher.
|
|
8
|
+
*/
|
|
9
|
+
export function useSignalValue(signal) {
|
|
10
|
+
const subscribe = useCallback((onStoreChange) => {
|
|
11
|
+
let disposed = false;
|
|
12
|
+
const watcher = new Signal.subtle.Watcher(() => {
|
|
13
|
+
if (disposed)
|
|
14
|
+
return;
|
|
15
|
+
queueMicrotask(() => {
|
|
16
|
+
if (disposed)
|
|
17
|
+
return;
|
|
18
|
+
onStoreChange();
|
|
19
|
+
watcher.watch(); // re-arm: the watcher stops after each notification
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
watcher.watch(signal);
|
|
23
|
+
return () => {
|
|
24
|
+
disposed = true;
|
|
25
|
+
watcher.unwatch(signal);
|
|
26
|
+
};
|
|
27
|
+
}, [signal]);
|
|
28
|
+
const getSnapshot = useCallback(() => signal.get(), [signal]);
|
|
29
|
+
return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Bridge a core/player `ReadonlySignal` (get + subscribe) into React. Used for
|
|
33
|
+
* the player's playback state (`comp.frame`, `state.scale`, …) and the studio's
|
|
34
|
+
* per-composition props signal.
|
|
35
|
+
*/
|
|
36
|
+
export function usePlayerSignal(signal) {
|
|
37
|
+
return useSyncExternalStore((onStoreChange) => signal.subscribe(() => onStoreChange()), () => signal.get(), () => signal.get());
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=signal-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-bridge.js","sourceRoot":"","sources":["../../src/signals/signal-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAIzC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAI,MAAoB;IACpD,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,aAAyB,EAAE,EAAE;QAC5B,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YAC7C,IAAI,QAAQ;gBAAE,OAAO;YACrB,cAAc,CAAC,GAAG,EAAE;gBAClB,IAAI,QAAQ;oBAAE,OAAO;gBACrB,aAAa,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,oDAAoD;YACvE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,GAAG,EAAE;YACV,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC,CAAC;IACJ,CAAC,EACD,CAAC,MAAM,CAAC,CACT,CAAC;IACF,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9D,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAI,MAAyB;IAC1D,OAAO,oBAAoB,CACzB,CAAC,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,EAC1D,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,EAClB,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CACnB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Composition } from "@smoove/core";
|
|
2
|
+
import type { PlayerApi } from "@smoove/player";
|
|
3
|
+
import { Signal } from "signal-polyfill";
|
|
4
|
+
import type { IconName } from "../components/icon/paths.js";
|
|
5
|
+
import type { Registry, RegistryEntry, RenderBackend, RenderJob, RenderRequest, Toast, WritableSignal } from "../types.js";
|
|
6
|
+
export type LoadStatus = "idle" | "loading" | "ready" | "error";
|
|
7
|
+
export type TlMode = "progress" | "layered";
|
|
8
|
+
export type PanelTab = "props" | "info";
|
|
9
|
+
export type ZoomValue = "fit" | number;
|
|
10
|
+
export type Region = {
|
|
11
|
+
in: number | null;
|
|
12
|
+
out: number | null;
|
|
13
|
+
};
|
|
14
|
+
export type StudioStoreOptions = {
|
|
15
|
+
registry: Registry;
|
|
16
|
+
render?: RenderBackend;
|
|
17
|
+
initialId?: string;
|
|
18
|
+
/** Called when a composition is selected, so a router can sync the URL. */
|
|
19
|
+
onNavigate?: (id: string) => void;
|
|
20
|
+
};
|
|
21
|
+
export type StudioStore = ReturnType<typeof createStore>;
|
|
22
|
+
export declare function createStore(opts: StudioStoreOptions): {
|
|
23
|
+
registry: Registry;
|
|
24
|
+
entries: RegistryEntry<Record<string, unknown>>[];
|
|
25
|
+
getEntry: (id: string) => RegistryEntry | undefined;
|
|
26
|
+
getPropsSignal: (id: string) => WritableSignal<Record<string, unknown>>;
|
|
27
|
+
selectedId: Signal.State<string>;
|
|
28
|
+
composition: Signal.State<Composition<Record<string, unknown>> | null>;
|
|
29
|
+
player: Signal.State<PlayerApi | null>;
|
|
30
|
+
loadStatus: Signal.State<Record<string, LoadStatus>>;
|
|
31
|
+
loadError: Signal.State<string | null>;
|
|
32
|
+
tlMode: Signal.State<TlMode>;
|
|
33
|
+
panelOpen: Signal.State<boolean>;
|
|
34
|
+
panelTab: Signal.State<PanelTab>;
|
|
35
|
+
zoom: Signal.State<ZoomValue>;
|
|
36
|
+
fitScale: Signal.State<number>;
|
|
37
|
+
timelineZoom: Signal.State<number>;
|
|
38
|
+
region: Signal.State<Region>;
|
|
39
|
+
layerOff: Signal.State<Record<string, Set<number>>>;
|
|
40
|
+
jobs: Signal.State<RenderJob[]>;
|
|
41
|
+
toasts: Signal.State<Toast[]>;
|
|
42
|
+
queueCount: Signal.Computed<number>;
|
|
43
|
+
select: (id: string) => void;
|
|
44
|
+
syncSelected: (id: string) => void;
|
|
45
|
+
loadActive: () => Promise<void>;
|
|
46
|
+
takeRestore: () => {
|
|
47
|
+
frame: number;
|
|
48
|
+
playing: boolean;
|
|
49
|
+
} | null;
|
|
50
|
+
setPlayer: (api: PlayerApi | null) => void;
|
|
51
|
+
setToastSink: (fn: ((title: string, icon?: IconName) => void) | null) => void;
|
|
52
|
+
setTlMode: (m: TlMode) => void;
|
|
53
|
+
setPanelOpen: (open: boolean) => void;
|
|
54
|
+
setPanelTab: (t: PanelTab) => void;
|
|
55
|
+
setZoom: (z: ZoomValue) => void;
|
|
56
|
+
setFitScale: (s: number) => void;
|
|
57
|
+
setTimelineZoom: (z: number) => void;
|
|
58
|
+
setRegion: (r: Region) => void;
|
|
59
|
+
setRegionIn: (frame: number) => void;
|
|
60
|
+
setRegionOut: (frame: number) => void;
|
|
61
|
+
clearRegion: () => void;
|
|
62
|
+
isLayerOff: (id: string, index: number) => boolean;
|
|
63
|
+
toggleLayer: (index: number) => void;
|
|
64
|
+
addToast: (title: string, icon?: IconName) => void;
|
|
65
|
+
dismissToast: (id: string) => void;
|
|
66
|
+
updateJob: (jobId: string, patch: Partial<RenderJob>) => void;
|
|
67
|
+
startRender: (req: RenderRequest) => string;
|
|
68
|
+
exportFrame: (req: RenderRequest) => string;
|
|
69
|
+
cancelJob: (jobId: string) => void;
|
|
70
|
+
removeJob: (jobId: string) => void;
|
|
71
|
+
clearDone: () => void;
|
|
72
|
+
downloadJob: (job: RenderJob) => void;
|
|
73
|
+
};
|
|
74
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAI5D,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACb,aAAa,EACb,SAAS,EACT,aAAa,EACb,KAAK,EACL,cAAc,EACf,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAChE,MAAM,MAAM,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAC5C,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AACxC,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC;AACvC,MAAM,MAAM,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAEzD,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB;;;mBA+B5B,MAAM,KAAG,aAAa,GAAG,SAAS;yBAE5B,MAAM,KAAG,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;;;;;;;;;;;;;;;;;iBAgExD,MAAM,KAAG,IAAI;uBAEP,MAAM,KAAG,IAAI;sBArCV,OAAO,CAAC,IAAI,CAAC;uBA6ClB;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;qBAiB1C,SAAS,GAAG,IAAI;uBAoCd,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,IAAI,KAAG,IAAI;mBAnC5D,MAAM;yBACA,OAAO;qBACX,QAAQ;iBACZ,SAAS;qBACL,MAAM;yBACF,MAAM;mBAEZ,MAAM;yBACA,MAAM;0BAKL,MAAM;;qBAOX,MAAM,SAAS,MAAM,KAAG,OAAO;yBAE3B,MAAM,KAAG,IAAI;sBAgBhB,MAAM,SAAS,QAAQ,KAAG,IAAI;uBAO7B,MAAM,KAAG,IAAI;uBAKb,MAAM,SAAS,OAAO,CAAC,SAAS,CAAC,KAAG,IAAI;uBAkCxC,aAAa,KAAG,MAAM;uBAEtB,aAAa,KAAG,MAAM;uBAEtB,MAAM,KAAG,IAAI;uBAIb,MAAM,KAAG,IAAI;qBAGjB,IAAI;uBAGA,SAAS,KAAG,IAAI;EAyD3C"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { Signal } from "signal-polyfill";
|
|
2
|
+
import { makeJobId } from "../lib/ids.js";
|
|
3
|
+
import { createPropsSignal } from "../registry/props-signal.js";
|
|
4
|
+
import { resolveDefaults } from "../schema/kf.js";
|
|
5
|
+
export function createStore(opts) {
|
|
6
|
+
const { registry, render } = opts;
|
|
7
|
+
const entries = registry.entries();
|
|
8
|
+
const firstId = opts.initialId ?? entries[0]?.id ?? "";
|
|
9
|
+
// ---- reactive state -------------------------------------------------------
|
|
10
|
+
const selectedId = new Signal.State(firstId);
|
|
11
|
+
const composition = new Signal.State(null);
|
|
12
|
+
/** The mounted `<smoove-player>` API — registered by the Stage. */
|
|
13
|
+
const player = new Signal.State(null);
|
|
14
|
+
const loadStatus = new Signal.State({});
|
|
15
|
+
const loadError = new Signal.State(null);
|
|
16
|
+
const tlMode = new Signal.State("progress");
|
|
17
|
+
const panelOpen = new Signal.State(false);
|
|
18
|
+
const panelTab = new Signal.State("props");
|
|
19
|
+
const zoom = new Signal.State("fit");
|
|
20
|
+
/** The measured fit-scale (reported by the Stage) so Zoom can show "Fit %". */
|
|
21
|
+
const fitScale = new Signal.State(0.5);
|
|
22
|
+
/** Horizontal zoom for the layered timeline (1 = fit width). */
|
|
23
|
+
const timelineZoom = new Signal.State(1);
|
|
24
|
+
const region = new Signal.State({ in: null, out: null });
|
|
25
|
+
const layerOff = new Signal.State({});
|
|
26
|
+
const jobs = new Signal.State([]);
|
|
27
|
+
const toasts = new Signal.State([]);
|
|
28
|
+
const queueCount = new Signal.Computed(() => jobs.get().filter((j) => j.status === "queued" || j.status === "rendering").length);
|
|
29
|
+
// ---- per-composition props signals (lazy, memoized) -----------------------
|
|
30
|
+
const propsSignals = new Map();
|
|
31
|
+
const getEntry = (id) => entries.find((e) => e.id === id);
|
|
32
|
+
function getPropsSignal(id) {
|
|
33
|
+
let sig = propsSignals.get(id);
|
|
34
|
+
if (!sig) {
|
|
35
|
+
const entry = getEntry(id);
|
|
36
|
+
sig = createPropsSignal(resolveDefaults(entry?.propsSchema, entry?.defaultProps));
|
|
37
|
+
propsSignals.set(id, sig);
|
|
38
|
+
}
|
|
39
|
+
return sig;
|
|
40
|
+
}
|
|
41
|
+
function setStatus(id, status) {
|
|
42
|
+
loadStatus.set({ ...loadStatus.get(), [id]: status });
|
|
43
|
+
}
|
|
44
|
+
// ---- selection / loading --------------------------------------------------
|
|
45
|
+
// Bridge each composition's form props onto the comp exactly once: seed it
|
|
46
|
+
// with the current values and forward later edits via `comp.setProps`, which
|
|
47
|
+
// re-applies the current frame without rebuilding (playhead preserved).
|
|
48
|
+
const wiredProps = new Set();
|
|
49
|
+
function wireProps(id, comp) {
|
|
50
|
+
const sig = getPropsSignal(id);
|
|
51
|
+
comp.setProps(sig.get());
|
|
52
|
+
if (wiredProps.has(id))
|
|
53
|
+
return;
|
|
54
|
+
wiredProps.add(id);
|
|
55
|
+
sig.subscribe((value) => comp.setProps(value));
|
|
56
|
+
}
|
|
57
|
+
async function loadActive() {
|
|
58
|
+
const id = selectedId.get();
|
|
59
|
+
if (!id)
|
|
60
|
+
return;
|
|
61
|
+
const cached = registry.peek(id);
|
|
62
|
+
if (cached) {
|
|
63
|
+
composition.set(cached);
|
|
64
|
+
setStatus(id, "ready");
|
|
65
|
+
wireProps(id, cached);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
setStatus(id, "loading");
|
|
69
|
+
loadError.set(null);
|
|
70
|
+
try {
|
|
71
|
+
const comp = await registry.load(id);
|
|
72
|
+
if (selectedId.get() !== id)
|
|
73
|
+
return; // selection moved on
|
|
74
|
+
composition.set(comp);
|
|
75
|
+
setStatus(id, "ready");
|
|
76
|
+
wireProps(id, comp);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
if (selectedId.get() !== id)
|
|
80
|
+
return;
|
|
81
|
+
composition.set(null);
|
|
82
|
+
setStatus(id, "error");
|
|
83
|
+
loadError.set(err instanceof Error ? err.message : String(err));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function applySelect(id, navigate) {
|
|
87
|
+
if (id === selectedId.get() && composition.get())
|
|
88
|
+
return;
|
|
89
|
+
selectedId.set(id);
|
|
90
|
+
region.set({ in: null, out: null });
|
|
91
|
+
composition.set(registry.peek(id) ?? null);
|
|
92
|
+
if (navigate)
|
|
93
|
+
opts.onNavigate?.(id);
|
|
94
|
+
void loadActive();
|
|
95
|
+
}
|
|
96
|
+
/** User-initiated selection — also syncs the router via onNavigate. */
|
|
97
|
+
const select = (id) => applySelect(id, true);
|
|
98
|
+
/** Router-initiated selection (URL changed) — does NOT call onNavigate. */
|
|
99
|
+
const syncSelected = (id) => applySelect(id, false);
|
|
100
|
+
// ---- dev hot-reload ------------------------------------------------------
|
|
101
|
+
// When a composition's builder is swapped (registry.update, e.g. Vite HMR),
|
|
102
|
+
// rebuild + remount the active one, preserving props (the props signal is
|
|
103
|
+
// memoized per id) and the playhead. The Stage consumes `takeRestore()` after
|
|
104
|
+
// mounting the rebuilt comp.
|
|
105
|
+
let pendingRestore = null;
|
|
106
|
+
const takeRestore = () => {
|
|
107
|
+
const r = pendingRestore;
|
|
108
|
+
pendingRestore = null;
|
|
109
|
+
return r;
|
|
110
|
+
};
|
|
111
|
+
async function reloadActive(id) {
|
|
112
|
+
const api = player.get();
|
|
113
|
+
pendingRestore = api ? { frame: api.getCurrentFrame(), playing: api.isPlaying() } : null;
|
|
114
|
+
wiredProps.delete(id);
|
|
115
|
+
composition.set(null); // force the Stage to remount even if React keeps the ref
|
|
116
|
+
await loadActive();
|
|
117
|
+
}
|
|
118
|
+
registry.onChange((id) => {
|
|
119
|
+
if (id === selectedId.get())
|
|
120
|
+
void reloadActive(id);
|
|
121
|
+
});
|
|
122
|
+
// ---- layout / playback-view actions ---------------------------------------
|
|
123
|
+
const setPlayer = (api) => player.set(api);
|
|
124
|
+
const setTlMode = (m) => tlMode.set(m);
|
|
125
|
+
const setPanelOpen = (open) => panelOpen.set(open);
|
|
126
|
+
const setPanelTab = (t) => panelTab.set(t);
|
|
127
|
+
const setZoom = (z) => zoom.set(z);
|
|
128
|
+
const setFitScale = (s) => fitScale.set(s);
|
|
129
|
+
const setTimelineZoom = (z) => timelineZoom.set(Math.max(1, Math.min(16, z)));
|
|
130
|
+
const setRegion = (r) => region.set(r);
|
|
131
|
+
const setRegionIn = (frame) => {
|
|
132
|
+
const r = region.get();
|
|
133
|
+
const max = r.out == null ? Number.POSITIVE_INFINITY : r.out - 1;
|
|
134
|
+
region.set({ in: Math.min(frame, max), out: r.out });
|
|
135
|
+
};
|
|
136
|
+
const setRegionOut = (frame) => {
|
|
137
|
+
const r = region.get();
|
|
138
|
+
const min = r.in == null ? 0 : r.in + 1;
|
|
139
|
+
region.set({ in: r.in, out: Math.max(frame, min) });
|
|
140
|
+
};
|
|
141
|
+
const clearRegion = () => region.set({ in: null, out: null });
|
|
142
|
+
const isLayerOff = (id, index) => layerOff.get()[id]?.has(index) ?? false;
|
|
143
|
+
const toggleLayer = (index) => {
|
|
144
|
+
const id = selectedId.get();
|
|
145
|
+
const map = layerOff.get();
|
|
146
|
+
const next = new Set(map[id] ?? []);
|
|
147
|
+
if (next.has(index))
|
|
148
|
+
next.delete(index);
|
|
149
|
+
else
|
|
150
|
+
next.add(index);
|
|
151
|
+
layerOff.set({ ...map, [id]: next });
|
|
152
|
+
};
|
|
153
|
+
// ---- toasts ---------------------------------------------------------------
|
|
154
|
+
// The Toasts component registers a sink (Base UI's Toast manager) so it owns
|
|
155
|
+
// rendering + auto-dismiss; until then toasts queue in the signal as fallback.
|
|
156
|
+
let toastSink = null;
|
|
157
|
+
const setToastSink = (fn) => {
|
|
158
|
+
toastSink = fn;
|
|
159
|
+
};
|
|
160
|
+
const addToast = (title, icon) => {
|
|
161
|
+
if (toastSink) {
|
|
162
|
+
toastSink(title, icon);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
toasts.set([...toasts.get(), { id: makeJobId(), title, icon }]);
|
|
166
|
+
};
|
|
167
|
+
const dismissToast = (id) => {
|
|
168
|
+
toasts.set(toasts.get().filter((t) => t.id !== id));
|
|
169
|
+
};
|
|
170
|
+
// ---- render jobs (transport-free; backend injected) -----------------------
|
|
171
|
+
const updateJob = (jobId, patch) => {
|
|
172
|
+
jobs.set(jobs.get().map((j) => (j.jobId === jobId ? { ...j, ...patch } : j)));
|
|
173
|
+
};
|
|
174
|
+
function enqueue(req, queuedToast) {
|
|
175
|
+
const job = {
|
|
176
|
+
...req,
|
|
177
|
+
jobId: makeJobId(),
|
|
178
|
+
status: "queued",
|
|
179
|
+
progress: 0,
|
|
180
|
+
createdAt: Date.now(),
|
|
181
|
+
};
|
|
182
|
+
jobs.set([job, ...jobs.get()]);
|
|
183
|
+
if (queuedToast)
|
|
184
|
+
addToast(queuedToast[0], queuedToast[1]);
|
|
185
|
+
if (!render)
|
|
186
|
+
return job.jobId;
|
|
187
|
+
Promise.resolve(render.start(job, (patch) => updateJob(job.jobId, patch)))
|
|
188
|
+
.then((final) => {
|
|
189
|
+
const cur = jobs.get().find((j) => j.jobId === job.jobId);
|
|
190
|
+
if (!cur || cur.status === "canceled")
|
|
191
|
+
return;
|
|
192
|
+
updateJob(job.jobId, { status: "done", progress: 1, ...(final ?? {}) });
|
|
193
|
+
if (job.kind === "still")
|
|
194
|
+
addToast(`Frame exported · ${job.comp}`, "camera");
|
|
195
|
+
else
|
|
196
|
+
addToast(`Render ready · ${job.comp}`, "check");
|
|
197
|
+
})
|
|
198
|
+
.catch((err) => {
|
|
199
|
+
updateJob(job.jobId, {
|
|
200
|
+
status: "error",
|
|
201
|
+
error: err instanceof Error ? err.message : String(err),
|
|
202
|
+
});
|
|
203
|
+
addToast(`Render failed · ${job.comp}`, "close");
|
|
204
|
+
});
|
|
205
|
+
return job.jobId;
|
|
206
|
+
}
|
|
207
|
+
const startRender = (req) => enqueue(req, [`Queued · ${req.comp}`, "server"]);
|
|
208
|
+
const exportFrame = (req) => enqueue(req);
|
|
209
|
+
const cancelJob = (jobId) => {
|
|
210
|
+
render?.cancel?.(jobId);
|
|
211
|
+
updateJob(jobId, { status: "canceled" });
|
|
212
|
+
};
|
|
213
|
+
const removeJob = (jobId) => {
|
|
214
|
+
jobs.set(jobs.get().filter((j) => j.jobId !== jobId));
|
|
215
|
+
};
|
|
216
|
+
const clearDone = () => {
|
|
217
|
+
jobs.set(jobs.get().filter((j) => j.status !== "done"));
|
|
218
|
+
};
|
|
219
|
+
const downloadJob = (job) => {
|
|
220
|
+
render?.download?.(job);
|
|
221
|
+
addToast(`Download started · ${job.comp}`, "download");
|
|
222
|
+
};
|
|
223
|
+
return {
|
|
224
|
+
// config / data
|
|
225
|
+
registry,
|
|
226
|
+
entries,
|
|
227
|
+
getEntry,
|
|
228
|
+
getPropsSignal,
|
|
229
|
+
// state signals
|
|
230
|
+
selectedId,
|
|
231
|
+
composition,
|
|
232
|
+
player,
|
|
233
|
+
loadStatus,
|
|
234
|
+
loadError,
|
|
235
|
+
tlMode,
|
|
236
|
+
panelOpen,
|
|
237
|
+
panelTab,
|
|
238
|
+
zoom,
|
|
239
|
+
fitScale,
|
|
240
|
+
timelineZoom,
|
|
241
|
+
region,
|
|
242
|
+
layerOff,
|
|
243
|
+
jobs,
|
|
244
|
+
toasts,
|
|
245
|
+
queueCount,
|
|
246
|
+
// actions
|
|
247
|
+
select,
|
|
248
|
+
syncSelected,
|
|
249
|
+
loadActive,
|
|
250
|
+
takeRestore,
|
|
251
|
+
setPlayer,
|
|
252
|
+
setToastSink,
|
|
253
|
+
setTlMode,
|
|
254
|
+
setPanelOpen,
|
|
255
|
+
setPanelTab,
|
|
256
|
+
setZoom,
|
|
257
|
+
setFitScale,
|
|
258
|
+
setTimelineZoom,
|
|
259
|
+
setRegion,
|
|
260
|
+
setRegionIn,
|
|
261
|
+
setRegionOut,
|
|
262
|
+
clearRegion,
|
|
263
|
+
isLayerOff,
|
|
264
|
+
toggleLayer,
|
|
265
|
+
addToast,
|
|
266
|
+
dismissToast,
|
|
267
|
+
updateJob,
|
|
268
|
+
startRender,
|
|
269
|
+
exportFrame,
|
|
270
|
+
cancelJob,
|
|
271
|
+
removeJob,
|
|
272
|
+
clearDone,
|
|
273
|
+
downloadJob,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:"Hanken Grotesk", system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-normal:0em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-xl:.75rem;--radius-2xl:1rem;--blur-sm:8px;--blur-md:12px;--blur-xl:24px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--color-stage:#0c0c0f;--color-bg-0:#100f14;--color-bg-1:#17161c;--color-bg-2:#1e1d25;--color-bg-3:#2a2933;--color-line:oklab(100% 0 5.96046e-8/.08);--color-line-2:oklab(100% 0 5.96046e-8/.13);--color-ink-1:#eceaf2;--color-ink-2:#a4a2b2;--color-ink-3:#6b6a78;--color-accent:#ff5640;--color-accent-2:#15cda8;--color-good:#46d39a;--color-warn:#ffb44d;--color-danger:#ff6b6b;--radius-ui:10px;--radius-control:7px;--font-display:"Comfortaa", system-ui, sans-serif;--spacing-sidebar:256px;--spacing-panel:320px;--color-accent-soft:#ff564029}@supports (color:color-mix(in lab, red, red)){:root,:host{--color-accent-soft:color-mix(in oklab, var(--color-accent) 16%, transparent)}}}@layer base{.smoove-studio{color:var(--color-ink-1);background:var(--color-bg-0);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility}.smoove-studio,.smoove-studio *{box-sizing:border-box}.smoove-studio button,.smoove-studio-portal button{appearance:none;font:inherit;line-height:inherit;color:inherit;cursor:pointer;background:0 0;border:0;margin:0;padding:0}.smoove-studio button:disabled,.smoove-studio-portal button:disabled{cursor:not-allowed}.smoove-studio input,.smoove-studio textarea,.smoove-studio select,.smoove-studio-portal input,.smoove-studio-portal textarea,.smoove-studio-portal select{appearance:none;font:inherit;line-height:inherit;color:inherit;margin:0}.smoove-studio svg,.smoove-studio-portal svg{display:block}.smoove-studio .scroll,.smoove-studio-portal .scroll{scrollbar-width:thin;scrollbar-color:#34343c transparent}.smoove-studio .scroll::-webkit-scrollbar{width:9px;height:9px}.smoove-studio-portal .scroll::-webkit-scrollbar{width:9px;height:9px}.smoove-studio .scroll::-webkit-scrollbar-thumb{background:#2c2c33 padding-box content-box;border:2px solid #0000;border-radius:99px}.smoove-studio-portal .scroll::-webkit-scrollbar-thumb{background:#2c2c33 padding-box content-box;border:2px solid #0000;border-radius:99px}.smoove-studio .scroll::-webkit-scrollbar-thumb:hover{background:#3a3a44 padding-box content-box}.smoove-studio-portal .scroll::-webkit-scrollbar-thumb:hover{background:#3a3a44 padding-box content-box}.smoove-studio .scroll::-webkit-scrollbar-track{background:0 0}.smoove-studio-portal .scroll::-webkit-scrollbar-track{background:0 0}@keyframes smoove-spin{to{transform:rotate(360deg)}}.smoove-studio .spin,.smoove-studio-portal .spin{animation:1s linear infinite smoove-spin}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-y-0{inset-block:calc(var(--spacing) * 0)}.-top-px{top:-1px}.top-0{top:calc(var(--spacing) * 0)}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1{top:calc(var(--spacing) * 1)}.top-1\/2{top:50%}.top-\[3px\]{top:3px}.right-1{right:calc(var(--spacing) * 1)}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-panel{right:var(--spacing-panel)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-0\.5{bottom:calc(var(--spacing) * .5)}.bottom-1{bottom:calc(var(--spacing) * 1)}.bottom-1\.5{bottom:calc(var(--spacing) * 1.5)}.bottom-3{bottom:calc(var(--spacing) * 3)}.bottom-5{bottom:calc(var(--spacing) * 5)}.bottom-\[26px\]{bottom:26px}.left-0{left:calc(var(--spacing) * 0)}.left-1{left:calc(var(--spacing) * 1)}.left-1\/2{left:50%}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-4{left:calc(var(--spacing) * 4)}.left-\[3px\]{left:3px}.z-5{z-index:5}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.z-\[2\]{z-index:2}.z-\[5\]{z-index:5}.z-\[6\]{z-index:6}.z-\[7\]{z-index:7}.z-\[8\]{z-index:8}.z-\[60\]{z-index:60}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.m-auto{margin:auto}.-mx-0\.5{margin-inline:calc(var(--spacing) * -.5)}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.my-1{margin-block:calc(var(--spacing) * 1)}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-4\.5{margin-bottom:calc(var(--spacing) * 4.5)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-11{width:calc(var(--spacing) * 11);height:calc(var(--spacing) * 11)}.size-\[7px\]{width:7px;height:7px}.size-\[14px\]{width:14px;height:14px}.size-\[15px\]{width:15px;height:15px}.size-\[17px\]{width:17px;height:17px}.size-\[18px\]{width:18px;height:18px}.size-\[22px\]{width:22px;height:22px}.size-\[26px\]{width:26px;height:26px}.size-\[30px\]{width:30px;height:30px}.size-\[34px\]{width:34px;height:34px}.size-\[38px\]{width:38px;height:38px}.size-\[46px\]{width:46px;height:46px}.size-\[52px\]{width:52px;height:52px}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:calc(var(--spacing) * 1)}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-6\.5{height:calc(var(--spacing) * 6.5)}.h-14{height:calc(var(--spacing) * 14)}.h-\[5px\]{height:5px}.h-\[15px\]{height:15px}.h-\[17px\]{height:17px}.h-\[18px\]{height:18px}.h-\[23px\]{height:23px}.h-\[26px\]{height:26px}.h-\[42px\]{height:42px}.h-\[50px\]{height:50px}.h-\[79px\]{height:79px}.h-full{height:100%}.h-px{height:1px}.max-h-72{max-height:calc(var(--spacing) * 72)}.max-h-\[calc\(100vh-48px\)\]{max-height:calc(100vh - 48px)}.min-h-0{min-height:calc(var(--spacing) * 0)}.w-0{width:calc(var(--spacing) * 0)}.w-0\.5{width:calc(var(--spacing) * .5)}.w-0\.75{width:calc(var(--spacing) * .75)}.w-2\.75{width:calc(var(--spacing) * 2.75)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-\[3px\]{width:3px}.w-\[11px\]{width:11px}.w-\[24px\]{width:24px}.w-\[26px\]{width:26px}.w-\[70px\]{width:70px}.w-\[88px\]{width:88px}.w-\[140px\]{width:140px}.w-\[320px\]{width:320px}.w-\[var\(--active-tab-width\)\]{width:var(--active-tab-width)}.w-full{width:100%}.w-px{width:1px}.max-w-\[200px\]{max-width:200px}.max-w-\[260px\]{max-width:260px}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-52{min-width:calc(var(--spacing) * 52)}.min-w-\[6px\]{min-width:6px}.min-w-\[17px\]{min-width:17px}.min-w-\[18px\]{min-width:18px}.min-w-\[32px\]{min-width:32px}.min-w-\[40px\]{min-width:40px}.min-w-\[var\(--anchor-width\)\]{min-width:var(--anchor-width)}.flex-1{flex:1}.flex-none{flex:none}.shrink-0{flex-shrink:0}.origin-\[var\(--transform-origin\)\]{transform-origin:var(--transform-origin)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-\[var\(--active-tab-left\)\]{--tw-translate-x:var(--active-tab-left);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-default{cursor:default}.cursor-ew-resize{cursor:ew-resize}.cursor-pointer{cursor:pointer}.resize-y{resize:vertical}.\[appearance\:textfield\]{appearance:textfield}.grid-rows-\[0fr\]{grid-template-rows:0fr}.grid-rows-\[1fr\]{grid-template-rows:1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-4\.5{gap:calc(var(--spacing) * 4.5)}.gap-\[3px\]{gap:3px}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[4px\]{border-radius:4px}.rounded-\[5px\]{border-radius:5px}.rounded-\[6px\]{border-radius:6px}.rounded-\[7px\]{border-radius:7px}.rounded-\[9px\]{border-radius:9px}.rounded-control{border-radius:var(--radius-control)}.rounded-full{border-radius:3.40282e38px}.rounded-sm{border-radius:var(--radius-sm)}.rounded-ui{border-radius:var(--radius-ui)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.rounded-b-\[3px\]{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.border{border-style:var(--tw-border-style);border-width:1px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent-line{border-color:#ff564066}@supports (color:color-mix(in lab, red, red)){.border-accent-line{border-color:color-mix(in oklab, var(--color-accent) 40%, transparent)}}.border-accent\/35{border-color:#ff564059}@supports (color:color-mix(in lab, red, red)){.border-accent\/35{border-color:color-mix(in oklab, var(--color-accent) 35%, transparent)}}.border-accent\/55{border-color:#ff56408c}@supports (color:color-mix(in lab, red, red)){.border-accent\/55{border-color:color-mix(in oklab, var(--color-accent) 55%, transparent)}}.border-danger\/30{border-color:#ff6b6b4d}@supports (color:color-mix(in lab, red, red)){.border-danger\/30{border-color:color-mix(in oklab, var(--color-danger) 30%, transparent)}}.border-good\/20{border-color:#46d39a33}@supports (color:color-mix(in lab, red, red)){.border-good\/20{border-color:color-mix(in oklab, var(--color-good) 20%, transparent)}}.border-good\/30{border-color:#46d39a4d}@supports (color:color-mix(in lab, red, red)){.border-good\/30{border-color:color-mix(in oklab, var(--color-good) 30%, transparent)}}.border-line{border-color:var(--color-line)}.border-line-2{border-color:var(--color-line-2)}.border-transparent{border-color:#0000}.bg-\[rgba\(6\,6\,9\,\.62\)\]{background-color:#0606099e}.bg-\[rgba\(16\,16\,20\,\.6\)\]{background-color:#10101499}.bg-accent{background-color:var(--color-accent)}.bg-accent-2{background-color:var(--color-accent-2)}.bg-accent-soft{background-color:#ff564029}@supports (color:color-mix(in lab, red, red)){.bg-accent-soft{background-color:color-mix(in oklab, var(--color-accent) 16%, transparent)}}.bg-accent\/13{background-color:#ff564021}@supports (color:color-mix(in lab, red, red)){.bg-accent\/13{background-color:color-mix(in oklab, var(--color-accent) 13%, transparent)}}.bg-accent\/15{background-color:#ff564026}@supports (color:color-mix(in lab, red, red)){.bg-accent\/15{background-color:color-mix(in oklab, var(--color-accent) 15%, transparent)}}.bg-bg-0{background-color:var(--color-bg-0)}.bg-bg-1{background-color:var(--color-bg-1)}.bg-bg-1\/97{background-color:#17161cf7}@supports (color:color-mix(in lab, red, red)){.bg-bg-1\/97{background-color:color-mix(in oklab, var(--color-bg-1) 97%, transparent)}}.bg-bg-1\/98{background-color:#17161cfa}@supports (color:color-mix(in lab, red, red)){.bg-bg-1\/98{background-color:color-mix(in oklab, var(--color-bg-1) 98%, transparent)}}.bg-bg-2{background-color:var(--color-bg-2)}.bg-bg-2\/40{background-color:#1e1d2566}@supports (color:color-mix(in lab, red, red)){.bg-bg-2\/40{background-color:color-mix(in oklab, var(--color-bg-2) 40%, transparent)}}.bg-bg-3{background-color:var(--color-bg-3)}.bg-black{background-color:var(--color-black)}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab, red, red)){.bg-black\/60{background-color:color-mix(in oklab, var(--color-black) 60%, transparent)}}.bg-black\/92{background-color:#000000eb}@supports (color:color-mix(in lab, red, red)){.bg-black\/92{background-color:color-mix(in oklab, var(--color-black) 92%, transparent)}}.bg-danger\/12{background-color:#ff6b6b1f}@supports (color:color-mix(in lab, red, red)){.bg-danger\/12{background-color:color-mix(in oklab, var(--color-danger) 12%, transparent)}}.bg-good{background-color:var(--color-good)}.bg-good\/12{background-color:#46d39a1f}@supports (color:color-mix(in lab, red, red)){.bg-good\/12{background-color:color-mix(in oklab, var(--color-good) 12%, transparent)}}.bg-ink-3\/50{background-color:#6b6a7880}@supports (color:color-mix(in lab, red, red)){.bg-ink-3\/50{background-color:color-mix(in oklab, var(--color-ink-3) 50%, transparent)}}.bg-line{background-color:var(--color-line)}.bg-line-2{background-color:var(--color-line-2)}.bg-transparent{background-color:#0000}.bg-warn{background-color:var(--color-warn)}.bg-white{background-color:var(--color-white)}.bg-white\/13{background-color:#ffffff21}@supports (color:color-mix(in lab, red, red)){.bg-white\/13{background-color:color-mix(in oklab, var(--color-white) 13%, transparent)}}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab, red, red)){.bg-white\/20{background-color:color-mix(in oklab, var(--color-white) 20%, transparent)}}.bg-white\/\[\.012\]{background-color:#ffffff03}@supports (color:color-mix(in lab, red, red)){.bg-white\/\[\.012\]{background-color:color-mix(in oklab, var(--color-white) 1.2%, transparent)}}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[repeating-linear-gradient\(45deg\,transparent\,transparent_7px\,rgba\(255\,255\,255\,\.02\)_7px\,rgba\(255\,255\,255\,\.02\)_14px\)\]{background-image:repeating-linear-gradient(45deg,#0000,#0000 7px,#ffffff05 7px 14px)}.from-accent-2{--tw-gradient-from:var(--color-accent-2);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-accent{--tw-gradient-to:var(--color-accent);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-3\.5{padding:calc(var(--spacing) * 3.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-10{padding:calc(var(--spacing) * 10)}.p-\[3px\]{padding:3px}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-4\.5{padding-inline:calc(var(--spacing) * 4.5)}.px-5\.5{padding-inline:calc(var(--spacing) * 5.5)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-\[3px\]{padding-block:3px}.py-\[5px\]{padding-block:5px}.py-\[7px\]{padding-block:7px}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-2\.5{padding-right:calc(var(--spacing) * 2.5)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3\.5{padding-bottom:calc(var(--spacing) * 3.5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-1{padding-left:calc(var(--spacing) * 1)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-display{font-family:var(--font-display)}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9\.5px\]{font-size:9.5px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[\.07em\]{--tw-tracking:.07em;letter-spacing:.07em}.tracking-\[\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.whitespace-nowrap{white-space:nowrap}.text-accent-2{color:var(--color-accent-2)}.text-danger{color:var(--color-danger)}.text-good{color:var(--color-good)}.text-ink-1{color:var(--color-ink-1)}.text-ink-2{color:var(--color-ink-2)}.text-ink-3{color:var(--color-ink-3)}.text-line-2{color:var(--color-line-2)}.text-warn{color:var(--color-warn)}.text-white{color:var(--color-white)}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab, red, red)){.text-white\/90{color:color-mix(in oklab, var(--color-white) 90%, transparent)}}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-45{opacity:.45}.opacity-100{opacity:1}.shadow-\[0_0_0_1px_rgba\(0\,0\,0\,\.35\)\,0_1px_5px_rgba\(0\,0\,0\,\.5\)\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#00000059), 0 1px 5px var(--tw-shadow-color,#00000080);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(255\,255\,255\,\.1\)_inset\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,#ffffff1a) inset;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_0_1px_var\(--color-line-2\)_inset\]{--tw-shadow:0 0 0 1px var(--tw-shadow-color,var(--color-line-2)) inset;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_0_3px_var\(--color-accent-soft\)\]{--tw-shadow:0 0 0 3px var(--tw-shadow-color,var(--color-accent-soft));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_6px_var\(--color-accent-soft\)\]{--tw-shadow:0 0 6px var(--tw-shadow-color,var(--color-accent-soft));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_7px_var\(--color-accent-soft\)\]{--tw-shadow:0 0 7px var(--tw-shadow-color,var(--color-accent-soft));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(255\,255\,255\,\.5\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#ffffff80);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_8px_var\(--color-accent-soft\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,var(--color-accent-soft));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_4px_rgba\(0\,0\,0\,\.3\)\]{--tw-shadow:0 1px 4px var(--tw-shadow-color,#0000004d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_2px_14px_-3px_var\(--color-accent-soft\)\]{--tw-shadow:0 2px 14px -3px var(--tw-shadow-color,var(--color-accent-soft));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_18px_44px_-12px_rgba\(0\,0\,0\,\.7\)\]{--tw-shadow:0 18px 44px -12px var(--tw-shadow-color,#000000b3);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_24px_80px_-20px_rgba\(0\,0\,0\,\.8\)\,0_0_0_1px_rgba\(255\,255\,255\,\.06\)\]{--tw-shadow:0 24px 80px -20px var(--tw-shadow-color,#000c), 0 0 0 1px var(--tw-shadow-color,#ffffff0f);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_30px_80px_-20px_rgba\(0\,0\,0\,\.8\)\]{--tw-shadow:0 30px 80px -20px var(--tw-shadow-color,#000c);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-accent-2{--tw-ring-color:var(--color-accent-2)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.ring-offset-bg-1{--tw-ring-offset-color:var(--color-bg-1)}.outline-0{outline-style:var(--tw-outline-style);outline-width:0}.saturate-50{--tw-saturate:saturate(50%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-\[3px\]{--tw-backdrop-blur:blur(3px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\,opacity\]{transition-property:grid-template-rows,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,opacity\]{transition-property:transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[writing-mode\:vertical-rl\]{writing-mode:vertical-rl}@media (hover:hover){.group-hover\:h-\[7px\]:is(:where(.group):hover *){height:7px}.group-hover\:w-\[78px\]:is(:where(.group):hover *){width:78px}.group-hover\:border-line-2:is(:where(.group):hover *){border-color:var(--color-line-2)}.group-hover\:text-ink-1:is(:where(.group):hover *){color:var(--color-ink-1)}.group-hover\:text-ink-2:is(:where(.group):hover *){color:var(--color-ink-2)}.group-hover\/h\:w-1:is(:where(.group\/h):hover *){width:calc(var(--spacing) * 1)}.group-hover\/h\:bg-accent-2:is(:where(.group\/h):hover *){background-color:var(--color-accent-2)}}.placeholder\:text-ink-3::placeholder{color:var(--color-ink-3)}.first\:mt-0:first-child{margin-top:calc(var(--spacing) * 0)}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}.focus-within\:border-accent:focus-within{border-color:var(--color-accent)}.focus-within\:shadow-\[0_0_0_3px_var\(--color-accent-soft\)\]:focus-within{--tw-shadow:0 0 0 3px var(--tw-shadow-color,var(--color-accent-soft));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (hover:hover){.hover\:border-line-2:hover{border-color:var(--color-line-2)}.hover\:bg-bg-2:hover{background-color:var(--color-bg-2)}.hover\:bg-bg-3:hover{background-color:var(--color-bg-3)}.hover\:bg-danger\/12:hover{background-color:#ff6b6b1f}@supports (color:color-mix(in lab, red, red)){.hover\:bg-danger\/12:hover{background-color:color-mix(in oklab, var(--color-danger) 12%, transparent)}}.hover\:bg-danger\/14:hover{background-color:#ff6b6b24}@supports (color:color-mix(in lab, red, red)){.hover\:bg-danger\/14:hover{background-color:color-mix(in oklab, var(--color-danger) 14%, transparent)}}.hover\:bg-white\/12:hover{background-color:#ffffff1f}@supports (color:color-mix(in lab, red, red)){.hover\:bg-white\/12:hover{background-color:color-mix(in oklab, var(--color-white) 12%, transparent)}}.hover\:text-danger:hover{color:var(--color-danger)}.hover\:text-ink-1:hover{color:var(--color-ink-1)}.hover\:text-ink-2:hover{color:var(--color-ink-2)}.hover\:text-white:hover{color:var(--color-white)}.hover\:brightness-110:hover{--tw-brightness:brightness(110%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}}.focus\:border-accent:focus{border-color:var(--color-accent)}.focus\:border-accent-line:focus{border-color:#ff564066}@supports (color:color-mix(in lab, red, red)){.focus\:border-accent-line:focus{border-color:color-mix(in oklab, var(--color-accent) 40%, transparent)}}.focus\:border-line-2:focus{border-color:var(--color-line-2)}.focus\:shadow-\[0_0_0_3px_var\(--color-accent-soft\)\]:focus{--tw-shadow:0 0 0 3px var(--tw-shadow-color,var(--color-accent-soft));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:shadow-\[0_0_0_4px_var\(--color-accent-soft\)\]:focus-visible{--tw-shadow:0 0 0 4px var(--tw-shadow-color,var(--color-accent-soft));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-accent\/50:focus-visible{--tw-ring-color:#ff564080}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-accent\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--color-accent) 50%, transparent)}}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-45:disabled{opacity:.45}.data-\[active\]\:text-accent-2[data-active]{color:var(--color-accent-2)}.data-\[checked\]\:translate-x-\[17px\][data-checked]{--tw-translate-x:17px;translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[checked\]\:bg-accent[data-checked]{background-color:var(--color-accent)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-40[data-disabled]{opacity:.4}.data-\[ending-style\]\:scale-\[\.97\][data-ending-style]{scale:.97}.data-\[ending-style\]\:opacity-0[data-ending-style]{opacity:0}.data-\[highlighted\]\:bg-bg-3[data-highlighted]{background-color:var(--color-bg-3)}.data-\[highlighted\]\:text-ink-1[data-highlighted]{color:var(--color-ink-1)}.data-\[popup-open\]\:border-accent[data-popup-open]{border-color:var(--color-accent)}.data-\[popup-open\]\:bg-bg-3[data-popup-open]{background-color:var(--color-bg-3)}.data-\[popup-open\]\:text-ink-1[data-popup-open]{color:var(--color-ink-1)}.data-\[popup-open\]\:shadow-\[0_0_0_3px_var\(--color-accent-soft\)\][data-popup-open]{--tw-shadow:0 0 0 3px var(--tw-shadow-color,var(--color-accent-soft));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.data-\[selected\]\:text-ink-1[data-selected]{color:var(--color-ink-1)}.data-\[starting-style\]\:translate-y-3[data-starting-style]{--tw-translate-y:calc(var(--spacing) * 3);translate:var(--tw-translate-x) var(--tw-translate-y)}.data-\[starting-style\]\:scale-95[data-starting-style]{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.data-\[starting-style\]\:scale-\[\.97\][data-starting-style]{scale:.97}.data-\[starting-style\]\:opacity-0[data-starting-style]{opacity:0}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}
|