@smoove/studio 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/components/brand/brand.d.ts +9 -0
  4. package/dist/components/brand/brand.d.ts.map +1 -0
  5. package/dist/components/brand/brand.js +11 -0
  6. package/dist/components/brand/brand.js.map +1 -0
  7. package/dist/components/button/button.d.ts +21 -0
  8. package/dist/components/button/button.d.ts.map +1 -0
  9. package/dist/components/button/button.js +20 -0
  10. package/dist/components/button/button.js.map +1 -0
  11. package/dist/components/button/icon-button.d.ts +27 -0
  12. package/dist/components/button/icon-button.d.ts.map +1 -0
  13. package/dist/components/button/icon-button.js +19 -0
  14. package/dist/components/button/icon-button.js.map +1 -0
  15. package/dist/components/header/header-title.d.ts +8 -0
  16. package/dist/components/header/header-title.d.ts.map +1 -0
  17. package/dist/components/header/header-title.js +7 -0
  18. package/dist/components/header/header-title.js.map +1 -0
  19. package/dist/components/header/header.d.ts +7 -0
  20. package/dist/components/header/header.d.ts.map +1 -0
  21. package/dist/components/header/header.js +7 -0
  22. package/dist/components/header/header.js.map +1 -0
  23. package/dist/components/header/zoom.d.ts +3 -0
  24. package/dist/components/header/zoom.d.ts.map +1 -0
  25. package/dist/components/header/zoom.js +16 -0
  26. package/dist/components/header/zoom.js.map +1 -0
  27. package/dist/components/icon/icon.d.ts +11 -0
  28. package/dist/components/icon/icon.d.ts.map +1 -0
  29. package/dist/components/icon/icon.js +7 -0
  30. package/dist/components/icon/icon.js.map +1 -0
  31. package/dist/components/icon/paths.d.ts +47 -0
  32. package/dist/components/icon/paths.d.ts.map +1 -0
  33. package/dist/components/icon/paths.js +54 -0
  34. package/dist/components/icon/paths.js.map +1 -0
  35. package/dist/components/left-panel/library.d.ts +8 -0
  36. package/dist/components/left-panel/library.d.ts.map +1 -0
  37. package/dist/components/left-panel/library.js +49 -0
  38. package/dist/components/left-panel/library.js.map +1 -0
  39. package/dist/components/left-panel/sidebar-group.d.ts +12 -0
  40. package/dist/components/left-panel/sidebar-group.d.ts.map +1 -0
  41. package/dist/components/left-panel/sidebar-group.js +11 -0
  42. package/dist/components/left-panel/sidebar-group.js.map +1 -0
  43. package/dist/components/left-panel/sidebar-item.d.ts +17 -0
  44. package/dist/components/left-panel/sidebar-item.d.ts.map +1 -0
  45. package/dist/components/left-panel/sidebar-item.js +12 -0
  46. package/dist/components/left-panel/sidebar-item.js.map +1 -0
  47. package/dist/components/left-panel/sidebar.d.ts +8 -0
  48. package/dist/components/left-panel/sidebar.d.ts.map +1 -0
  49. package/dist/components/left-panel/sidebar.js +8 -0
  50. package/dist/components/left-panel/sidebar.js.map +1 -0
  51. package/dist/components/primitives/dialog.d.ts +33 -0
  52. package/dist/components/primitives/dialog.d.ts.map +1 -0
  53. package/dist/components/primitives/dialog.js +30 -0
  54. package/dist/components/primitives/dialog.js.map +1 -0
  55. package/dist/components/primitives/menu.d.ts +25 -0
  56. package/dist/components/primitives/menu.d.ts.map +1 -0
  57. package/dist/components/primitives/menu.js +31 -0
  58. package/dist/components/primitives/menu.js.map +1 -0
  59. package/dist/components/primitives/number-field.d.ts +12 -0
  60. package/dist/components/primitives/number-field.d.ts.map +1 -0
  61. package/dist/components/primitives/number-field.js +7 -0
  62. package/dist/components/primitives/number-field.js.map +1 -0
  63. package/dist/components/primitives/portal-context.d.ts +9 -0
  64. package/dist/components/primitives/portal-context.d.ts.map +1 -0
  65. package/dist/components/primitives/portal-context.js +10 -0
  66. package/dist/components/primitives/portal-context.js.map +1 -0
  67. package/dist/components/primitives/select.d.ts +14 -0
  68. package/dist/components/primitives/select.d.ts.map +1 -0
  69. package/dist/components/primitives/select.js +11 -0
  70. package/dist/components/primitives/select.js.map +1 -0
  71. package/dist/components/primitives/slider.d.ts +10 -0
  72. package/dist/components/primitives/slider.d.ts.map +1 -0
  73. package/dist/components/primitives/slider.js +7 -0
  74. package/dist/components/primitives/slider.js.map +1 -0
  75. package/dist/components/primitives/switch.d.ts +5 -0
  76. package/dist/components/primitives/switch.d.ts.map +1 -0
  77. package/dist/components/primitives/switch.js +6 -0
  78. package/dist/components/primitives/switch.js.map +1 -0
  79. package/dist/components/primitives/tabs.d.ts +23 -0
  80. package/dist/components/primitives/tabs.d.ts.map +1 -0
  81. package/dist/components/primitives/tabs.js +17 -0
  82. package/dist/components/primitives/tabs.js.map +1 -0
  83. package/dist/components/primitives/tooltip.d.ts +9 -0
  84. package/dist/components/primitives/tooltip.d.ts.map +1 -0
  85. package/dist/components/primitives/tooltip.js +11 -0
  86. package/dist/components/primitives/tooltip.js.map +1 -0
  87. package/dist/components/render/export-frame-dialog.d.ts +8 -0
  88. package/dist/components/render/export-frame-dialog.d.ts.map +1 -0
  89. package/dist/components/render/export-frame-dialog.js +60 -0
  90. package/dist/components/render/export-frame-dialog.js.map +1 -0
  91. package/dist/components/render/render-dialog.d.ts +8 -0
  92. package/dist/components/render/render-dialog.d.ts.map +1 -0
  93. package/dist/components/render/render-dialog.js +95 -0
  94. package/dist/components/render/render-dialog.js.map +1 -0
  95. package/dist/components/render/render-queue.d.ts +5 -0
  96. package/dist/components/render/render-queue.d.ts.map +1 -0
  97. package/dist/components/render/render-queue.js +40 -0
  98. package/dist/components/render/render-queue.js.map +1 -0
  99. package/dist/components/right-panel/panel-handle.d.ts +3 -0
  100. package/dist/components/right-panel/panel-handle.d.ts.map +1 -0
  101. package/dist/components/right-panel/panel-handle.js +9 -0
  102. package/dist/components/right-panel/panel-handle.js.map +1 -0
  103. package/dist/components/right-panel/panel-tabs.d.ts +3 -0
  104. package/dist/components/right-panel/panel-tabs.d.ts.map +1 -0
  105. package/dist/components/right-panel/panel-tabs.js +26 -0
  106. package/dist/components/right-panel/panel-tabs.js.map +1 -0
  107. package/dist/components/right-panel/panel.d.ts +8 -0
  108. package/dist/components/right-panel/panel.d.ts.map +1 -0
  109. package/dist/components/right-panel/panel.js +16 -0
  110. package/dist/components/right-panel/panel.js.map +1 -0
  111. package/dist/components/schema-form/field.d.ts +9 -0
  112. package/dist/components/schema-form/field.d.ts.map +1 -0
  113. package/dist/components/schema-form/field.js +102 -0
  114. package/dist/components/schema-form/field.js.map +1 -0
  115. package/dist/components/schema-form/schema-form.d.ts +3 -0
  116. package/dist/components/schema-form/schema-form.d.ts.map +1 -0
  117. package/dist/components/schema-form/schema-form.js +18 -0
  118. package/dist/components/schema-form/schema-form.js.map +1 -0
  119. package/dist/components/stage/stage.d.ts +12 -0
  120. package/dist/components/stage/stage.d.ts.map +1 -0
  121. package/dist/components/stage/stage.js +103 -0
  122. package/dist/components/stage/stage.js.map +1 -0
  123. package/dist/components/studio/features.d.ts +4 -0
  124. package/dist/components/studio/features.d.ts.map +1 -0
  125. package/dist/components/studio/features.js +18 -0
  126. package/dist/components/studio/features.js.map +1 -0
  127. package/dist/components/studio/layout.d.ts +19 -0
  128. package/dist/components/studio/layout.d.ts.map +1 -0
  129. package/dist/components/studio/layout.js +17 -0
  130. package/dist/components/studio/layout.js.map +1 -0
  131. package/dist/components/studio/studio-context.d.ts +53 -0
  132. package/dist/components/studio/studio-context.d.ts.map +1 -0
  133. package/dist/components/studio/studio-context.js +3 -0
  134. package/dist/components/studio/studio-context.js.map +1 -0
  135. package/dist/components/studio/studio.d.ts +21 -0
  136. package/dist/components/studio/studio.d.ts.map +1 -0
  137. package/dist/components/studio/studio.js +38 -0
  138. package/dist/components/studio/studio.js.map +1 -0
  139. package/dist/components/timeline/layered-body.d.ts +8 -0
  140. package/dist/components/timeline/layered-body.d.ts.map +1 -0
  141. package/dist/components/timeline/layered-body.js +75 -0
  142. package/dist/components/timeline/layered-body.js.map +1 -0
  143. package/dist/components/timeline/region-handles.d.ts +8 -0
  144. package/dist/components/timeline/region-handles.d.ts.map +1 -0
  145. package/dist/components/timeline/region-handles.js +13 -0
  146. package/dist/components/timeline/region-handles.js.map +1 -0
  147. package/dist/components/timeline/ruler.d.ts +7 -0
  148. package/dist/components/timeline/ruler.d.ts.map +1 -0
  149. package/dist/components/timeline/ruler.js +19 -0
  150. package/dist/components/timeline/ruler.js.map +1 -0
  151. package/dist/components/timeline/scrubber.d.ts +6 -0
  152. package/dist/components/timeline/scrubber.d.ts.map +1 -0
  153. package/dist/components/timeline/scrubber.js +25 -0
  154. package/dist/components/timeline/scrubber.js.map +1 -0
  155. package/dist/components/timeline/timeline-header.d.ts +3 -0
  156. package/dist/components/timeline/timeline-header.d.ts.map +1 -0
  157. package/dist/components/timeline/timeline-header.js +36 -0
  158. package/dist/components/timeline/timeline-header.js.map +1 -0
  159. package/dist/components/timeline/timeline.d.ts +5 -0
  160. package/dist/components/timeline/timeline.d.ts.map +1 -0
  161. package/dist/components/timeline/timeline.js +16 -0
  162. package/dist/components/timeline/timeline.js.map +1 -0
  163. package/dist/components/timeline/transport.d.ts +5 -0
  164. package/dist/components/timeline/transport.d.ts.map +1 -0
  165. package/dist/components/timeline/transport.js +21 -0
  166. package/dist/components/timeline/transport.js.map +1 -0
  167. package/dist/components/timeline/use-scrub-surface.d.ts +20 -0
  168. package/dist/components/timeline/use-scrub-surface.d.ts.map +1 -0
  169. package/dist/components/timeline/use-scrub-surface.js +56 -0
  170. package/dist/components/timeline/use-scrub-surface.js.map +1 -0
  171. package/dist/components/toasts/toasts.d.ts +4 -0
  172. package/dist/components/toasts/toasts.d.ts.map +1 -0
  173. package/dist/components/toasts/toasts.js +22 -0
  174. package/dist/components/toasts/toasts.js.map +1 -0
  175. package/dist/hooks/use-composition.d.ts +10 -0
  176. package/dist/hooks/use-composition.d.ts.map +1 -0
  177. package/dist/hooks/use-composition.js +13 -0
  178. package/dist/hooks/use-composition.js.map +1 -0
  179. package/dist/hooks/use-layers.d.ts +9 -0
  180. package/dist/hooks/use-layers.d.ts.map +1 -0
  181. package/dist/hooks/use-layers.js +34 -0
  182. package/dist/hooks/use-layers.js.map +1 -0
  183. package/dist/hooks/use-playback.d.ts +15 -0
  184. package/dist/hooks/use-playback.d.ts.map +1 -0
  185. package/dist/hooks/use-playback.js +38 -0
  186. package/dist/hooks/use-playback.js.map +1 -0
  187. package/dist/hooks/use-props-form.d.ts +15 -0
  188. package/dist/hooks/use-props-form.d.ts.map +1 -0
  189. package/dist/hooks/use-props-form.js +22 -0
  190. package/dist/hooks/use-props-form.js.map +1 -0
  191. package/dist/hooks/use-real-fps.d.ts +3 -0
  192. package/dist/hooks/use-real-fps.d.ts.map +1 -0
  193. package/dist/hooks/use-real-fps.js +27 -0
  194. package/dist/hooks/use-real-fps.js.map +1 -0
  195. package/dist/hooks/use-shortcuts.d.ts +7 -0
  196. package/dist/hooks/use-shortcuts.d.ts.map +1 -0
  197. package/dist/hooks/use-shortcuts.js +53 -0
  198. package/dist/hooks/use-shortcuts.js.map +1 -0
  199. package/dist/hooks/use-studio.d.ts +4 -0
  200. package/dist/hooks/use-studio.d.ts.map +1 -0
  201. package/dist/hooks/use-studio.js +10 -0
  202. package/dist/hooks/use-studio.js.map +1 -0
  203. package/dist/index.d.ts +145 -0
  204. package/dist/index.d.ts.map +1 -0
  205. package/dist/index.js +117 -0
  206. package/dist/index.js.map +1 -0
  207. package/dist/lib/cn.d.ts +3 -0
  208. package/dist/lib/cn.d.ts.map +1 -0
  209. package/dist/lib/cn.js +8 -0
  210. package/dist/lib/cn.js.map +1 -0
  211. package/dist/lib/constants.d.ts +28 -0
  212. package/dist/lib/constants.d.ts.map +1 -0
  213. package/dist/lib/constants.js +38 -0
  214. package/dist/lib/constants.js.map +1 -0
  215. package/dist/lib/cva.d.ts +25 -0
  216. package/dist/lib/cva.d.ts.map +1 -0
  217. package/dist/lib/cva.js +23 -0
  218. package/dist/lib/cva.js.map +1 -0
  219. package/dist/lib/format.d.ts +13 -0
  220. package/dist/lib/format.d.ts.map +1 -0
  221. package/dist/lib/format.js +25 -0
  222. package/dist/lib/format.js.map +1 -0
  223. package/dist/lib/ids.d.ts +3 -0
  224. package/dist/lib/ids.d.ts.map +1 -0
  225. package/dist/lib/ids.js +6 -0
  226. package/dist/lib/ids.js.map +1 -0
  227. package/dist/registry/define-registry.d.ts +8 -0
  228. package/dist/registry/define-registry.d.ts.map +1 -0
  229. package/dist/registry/define-registry.js +71 -0
  230. package/dist/registry/define-registry.js.map +1 -0
  231. package/dist/registry/props-signal.d.ts +9 -0
  232. package/dist/registry/props-signal.d.ts.map +1 -0
  233. package/dist/registry/props-signal.js +25 -0
  234. package/dist/registry/props-signal.js.map +1 -0
  235. package/dist/schema/kf.d.ts +28 -0
  236. package/dist/schema/kf.d.ts.map +1 -0
  237. package/dist/schema/kf.js +82 -0
  238. package/dist/schema/kf.js.map +1 -0
  239. package/dist/schema/types.d.ts +69 -0
  240. package/dist/schema/types.d.ts.map +1 -0
  241. package/dist/schema/types.js +4 -0
  242. package/dist/schema/types.js.map +1 -0
  243. package/dist/server/index.d.ts +6 -0
  244. package/dist/server/index.d.ts.map +1 -0
  245. package/dist/server/index.js +7 -0
  246. package/dist/server/index.js.map +1 -0
  247. package/dist/server/map.d.ts +19 -0
  248. package/dist/server/map.d.ts.map +1 -0
  249. package/dist/server/map.js +63 -0
  250. package/dist/server/map.js.map +1 -0
  251. package/dist/server/render-queue.d.ts +46 -0
  252. package/dist/server/render-queue.d.ts.map +1 -0
  253. package/dist/server/render-queue.js +147 -0
  254. package/dist/server/render-queue.js.map +1 -0
  255. package/dist/server/temp-storage.d.ts +13 -0
  256. package/dist/server/temp-storage.d.ts.map +1 -0
  257. package/dist/server/temp-storage.js +55 -0
  258. package/dist/server/temp-storage.js.map +1 -0
  259. package/dist/server/types.d.ts +57 -0
  260. package/dist/server/types.d.ts.map +1 -0
  261. package/dist/server/types.js +2 -0
  262. package/dist/server/types.js.map +1 -0
  263. package/dist/signals/signal-bridge.d.ts +18 -0
  264. package/dist/signals/signal-bridge.d.ts.map +1 -0
  265. package/dist/signals/signal-bridge.js +39 -0
  266. package/dist/signals/signal-bridge.js.map +1 -0
  267. package/dist/store/store.d.ts +74 -0
  268. package/dist/store/store.d.ts.map +1 -0
  269. package/dist/store/store.js +276 -0
  270. package/dist/store/store.js.map +1 -0
  271. package/dist/styles/studio.css +2 -0
  272. package/dist/types.d.ts +112 -0
  273. package/dist/types.d.ts.map +1 -0
  274. package/dist/types.js +2 -0
  275. package/dist/types.js.map +1 -0
  276. package/package.json +66 -0
@@ -0,0 +1,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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}