cozyclay 3.0.3 → 3.1.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.
- package/CHANGELOG.md +67 -0
- package/INSTALL_FOR_AGENTS.md +146 -0
- package/README.md +74 -192
- package/THIRD_PARTY_NOTICES.md +0 -21
- package/bin/agent/agent-routes.mjs +22 -56
- package/bin/agent/agent-runner.mjs +5 -3
- package/bin/agent/main-agent.mjs +70 -0
- package/bin/agent/main-prompt.mjs +17 -0
- package/bin/agent/session-store.mjs +2 -2
- package/bin/agent/studio-prompt.mjs +1 -1
- package/bin/agent/studio-task-routes.mjs +185 -0
- package/bin/agent/studio-tasks.mjs +156 -0
- package/bin/agent/studio-tools.mjs +3 -2
- package/bin/agent/studio-turn-transaction.mjs +76 -0
- package/bin/cozyclay.mjs +5 -7
- package/dist/app/index.html +7 -6
- package/dist/assets/TaskBoard-DdDXMgZm.js +1 -0
- package/dist/assets/app-B2BpfCl2.js +5088 -0
- package/dist/assets/app-BlwOpest.css +1 -0
- package/dist/assets/compile-worker-D0pKioa0.js +5 -0
- package/dist/assets/landing-y3EqDgSZ.js +1 -0
- package/dist/assets/modulepreload-polyfill-P2Xu9kJm.js +1 -0
- package/dist/assets/motion3-compile-B887n77J.js +1 -0
- package/dist/assets/scene-asset-sync-COGOlF5T.css +1 -0
- package/dist/assets/scene-asset-sync-CQzEdsqu.js +13 -0
- package/dist/assets/task-board-BKaM7d-9.js +14 -0
- package/dist/assets/workflow-B8Dhzexj.js +179 -0
- package/dist/assets/x-bot-tpose-body-BusyR3eg.json +1 -0
- package/dist/assets/y-bot-tpose-body-Dy1VKChZ.json +1 -0
- package/dist/cozyclay-package.json +1 -1
- package/dist/greybox-to-video/index.html +2 -3
- package/dist/index.html +7 -57
- package/dist/llms.txt +2 -1
- package/dist/previs-software/index.html +2 -2
- package/dist/privacy/index.html +3 -7
- package/dist/seedance-camera-control/index.html +2 -2
- package/dist/sitemap.xml +5 -5
- package/dist/sw.js +5 -1
- package/dist/thumbs/blank-stage-dark.webp +0 -0
- package/dist/thumbs/blank-stage-light.webp +0 -0
- package/dist/workflow/index.html +5 -4
- package/mcp/mesh-file.mjs +3 -1
- package/mcp/server.mjs +3 -0
- package/package.json +3 -3
- package/src/App.jsx +50 -281
- package/src/analytics.js +3 -148
- package/src/app-stage.jsx +1 -1
- package/src/asset-pane.jsx +5 -10
- package/src/auto-flat.js +10 -0
- package/src/bus-tasks.js +11 -5
- package/src/command-bus.js +1 -1
- package/src/commands/motion3-compile.js +51 -27
- package/src/commands/motion3.js +3 -3
- package/src/commands/project.js +1 -1
- package/src/commands/shot.js +16 -4
- package/src/controls.jsx +0 -11
- package/src/cuts.js +11 -0
- package/src/domains/cast.js +3 -2
- package/src/domains/motion.js +3 -10
- package/src/domains/playback.js +32 -0
- package/src/domains/scenes.js +3 -22
- package/src/domains/shots.js +5 -5
- package/src/dualview.jsx +11 -15
- package/src/hierarchy-panel.css +18 -4
- package/src/hierarchy-panel.jsx +12 -11
- package/src/kits/held.js +3 -2
- package/src/light-blockers.js +2 -2
- package/src/main.jsx +5 -0
- package/src/motion/ground.js +5 -14
- package/src/motion/playback-frame-store.js +79 -0
- package/src/motion/playback-probe.js +16 -0
- package/src/motion/playback-subject.js +7 -0
- package/src/motion/timeline.css +43 -5
- package/src/motion/timeline.jsx +4 -3
- package/src/motion3/body.js +37 -5
- package/src/motion3/carried.js +11 -3
- package/src/motion3/compile-job.js +1 -1
- package/src/motion3/compiler/compile.js +7 -1
- package/src/motion3/compiler/finger-close.js +137 -0
- package/src/motion3/compiler/limbs.js +18 -3
- package/src/motion3/compiler/pose.js +6 -0
- package/src/motion3/compiler/validate-objects.js +17 -2
- package/src/motion3/compiler/validate-parts.js +2 -1
- package/src/motion3/compiler/vocab.js +4 -4
- package/src/motion3/describe.js +2 -2
- package/src/motion3/fix/index.js +5 -3
- package/src/motion3/flight.js +38 -0
- package/src/motion3/free-motion.js +10 -7
- package/src/motion3/load.js +125 -0
- package/src/motion3/mass.js +23 -0
- package/src/motion3/object-keys.js +11 -6
- package/src/motion3/object-pose.js +11 -3
- package/src/motion3/pipeline.js +3 -0
- package/src/motion3/qa/explain.js +3 -1
- package/src/motion3/qa/grasp-checks.js +123 -0
- package/src/motion3/qa/hints-grasp.js +71 -0
- package/src/motion3/qa/index.js +3 -1
- package/src/motion3/qa/object-checks.js +7 -2
- package/src/motion3/qa/patch.js +2 -1
- package/src/motion3/qa/spec-checks.js +10 -1
- package/src/motion3/schema/fields.js +3 -3
- package/src/motion3/schema/topics.js +9 -8
- package/src/motion3/schema/types.js +4 -1
- package/src/motion3/seat.js +84 -0
- package/src/motion3/settle.js +11 -6
- package/src/motion3/shapes.js +70 -0
- package/src/motion3/skills/catch.js +71 -0
- package/src/motion3/skills/index.js +10 -3
- package/src/motion3/skills/info.js +13 -0
- package/src/motion3/skills/throw.js +72 -0
- package/src/object-catalog.jsx +0 -4
- package/src/object-gizmo.jsx +2 -1
- package/src/object-path.js +1 -1
- package/src/panels/ProjectPanel.jsx +42 -21
- package/src/panels/details.css +15 -4
- package/src/popover.js +37 -0
- package/src/posestudio.jsx +15 -10
- package/src/project-browser-art.jsx +19 -0
- package/src/project-browser.css +74 -121
- package/src/project-browser.jsx +36 -60
- package/src/props.jsx +4 -7
- package/src/retired-kinds.js +37 -0
- package/src/scene-objects.js +3 -7
- package/src/scenes.js +4 -5
- package/src/settings-menu.jsx +1 -20
- package/src/shell/BottomDock.jsx +9 -9
- package/src/shell/MenuBar.jsx +1 -9
- package/src/shell/PreferencesDialog.jsx +3 -4
- package/src/shell/ViewportToolbar.jsx +3 -3
- package/src/shell/add-camera-shot.js +11 -0
- package/src/shell/glass-regions.css +3 -2
- package/src/shell/glass.css +0 -5
- package/src/shell/lens-scrub-math.js +51 -0
- package/src/shell/lens-scrub.css +73 -0
- package/src/shell/lens-scrub.jsx +98 -0
- package/src/shell/mode.css +6 -5
- package/src/shell/preferences.css +1 -32
- package/src/shell/shell.css +18 -1
- package/src/shell/studio-shell-context.js +5 -0
- package/src/shot-frame.js +26 -0
- package/src/stage-canvas-rigs.jsx +7 -8
- package/src/stage-characters.jsx +26 -0
- package/src/stage-gizmo.js +43 -0
- package/src/stage-labels-ko.js +0 -6
- package/src/stage-startup-defaults.js +3 -9
- package/src/starter-scenes.js +5 -11
- package/src/studio-agent-commands.js +2 -2
- package/src/studio-agent-protocol.js +2 -7
- package/src/studio-app-binding.js +1 -1
- package/src/studio-elements.js +1 -1
- package/src/styles/themes.css +13 -0
- package/src/styles.css +6 -674
- package/src/text/text-object.jsx +1 -1
- package/src/ui.jsx +8 -16
- package/src/use-embed-bridge.js +3 -6
- package/src/use-render-activity.js +3 -1
- package/src/view-ghosts.jsx +5 -3
- package/src/viewport-visible-rect.js +37 -0
- package/src/workflow/AgentPanel.jsx +75 -42
- package/src/workflow/AgentProgressCard.jsx +1 -1
- package/src/workflow/TaskBoard.jsx +102 -0
- package/src/workflow/TaskInline.jsx +114 -0
- package/src/workflow/agent-client.js +11 -25
- package/src/workflow/agent-panel.css +14 -1
- package/src/workflow/attachment-image.js +10 -3
- package/src/workflow/attachment-video.js +91 -0
- package/src/workflow/task-board.css +98 -0
- package/src/workflow/task-board.js +169 -0
- package/tools/check-eslint.mjs +2 -1
- package/tools/check-knip.mjs +2 -1
- package/tools/dev/pages/greybox-to-video.html +2 -3
- package/tools/dev/pages/previs-software.html +2 -2
- package/tools/dev/pages/privacy.html +3 -7
- package/tools/dev/pages/seedance-camera-control.html +2 -2
- package/tools/dev-full.mjs +11 -2
- package/tools/eslint-baseline.json +6 -6
- package/tools/knip-baseline.json +0 -11
- package/tools/loc-baseline.json +30 -31
- package/tools/metrics-snapshot.mjs +43 -5
- package/tools/render-start-thumbs.mjs +175 -0
- package/tools/run-tests.mjs +7 -14
- package/tools/sitemap.mjs +1 -1
- package/dist/assets/analytics-BibyE5ar.js +0 -6
- package/dist/assets/app-DhRJ-PBz.js +0 -5088
- package/dist/assets/app-f-fkV5uP.css +0 -1
- package/dist/assets/compile-worker-DqiA4AaN.js +0 -5
- package/dist/assets/first-shot-handoff-Qx7SKl38.js +0 -1
- package/dist/assets/landing-DYg87MDY.js +0 -1
- package/dist/assets/scene-asset-sync-DBYQBR0T.js +0 -20
- package/dist/assets/scene-asset-sync-_S8NQl5B.css +0 -1
- package/dist/assets/workflow-BSA22Ofr.js +0 -179
- package/dist/scenes/city-block.cclayproject +0 -1
- package/src/burn-in.js +0 -91
- package/src/camera-tutorial.jsx +0 -520
- package/src/facing-marks.js +0 -88
- package/src/first-shot-handoff.js +0 -44
- package/src/panels/motion.css +0 -197
- package/src/set-pieces.jsx +0 -183
- package/src/tutorial-analytics.js +0 -86
- package/src/tutorial-walk.js +0 -17
- package/src/use-camera-tutorial.js +0 -50
- package/src/use-semantic-state.js +0 -12
- package/tools/metrics/archive-traffic.mjs +0 -138
- 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 (
|
|
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
|
-
/*
|
|
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
|
-
.
|
|
6835
|
-
.app[data-workflow-mode="motion"] .vp-
|
|
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
|
-
.
|
|
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; }
|