cozyclay 3.0.3 → 3.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 (246) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/INSTALL_FOR_AGENTS.md +146 -0
  3. package/README.md +74 -192
  4. package/THIRD_PARTY_NOTICES.md +0 -21
  5. package/bin/agent/agent-routes.mjs +29 -62
  6. package/bin/agent/agent-runner.mjs +5 -3
  7. package/bin/agent/main-agent.mjs +70 -0
  8. package/bin/agent/main-prompt.mjs +17 -0
  9. package/bin/agent/plan-tool.mjs +114 -0
  10. package/bin/agent/script-tool.mjs +2 -0
  11. package/bin/agent/sculpt-sketch.mjs +190 -0
  12. package/bin/agent/session-store.mjs +4 -3
  13. package/bin/agent/sketch-code.mjs +151 -0
  14. package/bin/agent/sketch-sandbox.mjs +102 -0
  15. package/bin/agent/studio-prompt.mjs +1 -1
  16. package/bin/agent/studio-task-routes.mjs +185 -0
  17. package/bin/agent/studio-tasks.mjs +156 -0
  18. package/bin/agent/studio-tools.mjs +3 -2
  19. package/bin/agent/studio-turn-transaction.mjs +76 -0
  20. package/bin/agent/turn-frames.mjs +4 -0
  21. package/bin/cozyclay.mjs +5 -7
  22. package/dist/app/index.html +7 -6
  23. package/dist/assets/TaskBoard-ngdqiu7u.js +1 -0
  24. package/dist/assets/app-BlwOpest.css +1 -0
  25. package/dist/assets/app-DmR7jBkz.js +5144 -0
  26. package/dist/assets/compile-worker-D0pKioa0.js +5 -0
  27. package/dist/assets/landing-y3EqDgSZ.js +1 -0
  28. package/dist/assets/modulepreload-polyfill-P2Xu9kJm.js +1 -0
  29. package/dist/assets/motion3-compile-BB3_1-EB.js +1 -0
  30. package/dist/assets/scene-asset-sync-CBx7XRti.css +1 -0
  31. package/dist/assets/scene-asset-sync-Cgdtr1Yw.js +13 -0
  32. package/dist/assets/task-board-ErQvfoaz.js +14 -0
  33. package/dist/assets/workflow-zQM-EKW1.js +179 -0
  34. package/dist/assets/x-bot-tpose-body-BusyR3eg.json +1 -0
  35. package/dist/assets/y-bot-tpose-body-Dy1VKChZ.json +1 -0
  36. package/dist/cozyclay-package.json +1 -1
  37. package/dist/greybox-to-video/index.html +2 -3
  38. package/dist/index.html +7 -57
  39. package/dist/llms.txt +2 -1
  40. package/dist/previs-software/index.html +2 -2
  41. package/dist/privacy/index.html +3 -7
  42. package/dist/seedance-camera-control/index.html +2 -2
  43. package/dist/sitemap.xml +5 -5
  44. package/dist/sw.js +5 -1
  45. package/dist/thumbs/blank-stage-dark.webp +0 -0
  46. package/dist/thumbs/blank-stage-light.webp +0 -0
  47. package/dist/workflow/index.html +5 -4
  48. package/mcp/mesh-file.mjs +3 -1
  49. package/mcp/server.mjs +3 -0
  50. package/mcp/tool-handlers.mjs +2 -2
  51. package/package.json +5 -3
  52. package/src/App.jsx +51 -282
  53. package/src/analytics.js +3 -148
  54. package/src/app-stage.jsx +1 -1
  55. package/src/asset-pane.jsx +5 -10
  56. package/src/auto-flat.js +10 -0
  57. package/src/bus-tasks.js +11 -5
  58. package/src/command-bus.js +1 -1
  59. package/src/commands/elements.js +4 -3
  60. package/src/commands/motion3-compile.js +51 -27
  61. package/src/commands/motion3.js +3 -3
  62. package/src/commands/objects.js +1 -1
  63. package/src/commands/project.js +1 -1
  64. package/src/commands/shot.js +16 -4
  65. package/src/controls.jsx +0 -11
  66. package/src/cuts.js +11 -0
  67. package/src/domains/cast.js +3 -2
  68. package/src/domains/motion.js +3 -10
  69. package/src/domains/playback.js +32 -0
  70. package/src/domains/scenes.js +3 -22
  71. package/src/domains/shots.js +5 -5
  72. package/src/dualview.jsx +11 -15
  73. package/src/hierarchy-panel.css +18 -4
  74. package/src/hierarchy-panel.jsx +12 -11
  75. package/src/kits/held.js +3 -2
  76. package/src/light-blockers.js +2 -2
  77. package/src/main.jsx +5 -0
  78. package/src/material-look.js +189 -0
  79. package/src/material-presets.js +78 -0
  80. package/src/material-textures.js +157 -0
  81. package/src/motion/ground.js +5 -14
  82. package/src/motion/playback-frame-store.js +79 -0
  83. package/src/motion/playback-probe.js +16 -0
  84. package/src/motion/playback-subject.js +7 -0
  85. package/src/motion/timeline.css +43 -5
  86. package/src/motion/timeline.jsx +4 -3
  87. package/src/motion3/body.js +37 -5
  88. package/src/motion3/carried.js +11 -3
  89. package/src/motion3/compile-job.js +1 -1
  90. package/src/motion3/compiler/compile.js +7 -1
  91. package/src/motion3/compiler/finger-close.js +137 -0
  92. package/src/motion3/compiler/limbs.js +18 -3
  93. package/src/motion3/compiler/pose.js +6 -0
  94. package/src/motion3/compiler/validate-objects.js +17 -2
  95. package/src/motion3/compiler/validate-parts.js +2 -1
  96. package/src/motion3/compiler/vocab.js +4 -4
  97. package/src/motion3/describe.js +2 -2
  98. package/src/motion3/fix/index.js +5 -3
  99. package/src/motion3/flight.js +38 -0
  100. package/src/motion3/free-motion.js +10 -7
  101. package/src/motion3/load.js +125 -0
  102. package/src/motion3/mass.js +23 -0
  103. package/src/motion3/object-keys.js +11 -6
  104. package/src/motion3/object-pose.js +11 -3
  105. package/src/motion3/pipeline.js +3 -0
  106. package/src/motion3/qa/explain.js +3 -1
  107. package/src/motion3/qa/grasp-checks.js +123 -0
  108. package/src/motion3/qa/hints-grasp.js +71 -0
  109. package/src/motion3/qa/index.js +3 -1
  110. package/src/motion3/qa/object-checks.js +7 -2
  111. package/src/motion3/qa/patch.js +2 -1
  112. package/src/motion3/qa/spec-checks.js +10 -1
  113. package/src/motion3/schema/fields.js +3 -3
  114. package/src/motion3/schema/topics.js +9 -8
  115. package/src/motion3/schema/types.js +4 -1
  116. package/src/motion3/seat.js +84 -0
  117. package/src/motion3/settle.js +11 -6
  118. package/src/motion3/shapes.js +70 -0
  119. package/src/motion3/skills/catch.js +71 -0
  120. package/src/motion3/skills/index.js +10 -3
  121. package/src/motion3/skills/info.js +13 -0
  122. package/src/motion3/skills/throw.js +72 -0
  123. package/src/object-catalog.jsx +0 -4
  124. package/src/object-gizmo.jsx +2 -1
  125. package/src/object-look.js +9 -5
  126. package/src/object-path.js +1 -1
  127. package/src/panels/ProjectPanel.jsx +42 -21
  128. package/src/panels/details.css +15 -4
  129. package/src/popover.js +37 -0
  130. package/src/posestudio.jsx +15 -10
  131. package/src/primitive-look.js +38 -0
  132. package/src/project-browser-art.jsx +19 -0
  133. package/src/project-browser.css +74 -121
  134. package/src/project-browser.jsx +36 -60
  135. package/src/props.jsx +24 -35
  136. package/src/render-passes.js +7 -1
  137. package/src/retired-kinds.js +37 -0
  138. package/src/scene-objects.js +5 -9
  139. package/src/scenes.js +4 -5
  140. package/src/sculpt-colours.js +65 -0
  141. package/src/sculpt-compare.js +13 -50
  142. package/src/sculpt-csg.js +112 -0
  143. package/src/sculpt-curve.js +123 -0
  144. package/src/sculpt-cutters.js +43 -0
  145. package/src/sculpt-detail.js +207 -0
  146. package/src/sculpt-geometry-loft-convex.js +100 -0
  147. package/src/sculpt-geometry-shapes.js +250 -0
  148. package/src/sculpt-geometry.js +33 -15
  149. package/src/sculpt-loft-rings.js +225 -0
  150. package/src/sculpt-noise.js +65 -0
  151. package/src/sculpt-part-fields.js +27 -0
  152. package/src/sculpt-recipe-read.js +65 -0
  153. package/src/sculpt-recipe.js +33 -75
  154. package/src/sculpt-run.js +1 -1
  155. package/src/sculpt-scatter-items.js +183 -0
  156. package/src/sculpt-scatter-shape.js +57 -0
  157. package/src/sculpt-scatter.js +124 -0
  158. package/src/sculpt-shapes-curved.js +211 -0
  159. package/src/sculpt-shapes-loft-convex.js +218 -0
  160. package/src/sculpt-shapes.js +138 -0
  161. package/src/sculpt-sketch-state.js +76 -0
  162. package/src/sculpt-sketch.jsx +124 -0
  163. package/src/sculpt-surface-fields.js +65 -0
  164. package/src/settings-menu.jsx +1 -20
  165. package/src/shell/BottomDock.jsx +9 -9
  166. package/src/shell/MenuBar.jsx +1 -9
  167. package/src/shell/PreferencesDialog.jsx +3 -4
  168. package/src/shell/ViewportToolbar.jsx +3 -3
  169. package/src/shell/add-camera-shot.js +11 -0
  170. package/src/shell/glass-regions.css +3 -2
  171. package/src/shell/glass.css +0 -5
  172. package/src/shell/lens-scrub-math.js +51 -0
  173. package/src/shell/lens-scrub.css +73 -0
  174. package/src/shell/lens-scrub.jsx +98 -0
  175. package/src/shell/mode.css +6 -5
  176. package/src/shell/preferences.css +1 -32
  177. package/src/shell/shell.css +18 -1
  178. package/src/shell/studio-shell-context.js +5 -0
  179. package/src/shot-frame.js +26 -0
  180. package/src/stage-canvas-rigs.jsx +7 -8
  181. package/src/stage-characters.jsx +26 -0
  182. package/src/stage-gizmo.js +43 -0
  183. package/src/stage-labels-ko.js +0 -6
  184. package/src/stage-startup-defaults.js +3 -9
  185. package/src/starter-scenes.js +5 -11
  186. package/src/studio-agent-commands.js +2 -2
  187. package/src/studio-agent-protocol.js +2 -7
  188. package/src/studio-app-binding.js +1 -1
  189. package/src/studio-elements.js +6 -2
  190. package/src/styles/themes.css +13 -0
  191. package/src/styles.css +6 -674
  192. package/src/text/text-object.jsx +1 -1
  193. package/src/ui.jsx +8 -16
  194. package/src/use-embed-bridge.js +3 -6
  195. package/src/use-render-activity.js +3 -1
  196. package/src/view-ghosts.jsx +5 -3
  197. package/src/viewport-visible-rect.js +37 -0
  198. package/src/workflow/AgentPanel.jsx +79 -46
  199. package/src/workflow/AgentPlanCard.jsx +41 -0
  200. package/src/workflow/AgentProgressCard.jsx +1 -1
  201. package/src/workflow/TaskBoard.jsx +102 -0
  202. package/src/workflow/TaskInline.jsx +114 -0
  203. package/src/workflow/agent-client.js +25 -36
  204. package/src/workflow/agent-panel.css +14 -1
  205. package/src/workflow/agent-plan.css +93 -0
  206. package/src/workflow/agent-plan.js +59 -0
  207. package/src/workflow/attachment-image.js +10 -3
  208. package/src/workflow/attachment-video.js +91 -0
  209. package/src/workflow/task-board.css +98 -0
  210. package/src/workflow/task-board.js +169 -0
  211. package/tools/check-eslint.mjs +2 -1
  212. package/tools/check-knip.mjs +2 -1
  213. package/tools/dev/pages/greybox-to-video.html +2 -3
  214. package/tools/dev/pages/previs-software.html +2 -2
  215. package/tools/dev/pages/privacy.html +3 -7
  216. package/tools/dev/pages/seedance-camera-control.html +2 -2
  217. package/tools/dev-full.mjs +11 -2
  218. package/tools/eslint-baseline.json +6 -6
  219. package/tools/knip-baseline.json +0 -11
  220. package/tools/loc-baseline.json +30 -31
  221. package/tools/metrics-snapshot.mjs +43 -5
  222. package/tools/render-start-thumbs.mjs +175 -0
  223. package/tools/run-tests.mjs +10 -17
  224. package/tools/sitemap.mjs +1 -1
  225. package/dist/assets/analytics-BibyE5ar.js +0 -6
  226. package/dist/assets/app-DhRJ-PBz.js +0 -5088
  227. package/dist/assets/app-f-fkV5uP.css +0 -1
  228. package/dist/assets/compile-worker-DqiA4AaN.js +0 -5
  229. package/dist/assets/first-shot-handoff-Qx7SKl38.js +0 -1
  230. package/dist/assets/landing-DYg87MDY.js +0 -1
  231. package/dist/assets/scene-asset-sync-DBYQBR0T.js +0 -20
  232. package/dist/assets/scene-asset-sync-_S8NQl5B.css +0 -1
  233. package/dist/assets/workflow-BSA22Ofr.js +0 -179
  234. package/dist/scenes/city-block.cclayproject +0 -1
  235. package/src/burn-in.js +0 -91
  236. package/src/camera-tutorial.jsx +0 -520
  237. package/src/facing-marks.js +0 -88
  238. package/src/first-shot-handoff.js +0 -44
  239. package/src/panels/motion.css +0 -197
  240. package/src/set-pieces.jsx +0 -183
  241. package/src/tutorial-analytics.js +0 -86
  242. package/src/tutorial-walk.js +0 -17
  243. package/src/use-camera-tutorial.js +0 -50
  244. package/src/use-semantic-state.js +0 -12
  245. package/tools/metrics/archive-traffic.mjs +0 -138
  246. package/tools/perf/ik-camera-drag.mjs +0 -138
package/src/styles.css CHANGED
@@ -589,40 +589,6 @@ select {
589
589
  line-height: 1.5;
590
590
  }
591
591
 
592
- .camera-tutorial-handoff {
593
- display: flex;
594
- flex-wrap: wrap;
595
- align-items: center;
596
- gap: 8px;
597
- pointer-events: auto;
598
- padding-top: 8px;
599
- }
600
-
601
- .camera-tutorial-handoff strong,
602
- .camera-tutorial-handoff p {
603
- flex-basis: 100%;
604
- margin: 0;
605
- }
606
-
607
- .camera-tutorial-handoff .btn,
608
- .camera-tutorial-handoff-dismiss {
609
- font: inherit;
610
- font-size: 11px;
611
- padding: 6px 10px;
612
- cursor: pointer;
613
- }
614
-
615
- .camera-tutorial-handoff-dismiss {
616
- border: 1px solid var(--line2);
617
- background: transparent;
618
- color: var(--fg);
619
- }
620
-
621
- .camera-tutorial-handoff button:focus-visible {
622
- outline: 2px solid var(--accent);
623
- outline-offset: 2px;
624
- }
625
-
626
592
  @media (max-width: 700px) {
627
593
  .first-success-guide {
628
594
  right: 10px;
@@ -822,8 +788,7 @@ select {
822
788
  }
823
789
 
824
790
  /* The landing page's playground iframe: the viewport, a one-row transport,
825
- the Shots lane (the camera tutorial adds a shot and draws its rail) and the
826
- shot monitor stay; project chrome, hierarchy, inspector and the other lanes go. */
791
+ the Shots lane (a shot and its rail) and the shot monitor stay; project chrome, hierarchy, inspector and the other lanes go. */
827
792
  .app[data-embed-mode="playground"] {
828
793
  width: 100vw;
829
794
  height: 100vh;
@@ -877,50 +842,12 @@ select {
877
842
  .app[data-embed-mode="playground"] .tl-track.shots { height: 68px; min-height: 68px; }
878
843
  .app[data-embed-mode="playground"] .tl-head { padding: 6px 10px; }
879
844
  .app[data-embed-mode="playground"] .viewport { flex: 1 1 auto; }
880
- /* The shot monitor is the pane the tutorial points at: keep it small. */
845
+ /* Keep the shot monitor small. */
881
846
  .app[data-embed-mode="playground"] .vp-shot-preview { width: 22% !important; height: auto !important; aspect-ratio: 16 / 9; right: 12px; bottom: 12px; }
882
847
  .app[data-embed-mode="playground"] .vp-shot-preview-tag { font-size: 12px; }
883
848
  /* The look-through button carries its label now; keep it on one line. */
884
849
  .app[data-embed-mode="playground"] .vp-look-through { height: 24px; padding: 0 8px; white-space: nowrap; }
885
850
  .app[data-embed-mode="playground"] .vp-look-through svg { width: 15px; height: 15px; }
886
- /* Tutorial hints: the landing page names the control the current step needs. */
887
- .app[data-playground-hint="look"] .vp-look-through,
888
- .app[data-playground-hint="shot"] .tl-track.shots .tl-track-add,
889
- .app[data-playground-hint="rail"] .tl-track.shots .tl-shot-block:not(.selected),
890
- .app[data-playground-hint="rail"] .tl-rail-draw,
891
- .app[data-playground-hint="play"] .tl-transport button:nth-child(2) {
892
- animation: playground-pulse 1.1s ease-in-out infinite;
893
- box-shadow: 0 0 0 2px #d9a066;
894
- }
895
- @keyframes playground-pulse {
896
- 0%, 100% { box-shadow: 0 0 0 2px #d9a066; }
897
- 50% { box-shadow: 0 0 0 7px rgba(217, 160, 102, 0); }
898
- }
899
-
900
- /* The Studio tutorial's spotlight (#211). Same idea as the landing hints
901
- above, one region louder: inside the full studio the operator is scanning
902
- two panes and forty controls, so the ring is 3px in the accent with a halo
903
- breathing out of it rather than a thin amber outline. data-tutorial-step is
904
- the current step's kind, published by CameraTutorial through App. */
905
- .app[data-tutorial-step="shot"] .tl-track.shots .tl-track-add,
906
- .app[data-tutorial-step="rail"] .tl-track.shots .tl-shot-block:not(.selected),
907
- .app[data-tutorial-step="rail"] .tl-rail-draw,
908
- .app[data-tutorial-step="play"] .vp-look-through,
909
- .app[data-tutorial-step="play"] .dock-shot-look {
910
- animation: tutorial-spotlight 1.5s var(--ease) infinite;
911
- box-shadow: 0 0 0 3px var(--accent);
912
- }
913
- /* The rail is drawn INTO the top view, so the inset is the second half of the
914
- step's target: a soft accent outline, no pulse — two pulsing things in one
915
- step read as an alarm, not an instruction. */
916
- .app[data-tutorial-step="rail"] .vp-inset {
917
- box-shadow: 0 10px 30px #00000073, 0 0 0 2px var(--accent-ring);
918
- }
919
- @keyframes tutorial-spotlight {
920
- 0%, 100% { box-shadow: 0 0 0 3px var(--accent), 0 0 0 0 rgba(58, 124, 191, .45); }
921
- 50% { box-shadow: 0 0 0 3px var(--accent), 0 0 0 8px rgba(58, 124, 191, 0); }
922
- }
923
-
924
851
  /* ------------------------------------------------------- dual viewport ---- */
925
852
 
926
853
  /* Both panes render every frame out of one canvas; these divs only supply the
@@ -2413,32 +2340,6 @@ input[type=range]::-moz-range-thumb {
2413
2340
  color: #dcdce2;
2414
2341
  font-weight: 600;
2415
2342
  }
2416
- /* ------------------------------------------------------ ardy panel ------- */
2417
-
2418
- .ardy-status {
2419
- margin: 10px 0 0;
2420
- font-size: 11.5px;
2421
- line-height: 1.5;
2422
- color: var(--muted);
2423
- }
2424
-
2425
- .ardy-status:before {
2426
- content: "▸ ";
2427
- color: var(--cyan);
2428
- }
2429
-
2430
- .ardy-outcome.done {
2431
- color: var(--muted);
2432
- }
2433
-
2434
- .ardy-outcome.done code {
2435
- color: var(--cyan);
2436
- }
2437
-
2438
- .ardy-outcome.error {
2439
- color: #e5484d;
2440
- }
2441
-
2442
2343
  /* ----------------------------------------------------------- subjects ----- */
2443
2344
 
2444
2345
  .subjects-row {
@@ -5168,8 +5069,6 @@ input[type=range]::-moz-range-thumb {
5168
5069
  }
5169
5070
 
5170
5071
  .inspector-hint,
5171
- .ardy-hint,
5172
- .ardy-status,
5173
5072
  .hint,
5174
5073
  .check,
5175
5074
  .field label,
@@ -5178,9 +5077,7 @@ input[type=range]::-moz-range-thumb {
5178
5077
  color: var(--lg-9a9a9a, #9a9a9a);
5179
5078
  }
5180
5079
 
5181
- .hint b,
5182
- .ardy-hint code,
5183
- .ardy-outcome code {
5080
+ .hint b {
5184
5081
  color: var(--lg-d2d2d2, #d2d2d2);
5185
5082
  }
5186
5083
 
@@ -5701,7 +5598,6 @@ input[type=range]::-moz-range-thumb {
5701
5598
  }
5702
5599
 
5703
5600
  .inspector-hint,
5704
- .ardy-hint,
5705
5601
  .studio-hint {
5706
5602
  font-size: 10.5px;
5707
5603
  line-height: 1.55;
@@ -5742,12 +5638,6 @@ input[type=range]::-moz-range-thumb {
5742
5638
  .row .val,
5743
5639
  .readout,
5744
5640
  .inspector-status-grid,
5745
- .ardy-status,
5746
- .ardy-report-grid b,
5747
- .ardy-report-grid span,
5748
- .ardy-meta,
5749
- .ardy-outcome code,
5750
- .ardy-hint code,
5751
5641
  .kbd-hint,
5752
5642
  .caption,
5753
5643
  .hud,
@@ -6831,8 +6721,8 @@ input[type=range]::-moz-range-thumb {
6831
6721
  .app[data-workflow-mode="motion"] .workflow-scene-context,
6832
6722
  .app[data-workflow-mode="motion"] .workflow-camera-context { display: none; }
6833
6723
  .app[data-workflow-mode="motion"] .workflow-toolbar-hint { display: inline-flex; }
6834
- .app[data-workflow-mode="motion"] .vp-inset,
6835
- .app[data-workflow-mode="motion"] .vp-shot-preview { display: none !important; }
6724
+ /* The shot preview stays in Motion: it fills the dock's Shot Camera frame. */
6725
+ .app[data-workflow-mode="motion"] .vp-inset { display: none !important; }
6836
6726
 
6837
6727
  /* Keep the timeline focused on the selected workflow. Pose-correction and
6838
6728
  take-generation controls are useful while authoring motion, but they are
@@ -7618,12 +7508,7 @@ input[type=range] {
7618
7508
 
7619
7509
  /* hints/status: smaller, quieter */
7620
7510
  .inspector-hint,
7621
- .ardy-hint,
7622
- .ardy-status,
7623
- .hint,
7624
- .ardy-caveat,
7625
- .ardy-meta,
7626
- .ardy-clamp {
7511
+ .hint {
7627
7512
  font-size: 10px;
7628
7513
  line-height: 1.5;
7629
7514
  }
@@ -9429,507 +9314,7 @@ input[type=range] {
9429
9314
  color: #e08a7a;
9430
9315
  }
9431
9316
 
9432
- /* ------------------------------------------------- camera tutorial ------- */
9433
-
9434
- /* The Studio-native camera tutorial (#206): a strip of seven step chips and
9435
- one hint card, hung under the 27px viewport titlebar, left of the Top-View
9436
- inset (right:15px). The overlay is transparent to the pointer — every step
9437
- is finished by working the stage underneath it — so only the close button
9438
- takes clicks. */
9439
- .camera-tutorial {
9440
- position: absolute;
9441
- top: 35px;
9442
- left: 12px;
9443
- z-index: 7;
9444
- width: min(430px, calc(100% - 24px - 26%));
9445
- padding: 8px 10px 9px;
9446
- display: flex;
9447
- flex-direction: column;
9448
- gap: 7px;
9449
- background: color-mix(in srgb, var(--panel) 94%, #000);
9450
- border: 1px solid var(--line2);
9451
- border-radius: 8px;
9452
- box-shadow: var(--shadow-md);
9453
- pointer-events: none;
9454
- animation: rise var(--med) var(--ease) both;
9455
- }
9456
-
9457
- /* The look-through exit pill is centred in the same band (top:60px), and it
9458
- is the only way back to the free camera without the keyboard. While the
9459
- player is up the card gives that width back rather than covering it. */
9460
- .camera-tutorial[data-previewing="1"] {
9461
- width: clamp(220px, calc(50% - 92px), 360px);
9462
- }
9463
-
9464
- /* The floating shell covers the full-bleed viewport with panels. Keep the
9465
- instructions inside its open stage, clear of the tool rail and dock. */
9466
- .app[data-shell="glass"]:not([data-embed-mode]) .camera-tutorial {
9467
- top: calc(var(--shell-view-top, 52px) + 12px);
9468
- left: calc(var(--shell-center-left) + 64px);
9469
- width: min(430px, calc(100% - var(--shell-center-left) - var(--shell-center-right) - 128px));
9470
- }
9471
- .app[data-shell="glass"][data-tutorial-step="rail"] .camera-tutorial,
9472
- .app[data-shell="glass"] .camera-tutorial[data-previewing="1"] {
9473
- top: auto;
9474
- bottom: calc(var(--shell-center-bottom) + 12px);
9475
- }
9476
- .app[data-shell="glass"]:not([data-embed-mode]) .tutorial-cue {
9477
- left: calc((var(--shell-center-left) + 100% - var(--shell-center-right)) / 2);
9478
- bottom: calc(var(--shell-center-bottom) + 18px);
9479
- }
9480
-
9481
- .camera-tutorial-steps {
9482
- display: flex;
9483
- flex-wrap: wrap;
9484
- gap: 4px;
9485
- margin: 0;
9486
- padding: 0 22px 0 0;
9487
- list-style: none;
9488
- }
9489
-
9490
- .camera-tutorial-steps li {
9491
- display: inline-flex;
9492
- align-items: center;
9493
- gap: 5px;
9494
- padding: 2px 7px;
9495
- border: 1px solid var(--line2);
9496
- border-radius: 999px;
9497
- color: var(--muted);
9498
- font-size: 10px;
9499
- font-weight: 700;
9500
- letter-spacing: .02em;
9501
- }
9502
-
9503
- .camera-tutorial-steps li i {
9504
- font-family: var(--mono);
9505
- font-style: normal;
9506
- font-size: 9px;
9507
- opacity: .85;
9508
- }
9509
-
9510
- .camera-tutorial-steps li[data-current="1"] {
9511
- border-color: var(--accent);
9512
- background: var(--accent-soft);
9513
- color: var(--fg);
9514
- }
9515
-
9516
- .camera-tutorial-steps li[data-done="1"] {
9517
- border-color: color-mix(in srgb, #65c18c 55%, transparent);
9518
- color: #65c18c;
9519
- }
9520
-
9521
- .camera-tutorial-card {
9522
- display: flex;
9523
- align-items: baseline;
9524
- gap: 8px;
9525
- color: var(--fg);
9526
- font-size: 11.5px;
9527
- line-height: 1.45;
9528
- }
9529
-
9530
- .camera-tutorial-card p {
9531
- margin: 0;
9532
- }
9533
-
9534
- .camera-tutorial-count {
9535
- flex: none;
9536
- color: var(--accent);
9537
- font-family: var(--mono);
9538
- font-size: 9.5px;
9539
- font-weight: 700;
9540
- letter-spacing: .06em;
9541
- text-transform: uppercase;
9542
- }
9543
-
9544
- .camera-tutorial-count.done {
9545
- color: #65c18c;
9546
- }
9547
-
9548
- .camera-tutorial kbd {
9549
- padding: 1px 5px;
9550
- border: 1px solid var(--line2);
9551
- border-radius: 4px;
9552
- background: var(--card2);
9553
- color: var(--fg);
9554
- font-family: var(--mono);
9555
- font-size: 9.5px;
9556
- }
9557
-
9558
- .camera-tutorial-keys {
9559
- display: inline-flex;
9560
- gap: 3px;
9561
- margin: 0 2px;
9562
- }
9563
-
9564
- .camera-tutorial-keys kbd[data-done="1"] {
9565
- border-color: color-mix(in srgb, #65c18c 55%, transparent);
9566
- color: #65c18c;
9567
- }
9568
-
9569
- .camera-tutorial-close {
9570
- position: absolute;
9571
- top: 4px;
9572
- right: 5px;
9573
- padding: 0 4px;
9574
- border: 0;
9575
- background: transparent;
9576
- color: var(--muted);
9577
- font-size: 15px;
9578
- line-height: 1;
9579
- cursor: pointer;
9580
- pointer-events: auto;
9581
- }
9582
-
9583
- .camera-tutorial-close:hover,
9584
- .camera-tutorial-close:focus-visible {
9585
- color: var(--fg);
9586
- }
9587
-
9588
- /* The card's region pointer: the control the step needs is in another pane,
9589
- so the copy opens with which way to look before it says what to do. */
9590
- .camera-tutorial-where {
9591
- margin-right: 6px;
9592
- padding: 1px 5px;
9593
- border: 1px solid var(--accent-ring);
9594
- border-radius: 4px;
9595
- color: var(--accent);
9596
- font-size: 9.5px;
9597
- font-weight: 700;
9598
- letter-spacing: .02em;
9599
- white-space: nowrap;
9600
- vertical-align: 1px;
9601
- }
9602
-
9603
- /* ------------------------------------------------- tutorial beacon ------- */
9604
-
9605
- /* A numbered circle, a leader line and a caption chip pinned to the control
9606
- the current step needs (#211). Portalled to <body>, so it clears every pane
9607
- in the studio (the highest viewport/timeline layer is 13) and clips to
9608
- nothing; never takes the pointer, so the control underneath stays
9609
- clickable. */
9610
- .tutorial-beacon {
9611
- position: fixed;
9612
- z-index: 14;
9613
- display: flex;
9614
- align-items: center;
9615
- gap: 7px;
9616
- pointer-events: none;
9617
- animation: rise var(--med) var(--ease) backwards;
9618
- }
9619
-
9620
- .tutorial-beacon-leader {
9621
- position: absolute;
9622
- inset: 0;
9623
- overflow: visible;
9624
- width: 100%;
9625
- height: 100%;
9626
- }
9627
-
9628
- .tutorial-beacon-leader line {
9629
- stroke: var(--accent);
9630
- stroke-width: 1.5;
9631
- stroke-linecap: round;
9632
- stroke-dasharray: 3 3;
9633
- opacity: .85;
9634
- }
9635
-
9636
- .tutorial-beacon-dot {
9637
- position: relative;
9638
- flex: none;
9639
- width: 22px;
9640
- height: 22px;
9641
- display: inline-flex;
9642
- align-items: center;
9643
- justify-content: center;
9644
- border-radius: 50%;
9645
- background: var(--accent);
9646
- color: var(--on-accent);
9647
- font-family: var(--mono);
9648
- font-size: 11px;
9649
- font-weight: 700;
9650
- box-shadow: 0 0 0 3px rgba(58, 124, 191, .28), var(--shadow);
9651
- animation: tutorial-beacon-breathe 1.5s var(--ease) infinite;
9652
- }
9653
-
9654
- .tutorial-beacon-label {
9655
- position: relative;
9656
- max-width: 190px;
9657
- padding: 3px 8px;
9658
- border: 1px solid var(--accent-ring);
9659
- border-radius: 6px;
9660
- background: color-mix(in srgb, var(--panel) 94%, #000);
9661
- box-shadow: var(--shadow-md);
9662
- color: var(--fg);
9663
- font-size: 10.5px;
9664
- font-weight: 600;
9665
- line-height: 1.35;
9666
- word-break: keep-all;
9667
- }
9668
-
9669
- @keyframes tutorial-beacon-breathe {
9670
- 0%, 100% { box-shadow: 0 0 0 3px rgba(58, 124, 191, .28), var(--shadow); }
9671
- 50% { box-shadow: 0 0 0 8px rgba(58, 124, 191, 0), var(--shadow); }
9672
- }
9673
-
9674
- /* ------------------------------------------------- gesture cue ----------- */
9675
-
9676
- /* Steps 1–4 have no control to point at, so the cue draws the hand instead:
9677
- a mouse glyph with the button the step wants lit, moving the way the hand
9678
- is supposed to move. Centre-bottom of the viewport, clear of the shot
9679
- preview (bottom-right) and the Top-View inset (top-right). */
9680
- .tutorial-cue {
9681
- position: absolute;
9682
- left: 50%;
9683
- bottom: 18px;
9684
- z-index: 7;
9685
- width: 120px;
9686
- transform: translateX(-50%);
9687
- display: flex;
9688
- flex-direction: column;
9689
- align-items: center;
9690
- gap: 7px;
9691
- padding: 10px 8px 8px;
9692
- border: 1px solid var(--line2);
9693
- border-radius: 10px;
9694
- background: color-mix(in srgb, var(--panel) 82%, transparent);
9695
- box-shadow: var(--shadow-md);
9696
- backdrop-filter: blur(6px);
9697
- pointer-events: none;
9698
- opacity: 1;
9699
- transition: opacity var(--med) var(--ease), transform var(--med) var(--ease);
9700
- /* `backwards`, not `both`: a filled-forwards animation would pin opacity at
9701
- the keyframe's value and the fade-out below would never run. riseCenter
9702
- keeps the -50% centring the base rule needs. */
9703
- animation: riseCenter var(--med) var(--ease) backwards;
9704
- }
9705
-
9706
- .tutorial-cue[data-leaving="1"] {
9707
- opacity: 0;
9708
- transform: translateX(-50%) translateY(6px);
9709
- }
9710
-
9711
- .tutorial-cue-stage {
9712
- position: relative;
9713
- display: flex;
9714
- align-items: flex-end;
9715
- justify-content: center;
9716
- gap: 6px;
9717
- /* full width so the orbit keycap and pivot anchor to the panel, not to the
9718
- glyph's own shrink-wrapped box */
9719
- width: 100%;
9720
- height: 54px;
9721
- }
9722
-
9723
- .tutorial-cue-arm {
9724
- position: relative;
9725
- display: inline-flex;
9726
- align-items: flex-end;
9727
- }
9728
-
9729
- .tutorial-cue-mouse {
9730
- width: 30px;
9731
- height: 44px;
9732
- overflow: visible;
9733
- }
9734
-
9735
- .cue-mouse-body {
9736
- fill: none;
9737
- stroke: var(--muted);
9738
- stroke-width: 2.5;
9739
- }
9740
-
9741
- .cue-mouse-left,
9742
- .cue-mouse-right {
9743
- fill: var(--card2);
9744
- stroke: var(--muted);
9745
- stroke-width: 1.5;
9746
- }
9747
-
9748
- .cue-mouse-wheel {
9749
- fill: var(--muted2);
9750
- }
9751
-
9752
- /* the lit control per step */
9753
- .tutorial-cue[data-kind="fly"] .cue-mouse-right,
9754
- .tutorial-cue[data-kind="walk"] .cue-mouse-right {
9755
- fill: var(--accent);
9756
- stroke: var(--accent);
9757
- }
9758
-
9759
- .tutorial-cue[data-kind="orbit"] .cue-mouse-left {
9760
- fill: var(--accent);
9761
- stroke: var(--accent);
9762
- }
9763
-
9764
- .tutorial-cue[data-kind="dolly"] .cue-mouse-wheel {
9765
- fill: var(--accent);
9766
- }
9767
-
9768
- /* fly: the mouse slides left and right under a two-headed arc */
9769
- .tutorial-cue[data-kind="fly"] .tutorial-cue-arm {
9770
- animation: cue-swing 2.2s var(--ease) infinite;
9771
- }
9772
-
9773
- .tutorial-cue-arc {
9774
- position: absolute;
9775
- left: 50%;
9776
- top: -13px;
9777
- width: 56px;
9778
- height: 18px;
9779
- transform: translateX(-50%);
9780
- overflow: visible;
9781
- }
9782
-
9783
- .cue-arc-line,
9784
- .cue-arc-head {
9785
- fill: none;
9786
- stroke: var(--accent);
9787
- stroke-width: 1.6;
9788
- stroke-linecap: round;
9789
- stroke-linejoin: round;
9790
- }
9791
-
9792
- /* dolly: the wheel is lit and the arrows breathe up and down */
9793
- .tutorial-cue-updown {
9794
- width: 12px;
9795
- height: 40px;
9796
- overflow: visible;
9797
- }
9798
-
9799
- .cue-up,
9800
- .cue-down {
9801
- fill: none;
9802
- stroke: var(--accent);
9803
- stroke-width: 1.6;
9804
- stroke-linecap: round;
9805
- stroke-linejoin: round;
9806
- }
9807
-
9808
- .cue-up { animation: cue-up 1.8s var(--ease) infinite; }
9809
- .cue-down { animation: cue-down 1.8s var(--ease) infinite; }
9810
-
9811
- /* orbit: Alt is held while the mouse arcs around the subject. The keycap sits
9812
- in the stage's bottom-left corner and the pivot dot in its bottom-centre,
9813
- so the swing above them never crosses either. */
9814
- .tutorial-cue[data-kind="orbit"] .tutorial-cue-stage {
9815
- height: 64px;
9816
- align-items: flex-start;
9817
- }
9818
-
9819
- .tutorial-cue-key {
9820
- position: absolute;
9821
- left: 0;
9822
- bottom: 0;
9823
- padding: 2px 5px;
9824
- border: 1px solid var(--accent);
9825
- border-radius: 4px;
9826
- background: var(--accent-soft);
9827
- color: var(--fg);
9828
- font-family: var(--mono);
9829
- font-size: 9px;
9830
- font-weight: 700;
9831
- }
9832
-
9833
- .tutorial-cue-pivot {
9834
- position: absolute;
9835
- left: 50%;
9836
- bottom: 1px;
9837
- width: 6px;
9838
- height: 6px;
9839
- transform: translateX(-50%);
9840
- border-radius: 50%;
9841
- background: var(--muted);
9842
- box-shadow: 0 0 0 3px var(--card2);
9843
- }
9844
-
9845
- /* the pivot is 20px below the mouse, so the arc reads as circling a subject */
9846
- .tutorial-cue[data-kind="orbit"] .tutorial-cue-arm {
9847
- transform-origin: 50% 145%;
9848
- animation: cue-orbit 2.8s var(--ease) infinite;
9849
- }
9850
-
9851
- /* walk: the six keys, pulsing until each one has been pressed */
9852
- .tutorial-cue-keys {
9853
- display: grid;
9854
- grid-template-columns: repeat(6, 1fr);
9855
- gap: 3px;
9856
- width: 100%;
9857
- }
9858
-
9859
- .tutorial-cue-keys kbd {
9860
- padding: 2px 0;
9861
- border: 1px solid var(--line2);
9862
- border-radius: 3px;
9863
- background: var(--card2);
9864
- color: var(--muted);
9865
- font-family: var(--mono);
9866
- font-size: 8.5px;
9867
- font-weight: 700;
9868
- text-align: center;
9869
- animation: cue-key 1.6s var(--ease) infinite;
9870
- }
9871
-
9872
- .tutorial-cue-keys kbd[data-done="1"] {
9873
- border-color: color-mix(in srgb, #65c18c 60%, transparent);
9874
- background: color-mix(in srgb, #65c18c 16%, transparent);
9875
- color: #65c18c;
9876
- animation: none;
9877
- }
9878
-
9879
- .tutorial-cue-caption {
9880
- color: var(--fg);
9881
- font-size: 9.5px;
9882
- font-weight: 600;
9883
- line-height: 1.3;
9884
- text-align: center;
9885
- word-break: keep-all;
9886
- }
9887
-
9888
- @keyframes cue-swing {
9889
- 0%, 100% { transform: translateX(-7px); }
9890
- 50% { transform: translateX(7px); }
9891
- }
9892
-
9893
- @keyframes cue-orbit {
9894
- 0%, 100% { transform: rotate(-13deg); }
9895
- 50% { transform: rotate(13deg); }
9896
- }
9897
-
9898
- @keyframes cue-up {
9899
- 0%, 100% { transform: translateY(2px); opacity: .45; }
9900
- 40% { transform: translateY(-2px); opacity: 1; }
9901
- }
9902
-
9903
- @keyframes cue-down {
9904
- 0%, 100% { transform: translateY(-2px); opacity: .45; }
9905
- 90% { transform: translateY(2px); opacity: 1; }
9906
- }
9907
-
9908
- @keyframes cue-key {
9909
- 0%, 100% { border-color: var(--line2); color: var(--muted); }
9910
- 50% { border-color: var(--accent); color: var(--fg); }
9911
- }
9912
-
9913
- /* Reduced motion: the tutorial still points at the control, it just stops
9914
- moving — a static ring, a static glyph, static keycaps. */
9915
9317
  @media (prefers-reduced-motion: reduce) {
9916
- .app[data-tutorial-step="shot"] .tl-track.shots .tl-track-add,
9917
- .app[data-tutorial-step="rail"] .tl-track.shots .tl-shot-block:not(.selected),
9918
- .app[data-tutorial-step="rail"] .tl-rail-draw,
9919
- .app[data-tutorial-step="play"] .vp-look-through {
9920
- animation: none;
9921
- box-shadow: 0 0 0 3px var(--accent);
9922
- }
9923
- .tutorial-beacon,
9924
- .tutorial-beacon-dot,
9925
- .tutorial-cue,
9926
- .tutorial-cue-arm,
9927
- .tutorial-cue-keys kbd,
9928
- .cue-up,
9929
- .cue-down {
9930
- animation: none;
9931
- }
9932
- .tutorial-cue { transition: none; }
9933
9318
  /* The agent's receipt highlight still appears and is still cleared by the
9934
9319
  host's own timer; only the fade is dropped. */
9935
9320
  .hierarchy-row.agent-touched::after { animation: none; opacity: 1; }
@@ -10124,59 +9509,6 @@ input[type=range] {
10124
9509
  .agent-history-empty { padding: 10px; color: var(--muted); }
10125
9510
  .agent-toast { padding: 8px 12px; border-bottom: 1px solid var(--line); background: var(--accent-soft); color: var(--fg); font-size: 11px; }
10126
9511
 
10127
- /* Fal H3 Studio motion launch slice (#380). */
10128
- .i2v-motion-card { margin-top: 12px; padding: 14px; border: 1px solid var(--line, #313747); border-radius: 10px; background: rgba(21, 25, 35, .72); font-size: 13px; }
10129
- .i2v-motion-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin: -14px -14px 0; padding: 8px 14px; background: #151923; border-radius: 10px 10px 0 0; font-size: 12px; }
10130
- .i2v-motion-head span { color: var(--muted, #a7afc2); font-size: 12px; }
10131
- .i2v-motion-mode-tabs { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-top: 10px; }
10132
- .i2v-motion-mode-tabs button { min-height: 34px; padding: 6px 8px; border: 1px solid #343b4d; border-radius: 6px; background: var(--lg-11151e, #11151e); color: var(--muted, #a7afc2); font: inherit; font-size: 13px; cursor: pointer; }
10133
- .i2v-motion-mode-tabs button.active { border-color: #7dd3fc; background: rgba(42, 77, 100, .32); color: #e6f7ff; }
10134
- .i2v-motion-mode-hint { margin-top: 6px; }
10135
- .i2v-motion-stepper { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; margin-top: 10px; }
10136
- .i2v-motion-stepper span { display: flex; align-items: center; gap: 5px; min-width: 0; padding: 6px 7px; border: 1px solid #343b4d; border-radius: 6px; color: var(--muted, #a7afc2); font-size: 11px; }
10137
- .i2v-motion-stepper span.active { border-color: #e1b45b; background: rgba(120, 85, 27, .22); color: #ffe7aa; }
10138
- .i2v-motion-stepper span.done { border-color: #3e8d62; color: #9fe6b8; }
10139
- .i2v-motion-stepper b { font-size: 12px; }
10140
- .i2v-motion-segmentation-row { display: flex; align-items: center; gap: 6px; margin-top: 7px; }
10141
- .i2v-motion-segmentation-row .i2v-motion-segmentation { flex: 1; margin: 0; }
10142
- .i2v-motion-flat-cta { flex: none; min-height: 32px !important; padding: 5px 10px !important; font-size: 12px !important; }
10143
- .i2v-motion-pose-row, .i2v-motion-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 10px; }
10144
- .i2v-motion-pose-row .btn, .i2v-motion-actions .btn { min-height: 36px; padding: 7px 12px; font-size: 13px; }
10145
- .i2v-motion-pose-row .btn.active { border-color: #7dd3fc; color: #d7f3ff; }
10146
- .i2v-motion-capture-status { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin-top: 10px; }
10147
- .i2v-motion-capture-slot { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding: 9px; border: 1px solid #343b4d; border-radius: 7px; background: var(--lg-11151e, #11151e); }
10148
- .i2v-motion-capture-slot.captured { border-color: #3e8d62; background: rgba(35, 83, 54, .22); }
10149
- .i2v-motion-capture-slot strong { color: var(--fg, #eef3ff); font-size: 13px; }
10150
- .i2v-motion-capture-slot.captured strong { color: #9fe6b8; }
10151
- .i2v-motion-capture-slot span { overflow: hidden; color: var(--muted, #a7afc2); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; }
10152
- .i2v-motion-slot-action { align-self: flex-start; padding: 0; border: 0; background: transparent; color: #b8dfff; font: inherit; font-size: 11px; cursor: pointer; text-decoration: underline; }
10153
- .i2v-motion-camera-status { margin: 8px 0 0; color: var(--muted, #a7afc2); font-size: 11px; }
10154
- .i2v-motion-camera-status.ready { color: #9fe6b8; }
10155
- .i2v-motion-camera-actions { display: flex; gap: 5px; flex-wrap: wrap; margin-top: 5px; }
10156
- .i2v-motion-camera-actions .btn { min-height: 30px !important; padding: 4px 9px !important; font-size: 12px !important; }
10157
- .i2v-motion-thumbs { display: flex; gap: 8px; margin-top: 8px; min-height: 0; }
10158
- .i2v-motion-thumbs figure { margin: 0; min-width: 0; }
10159
- .i2v-motion-thumbs img { display: block; width: 148px; height: 84px; object-fit: cover; border-radius: 5px; border: 1px solid #42506a; background: #0c0f16; }
10160
- .i2v-motion-thumbs figcaption { margin-top: 4px; color: var(--muted, #a7afc2); font-size: 11px; }
10161
- .i2v-motion-instruction { width: 100%; min-height: 64px; margin-top: 10px; padding: 9px; resize: vertical; border: 1px solid #343b4d; border-radius: 6px; background: var(--lg-11151e, #11151e); color: inherit; font: inherit; font-size: 13px; }
10162
- .i2v-motion-inline-error { margin-top: 8px; }
10163
- .i2v-motion-segmentation.ready { color: #9fe6b8; }
10164
- .i2v-motion-video { display: block; width: 100%; margin-top: 10px; border-radius: 7px; background: #090b10; }
10165
- .i2v-motion-duration-row { display: flex; align-items: center; gap: 8px; margin-top: 10px; }
10166
- .i2v-motion-duration-row .btn { min-height: 32px; padding: 5px 12px; font-size: 12px; }
10167
- .i2v-motion-duration-row .btn.active { border-color: #7dd3fc; background: rgba(42, 77, 100, .32); color: #e6f7ff; }
10168
- .i2v-motion-prompt-edit { margin-top: 10px; }
10169
- .i2v-motion-prompt-edit summary { cursor: pointer; color: var(--muted, #a7afc2); font-size: 12px; }
10170
- .i2v-motion-prompt-override { min-height: 88px; margin-top: 6px; font-family: ui-monospace, monospace; font-size: 12px; }
10171
- .i2v-motion-open-row { margin-top: 12px; }
10172
- .i2v-motion-open { width: 100%; min-height: 40px; font-size: 14px; }
10173
- .modal.i2v-motion-modal { width: min(920px, 96vw); }
10174
- .i2v-motion-modal-body { display: grid; grid-template-columns: minmax(280px, 1fr) minmax(320px, 1.1fr); gap: 18px; }
10175
- .i2v-motion-modal .i2v-motion-thumbs { flex-direction: column; }
10176
- .i2v-motion-modal .i2v-motion-thumbs img { width: 100%; height: auto; }
10177
- @media (max-width: 700px) { .i2v-motion-modal-body { grid-template-columns: 1fr; } }
10178
- .agent-i2v-action { color: #6d4aff; border-color: color-mix(in srgb, #6d4aff 35%, var(--line) 65%); }
10179
- .agent-i2v-action:disabled { opacity: .45; }
10180
9512
  .result-motion-video { width: 100%; max-height: 420px; background: #090b10; }
10181
9513
  .result-motion-meta { display: flex; flex-wrap: wrap; gap: 6px; margin: 8px 0; color: var(--muted, #a7afc2); font-size: 11px; }
10182
9514
  .result-motion-meta span { padding: 3px 6px; border: 1px solid var(--line, #313747); border-radius: 999px; }