cozyclay 1.9.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/bin/agent/agent-routes.mjs +74 -70
  3. package/bin/agent/agent-runner.mjs +10 -3
  4. package/bin/agent/motion-runtime.mjs +32 -260
  5. package/bin/agent/providers.mjs +46 -3
  6. package/bin/agent/session-store.mjs +41 -5
  7. package/bin/agent/studio-prompt.mjs +1 -1
  8. package/bin/agent/studio-tools.mjs +48 -11
  9. package/bin/cozyclay.mjs +26 -8
  10. package/bin/live/cli.mjs +22 -3
  11. package/bin/mcp-runtime.mjs +35 -20
  12. package/bin/telemetry-state.mjs +5 -2
  13. package/bin/update-check.mjs +15 -0
  14. package/dist/app/index.html +6 -6
  15. package/dist/assets/analytics-MVZOEW8O.js +1 -0
  16. package/dist/assets/app-C1sdVbg4.css +1 -0
  17. package/dist/assets/app-CA55tcI3.js +4876 -0
  18. package/dist/assets/{demo-B-eg1CT8.js → demo-ByeYp-dY.js} +1 -1
  19. package/dist/assets/{first-shot-handoff-CGgnvNu8.js → first-shot-handoff-DgT28ZiV.js} +1 -1
  20. package/dist/assets/{landing-IbRp3FnQ.js → landing-BaXkpFip.js} +1 -1
  21. package/dist/assets/shot-prompt-CbqWcWYi.css +1 -0
  22. package/dist/assets/shot-prompt-Yrt99wZx.js +17 -0
  23. package/dist/assets/{ticket-BgIzOBOf.js → ticket-BcmsnHn5.js} +1 -1
  24. package/dist/assets/workflow-DRdwoDBT.css +1 -0
  25. package/dist/assets/workflow-dNPGY9xz.js +179 -0
  26. package/dist/cozyclay-package.json +1 -1
  27. package/dist/fonts/IBM-Plex-Sans-OFL.txt +92 -0
  28. package/dist/fonts/JetBrains-Mono-OFL.txt +93 -0
  29. package/dist/fonts/README.md +13 -9
  30. package/dist/fonts/ibm-plex-sans-400-latin.woff2 +0 -0
  31. package/dist/fonts/ibm-plex-sans-500-latin.woff2 +0 -0
  32. package/dist/fonts/ibm-plex-sans-600-latin.woff2 +0 -0
  33. package/dist/fonts/jetbrains-mono-400-latin.woff2 +0 -0
  34. package/dist/fonts/jetbrains-mono-500-latin.woff2 +0 -0
  35. package/dist/index.html +7 -7
  36. package/dist/privacy/index.html +13 -8
  37. package/dist/sitemap.xml +6 -6
  38. package/dist/workflow/index.html +5 -5
  39. package/mcp/LIVE-PROTOCOL.md +1 -1
  40. package/mcp/live-hub.mjs +35 -93
  41. package/mcp/mesh-file.mjs +48 -0
  42. package/mcp/server.mjs +6 -77
  43. package/mcp/tool-handlers.mjs +224 -377
  44. package/package.json +2 -1
  45. package/src/App.jsx +1273 -9075
  46. package/src/analytics.js +393 -9
  47. package/src/app-context.js +211 -0
  48. package/src/app-stage.jsx +25 -24
  49. package/src/ardy/auto-fix-panel.css +108 -0
  50. package/src/ardy/collision-blockers.js +9 -3
  51. package/src/ardy/fix-collisions.js +10 -66
  52. package/src/ardy/ground.js +4 -4
  53. package/src/ardy/ik-drag.js +101 -0
  54. package/src/ardy/ik-key-json.js +43 -0
  55. package/src/ardy/ik.js +122 -76
  56. package/src/ardy/physics-panel.css +2 -0
  57. package/src/ardy/physics-panel.jsx +17 -5
  58. package/src/ardy/platform-fit-panel.css +64 -0
  59. package/src/ardy/platform-fit-panel.jsx +40 -0
  60. package/src/ardy/platform-fit.js +326 -0
  61. package/src/ardy/playback.js +166 -20
  62. package/src/ardy/range-pin.js +299 -0
  63. package/src/ardy/timeline-coordinates.js +26 -0
  64. package/src/ardy/timeline.css +1199 -0
  65. package/src/ardy/timeline.jsx +149 -41
  66. package/src/ardy/waypoints.js +2 -2
  67. package/src/asset-pane.css +462 -0
  68. package/src/asset-pane.jsx +461 -232
  69. package/src/command-bus.js +349 -0
  70. package/src/commands/ai.js +31 -0
  71. package/src/commands/cast.js +140 -0
  72. package/src/commands/elements/character.js +13 -0
  73. package/src/commands/elements/motion.js +14 -0
  74. package/src/commands/elements/object.js +22 -0
  75. package/src/commands/elements/scene.js +16 -0
  76. package/src/commands/elements/shot.js +9 -0
  77. package/src/commands/elements/stage.js +11 -0
  78. package/src/commands/elements.js +155 -0
  79. package/src/commands/export.js +20 -0
  80. package/src/commands/index.js +40 -0
  81. package/src/commands/motion.js +231 -0
  82. package/src/commands/objects.js +174 -0
  83. package/src/commands/project.js +53 -0
  84. package/src/commands/scene.js +81 -0
  85. package/src/commands/shared.js +19 -0
  86. package/src/commands/shot.js +103 -0
  87. package/src/commands/stage.js +17 -0
  88. package/src/commands/view.js +42 -0
  89. package/src/document-store.js +144 -0
  90. package/src/domains/cast.js +1007 -0
  91. package/src/domains/motion.js +3219 -0
  92. package/src/domains/objects.js +932 -0
  93. package/src/domains/scenes.js +817 -0
  94. package/src/domains/shots.js +404 -0
  95. package/src/domains/stage.js +93 -0
  96. package/src/dualview.jsx +113 -57
  97. package/src/facing-marks.js +3 -0
  98. package/src/first-success-guide.jsx +14 -14
  99. package/src/grid-view.js +18 -5
  100. package/src/hierarchy-model.js +24 -16
  101. package/src/hierarchy-panel.css +386 -0
  102. package/src/hierarchy-panel.jsx +150 -21
  103. package/src/{fal-motion-client.js → i2v-motion-client.js} +13 -13
  104. package/src/i2v-motion-studio.jsx +180 -0
  105. package/src/ik-camera.js +3 -0
  106. package/src/main.jsx +6 -0
  107. package/src/motion/generation.js +105 -0
  108. package/src/motion-readiness-ui.jsx +4 -4
  109. package/src/motion-readiness.js +11 -0
  110. package/src/motion-trail.js +366 -9
  111. package/src/object-gizmo.jsx +7 -1
  112. package/src/otio.js +2 -1
  113. package/src/panels/CameraPanel.jsx +60 -0
  114. package/src/panels/CharacterTransformPanel.jsx +48 -0
  115. package/src/panels/EnvironmentPanel.jsx +40 -0
  116. package/src/panels/Foldout.jsx +32 -0
  117. package/src/panels/LightPanel.jsx +24 -0
  118. package/src/panels/ObjectTransformPanel.jsx +554 -0
  119. package/src/panels/PosePanel.jsx +97 -0
  120. package/src/panels/ProjectPanel.jsx +33 -0
  121. package/src/panels/PromptBlocksPanel.jsx +442 -0
  122. package/src/panels/PropsPanel.jsx +70 -0
  123. package/src/panels/ReferenceImageField.jsx +91 -0
  124. package/src/panels/RigControlPanel.jsx +78 -0
  125. package/src/panels/RigPanel.jsx +37 -0
  126. package/src/panels/SubjectBox.jsx +47 -0
  127. package/src/panels/SubjectsPanel.jsx +39 -0
  128. package/src/panels/VideoCapturePanel.jsx +180 -0
  129. package/src/panels/details.css +1171 -0
  130. package/src/panels/motion.css +197 -0
  131. package/src/panels/pose.css +39 -0
  132. package/src/planview.jsx +60 -31
  133. package/src/posestudio.jsx +59 -4
  134. package/src/project-browser.css +1073 -0
  135. package/src/project-browser.jsx +284 -123
  136. package/src/range-pin-object-transform.js +19 -0
  137. package/src/range-pin-panel.css +518 -0
  138. package/src/range-pin-panel.jsx +344 -0
  139. package/src/result-modal.jsx +5 -5
  140. package/src/room.jsx +79 -51
  141. package/src/scene-objects.js +37 -1
  142. package/src/scenes.js +5 -0
  143. package/src/semantic-edit.js +2 -0
  144. package/src/settings-menu.jsx +39 -105
  145. package/src/shell/BottomDock.jsx +450 -0
  146. package/src/shell/DetailsSlot.jsx +513 -0
  147. package/src/shell/LibrarySlot.jsx +86 -0
  148. package/src/shell/MenuBar.jsx +601 -0
  149. package/src/shell/OutlinerSlot.jsx +50 -0
  150. package/src/shell/PreferencesDialog.jsx +538 -0
  151. package/src/shell/PreferencesSlot.jsx +40 -0
  152. package/src/shell/StatusBar.jsx +125 -0
  153. package/src/shell/StudioShell.jsx +92 -0
  154. package/src/shell/TopBar.jsx +129 -0
  155. package/src/shell/ViewportToolbar.jsx +656 -0
  156. package/src/shell/agent-glass.css +296 -0
  157. package/src/shell/dock.css +93 -0
  158. package/src/shell/glass-regions.css +985 -0
  159. package/src/shell/glass.css +687 -0
  160. package/src/shell/log-store.js +52 -0
  161. package/src/shell/mode.css +9 -0
  162. package/src/shell/preferences.css +651 -0
  163. package/src/shell/shell.css +282 -0
  164. package/src/shell/studio-shell-context.js +19 -0
  165. package/src/shell/topbar.css +435 -0
  166. package/src/shell/viewport.css +451 -0
  167. package/src/store/authored-intent.js +22 -0
  168. package/src/store/runtime-adapters.js +92 -0
  169. package/src/store/scene-stage.js +21 -0
  170. package/src/store/use-document-store.js +14 -0
  171. package/src/studio-actions.js +210 -0
  172. package/src/studio-agent-commands.js +41 -271
  173. package/src/studio-agent-context.js +39 -10
  174. package/src/studio-agent-motion.js +122 -373
  175. package/src/studio-agent-protocol.js +67 -31
  176. package/src/studio-app-binding.js +379 -0
  177. package/src/studio-contact-sheet.js +73 -0
  178. package/src/studio-elements.js +58 -51
  179. package/src/styles/themes.css +200 -0
  180. package/src/styles/tokens.css +69 -0
  181. package/src/styles.css +460 -1742
  182. package/src/theme.js +44 -0
  183. package/src/timeline-extent.js +16 -0
  184. package/src/trail-key-conflicts.js +39 -0
  185. package/src/trail-pick.js +59 -0
  186. package/src/ui.jsx +8 -8
  187. package/src/use-case-question.jsx +66 -0
  188. package/src/workflow/AgentPanel.jsx +82 -69
  189. package/src/workflow/agent-client.js +12 -2
  190. package/src/workflow/agent-panel.css +34 -32
  191. package/src/workflow/cozy-scene-node.css +2 -0
  192. package/src/workflow/workflow.css +2 -0
  193. package/tools/ardy/__pycache__/cclay_gvhmr_worker.cpython-313.pyc +0 -0
  194. package/tools/ardy/bridge.mjs +164 -146
  195. package/tools/ardy/visual-qa.mjs +5 -5
  196. package/tools/bench/EXP3.md +61 -0
  197. package/tools/bench/cclay_bench_extract_incam.py +125 -0
  198. package/tools/bench/cclay_bench_extract_obs.py +204 -0
  199. package/tools/bench/cclay_bench_runner.py +42 -0
  200. package/tools/bench/cube-contact.mjs +162 -0
  201. package/tools/bench/exp3.mjs +152 -0
  202. package/tools/bench/extract-bench-lib.mjs +216 -0
  203. package/tools/bench/extract-bench.mjs +302 -0
  204. package/tools/bench/fal-generate.mjs +88 -0
  205. package/tools/bench/fit/README.md +189 -0
  206. package/tools/bench/fit/camera.mjs +59 -0
  207. package/tools/bench/fit/contact.mjs +419 -0
  208. package/tools/bench/fit/footlock.mjs +234 -0
  209. package/tools/bench/fit/motion.mjs +85 -0
  210. package/tools/bench/fit/pin.mjs +27 -0
  211. package/tools/bench/fit/remote.mjs +105 -0
  212. package/tools/bench/fit-bench.mjs +126 -0
  213. package/tools/bench/fit-sanity.mjs +45 -0
  214. package/tools/bench/metrics.mjs +313 -0
  215. package/tools/bench/obs/depth.mjs +258 -0
  216. package/tools/bench/obs/extrinsics.mjs +175 -0
  217. package/tools/bench/obs/fit_mannequin_betas.py +340 -0
  218. package/tools/bench/obs/ground.mjs +294 -0
  219. package/tools/bench/obs/heading.mjs +151 -0
  220. package/tools/bench/obs/ladder.mjs +555 -0
  221. package/tools/bench/obs/mannequin-betas.json +124 -0
  222. package/tools/bench/obs/remote.mjs +83 -0
  223. package/tools/bench/obs/rest_joints.py +52 -0
  224. package/tools/bench/obs/ybot-targets.mjs +49 -0
  225. package/tools/bench/obs-bench.mjs +520 -0
  226. package/tools/bench/score.mjs +343 -0
  227. package/tools/bench/summarize.mjs +86 -0
  228. package/tools/dev/pages/privacy.html +13 -8
  229. package/tools/gt-render/browser.mjs +159 -0
  230. package/tools/gt-render/camera-math.mjs +276 -0
  231. package/tools/gt-render/page.mjs +267 -0
  232. package/tools/gt-render/render.mjs +514 -0
  233. package/tools/gt-render/scene-box.mjs +31 -0
  234. package/tools/gt-render/take-transform.mjs +87 -0
  235. package/tools/morphgs/assets/gen_truth.py +39 -0
  236. package/tools/morphgs/assets/mesh_ori_rig.txt +27 -0
  237. package/tools/morphgs/assets/playback-check.mjs +30 -0
  238. package/tools/morphgs/demo-gate.sh +26 -0
  239. package/tools/morphgs/fbx2morphgs.mjs +68 -0
  240. package/tools/morphgs/morphgs-to-cskel27.mjs +105 -0
  241. package/tools/morphgs/patches/preprocess_src-none-mode.patch +76 -0
  242. package/tools/morphgs/setup-on-cluster.sh +126 -0
  243. package/tools/qa/css-rule-usage.mjs +283 -0
  244. package/tools/qa/studio-control-count.mjs +70 -32
  245. package/tools/run-tests.mjs +134 -12
  246. package/tools/track/DESIGN.md +513 -0
  247. package/tools/track/backfill-provenance.mjs +116 -0
  248. package/tools/track/budget.mjs +8 -0
  249. package/tools/track/check-rig.mjs +209 -0
  250. package/tools/track/diagnostics.schema.json +60 -0
  251. package/tools/track/export-rig.mjs +256 -0
  252. package/tools/track/fallback.mjs +7 -0
  253. package/tools/track/fk-parity-fixture.mjs +161 -0
  254. package/tools/track/gate.mjs +349 -0
  255. package/tools/track/masks.mjs +318 -0
  256. package/tools/track/metrics.mjs +201 -0
  257. package/tools/track/publish-obs.mjs +108 -0
  258. package/tools/track/py/check_env.py +61 -0
  259. package/tools/track/py/eval_lr.py +229 -0
  260. package/tools/track/py/lr_viterbi.py +294 -0
  261. package/tools/track/py/masks.py +405 -0
  262. package/tools/track/py/objective.py +382 -0
  263. package/tools/track/py/rig.py +508 -0
  264. package/tools/track/py/scene.py +326 -0
  265. package/tools/track/py/test_joint_indices.py +123 -0
  266. package/tools/track/py/test_lr_viterbi.py +195 -0
  267. package/tools/track/py/test_masks.py +229 -0
  268. package/tools/track/py/test_rig.py +288 -0
  269. package/tools/track/py/test_scene.py +354 -0
  270. package/tools/track/py/test_track.py +328 -0
  271. package/tools/track/py/track.py +411 -0
  272. package/tools/track/remote.mjs +140 -0
  273. package/tools/track/rig-dump.mjs +227 -0
  274. package/tools/track/run-box-tests.mjs +14 -0
  275. package/tools/track/run-box.mjs +168 -0
  276. package/tools/track/setup-box.sh +59 -0
  277. package/tools/track/study-2d.mjs +728 -0
  278. package/dist/assets/analytics-B1hnH66c.js +0 -1
  279. package/dist/assets/app-BWusbqgO.js +0 -4861
  280. package/dist/assets/app-qKDo4PBX.css +0 -1
  281. package/dist/assets/shot-prompt-CHUtw6af.js +0 -17
  282. package/dist/assets/shot-prompt-C_g2BHVc.css +0 -1
  283. package/dist/assets/workflow-CVwzMhz2.js +0 -179
  284. package/dist/assets/workflow-DsudxKHF.css +0 -1
  285. package/src/fal-motion-studio.jsx +0 -180
  286. package/src/scene-history.js +0 -129
@@ -0,0 +1,1199 @@
1
+ /* v2 Sequencer
2
+ *
3
+ * The timeline still carries the interaction class names used by the editor,
4
+ * but every visual rule is rooted at .v2-sequencer. The legacy global sheet
5
+ * can therefore keep shipping beside this region without changing its surface.
6
+ */
7
+
8
+ .v2-sequencer {
9
+ --tl-header-height: 36px;
10
+ --tl-ruler-height: 24px;
11
+ --tl-track-row-height: 38px;
12
+ --tl-track-group-height: 114px;
13
+ --tl-track-tree-width: 190px;
14
+ --tl-clip-inset: 7px;
15
+ --tl-divider-width: 1px;
16
+ --tl-playhead-width: 1px;
17
+ --tl-playhead-head-width: 5px;
18
+ --tl-playhead-head-height: 6px;
19
+ --tl-key-size: 8px;
20
+ --tl-pin-height: 6px;
21
+ --tl-preview-height: 2px;
22
+ --tl-control-gap: 2px;
23
+ --tl-font-ui: 12px;
24
+ --tl-font-secondary: 11px;
25
+ --tl-font-label: 11.5px;
26
+ --tl-font-title: 15px;
27
+ --tl-font-mono: 12px;
28
+ --tl-hint-width: 240px;
29
+ --tl-round: 50%;
30
+ --tl-transparent: transparent;
31
+ --tl-body-clip: var(--clip-body);
32
+ --tl-body-clip-selected: var(--clip-body-selected);
33
+ --tl-prompt-clip: var(--clip-prompt);
34
+ --tl-prompt-clip-text: var(--clip-prompt-text);
35
+ --tl-camera-clip: var(--clip-camera);
36
+ --tl-camera-rail: var(--clip-camera-alt);
37
+ --tl-chip-folder: var(--chip-folder);
38
+ --tl-chip-mesh: var(--chip-mesh);
39
+ --tl-chip-cast: var(--chip-cast);
40
+ --tl-chip-camera: var(--chip-camera);
41
+ --tl-chip-light: var(--chip-light);
42
+ --tl-chip-motion: var(--chip-motion);
43
+ --tl-focus: rgba(232, 163, 61, .72);
44
+ --tl-pin: rgba(232, 163, 61, .35);
45
+ --tl-overlay: rgba(12, 12, 13, .78);
46
+ box-sizing: border-box;
47
+ flex: none;
48
+ height: var(--timeline-height, 330px);
49
+ min-height: var(--tl-min-height, 190px);
50
+ display: flex;
51
+ flex-direction: column;
52
+ position: relative;
53
+ z-index: 6;
54
+ background: var(--surface-0, #070708);
55
+ border-top: var(--tl-divider-width, 1px) solid var(--row-divider, #1d1d20);
56
+ box-shadow: none;
57
+ color: var(--text-1, #e4e4e7);
58
+ font-family: var(--sans, 'IBM Plex Sans'), sans-serif;
59
+ font-size: var(--tl-font-ui, 12px);
60
+ -webkit-font-smoothing: antialiased;
61
+ }
62
+
63
+ .v2-sequencer *,
64
+ .v2-sequencer *::before,
65
+ .v2-sequencer *::after {
66
+ box-sizing: border-box;
67
+ }
68
+
69
+ .v2-sequencer.collapsed {
70
+ height: var(--tl-collapsed-height, 34px);
71
+ min-height: var(--tl-collapsed-height, 34px);
72
+ }
73
+
74
+ /* One 36px row when it fits; on narrow windows (1280 wide leaves the
75
+ * Sequencer ~660px) the header wraps onto more rows instead of clipping its
76
+ * right-hand controls, so every control stays visible and clickable. */
77
+ .v2-sequencer .tl-head {
78
+ position: relative;
79
+ flex: none;
80
+ height: auto;
81
+ min-height: var(--tl-header-height, 36px);
82
+ display: flex;
83
+ flex-wrap: wrap;
84
+ align-items: center;
85
+ gap: var(--tl-head-row-gap, 4px) var(--sp-1, 8px);
86
+ padding: var(--tl-head-pad-y, 3px) calc(var(--sp-2, 12px) + var(--h-control, 28px) + var(--sp-1, 8px)) var(--tl-head-pad-y, 3px) var(--sp-2, 12px);
87
+ background: var(--surface-bar, #121214);
88
+ border-bottom: var(--tl-divider-width, 1px) solid var(--row-divider, #1d1d20);
89
+ color: var(--text-1, #e4e4e7);
90
+ white-space: nowrap;
91
+ }
92
+
93
+ .v2-sequencer .tl-title {
94
+ flex: none;
95
+ font-size: var(--tl-font-title, 15px);
96
+ font-weight: 600;
97
+ line-height: 1;
98
+ color: var(--text-1, #e4e4e7);
99
+ }
100
+
101
+ .v2-sequencer .tl-transport {
102
+ flex: none;
103
+ display: inline-flex;
104
+ align-items: center;
105
+ gap: var(--tl-control-gap, 2px);
106
+ }
107
+
108
+ .v2-sequencer .tl-btn {
109
+ width: var(--tl-transport-width, 26px);
110
+ height: var(--h-row, 24px);
111
+ min-height: var(--h-row, 24px);
112
+ padding: 0;
113
+ display: inline-flex;
114
+ align-items: center;
115
+ justify-content: center;
116
+ border: 0;
117
+ border-radius: var(--r-1, 4px);
118
+ background: var(--surface-raised, #1e1e21);
119
+ color: var(--text-2, #9b9ba1);
120
+ font-family: var(--sans, 'IBM Plex Sans'), sans-serif;
121
+ font-size: var(--tl-font-ui, 12px);
122
+ font-weight: 500;
123
+ line-height: 1;
124
+ cursor: pointer;
125
+ transition: background var(--fast, .14s) ease, color var(--fast, .14s) ease;
126
+ }
127
+
128
+ .v2-sequencer .tl-btn:hover:not(:disabled),
129
+ .v2-sequencer .tl-btn:focus-visible {
130
+ background: var(--surface-active, #26262a);
131
+ color: var(--text-1, #e4e4e7);
132
+ }
133
+
134
+ .v2-sequencer .tl-btn:focus-visible,
135
+ .v2-sequencer .tl-seq-action:focus-visible,
136
+ .v2-sequencer .tl-track-add:focus-visible,
137
+ .v2-sequencer .tl-pin-band:focus-visible,
138
+ .v2-sequencer .tl-shot-block:focus-visible,
139
+ .v2-sequencer .tl-crane-knob:focus-visible {
140
+ outline: var(--tl-divider-width, 1px) solid var(--select, #e8a33d);
141
+ outline-offset: var(--tl-divider-width, 1px);
142
+ }
143
+
144
+ .v2-sequencer .tl-btn:disabled,
145
+ .v2-sequencer .tl-seq-action:disabled,
146
+ .v2-sequencer .tl-track-add:disabled {
147
+ opacity: .45;
148
+ cursor: not-allowed;
149
+ }
150
+
151
+ .v2-sequencer .tl-btn.play,
152
+ .v2-sequencer .tl-btn.play:hover:not(:disabled) {
153
+ background: var(--surface-active, #26262a);
154
+ color: var(--text-1, #e4e4e7);
155
+ }
156
+
157
+ .v2-sequencer .tl-readout {
158
+ flex: none;
159
+ margin: 0;
160
+ padding: 0;
161
+ display: inline-flex;
162
+ align-items: baseline;
163
+ gap: var(--tl-control-gap, 2px);
164
+ border: 0;
165
+ background: var(--tl-transparent, transparent);
166
+ color: var(--text-3, #636369);
167
+ font-family: var(--mono, 'JetBrains Mono'), monospace;
168
+ font-size: var(--tl-font-mono, 12px);
169
+ font-weight: 400;
170
+ font-variant-numeric: tabular-nums;
171
+ letter-spacing: 0;
172
+ white-space: nowrap;
173
+ }
174
+
175
+ .v2-sequencer .tl-readout b {
176
+ color: var(--select, #e8a33d);
177
+ font-weight: 500;
178
+ }
179
+
180
+ .v2-sequencer .tl-sequencer-actions {
181
+ margin-left: auto;
182
+ flex: none;
183
+ display: inline-flex;
184
+ align-items: center;
185
+ gap: var(--tl-control-gap, 2px);
186
+ }
187
+
188
+ .v2-sequencer .tl-seq-action {
189
+ height: var(--h-row, 24px);
190
+ min-height: var(--h-row, 24px);
191
+ padding: 0 var(--sp-1, 8px);
192
+ border: 0;
193
+ border-radius: var(--r-1, 4px);
194
+ background: var(--surface-raised, #1e1e21);
195
+ color: var(--text-row, #c9c9ce);
196
+ font-family: var(--sans, 'IBM Plex Sans'), sans-serif;
197
+ font-size: var(--tl-font-secondary, 11px);
198
+ font-weight: 500;
199
+ line-height: 1;
200
+ white-space: nowrap;
201
+ cursor: pointer;
202
+ }
203
+
204
+ .v2-sequencer .tl-seq-action:hover:not(:disabled),
205
+ .v2-sequencer .tl-seq-action:focus-visible {
206
+ background: var(--surface-active, #26262a);
207
+ color: var(--text-1, #e4e4e7);
208
+ }
209
+
210
+ .v2-sequencer .tl-seq-action.cut {
211
+ color: var(--select, #e8a33d);
212
+ }
213
+
214
+ .v2-sequencer .tl-seq-action.rail {
215
+ color: var(--camera, #a78bfa);
216
+ }
217
+
218
+ .v2-sequencer .tl-head-group {
219
+ flex: none;
220
+ display: inline-flex;
221
+ align-items: center;
222
+ gap: var(--tl-control-gap, 2px);
223
+ padding: 0;
224
+ border: 0;
225
+ border-radius: var(--r-1, 4px);
226
+ background: var(--tl-transparent, transparent);
227
+ }
228
+
229
+ .v2-sequencer .tl-view-tools .tl-btn.zoom,
230
+ .v2-sequencer .tl-view-tools .tl-btn.wp {
231
+ width: auto;
232
+ min-width: var(--h-control, 28px);
233
+ padding: 0 var(--sp-1, 8px);
234
+ font-size: var(--tl-font-secondary, 11px);
235
+ }
236
+
237
+ .v2-sequencer .tl-btn.wp.on {
238
+ background: var(--select-tint, rgba(232, 163, 61, .14));
239
+ color: var(--select, #e8a33d);
240
+ }
241
+
242
+ .v2-sequencer .tl-pose-tools {
243
+ color: var(--text-2, #9b9ba1);
244
+ }
245
+
246
+ .v2-sequencer .tl-pose-hint,
247
+ .v2-sequencer .tl-wp-hint {
248
+ max-width: var(--tl-hint-width, 240px);
249
+ overflow: hidden;
250
+ text-overflow: ellipsis;
251
+ color: var(--text-3, #636369);
252
+ font-size: var(--tl-font-secondary, 11px);
253
+ white-space: nowrap;
254
+ }
255
+
256
+ .v2-sequencer .tl-btn.ik,
257
+ .v2-sequencer .tl-btn.clear {
258
+ width: auto;
259
+ min-width: var(--h-control, 28px);
260
+ padding: 0 var(--sp-1, 8px);
261
+ color: var(--text-row, #c9c9ce);
262
+ white-space: nowrap;
263
+ }
264
+
265
+ .v2-sequencer .tl-btn.ik.on,
266
+ .v2-sequencer .tl-btn.ik.snap.on,
267
+ .v2-sequencer .tl-btn.ik.contact.on {
268
+ background: var(--select-tint, rgba(232, 163, 61, .14));
269
+ color: var(--select, #e8a33d);
270
+ }
271
+
272
+ .v2-sequencer .tl-motion-tools {
273
+ min-width: 0;
274
+ }
275
+
276
+ .v2-sequencer .tl-motion-speed-editor {
277
+ min-width: 0;
278
+ height: var(--h-control, 28px);
279
+ padding: 0 var(--sp-1, 8px);
280
+ display: inline-flex;
281
+ align-items: center;
282
+ gap: var(--tl-control-gap, 2px);
283
+ border: 0;
284
+ border-radius: var(--r-1, 4px);
285
+ background: var(--surface-field, #0f0f11);
286
+ color: var(--text-2, #9b9ba1);
287
+ font-size: var(--tl-font-secondary, 11px);
288
+ }
289
+
290
+ .v2-sequencer .tl-motion-speed-editor input[type="range"] {
291
+ width: var(--tl-speed-width, 90px);
292
+ accent-color: var(--ok, #4fbf7a);
293
+ }
294
+
295
+ .v2-sequencer .tl-motion-speed-editor input[type="number"] {
296
+ width: var(--tl-speed-number-width, 44px);
297
+ height: var(--h-row, 24px);
298
+ padding: 0 var(--tl-control-gap, 2px);
299
+ border: 0;
300
+ border-radius: var(--r-1, 4px);
301
+ background: var(--field-deep, #0c0c0d);
302
+ color: var(--text-1, #e4e4e7);
303
+ font: inherit;
304
+ font-family: var(--mono, 'JetBrains Mono'), monospace;
305
+ font-variant-numeric: tabular-nums;
306
+ }
307
+
308
+ .v2-sequencer .tl-motion-speed-editor input:focus-visible {
309
+ outline: var(--tl-divider-width, 1px) solid var(--select, #e8a33d);
310
+ outline-offset: var(--tl-divider-width, 1px);
311
+ }
312
+
313
+ .v2-sequencer .tl-motion-speed-editor small {
314
+ color: var(--ok, #4fbf7a);
315
+ }
316
+
317
+ .v2-sequencer .tl-toggle {
318
+ /* Pinned to the first row's right edge, clear of the wrapping controls. */
319
+ position: absolute;
320
+ top: calc((var(--tl-header-height, 36px) - var(--tl-divider-width, 1px) - var(--h-row, 24px)) / 2);
321
+ right: var(--sp-2, 12px);
322
+ flex: none;
323
+ margin-left: 0;
324
+ width: var(--h-control, 28px);
325
+ height: var(--h-row, 24px);
326
+ padding: 0;
327
+ border: 0;
328
+ border-radius: var(--r-1, 4px);
329
+ background: var(--tl-transparent, transparent);
330
+ color: var(--text-3, #636369);
331
+ font-size: var(--tl-font-ui, 12px);
332
+ cursor: pointer;
333
+ }
334
+
335
+ .v2-sequencer .tl-toggle:hover,
336
+ .v2-sequencer .tl-toggle:focus-visible {
337
+ background: var(--surface-raised, #1e1e21);
338
+ color: var(--text-1, #e4e4e7);
339
+ }
340
+
341
+ .v2-sequencer .tl-camera-editor {
342
+ flex: none;
343
+ min-height: var(--h-control, 28px);
344
+ max-height: var(--h-control, 28px);
345
+ padding: 0 var(--sp-2, 12px);
346
+ display: flex;
347
+ align-items: center;
348
+ gap: var(--sp-1, 8px);
349
+ border-bottom: var(--tl-divider-width, 1px) solid var(--row-divider, #1d1d20);
350
+ background: var(--surface-panel, #151517);
351
+ color: var(--text-2, #9b9ba1);
352
+ font-size: var(--tl-font-secondary, 11px);
353
+ overflow-x: auto;
354
+ overflow-y: hidden;
355
+ white-space: nowrap;
356
+ }
357
+
358
+ .v2-sequencer .tl-camera-editor-title {
359
+ max-width: var(--tl-camera-title-width, 148px);
360
+ color: var(--camera, #a78bfa);
361
+ font-size: var(--tl-font-secondary, 11px);
362
+ }
363
+
364
+ .v2-sequencer .tl-camera-head,
365
+ .v2-sequencer .tl-camera-tool {
366
+ height: var(--h-row, 24px);
367
+ padding: 0 var(--sp-1, 8px);
368
+ border: 0;
369
+ border-radius: var(--r-1, 4px);
370
+ background: var(--surface-raised, #1e1e21);
371
+ color: var(--text-row, #c9c9ce);
372
+ font: inherit;
373
+ font-size: var(--tl-font-secondary, 11px);
374
+ cursor: pointer;
375
+ }
376
+
377
+ .v2-sequencer .tl-camera-head:hover,
378
+ .v2-sequencer .tl-camera-tool:hover,
379
+ .v2-sequencer .tl-camera-head:focus-visible,
380
+ .v2-sequencer .tl-camera-tool:focus-visible {
381
+ background: var(--surface-active, #26262a);
382
+ color: var(--text-1, #e4e4e7);
383
+ }
384
+
385
+ .v2-sequencer .tl-camera-head.active,
386
+ .v2-sequencer .tl-camera-tool.active {
387
+ background: var(--primary, #7258a0);
388
+ color: var(--text-1, #e4e4e7);
389
+ }
390
+
391
+ .v2-sequencer .tl-camera-tool.danger {
392
+ color: var(--danger, #e5484d);
393
+ }
394
+
395
+ .v2-sequencer .tl-camera-editor input,
396
+ .v2-sequencer .tl-camera-metric {
397
+ width: var(--tl-camera-field-width, 50px);
398
+ height: var(--h-row, 24px);
399
+ padding: 0 var(--tl-control-gap, 2px);
400
+ border: 0;
401
+ border-radius: var(--r-1, 4px);
402
+ background: var(--field-deep, #0c0c0d);
403
+ color: var(--text-1, #e4e4e7);
404
+ font: inherit;
405
+ font-family: var(--mono, 'JetBrains Mono'), monospace;
406
+ font-variant-numeric: tabular-nums;
407
+ }
408
+
409
+ .v2-sequencer .tl-camera-editor input:focus-visible {
410
+ outline: var(--tl-divider-width, 1px) solid var(--camera, #a78bfa);
411
+ outline-offset: var(--tl-divider-width, 1px);
412
+ }
413
+
414
+ .v2-sequencer .tl-camera-slate,
415
+ .v2-sequencer .tl-camera-count {
416
+ color: var(--text-3, #636369);
417
+ }
418
+
419
+ .v2-sequencer .tl-body {
420
+ position: relative;
421
+ flex: 1;
422
+ min-height: 0;
423
+ --tl-label-w: var(--tl-track-tree-width, 190px);
424
+ overflow-x: auto;
425
+ overflow-y: auto;
426
+ background: var(--surface-0, #070708);
427
+ }
428
+
429
+ .v2-sequencer .tl-surface {
430
+ position: relative;
431
+ width: calc(var(--tl-label-w) + (100% - var(--tl-label-w)) * var(--tl-zoom));
432
+ min-width: var(--tl-surface-min-width, 520px);
433
+ min-height: 0;
434
+ height: 100%;
435
+ display: grid;
436
+ grid-template-rows:
437
+ var(--tl-ruler-height, 24px)
438
+ var(--tl-track-row-height, 38px)
439
+ var(--tl-track-group-height, 114px)
440
+ var(--tl-track-row-height, 38px)
441
+ var(--tl-track-group-height, 114px);
442
+ border-radius: var(--r-2, 6px);
443
+ background: var(--surface-bar, #121214);
444
+ overflow: hidden;
445
+ }
446
+
447
+ .v2-sequencer .tl-surface.empty-shots {
448
+ grid-template-rows:
449
+ var(--tl-ruler-height, 24px)
450
+ var(--tl-track-row-height, 38px)
451
+ var(--tl-track-group-height, 114px)
452
+ var(--tl-track-row-height, 38px)
453
+ var(--tl-track-group-height, 114px);
454
+ }
455
+
456
+ .v2-sequencer .tl-ruler {
457
+ min-height: var(--tl-ruler-height, 24px);
458
+ display: grid;
459
+ grid-template-columns: var(--tl-label-w) 1fr;
460
+ background: var(--surface-panel, #151517);
461
+ border-bottom: var(--tl-divider-width, 1px) solid var(--row-divider, #1d1d20);
462
+ }
463
+
464
+ .v2-sequencer .tl-ruler-label {
465
+ min-width: 0;
466
+ padding: 0 var(--sp-2, 12px);
467
+ display: flex;
468
+ align-items: center;
469
+ border-right: var(--tl-divider-width, 1px) solid var(--row-divider, #1d1d20);
470
+ background: var(--surface-panel, #151517);
471
+ color: var(--text-3, #636369);
472
+ font-family: var(--mono, 'JetBrains Mono'), monospace;
473
+ font-size: var(--tl-font-secondary, 11px);
474
+ font-variant-numeric: tabular-nums;
475
+ letter-spacing: .04em;
476
+ text-transform: uppercase;
477
+ position: sticky;
478
+ left: 0;
479
+ z-index: 6;
480
+ }
481
+
482
+ .v2-sequencer .tl-ruler-lane {
483
+ position: relative;
484
+ cursor: ew-resize;
485
+ touch-action: none;
486
+ user-select: none;
487
+ }
488
+
489
+ .v2-sequencer .tl-frame-box {
490
+ top: var(--tl-control-gap, 2px);
491
+ height: var(--h-row, 24px);
492
+ min-width: var(--tl-frame-box-width, 42px);
493
+ padding: 0 var(--tl-control-gap, 2px);
494
+ display: flex;
495
+ align-items: center;
496
+ justify-content: center;
497
+ border: 0;
498
+ border-radius: var(--r-1, 4px);
499
+ background: var(--select, #e8a33d);
500
+ color: var(--on-select, #1a1204);
501
+ font-family: var(--mono, 'JetBrains Mono'), monospace;
502
+ font-size: var(--tl-font-secondary, 11px);
503
+ font-weight: 500;
504
+ font-variant-numeric: tabular-nums;
505
+ box-shadow: none;
506
+ }
507
+
508
+ .v2-sequencer .tl-tick {
509
+ bottom: 0;
510
+ color: var(--text-off, #4f4f55);
511
+ font-family: var(--mono, 'JetBrains Mono'), monospace;
512
+ font-size: var(--tl-font-secondary, 11px);
513
+ font-variant-numeric: tabular-nums;
514
+ }
515
+
516
+ .v2-sequencer .tl-tick i {
517
+ width: var(--tl-divider-width, 1px);
518
+ height: var(--tl-tick-height, 5px);
519
+ background: var(--row-divider, #1d1d20);
520
+ }
521
+
522
+ .v2-sequencer .tl-track {
523
+ min-height: var(--tl-track-row-height, 38px);
524
+ display: grid;
525
+ grid-template-columns: var(--tl-label-w) 1fr;
526
+ border-bottom: var(--tl-divider-width, 1px) solid var(--row-divider, #1d1d20);
527
+ }
528
+
529
+ .v2-sequencer .tl-track.prompts,
530
+ .v2-sequencer .tl-track:not(.ik):not(.shots):not(.objmo) {
531
+ height: var(--tl-track-row-height, 38px);
532
+ }
533
+
534
+ .v2-sequencer .tl-track.ik,
535
+ .v2-sequencer .tl-track.shots {
536
+ height: var(--tl-track-group-height, 114px);
537
+ min-height: var(--tl-track-group-height, 114px);
538
+ }
539
+
540
+ .v2-sequencer .tl-track-label {
541
+ min-width: 0;
542
+ height: 100%;
543
+ padding: 0;
544
+ display: flex;
545
+ align-items: stretch;
546
+ gap: 0;
547
+ border-right: var(--tl-divider-width, 1px) solid var(--row-divider, #1d1d20);
548
+ background: var(--surface-panel, #151517);
549
+ color: var(--text-row, #c9c9ce);
550
+ position: sticky;
551
+ left: 0;
552
+ z-index: 5;
553
+ }
554
+
555
+ .v2-sequencer .tl-track-label-stack {
556
+ width: 100%;
557
+ height: 100%;
558
+ display: grid;
559
+ grid-template-rows: repeat(3, var(--tl-track-row-height, 38px));
560
+ }
561
+
562
+ .v2-sequencer .tl-track-subrow {
563
+ min-width: 0;
564
+ height: var(--tl-track-row-height, 38px);
565
+ padding: 0 var(--sp-2, 12px);
566
+ display: flex;
567
+ align-items: center;
568
+ gap: var(--sp-1, 8px);
569
+ position: relative;
570
+ }
571
+
572
+ .v2-sequencer .tl-track-subrow.indent {
573
+ padding-left: var(--sp-3, 16px);
574
+ }
575
+
576
+ .v2-sequencer .tl-track-chip {
577
+ min-width: 0;
578
+ flex: 0 1 auto;
579
+ height: var(--tl-chip-height, 16px);
580
+ display: inline-flex;
581
+ align-items: center;
582
+ gap: 6px;
583
+ overflow: hidden;
584
+ color: var(--text-row, #c9c9ce);
585
+ font-size: var(--tl-font-secondary, 11px);
586
+ font-weight: 500;
587
+ white-space: nowrap;
588
+ text-overflow: ellipsis;
589
+ --tl-chip-dot: var(--text-3, #636369);
590
+ }
591
+
592
+ /* v2 track tree: a 6 px colour chip before the name, never a filled label. */
593
+ .v2-sequencer .tl-track-chip::before {
594
+ content: "";
595
+ flex: none;
596
+ width: 6px;
597
+ height: 6px;
598
+ border-radius: 2px;
599
+ background: var(--tl-chip-dot);
600
+ }
601
+
602
+ .v2-sequencer .tl-track-chip.prompt,
603
+ .v2-sequencer .tl-track-chip.body { --tl-chip-dot: var(--tl-chip-motion, #6f93d6); }
604
+
605
+ .v2-sequencer .tl-track-chip.pins,
606
+ .v2-sequencer .tl-track-chip.ik { --tl-chip-dot: var(--select, #e8a33d); }
607
+
608
+ .v2-sequencer .tl-track-chip.camera,
609
+ .v2-sequencer .tl-track-chip.rail,
610
+ .v2-sequencer .tl-track-chip.crane { --tl-chip-dot: var(--camera, #a78bfa); }
611
+
612
+ .v2-sequencer .tl-track-chip.root { --tl-chip-dot: var(--tl-chip-cast, #5fb584); }
613
+
614
+ .v2-sequencer .tl-track-owner,
615
+ .v2-sequencer .tl-path-speed {
616
+ position: absolute;
617
+ right: var(--sp-1, 8px);
618
+ color: var(--text-3, #636369);
619
+ font-family: var(--mono, 'JetBrains Mono'), monospace;
620
+ font-size: var(--tl-font-secondary, 11px);
621
+ font-style: normal;
622
+ font-variant-numeric: tabular-nums;
623
+ }
624
+
625
+ .v2-sequencer .tl-path-speed {
626
+ bottom: var(--tl-control-gap, 2px);
627
+ }
628
+
629
+ .v2-sequencer .tl-track-add {
630
+ position: absolute;
631
+ top: var(--tl-control-gap, 2px);
632
+ right: var(--sp-1, 8px);
633
+ width: var(--h-row, 24px);
634
+ height: var(--h-row, 24px);
635
+ min-height: var(--h-row, 24px);
636
+ padding: 0;
637
+ border: 0;
638
+ border-radius: var(--r-1, 4px);
639
+ background: var(--surface-raised, #1e1e21);
640
+ color: var(--text-2, #9b9ba1);
641
+ font-size: var(--tl-font-ui, 12px);
642
+ cursor: pointer;
643
+ }
644
+
645
+ .v2-sequencer .tl-track-add:hover:not(:disabled) {
646
+ background: var(--surface-active, #26262a);
647
+ color: var(--text-1, #e4e4e7);
648
+ }
649
+
650
+ .v2-sequencer .tl-track-add.cut {
651
+ width: auto;
652
+ min-width: var(--tl-add-shot-width, 76px);
653
+ padding: 0 var(--sp-1, 8px);
654
+ font-size: var(--tl-font-secondary, 11px);
655
+ }
656
+
657
+ .v2-sequencer .tl-track-add.motion-cut {
658
+ color: var(--select, #e8a33d);
659
+ }
660
+
661
+ .v2-sequencer .tl-track-add.ik {
662
+ color: var(--select, #e8a33d);
663
+ }
664
+
665
+ .v2-sequencer .tl-lane {
666
+ position: relative;
667
+ background: var(--surface-bar, #121214);
668
+ }
669
+
670
+ .v2-sequencer .tl-lane:hover {
671
+ background: var(--surface-raised, #1e1e21);
672
+ }
673
+
674
+ .v2-sequencer .tl-lane.root {
675
+ cursor: crosshair;
676
+ }
677
+
678
+ .v2-sequencer .tl-grid {
679
+ top: 0;
680
+ bottom: 0;
681
+ left: calc(var(--tl-f) * 100%);
682
+ width: var(--tl-divider-width, 1px);
683
+ background: var(--row-divider, #1d1d20);
684
+ pointer-events: none;
685
+ }
686
+
687
+ .v2-sequencer .tl-motion-clip {
688
+ top: var(--tl-clip-inset, 7px);
689
+ height: calc(var(--tl-track-row-height, 38px) - (var(--tl-clip-inset, 7px) * 2));
690
+ transform: none;
691
+ left: calc(var(--tl-f-start) * 100% + var(--tl-clip-inset, 7px));
692
+ width: max(var(--tl-min-clip-width, 1px), calc((var(--tl-f-end) - var(--tl-f-start)) * 100% - (var(--tl-clip-inset, 7px) * 2)));
693
+ padding: 0 var(--sp-1, 8px);
694
+ border: 0;
695
+ border-radius: var(--r-1, 4px);
696
+ background: var(--tl-body-clip, #23402f);
697
+ color: var(--text-row, #c9c9ce);
698
+ font-size: var(--tl-font-secondary, 11px);
699
+ font-weight: 500;
700
+ box-shadow: none;
701
+ }
702
+
703
+ .v2-sequencer .tl-motion-clip.selected {
704
+ background: var(--tl-body-clip-selected, #2e5a3f);
705
+ border: 0;
706
+ box-shadow: inset 0 0 0 var(--tl-divider-width, 1px) var(--ok, #4fbf7a);
707
+ }
708
+
709
+ .v2-sequencer .tl-motion-clip.trimming,
710
+ .v2-sequencer .tl-motion-clip.retiming {
711
+ background: var(--tl-body-clip-selected, #2e5a3f);
712
+ border: 0;
713
+ box-shadow: inset 0 0 0 var(--tl-divider-width, 1px) var(--select, #e8a33d);
714
+ }
715
+
716
+ .v2-sequencer .tl-motion-clip-label {
717
+ min-width: 0;
718
+ font-family: var(--mono, 'JetBrains Mono'), monospace;
719
+ font-size: var(--tl-font-secondary, 11px);
720
+ font-variant-numeric: tabular-nums;
721
+ }
722
+
723
+ .v2-sequencer .tl-motion-clip-handle {
724
+ width: var(--tl-handle-width, 6px);
725
+ border: 0;
726
+ border-radius: var(--r-1, 4px);
727
+ background: var(--ok, #4fbf7a);
728
+ }
729
+
730
+ .v2-sequencer .tl-motion-clip-handle:hover {
731
+ background: var(--text-1, #e4e4e7);
732
+ }
733
+
734
+ .v2-sequencer .tl-motion-clip-handle.speed,
735
+ .v2-sequencer .tl-motion-clip-handle.speed:hover {
736
+ background: var(--select, #e8a33d);
737
+ }
738
+
739
+ .v2-sequencer .tl-chip {
740
+ top: var(--tl-clip-inset, 7px);
741
+ height: calc(var(--tl-track-row-height, 38px) - (var(--tl-clip-inset, 7px) * 2));
742
+ transform: none;
743
+ left: calc(var(--tl-f-start) * 100% + var(--tl-clip-inset, 7px));
744
+ width: max(var(--tl-min-clip-width, 1px), calc((var(--tl-f-end) - var(--tl-f-start)) * 100% - (var(--tl-clip-inset, 7px) * 2)));
745
+ padding: 0 var(--sp-1, 8px);
746
+ border: 0;
747
+ border-radius: var(--r-1, 4px);
748
+ background: var(--tl-prompt-clip, #233149);
749
+ color: var(--tl-prompt-clip-text, #b9c9ea);
750
+ font-size: var(--tl-font-secondary, 11px);
751
+ font-weight: 500;
752
+ box-shadow: none;
753
+ }
754
+
755
+ .v2-sequencer .tl-chip.selected {
756
+ background: var(--surface-active, #26262a);
757
+ outline: var(--tl-divider-width, 1px) solid var(--select, #e8a33d);
758
+ box-shadow: none;
759
+ }
760
+
761
+ .v2-sequencer .tl-chip-input {
762
+ padding: 0 var(--tl-control-gap, 2px);
763
+ color: inherit;
764
+ font: inherit;
765
+ }
766
+
767
+ .v2-sequencer .tl-chip-input::placeholder {
768
+ color: var(--text-2, #9b9ba1);
769
+ }
770
+
771
+ .v2-sequencer .tl-chip-handle {
772
+ width: var(--tl-handle-width, 6px);
773
+ background: var(--select, #e8a33d);
774
+ }
775
+
776
+ .v2-sequencer .tl-chip.ghost {
777
+ background: var(--field, #0f0f11);
778
+ color: var(--text-3, #636369);
779
+ box-shadow: none;
780
+ }
781
+
782
+ .v2-sequencer .tl-shot-block {
783
+ top: var(--tl-clip-inset, 7px);
784
+ bottom: var(--tl-clip-inset, 7px);
785
+ left: calc(var(--tl-f-start) * 100% + var(--tl-clip-inset, 7px));
786
+ width: max(var(--tl-min-clip-width, 1px), calc((var(--tl-f-end) - var(--tl-f-start)) * 100% - (var(--tl-clip-inset, 7px) * 2)));
787
+ padding: var(--sp-1, 8px) var(--sp-1, 8px) var(--tl-shot-footer-height, 28px);
788
+ border: 0;
789
+ border-radius: var(--r-1, 4px);
790
+ background: var(--tl-camera-clip, #3d3354);
791
+ color: var(--text-1, #e4e4e7);
792
+ font-size: var(--tl-font-secondary, 11px);
793
+ box-shadow: none;
794
+ }
795
+
796
+ .v2-sequencer .tl-shot-block.active,
797
+ .v2-sequencer .tl-shot-block.selected {
798
+ background: var(--tl-camera-rail, #302a40);
799
+ box-shadow: inset 0 0 0 var(--tl-divider-width, 1px) var(--camera, #a78bfa);
800
+ }
801
+
802
+ .v2-sequencer .tl-shot-block.has-dolly,
803
+ .v2-sequencer .tl-shot-block.has-dolly.active {
804
+ background: var(--tl-camera-rail, #302a40);
805
+ border: 0;
806
+ }
807
+
808
+ .v2-sequencer .tl-shot-block.moving {
809
+ opacity: .72;
810
+ box-shadow: inset 0 0 0 var(--tl-divider-width, 1px) var(--select, #e8a33d);
811
+ }
812
+
813
+ .v2-sequencer .tl-shot-label {
814
+ z-index: 5;
815
+ color: var(--text-1, #e4e4e7);
816
+ }
817
+
818
+ .v2-sequencer .tl-shot-label small,
819
+ .v2-sequencer .tl-shot-camera-summary > small {
820
+ background: var(--tl-camera-clip, #3d3354);
821
+ color: var(--text-2, #9b9ba1);
822
+ font-size: var(--tl-font-secondary, 11px);
823
+ }
824
+
825
+ .v2-sequencer .tl-shot-camera-summary > b,
826
+ .v2-sequencer .tl-camera-block-state {
827
+ color: var(--camera, #a78bfa);
828
+ font-size: var(--tl-font-secondary, 11px);
829
+ }
830
+
831
+ .v2-sequencer .tl-shot-key-surface {
832
+ left: var(--sp-1, 8px);
833
+ right: var(--sp-1, 8px);
834
+ bottom: 0;
835
+ height: var(--tl-key-strip-height, 12px);
836
+ border-top: var(--tl-divider-width, 1px) solid var(--camera, #a78bfa);
837
+ background: var(--tl-transparent, transparent);
838
+ cursor: crosshair;
839
+ }
840
+
841
+ .v2-sequencer .tl-shot-key-surface:hover {
842
+ background: var(--select-tint, rgba(232, 163, 61, .14));
843
+ }
844
+
845
+ .v2-sequencer .tl-shot-edge {
846
+ top: 0;
847
+ bottom: 0;
848
+ width: var(--tl-edge-width, 8px);
849
+ border: 0;
850
+ background: var(--tl-transparent, transparent);
851
+ color: var(--select, #e8a33d);
852
+ }
853
+
854
+ .v2-sequencer .tl-shot-edge:hover {
855
+ background: var(--select-tint, rgba(232, 163, 61, .14));
856
+ }
857
+
858
+ .v2-sequencer .tl-shot-actions {
859
+ background: var(--overlay, rgba(12, 12, 13, .78));
860
+ }
861
+
862
+ .v2-sequencer .tl-shot-actions button {
863
+ height: var(--h-row, 24px);
864
+ border-radius: var(--r-1, 4px);
865
+ background: var(--surface-raised, #1e1e21);
866
+ color: var(--text-row, #c9c9ce);
867
+ font-size: var(--tl-font-secondary, 11px);
868
+ }
869
+
870
+ .v2-sequencer .tl-shot-actions button:hover,
871
+ .v2-sequencer .tl-shot-actions button:focus-visible {
872
+ background: var(--surface-active, #26262a);
873
+ color: var(--text-1, #e4e4e7);
874
+ }
875
+
876
+ .v2-sequencer .tl-shot-name-input {
877
+ height: var(--h-row, 24px);
878
+ border: 0;
879
+ border-radius: var(--r-1, 4px);
880
+ background: var(--field-deep, #0c0c0d);
881
+ color: var(--text-1, #e4e4e7);
882
+ }
883
+
884
+ .v2-sequencer .tl-shot-empty {
885
+ padding: 0 var(--sp-2, 12px);
886
+ color: var(--text-3, #636369);
887
+ font-size: var(--tl-font-secondary, 11px);
888
+ }
889
+
890
+ .v2-sequencer .tl-marker,
891
+ .v2-sequencer .tl-ik-run-cap,
892
+ .v2-sequencer .tl-ik-run-at {
893
+ width: var(--tl-key-size, 8px);
894
+ height: var(--tl-key-size, 8px);
895
+ border: 0;
896
+ border-radius: var(--r-1, 4px);
897
+ box-shadow: none;
898
+ }
899
+
900
+ .v2-sequencer .tl-marker {
901
+ top: calc(var(--tl-track-row-height, 38px) / 2);
902
+ background: var(--camera, #a78bfa);
903
+ transform: translate(-50%, -50%) rotate(45deg);
904
+ pointer-events: auto;
905
+ }
906
+
907
+ .v2-sequencer .tl-marker.cam {
908
+ top: calc(var(--tl-track-row-height, 38px) / 2);
909
+ bottom: auto;
910
+ background: var(--camera, #a78bfa);
911
+ transform: translate(-50%, -50%) rotate(45deg);
912
+ z-index: 7;
913
+ }
914
+
915
+ .v2-sequencer .tl-marker.wp {
916
+ background: var(--ok, #4fbf7a);
917
+ }
918
+
919
+ .v2-sequencer .tl-marker.wp.pending {
920
+ background: var(--tl-transparent, transparent);
921
+ border: var(--tl-divider-width, 1px) solid var(--select, #e8a33d);
922
+ }
923
+
924
+ .v2-sequencer .tl-marker.ik {
925
+ top: calc((var(--tl-track-row-height, 38px) * 2) + (var(--tl-track-row-height, 38px) / 2));
926
+ background: var(--select, #e8a33d);
927
+ transform: translate(-50%, -50%) rotate(45deg);
928
+ }
929
+
930
+ .v2-sequencer .tl-marker:hover,
931
+ .v2-sequencer .tl-marker.current {
932
+ box-shadow: 0 0 0 var(--tl-divider-width, 1px) var(--select, #e8a33d);
933
+ }
934
+
935
+ .v2-sequencer .tl-ik-run {
936
+ top: calc((var(--tl-track-row-height, 38px) * 2) + (var(--tl-track-row-height, 38px) / 2));
937
+ height: var(--tl-divider-width, 1px);
938
+ border: 0;
939
+ border-radius: var(--r-1, 4px);
940
+ background: var(--select, #e8a33d);
941
+ box-shadow: none;
942
+ }
943
+
944
+ .v2-sequencer .tl-ik-run-cap,
945
+ .v2-sequencer .tl-ik-run-at {
946
+ background: var(--select, #e8a33d);
947
+ transform: translateY(-50%) rotate(45deg);
948
+ }
949
+
950
+ .v2-sequencer .tl-ik-run.current {
951
+ background: var(--select, #e8a33d);
952
+ box-shadow: 0 0 0 var(--tl-divider-width, 1px) var(--select, #e8a33d);
953
+ }
954
+
955
+ .v2-sequencer .tl-pin-band,
956
+ .v2-sequencer .tl-pin-pending {
957
+ position: absolute;
958
+ top: calc(var(--tl-track-row-height, 38px) + (var(--tl-track-row-height, 38px) / 2));
959
+ left: calc(var(--tl-f-start) * 100%);
960
+ width: max(var(--tl-min-pin-width, 1px), calc((var(--tl-f-end) - var(--tl-f-start)) * 100%));
961
+ height: var(--tl-pin-height, 6px);
962
+ padding: 0;
963
+ transform: translateY(-50%);
964
+ border: 0;
965
+ border-radius: var(--r-1, 4px);
966
+ background: var(--tl-pin, rgba(232, 163, 61, .35));
967
+ pointer-events: auto;
968
+ z-index: 4;
969
+ }
970
+
971
+ .v2-sequencer .tl-pin-band:hover,
972
+ .v2-sequencer .tl-pin-band.selected {
973
+ background: var(--select, #e8a33d);
974
+ }
975
+
976
+ .v2-sequencer .tl-pin-band-ramp,
977
+ .v2-sequencer .tl-pin-band-core {
978
+ position: absolute;
979
+ top: 0;
980
+ bottom: 0;
981
+ display: block;
982
+ background: inherit;
983
+ }
984
+
985
+ .v2-sequencer .tl-pin-band-core {
986
+ left: 0;
987
+ right: 0;
988
+ }
989
+
990
+ .v2-sequencer .tl-pin-band-ramp.start {
991
+ left: 0;
992
+ width: calc((var(--tl-pin-ramp-start) - var(--tl-f-start)) / max(.0001, var(--tl-f-end) - var(--tl-f-start)) * 100%);
993
+ opacity: .55;
994
+ }
995
+
996
+ .v2-sequencer .tl-pin-band-ramp.end {
997
+ right: 0;
998
+ width: calc((var(--tl-f-end) - var(--tl-pin-ramp-end)) / max(.0001, var(--tl-f-end) - var(--tl-f-start)) * 100%);
999
+ opacity: .55;
1000
+ }
1001
+
1002
+ .v2-sequencer .tl-preview-range {
1003
+ position: absolute;
1004
+ bottom: calc(var(--tl-track-group-height, 114px) - var(--tl-track-row-height, 38px));
1005
+ left: calc(var(--tl-f-start) * 100%);
1006
+ width: max(var(--tl-min-pin-width, 1px), calc((var(--tl-f-end) - var(--tl-f-start)) * 100%));
1007
+ height: var(--tl-preview-height, 2px);
1008
+ background: var(--select, #e8a33d);
1009
+ pointer-events: none;
1010
+ z-index: 5;
1011
+ }
1012
+
1013
+ .v2-sequencer .tl-playhead {
1014
+ top: 0;
1015
+ bottom: 0;
1016
+ left: calc(var(--tl-label-w) + (100% - var(--tl-label-w)) * var(--tl-f));
1017
+ width: var(--tl-playhead-width, 1px);
1018
+ background: var(--select, #e8a33d);
1019
+ box-shadow: none;
1020
+ pointer-events: none;
1021
+ z-index: 9;
1022
+ }
1023
+
1024
+ .v2-sequencer .tl-playhead::before {
1025
+ content: "";
1026
+ position: absolute;
1027
+ top: 0;
1028
+ left: 50%;
1029
+ width: 0;
1030
+ height: 0;
1031
+ transform: translateX(-50%);
1032
+ border-left: var(--tl-playhead-head-width, 5px) solid var(--tl-transparent, transparent);
1033
+ border-right: var(--tl-playhead-head-width, 5px) solid var(--tl-transparent, transparent);
1034
+ border-top: var(--tl-playhead-head-height, 6px) solid var(--select, #e8a33d);
1035
+ }
1036
+
1037
+ .v2-sequencer .tl-collapsed {
1038
+ height: 100%;
1039
+ padding: 0 var(--sp-2, 12px);
1040
+ display: flex;
1041
+ align-items: center;
1042
+ gap: var(--sp-1, 8px);
1043
+ background: var(--surface-bar, #121214);
1044
+ }
1045
+
1046
+ .v2-sequencer .tl-badge {
1047
+ flex: none;
1048
+ height: var(--h-row, 24px);
1049
+ display: inline-flex;
1050
+ align-items: center;
1051
+ padding: 0 var(--sp-1, 8px);
1052
+ border: 0;
1053
+ border-radius: var(--r-1, 4px);
1054
+ background: var(--select-tint, rgba(232, 163, 61, .14));
1055
+ color: var(--select, #e8a33d);
1056
+ font-family: var(--mono, 'JetBrains Mono'), monospace;
1057
+ font-size: var(--tl-font-secondary, 11px);
1058
+ }
1059
+
1060
+ .v2-sequencer .tl-track.objmo .tl-track-label,
1061
+ .v2-sequencer .tl-track.objmo .tl-lane {
1062
+ background: var(--surface-bar, #121214);
1063
+ color: var(--text-row, #c9c9ce);
1064
+ }
1065
+
1066
+ .v2-sequencer .tl-track.objmo .tl-track-label {
1067
+ align-items: center;
1068
+ padding: 0 var(--sp-2, 12px);
1069
+ }
1070
+
1071
+ .v2-sequencer .tl-track.objmo .tl-lane {
1072
+ min-height: var(--tl-track-row-height, 38px);
1073
+ }
1074
+
1075
+ .v2-sequencer .tl-camera-tool:disabled,
1076
+ .v2-sequencer .tl-camera-editor input:disabled {
1077
+ opacity: .45;
1078
+ cursor: not-allowed;
1079
+ }
1080
+
1081
+ .v2-sequencer .tl-crane-editor,
1082
+ .v2-sequencer .tl-crane-editor-svg {
1083
+ position: absolute;
1084
+ inset: 0;
1085
+ width: 100%;
1086
+ height: 100%;
1087
+ }
1088
+
1089
+ .v2-sequencer .tl-crane-editor-svg {
1090
+ cursor: crosshair;
1091
+ }
1092
+
1093
+ .v2-sequencer .tl-crane-grid,
1094
+ .v2-sequencer .tl-crane-time-pick {
1095
+ stroke: var(--camera, #a78bfa);
1096
+ stroke-width: var(--tl-divider-width, 1px);
1097
+ vector-effect: non-scaling-stroke;
1098
+ }
1099
+
1100
+ .v2-sequencer .tl-crane-grid {
1101
+ opacity: .35;
1102
+ }
1103
+
1104
+ .v2-sequencer .tl-crane-fill {
1105
+ fill: var(--select-tint, rgba(232, 163, 61, .14));
1106
+ }
1107
+
1108
+ .v2-sequencer .tl-crane-line {
1109
+ fill: var(--tl-transparent, transparent);
1110
+ stroke: var(--camera, #a78bfa);
1111
+ stroke-width: var(--tl-divider-width, 1px);
1112
+ vector-effect: non-scaling-stroke;
1113
+ }
1114
+
1115
+ .v2-sequencer .tl-crane-time-pick.selected {
1116
+ stroke: var(--select, #e8a33d);
1117
+ }
1118
+
1119
+ .v2-sequencer .tl-crane-knob {
1120
+ width: var(--tl-knob-size, 15px);
1121
+ height: var(--tl-knob-size, 15px);
1122
+ border: 0;
1123
+ border-radius: var(--tl-round, 50%);
1124
+ background: var(--camera, #a78bfa);
1125
+ box-shadow: none;
1126
+ }
1127
+
1128
+ .v2-sequencer .tl-crane-knob.selected {
1129
+ background: var(--select, #e8a33d);
1130
+ }
1131
+
1132
+ .v2-sequencer .sg-shot {
1133
+ left: var(--sp-1, 8px);
1134
+ right: var(--sp-1, 8px);
1135
+ top: var(--tl-rail-offset, 38px);
1136
+ bottom: var(--tl-control-gap, 2px);
1137
+ }
1138
+
1139
+ .v2-sequencer .sg-shot .sg-line,
1140
+ .v2-sequencer .sg-cam .sg-line {
1141
+ stroke: var(--camera, #a78bfa);
1142
+ }
1143
+
1144
+ .v2-sequencer .sg-shot .sg-body,
1145
+ .v2-sequencer .sg-cam .sg-body {
1146
+ background: var(--tl-transparent, transparent);
1147
+ border: 0;
1148
+ }
1149
+
1150
+ .v2-sequencer .sg-shot .sg-fill,
1151
+ .v2-sequencer .sg-cam .sg-fill {
1152
+ fill: var(--select-tint, rgba(232, 163, 61, .14));
1153
+ }
1154
+
1155
+ .v2-sequencer .sg-cut,
1156
+ .v2-sequencer .sg-cut-diamond {
1157
+ stroke: var(--select, #e8a33d);
1158
+ fill: var(--select, #e8a33d);
1159
+ }
1160
+
1161
+ .v2-sequencer .sg-playhead {
1162
+ stroke: var(--select, #e8a33d);
1163
+ }
1164
+
1165
+ .v2-sequencer .tl-shot-block .tl-crane-editor,
1166
+ .v2-sequencer .tl-shot-block .sg-shot {
1167
+ pointer-events: auto;
1168
+ }
1169
+
1170
+ .v2-sequencer .tl-surface {
1171
+ height: max(100%, var(--tl-surface-height, 328px));
1172
+ min-height: var(--tl-surface-height, 328px);
1173
+ overflow: visible;
1174
+ }
1175
+
1176
+ .v2-sequencer.timeline:not(.collapsed) {
1177
+ height: max(var(--timeline-height, 330px), var(--tl-v2-height, 330px));
1178
+ min-height: var(--tl-v2-height, 330px);
1179
+ }
1180
+
1181
+ .v2-sequencer.timeline.collapsed {
1182
+ height: var(--tl-collapsed-height, 34px);
1183
+ min-height: var(--tl-collapsed-height, 34px);
1184
+ }
1185
+
1186
+ @media (max-width: 900px) {
1187
+ .v2-sequencer .tl-title {
1188
+ font-size: var(--tl-font-ui, 12px);
1189
+ }
1190
+
1191
+ .v2-sequencer .tl-sequencer-actions {
1192
+ margin-left: var(--sp-1, 8px);
1193
+ }
1194
+
1195
+ .v2-sequencer .tl-track-tree,
1196
+ .v2-sequencer .tl-ruler-label {
1197
+ width: var(--tl-track-tree-width, 190px);
1198
+ }
1199
+ }