Files
Genarrative/apps/ai-game-creator-shell/src/styles.css
T
suzmii ff287c19fc 模型下拉弹层改回以触发钮为锚点,输入区高度变化不再牵动它
- styles.css:direct-codex 控制排里的 .conversation-model-select 由 position: static !important 改为 position: relative !important(只改这一个词,另补一段注释说明它同时是弹层锚点)。这颗容器是 .conversation-model-menu(position: absolute; right: 0; bottom: calc(100% + 8px))与模型提示([role='alert'] / [role='status'],position: absolute; bottom: 36px)的包含块;写成 static 时包含块回落到最近的有定位祖先——也就是 position: absolute 的 composer 盒子,菜单于是出现在整个 composer 上方、与触发钮之间隔着整个输入区,输入区一变高(多行、引用 chip、AI 润色)菜单与提示跟着往上飘:这就是"编辑框把元素挤开"的形态。
- styles.css:right/bottom: auto、flex: 0 1 auto、min-width: 0、max-width: 180px 全部保持原样——relative 不会把模型选择钮移出控制排,也不改它被压缩换行的行为;交互语义零改动(打开/选择/刷新模型、发送、@ 引用、快速模式全在原位)。
- project-development.suite.ts:新增一条声明级守卫。① 弹层不参与父容器流式布局(菜单与模型提示都是 absolute,菜单 bottom: calc(100% + …)、right: 0);② 锚点必须是有定位的容器(relative 且不是 static),同时仍在原位(right/bottom auto、flex 0 1 auto、min-width 0);③ 输入区高度变化不得推动同排操作元素(composer 是底边锚定的两行网格:position: absolute + bottom: 12px + grid-template-rows: auto auto;控制排是单行 flex 且不换行,@ 与发送钮 flex: 0 0 30px 不可压缩,窄屏下被压缩的是可收缩的模型选择钮)。
- conversationModelSelect.test.tsx:新增一条 DOM 守卫——菜单必须是 .conversation-model-select 的直接子节点,且不得成为控制排容器 .project-supervisor-composer-controls-right 的流式子节点。
- 变异验证(均已实测红灯):① 锚点改回 static → "expected … to match /position:\s*relative\s*!important/";② 菜单改成 position: static(弹层回流式)→ "expected … to match /position:\s*absolute/";③ 把菜单渲染挪出触发钮容器(变成同排容器的流式子节点)→ DOM 守卫 "expected null not to be null"。
- 门禁:typecheck exit 0;AGC 子集 1205 passed / 4 skipped / 0 failed(基线 1203 + 本次新增 2 条);src/components/image-editor 1385 passed;check:encoding 4379 文件通过;本次三个文件单独 `git diff --check` exit 0(全量 `git diff --check` 目前报的是另一位 Agent 在途修改的 packages/shared/src/components/styles.css:1281 EOF 空行,与本次无关)。
2026-09-11 14:53:11 +08:00

10185 lines
214 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@import 'tailwindcss';
@source '../../../packages/shared/src/components';
/* 资源画布直接渲染仓库根 src/components/image-editor 下的共享图片画布组件(它们又用到
src/components/common)。这两个目录不在 app 根下,Tailwind 自动探测扫不到,缺了组件
自带的工具类(h-3 / rounded-full / inline-flex …)就会和网页端美术画布长得不一样。 */
@source '../../../src/components/image-editor';
@source '../../../src/components/common';
@import '@genarrative/shared/styles.css';
@import '../../../packages/shared/src/theme.css';
:root {
color: #18202f;
background: #f5f7fb;
font-family: Inter, 'PingFang SC', 'Microsoft YaHei', system-ui, sans-serif;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
}
#root {
height: 100dvh;
min-height: 0;
}
.app-update-notice {
position: fixed;
z-index: 40;
top: calc(var(--window-chrome-height) + 12px);
right: 16px;
display: flex;
align-items: center;
gap: 16px;
max-width: min(520px, calc(100vw - 32px));
padding: 12px 14px;
border: 1px solid #efc9ae;
border-radius: 12px;
background: #fffaf5;
box-shadow: 0 8px 24px rgb(100 49 26 / 16%);
}
.app-update-notice > div {
display: grid;
gap: 3px;
min-width: 0;
}
.app-update-notice strong {
color: #4a220f;
font-size: 13px;
}
.app-update-notice span,
.app-update-notice p {
margin: 0;
color: #8d6a58;
font-size: 11px;
}
.app-update-notice p {
max-width: 320px;
max-height: 120px;
overflow-y: auto;
overflow-wrap: anywhere;
white-space: pre-wrap;
}
.app-update-notice button {
flex: 0 0 auto;
padding: 7px 12px;
border: 0;
border-radius: 8px;
background: #c7653d;
color: white;
cursor: pointer;
font-size: 12px;
font-weight: 700;
}
.app-update-notice button:disabled {
cursor: wait;
opacity: 0.65;
}
.app-update-notice .app-update-close {
display: inline-flex;
align-items: center;
justify-content: center;
width: 28px;
height: 28px;
padding: 0;
border: 0;
border-radius: 6px;
background: transparent;
color: #8d6a58;
cursor: pointer;
}
.app-update-notice .app-update-close:hover {
background: rgb(199 101 61 / 12%);
color: #4a220f;
}
.app-update-notice .app-update-close:disabled {
cursor: wait;
opacity: 0.5;
}
.app-update-overlay {
position: fixed;
z-index: 260;
inset: 0;
display: grid;
padding: 24px;
background: rgb(35 20 12 / 48%);
place-items: center;
pointer-events: auto;
}
.app-update-progress-dialog {
display: grid;
width: min(420px, calc(100vw - 48px));
gap: 12px;
padding: 28px;
border: 1px solid #efc9ae;
border-radius: 18px;
background: #fffaf5;
box-shadow: 0 20px 60px rgb(38 18 8 / 28%);
color: #4a220f;
text-align: center;
}
.app-update-progress-icon {
display: grid;
width: 52px;
height: 52px;
margin: 0 auto;
border-radius: 16px;
background: #f6dfd0;
color: #c7653d;
place-items: center;
}
.app-update-progress-icon .is-spinning {
animation: app-update-spin 0.9s linear infinite;
}
@keyframes app-update-spin {
to {
transform: rotate(360deg);
}
}
.app-update-progress-dialog h2,
.app-update-progress-dialog p,
.app-update-progress-dialog small {
margin: 0;
}
.app-update-progress-dialog h2 {
font-size: 18px;
}
.app-update-progress-dialog p,
.app-update-progress-dialog small {
color: #8d6a58;
font-size: 12px;
}
.app-update-progress-track {
height: 8px;
overflow: hidden;
border-radius: 99px;
background: #f1ded2;
}
.app-update-progress-track span {
display: block;
height: 100%;
border-radius: inherit;
background: #c7653d;
transition: width 180ms ease;
}
.app-update-progress-dialog button {
justify-self: center;
min-width: 96px;
padding: 8px 16px;
border: 0;
border-radius: 8px;
background: #c7653d;
color: #fff;
cursor: pointer;
font-weight: 700;
}
.app-update-progress-actions {
display: flex;
justify-content: center;
gap: 10px;
}
:root {
/* 网页内自绘标题栏占用的顶部高度;portal 到 body 的固定弹层也要从它下方开始。 */
--window-chrome-height: 50px;
}
/* portal 到 body 的全屏固定弹层从标题栏下方开始,避免与自绘标题栏重叠。 */
.fixed.inset-0 {
top: var(--window-chrome-height);
}
/* 桌面壳统一承载标题栏,让 Tauri 与浏览器预览共用同一表面。 */
.window-chrome {
--window-chrome-height: 50px;
--window-chrome-title-side-space: 300px;
position: relative;
display: block;
width: 100%;
height: 100dvh;
min-height: 0;
overflow: hidden;
background: var(--platform-body-fill, #fffdf9);
color: var(--platform-text-strong, #3d1f10);
}
.window-chrome__bar {
position: absolute;
top: 0;
right: 0;
left: 0;
z-index: 30;
display: grid;
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
align-items: center;
min-width: 0;
height: var(--window-chrome-height);
padding: 0;
overflow: visible;
border-bottom: 1px solid var(--platform-surface-border, #ead8cb);
background: radial-gradient(
circle at 16% -80%,
rgb(255 255 255 / 88%),
transparent 38%
),
radial-gradient(circle at 72% 0%, rgb(237 190 151 / 20%), transparent 28%),
var(
--platform-desktop-topbar-fill,
linear-gradient(180deg, #fffefa, #fbf1e9)
);
box-shadow: 0 5px 18px rgb(112 57 30 / 7%);
user-select: none;
-webkit-app-region: drag;
}
.window-chrome__bar::after {
position: absolute;
right: 0;
bottom: -1px;
left: 0;
height: 1px;
background: linear-gradient(
90deg,
transparent,
rgb(199 101 61 / 22%),
transparent
);
content: '';
pointer-events: none;
}
.window-chrome__leading,
.window-chrome__trailing,
.window-chrome__controls,
.window-chrome__brand,
.window-chrome__wallet-slot {
-webkit-app-region: no-drag;
}
.window-chrome__leading,
.window-chrome__trailing {
display: flex;
align-items: center;
min-width: 0;
}
.window-chrome__leading {
grid-column: 1;
position: relative;
z-index: 1;
justify-self: start;
gap: 12px;
padding-left: 12px;
}
.window-chrome__brand {
display: inline-flex;
align-items: center;
flex: 0 0 auto;
gap: 8px;
min-width: 132px;
color: var(--platform-text-strong, #3d1f10);
}
.window-chrome__brand-mark {
display: grid;
width: 32px;
height: 32px;
place-items: center;
border: 1px solid rgb(199 101 61 / 20%);
border-radius: 11px;
background: linear-gradient(145deg, #fffaf2 5%, #f4d8c3 100%);
box-shadow:
0 5px 12px rgb(182 98 63 / 14%),
inset 0 1px 0 rgb(255 255 255 / 90%);
}
.window-chrome__brand-mark img {
width: 27px;
height: 27px;
object-fit: contain;
filter: drop-shadow(0 3px 4px rgb(139 69 39 / 14%));
}
.window-chrome__brand-copy {
display: grid;
gap: 1px;
line-height: 1;
}
.window-chrome__brand-copy strong {
color: var(--platform-brand-logo-title, #4a220f);
font-size: 14px;
font-weight: 800;
letter-spacing: 0.02em;
}
.window-chrome__brand-copy span {
color: var(--platform-brand-logo-subtitle, #c7653d);
font-size: 9px;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.window-chrome__drag-region {
position: absolute;
z-index: 0;
inset: 0;
display: grid;
place-items: center;
width: auto;
min-width: 0;
color: var(--platform-text-muted, #a38f80);
font-size: 11px;
font-weight: 650;
letter-spacing: 0.04em;
cursor: default;
padding-inline: var(--window-chrome-title-side-space);
-webkit-app-region: drag;
}
.window-chrome__title-wrap {
position: relative;
display: block;
min-width: 0;
max-width: min(42vw, 460px, 100%);
}
.window-chrome__title {
display: block;
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.window-chrome__workspace-dot {
position: absolute;
top: 50%;
right: calc(100% + 9px);
width: 6px;
height: 6px;
margin: 0;
border-radius: 50%;
background: var(--platform-accent, #c7653d);
box-shadow: 0 0 0 4px rgb(199 101 61 / 10%);
transform: translateY(-50%);
}
.window-chrome__trailing {
grid-column: 3;
position: relative;
z-index: 1;
justify-self: end;
flex: 0 0 auto;
gap: 12px;
padding-left: 8px;
}
.window-chrome__wallet-slot {
display: flex;
align-items: center;
min-width: 0;
}
.window-chrome__wallet-slot > .launcher-account-bar {
position: static;
top: auto;
right: auto;
}
.window-chrome__controls {
display: flex;
align-self: stretch;
}
.window-chrome__control {
display: grid;
width: 44px;
height: var(--window-chrome-height);
place-items: center;
border: 0;
border-radius: 0;
background: transparent;
color: var(--platform-text-base, #6f5848);
cursor: pointer;
transition:
background 150ms ease,
color 150ms ease;
}
.window-chrome__control:hover,
.window-chrome__control:focus-visible {
background: rgb(204 117 76 / 12%);
color: var(--platform-text-strong, #3d1f10);
outline: none;
}
.window-chrome__control--close:hover,
.window-chrome__control--close:focus-visible {
background: #c7653d;
color: #fffaf5;
}
.window-chrome__content {
position: relative;
z-index: 0;
box-sizing: border-box;
height: 100%;
padding-top: var(--window-chrome-height);
min-width: 0;
min-height: 0;
overflow: hidden;
}
.window-chrome__content > .client-auth-shell,
.window-chrome__content > .launcher-shell,
.window-chrome__content > .app-shell {
height: 100%;
min-height: 0;
}
.window-chrome__content > .launcher-shell > aside {
height: 100%;
min-height: 0;
}
.window-chrome__content > .launcher-shell .launcher-main,
.window-chrome__content > .app-shell.app-shell--dev {
min-height: 0;
}
.window-chrome__content > .app-shell.app-shell--user .chat-pane {
min-height: calc(100% - 48px);
}
.window-chrome__content .launcher-projects-page,
.window-chrome__content .launcher-main:has(.launcher-projects-page) {
height: 100%;
}
.window-chrome__content > .launcher-shell .launcher-main {
height: 100%;
min-height: 0;
padding-bottom: 0;
}
.window-chrome__content > .launcher-shell .launcher-main > .platform-theme {
height: 100%;
min-height: 0;
overflow: auto;
}
.window-chrome__content .launcher-main:has(.game-project-workbench) {
display: flex;
flex-direction: column;
height: 100%;
min-height: 0;
padding-bottom: 0;
}
.window-chrome__content .game-project-workbench {
flex: 1 1 auto;
height: auto;
min-height: 0;
}
.window-chrome__content .game-workbench-layout {
height: 100%;
min-height: 0;
}
@media (max-width: 760px) {
:root {
--window-chrome-height: 46px;
}
.window-chrome {
--window-chrome-height: 46px;
}
.window-chrome__bar {
padding: 0;
}
.window-chrome__brand {
min-width: 38px;
}
.window-chrome__brand-copy,
.window-chrome__title {
display: none;
}
.window-chrome__drag-region {
display: none;
padding-inline: 0;
}
.window-chrome__leading {
gap: 5px;
padding-left: 8px;
}
.window-chrome__trailing {
padding-left: 2px;
}
.window-chrome__control {
width: 40px;
}
}
button,
input,
select,
textarea {
font: inherit;
}
@keyframes ui-editor-status-attention-arrive {
0%,
100% {
transform: scale(1);
}
16%,
50% {
transform: scale(1.012);
}
32%,
68% {
transform: scale(0.996);
}
}
@keyframes ui-editor-status-attention-ring {
0%,
100% {
opacity: 0;
transform: scale(0.96);
}
16%,
48% {
opacity: 0.78;
transform: scale(1.01);
}
32%,
68% {
opacity: 0.2;
transform: scale(1.025);
}
}
@keyframes ui-editor-status-attention-breathe {
0%,
100% {
opacity: 0.32;
transform: scale(0.995);
}
50% {
opacity: 0.7;
transform: scale(1.018);
}
}
.ui-editor-status-attention {
position: relative;
z-index: 0;
isolation: isolate;
border: 2px solid rgb(var(--ui-editor-status-attention-rgb) / 88%);
background: rgb(var(--ui-editor-status-attention-rgb) / 8%);
box-shadow:
0 0 0 4px rgb(var(--ui-editor-status-attention-rgb) / 16%),
0 8px 20px rgb(var(--ui-editor-status-attention-rgb) / 12%);
animation: ui-editor-status-attention-arrive 820ms
cubic-bezier(0.2, 0.8, 0.2, 1);
}
.ui-editor-status-attention::after {
position: absolute;
z-index: -1;
inset: -6px;
border: 2px solid rgb(var(--ui-editor-status-attention-rgb) / 85%);
border-radius: 12px;
content: '';
pointer-events: none;
animation:
ui-editor-status-attention-ring 820ms ease-out,
ui-editor-status-attention-breathe 1.8s ease-in-out 820ms infinite;
}
.ui-editor-status-attention--review {
--ui-editor-status-attention-rgb: 245 158 11;
}
.ui-editor-status-attention--blocked {
--ui-editor-status-attention-rgb: 239 68 68;
}
@media (prefers-reduced-motion: reduce) {
.ui-editor-status-attention,
.ui-editor-status-attention::after {
animation: none;
}
.ui-editor-status-attention::after {
opacity: 0.7;
transform: scale(1.01);
}
}
.client-auth-shell {
display: grid;
min-height: 100vh;
padding: 24px;
overflow-x: hidden;
overflow-y: auto;
background: var(--platform-body-fill);
color: var(--platform-text-strong);
place-items: center;
}
.client-auth-panel {
position: relative;
display: grid;
width: min(360px, 100%);
gap: 16px;
padding: 28px;
overflow: hidden;
border: 1px solid var(--platform-surface-border);
border-radius: 24px;
background: var(--platform-panel-fill);
box-shadow: var(--platform-panel-shadow);
}
.client-auth-panel::before {
position: absolute;
top: -94px;
right: -76px;
width: 204px;
height: 204px;
border-radius: 50%;
background: radial-gradient(
circle,
var(--platform-hero-glow-b),
transparent 68%
);
content: '';
pointer-events: none;
}
.client-auth-logo {
position: relative;
z-index: 1;
width: 56px;
height: 56px;
object-fit: contain;
filter: drop-shadow(0 9px 15px rgb(182 98 63 / 18%));
}
.client-auth-panel h1 {
position: relative;
z-index: 1;
margin: 0;
font-size: 24px;
letter-spacing: 0;
}
.client-auth-panel p {
position: relative;
z-index: 1;
margin: 6px 0 0;
color: var(--platform-text-soft);
font-size: 13px;
}
.client-auth-panel label {
position: relative;
z-index: 1;
display: grid;
gap: 7px;
color: var(--platform-text-base);
font-size: 13px;
font-weight: 700;
}
.client-auth-panel input {
height: 38px;
min-width: 0;
padding: 0 11px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 12px;
background: var(--platform-input-fill);
color: var(--platform-text-strong);
font: inherit;
transition:
border-color 160ms ease,
box-shadow 160ms ease,
background 160ms ease;
}
.client-auth-panel select {
height: 38px;
min-width: 0;
padding: 0 11px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 12px;
background: var(--platform-input-fill);
color: var(--platform-text-strong);
font: inherit;
transition:
border-color 160ms ease,
box-shadow 160ms ease,
background 160ms ease;
}
.client-auth-panel select:focus {
border-color: var(--platform-surface-hover-border);
outline: 2px solid var(--platform-input-focus-ring);
background: var(--platform-input-fill-focus);
}
.client-auth-panel input:focus {
border-color: var(--platform-surface-hover-border);
outline: 2px solid var(--platform-input-focus-ring);
background: var(--platform-input-fill-focus);
}
.client-auth-panel button {
position: relative;
z-index: 1;
height: 38px;
border: 1px solid var(--platform-button-primary-border);
border-radius: 12px;
background: var(--platform-button-primary-fill);
box-shadow: var(--platform-profile-action-shadow);
color: var(--platform-button-primary-text);
font-weight: 700;
cursor: pointer;
transition:
transform 160ms ease,
box-shadow 160ms ease,
filter 160ms ease;
}
.client-auth-panel button:not(:disabled):hover {
filter: brightness(1.04);
transform: translateY(-1px);
}
.client-auth-panel button:not(:disabled):active {
translate: 0 0;
}
.client-auth-panel button:disabled {
cursor: default;
opacity: 0.62;
}
.client-auth-tabs {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 6px;
padding: 4px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 14px;
background: var(--platform-subpanel-fill);
}
.client-auth-tabs button {
border-color: transparent;
background: transparent;
box-shadow: none;
color: var(--platform-text-soft);
}
.client-auth-tabs button.is-active {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
box-shadow: 0 8px 18px rgb(182 98 63 / 18%);
color: var(--platform-button-primary-text);
}
.client-auth-code-row {
display: grid;
grid-template-columns: minmax(0, 1fr) 104px;
gap: 10px;
align-items: end;
}
.client-auth-code-row button {
padding: 0 10px;
white-space: nowrap;
}
.client-auth-status {
min-height: 18px;
overflow-wrap: anywhere;
}
@media (max-width: 480px) {
.client-auth-shell {
padding: 16px;
}
.client-auth-panel {
padding: 24px;
border-radius: 20px;
}
}
.launcher-shell {
--launcher-sidebar-width: 64px;
display: grid;
grid-template-columns: var(--launcher-sidebar-width) minmax(0, 1fr);
min-height: 100vh;
background: #fff;
color: #171717;
}
.launcher-shell.platform-theme {
background: var(--platform-body-fill);
color: var(--platform-text-strong);
}
.launcher-shell.platform-theme .launcher-main {
background: var(--platform-body-fill);
}
.launcher-shell.platform-theme .launcher-promo {
background: var(--platform-warm-bg);
color: var(--platform-warm-text);
}
.launcher-shell.platform-theme .launcher-promo button {
color: var(--platform-warm-text);
}
.launcher-shell.platform-theme .launcher-countdown {
border-color: var(--platform-subpanel-border);
background: var(--platform-subpanel-fill);
color: var(--platform-text-strong);
}
.launcher-promo button {
border: 0;
cursor: pointer;
}
.launcher-main {
position: relative;
display: grid;
grid-template-columns: minmax(0, 1fr);
grid-template-rows: auto auto auto;
align-content: start;
min-width: 0;
min-height: 100vh;
padding: 0 0 42px;
overflow: hidden;
}
.launcher-promo {
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
min-height: 32px;
padding: 0 220px 0 24px;
background: #dfff4b;
color: #111;
font-size: 13px;
white-space: nowrap;
}
.launcher-promo strong {
font-weight: 700;
}
.launcher-promo button {
padding: 0;
background: transparent;
color: #111;
font-weight: 700;
text-decoration: underline;
}
.launcher-countdown {
display: grid;
min-width: 18px;
height: 20px;
padding: 0 5px;
border-radius: 7px;
background: #fff;
place-items: center;
}
.launcher-account-bar {
position: absolute;
top: 16px;
right: 22px;
display: flex;
align-items: center;
gap: 0;
z-index: 2;
}
.launcher-main-with-promo .launcher-account-bar {
top: 44px;
}
.launcher-project-list-actions {
display: flex;
align-items: center;
gap: 10px;
}
.launcher-project-create > button {
display: grid;
border-style: dashed;
color: #777;
place-items: center;
}
.launcher-project-thumb {
display: grid;
place-items: center;
}
.launcher-project-thumb span {
display: grid;
width: 54px;
height: 54px;
border-radius: 14px;
background: #fff;
color: #f26d2d;
font-size: 18px;
font-weight: 800;
place-items: center;
box-shadow: 0 8px 22px rgb(242 109 45 / 16%);
}
.launcher-page {
display: grid;
gap: 22px;
width: min(1054px, calc(100vw - 122px));
margin: 0 auto;
padding: 118px 0 0;
}
.launcher-projects-page {
display: flex;
flex-direction: column;
gap: 18px;
width: calc(100vw - var(--launcher-sidebar-width));
max-width: none;
flex: 1 1 auto;
height: 100dvh;
min-height: 0;
margin: 0;
padding: 92px 28px 24px;
overflow: hidden;
}
.launcher-main:has(.launcher-projects-page) {
display: flex;
flex-direction: column;
height: 100dvh;
min-height: 0;
padding-bottom: 0;
}
.launcher-page header {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 24px;
}
.launcher-page h1 {
margin: 0;
color: #111827;
font-size: 28px;
letter-spacing: 0;
}
.launcher-page p {
margin: 8px 0 0;
color: #8b8b8b;
font-size: 13px;
}
.launcher-project-runtime-summary {
display: block;
margin-top: 5px;
color: #687386;
font-size: 11px;
overflow-wrap: anywhere;
}
.launcher-page-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.launcher-page-actions button,
.launcher-page .launcher-project-list-actions button,
.launcher-empty-projects button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-height: 36px;
padding: 0 12px;
border: 1px solid var(--platform-surface-border);
border-radius: 9px;
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
font-size: 12px;
font-weight: 700;
white-space: nowrap;
cursor: pointer;
}
.launcher-page .launcher-project-list-actions button:disabled,
.launcher-empty-projects button:disabled {
cursor: not-allowed;
opacity: 0.55;
}
.launcher-projects-page button:focus-visible,
.launcher-project-search input:focus-visible {
outline: 3px solid var(--platform-warm-text);
outline-offset: 2px;
}
.launcher-projects-toolbar {
display: grid;
grid-template-columns: minmax(160px, 1fr) auto;
align-items: center;
gap: 24px;
}
.launcher-projects-heading {
min-width: 0;
}
.launcher-projects-controls {
display: flex;
align-items: center;
gap: 10px;
}
.launcher-project-search {
display: flex;
align-items: center;
width: clamp(260px, 28vw, 390px);
height: 38px;
gap: 8px;
padding: 0 10px;
border: 1px solid var(--platform-surface-border);
border-radius: 9px;
background: var(--platform-input-fill);
color: var(--platform-text-soft);
}
.launcher-project-search:focus-within {
border-color: var(--platform-surface-hover-border);
box-shadow: 0 0 0 3px var(--platform-input-focus-ring);
}
.launcher-project-search input {
min-width: 0;
flex: 1;
border: 0;
outline: 0;
background: transparent;
color: var(--platform-text-strong);
font: inherit;
font-size: 13px;
}
.launcher-project-search button {
display: grid;
width: 24px;
height: 24px;
padding: 0;
border: 0;
border-radius: 6px;
background: transparent;
color: var(--platform-text-soft);
cursor: pointer;
place-items: center;
}
.launcher-project-actions {
display: flex;
align-items: center;
gap: 8px;
}
.launcher-project-actions button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 38px;
gap: 7px;
padding: 0 14px;
border: 1px solid var(--platform-surface-border);
border-radius: 9px;
font-size: 12px;
font-weight: 800;
white-space: nowrap;
cursor: pointer;
}
.launcher-project-actions button:disabled {
cursor: not-allowed;
opacity: 0.55;
}
.launcher-project-actions .launcher-project-open-action {
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
}
.launcher-project-actions .launcher-project-create-action {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
.launcher-project-page-status {
min-height: 18px;
}
.launcher-project-list-shell {
display: flex;
flex-direction: column;
flex: 1 1 auto;
min-height: 0;
overflow: hidden;
border: 1px solid var(--platform-surface-border);
border-radius: 12px;
background: var(--platform-subpanel-fill);
box-shadow: var(--platform-panel-shadow);
}
.launcher-project-table-header,
.launcher-project-table article {
display: grid;
grid-template-columns:
minmax(360px, 1fr) minmax(120px, 160px) minmax(150px, 190px)
104px;
align-items: center;
min-width: 0;
}
.launcher-project-table-header {
height: 42px;
flex-shrink: 0;
padding: 0 14px;
border-bottom: 1px solid var(--platform-surface-border);
background: color-mix(
in srgb,
var(--platform-subpanel-fill) 82%,
var(--platform-warm-bg)
);
color: var(--platform-text-soft);
font-size: 11px;
font-weight: 800;
letter-spacing: 0.03em;
}
.launcher-project-table-header span:last-child {
text-align: center;
}
.launcher-project-table {
display: grid;
align-content: start;
flex: 1 1 auto;
min-height: 0;
overflow-y: auto;
}
.launcher-project-table article {
min-height: 66px;
padding: 0 14px;
border-bottom: 1px solid var(--platform-surface-border);
background: var(--platform-subpanel-fill);
transition: background 120ms ease;
}
.launcher-project-table article:last-child {
border-bottom: 0;
}
.launcher-project-table
article:has(.launcher-project-row-main:not(:disabled)):hover {
background: var(--platform-nav-item-hover-fill);
}
.launcher-project-table article > .launcher-project-row-main {
display: flex;
align-items: center;
justify-content: flex-start;
width: 100%;
height: 100%;
min-width: 0;
gap: 12px;
padding: 0;
border: 0;
background: transparent;
color: inherit;
text-align: left;
cursor: pointer;
}
.launcher-project-table article > .launcher-project-rename {
display: flex;
align-items: center;
justify-content: flex-start;
width: 100%;
height: 100%;
min-width: 0;
gap: 12px;
}
.launcher-project-rename label {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0 0 0 0);
white-space: nowrap;
}
.launcher-project-rename input {
width: min(100%, 320px);
min-width: 0;
min-height: 30px;
padding: 0 8px;
border: 1px solid var(--platform-surface-border);
border-radius: 7px;
color: var(--platform-text-strong);
font-size: 13px;
font-weight: 700;
}
.launcher-project-rename input:focus-visible {
border-color: var(--platform-warm-text);
outline: 2px solid transparent;
}
.launcher-project-rename-error {
color: #a64735 !important;
}
.launcher-project-rename-actions {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 5px;
justify-self: end;
width: 100%;
}
.launcher-project-rename-actions button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 28px;
gap: 3px;
padding: 0 7px;
border-radius: 7px;
font-size: 11px;
font-weight: 700;
}
.launcher-project-rename-actions button:first-child {
border: 0;
background: var(--platform-warm-text);
color: #fff;
}
.launcher-project-rename-actions button:last-child {
border: 1px solid var(--platform-surface-border);
background: transparent;
color: var(--platform-text-strong);
}
.launcher-project-table article > .launcher-project-row-main:disabled {
cursor: not-allowed;
opacity: 0.62;
}
.launcher-project-kind-icon {
display: grid;
width: 34px;
height: 34px;
flex: 0 0 auto;
border-radius: 9px;
background: var(--platform-warm-bg);
color: var(--platform-warm-text);
place-items: center;
}
.launcher-project-name-cell {
display: grid;
min-width: 0;
gap: 4px;
}
.launcher-project-table article strong {
display: block;
overflow: hidden;
color: var(--platform-text-strong);
font-size: 13px;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-project-table article small {
display: block;
width: 100%;
min-width: 0;
max-width: 100%;
margin: 0;
color: var(--platform-text-soft);
font-size: 11px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-project-kind-cell {
overflow: hidden;
padding-right: 16px;
color: var(--platform-text-base);
font-size: 12px;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-project-status {
display: inline-flex;
align-items: center;
justify-self: start;
max-width: calc(100% - 12px);
min-height: 24px;
gap: 5px;
overflow: hidden;
padding: 0 8px;
border-radius: 999px;
font-size: 11px;
font-weight: 700;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-project-status-ready {
background: color-mix(in srgb, #2d9d62 12%, transparent);
color: #237b4d;
}
.launcher-project-status-checking {
background: color-mix(in srgb, var(--platform-warm-text) 12%, transparent);
color: var(--platform-warm-text);
}
.launcher-project-status-warning {
background: color-mix(in srgb, #d15f45 12%, transparent);
color: #a64735;
}
.launcher-project-more {
position: relative;
display: grid;
justify-self: center;
}
.launcher-project-more-trigger {
display: grid;
width: 34px;
height: 34px;
padding: 0;
border: 0;
border-radius: 8px;
background: transparent;
color: var(--platform-text-soft);
cursor: pointer;
place-items: center;
}
.launcher-project-more-trigger:hover,
.launcher-project-more-trigger[aria-expanded='true'] {
background: var(--platform-nav-item-hover-fill);
color: var(--platform-text-strong);
}
.launcher-project-more-menu {
position: absolute;
top: 38px;
right: 0;
z-index: 20;
display: grid;
width: 164px;
gap: 4px;
padding: 6px;
border: 1px solid var(--platform-surface-border);
border-radius: 10px;
background: var(--platform-subpanel-fill);
box-shadow: 0 16px 34px rgb(75 47 32 / 18%);
}
.launcher-project-more-menu-drop-up {
top: auto;
bottom: 38px;
}
.launcher-project-more-menu button {
display: flex;
align-items: center;
justify-content: flex-start;
min-height: 34px;
gap: 8px;
padding: 0 9px;
border: 0;
border-radius: 7px;
background: transparent;
color: var(--platform-text-strong);
font-size: 12px;
font-weight: 700;
cursor: pointer;
}
.launcher-project-more-menu button:hover {
background: var(--platform-nav-item-hover-fill);
}
.launcher-project-more-menu button:disabled {
cursor: not-allowed;
opacity: 0.45;
}
.launcher-project-more-menu .launcher-project-remove-action {
color: #a64735;
}
.launcher-empty-projects {
display: grid;
justify-items: center;
gap: 12px;
min-height: 260px;
padding: 48px;
color: var(--platform-text-soft);
}
.launcher-empty-projects strong {
color: #111827;
font-size: 15px;
}
.launcher-help-cards {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
}
.launcher-help-cards article {
display: grid;
min-height: 118px;
padding: 18px;
border: 1px solid #e5e7eb;
border-radius: 8px;
background: #fff;
color: #111827;
font-size: 14px;
font-weight: 700;
align-content: end;
}
.launcher-agent-chat-page {
padding-top: 92px;
}
.launcher-agent-chat-page > header .launcher-project-list-actions button {
height: 34px;
padding: 0 12px;
border: 1px solid #d8dde5;
border-radius: 6px;
background: #fff;
color: #111827;
font-size: 12px;
white-space: nowrap;
}
.launcher-agent-chat-page
> header
.launcher-project-list-actions
button:last-child {
border-color: #111827;
background: #111827;
color: #fff;
}
.launcher-agent-chat-layout {
display: grid;
grid-template-columns: minmax(220px, 0.3fr) minmax(0, 1fr);
align-items: start;
gap: 12px;
width: 100%;
min-width: 0;
min-height: min(620px, calc(100vh - 168px));
}
.launcher-agent-chat-sidebar,
.launcher-agent-chat-main {
min-width: 0;
border: 1px solid #e5e7eb;
border-radius: 8px;
background: #fff;
}
.launcher-agent-chat-sidebar {
display: grid;
align-content: start;
gap: 12px;
padding: 12px;
}
.launcher-agent-chat-project {
display: grid;
gap: 10px;
}
.launcher-agent-chat-project label {
display: grid;
gap: 6px;
color: #6b7280;
font-size: 12px;
}
.launcher-agent-chat-project input {
min-width: 0;
height: 34px;
padding: 0 10px;
border: 1px solid #d8dde5;
border-radius: 8px;
color: #111827;
background: #fff;
}
.launcher-agent-picker {
display: grid;
gap: 8px;
max-height: 450px;
overflow: auto;
}
.launcher-agent-picker button {
display: grid;
justify-items: start;
gap: 5px;
min-width: 0;
padding: 10px;
border: 1px solid #e5e7eb;
border-radius: 8px;
background: #fff;
color: #111827;
text-align: left;
}
.launcher-agent-picker .launcher-agent-active {
border-color: #8b5cf6;
background: #f8f2ff;
}
.launcher-agent-picker strong,
.launcher-agent-picker span,
.launcher-agent-picker small {
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-agent-picker strong {
font-size: 13px;
}
.launcher-agent-picker span,
.launcher-agent-picker small {
color: #6b7280;
font-size: 11px;
}
.launcher-agent-chat-main {
display: grid;
grid-template-rows: auto auto auto auto clamp(260px, 40vh, 380px) auto;
align-content: start;
width: 100%;
overflow: visible;
}
.launcher-agent-chat-main > header {
display: flex;
justify-content: space-between;
gap: 12px;
padding: 14px;
border-bottom: 1px solid #e5e7eb;
}
.launcher-agent-chat-main h2,
.launcher-agent-chat-main p {
margin: 0;
}
.launcher-agent-chat-main h2 {
color: #111827;
font-size: 16px;
}
.launcher-agent-chat-main p,
.launcher-agent-chat-main small {
color: #6b7280;
font-size: 12px;
}
.launcher-agent-session-bar {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 8px;
min-width: 0;
padding: 8px 12px;
border-bottom: 1px solid #e5e7eb;
background: #f8fafc;
}
.launcher-agent-session-actions,
.launcher-agent-session-list {
display: flex;
align-items: center;
gap: 6px;
}
.launcher-agent-session-actions button {
display: grid;
width: 30px;
height: 30px;
padding: 0;
border: 1px solid #d8dde5;
border-radius: 6px;
background: #fff;
color: #374151;
place-items: center;
}
.launcher-agent-session-list {
min-width: 0;
overflow-x: auto;
}
.launcher-agent-session-list button {
display: flex;
flex: 0 0 auto;
align-items: center;
gap: 7px;
max-width: 190px;
height: 30px;
padding: 0 9px;
border: 1px solid #d8dde5;
border-radius: 6px;
background: #fff;
color: #374151;
}
.launcher-agent-session-list button span {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-agent-session-list button small {
flex: 0 0 auto;
}
.launcher-agent-session-list .launcher-agent-session-active {
border-color: #7c3aed;
background: #f5f0ff;
color: #5b21b6;
}
.launcher-agent-session-list .launcher-agent-session-archived {
border-style: dashed;
color: #6b7280;
}
.launcher-agent-session-status {
max-width: 180px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-agent-chat-messages {
grid-row: 5;
display: grid;
align-content: start;
gap: 10px;
height: clamp(260px, 40vh, 380px);
min-height: 260px;
max-height: 380px;
padding: 14px;
overflow-y: auto;
overscroll-behavior: contain;
scrollbar-gutter: stable;
}
.launcher-agent-chat-messages .message {
max-width: min(720px, 88%);
margin: 0;
padding: 9px 12px;
border-radius: 14px;
line-height: 1.55;
}
.launcher-agent-chat-messages .message--user {
justify-self: end;
border: 1px solid #d8c4a8;
border-radius: 14px 14px 4px;
background: #fff7ed;
color: #8a4b08;
}
.launcher-agent-chat-waiting {
position: sticky;
bottom: 0;
display: flex;
align-items: center;
gap: 9px;
width: fit-content;
max-width: 100%;
padding: 9px 11px;
border: 1px solid #d8dde5;
border-radius: 8px;
background: #f8fafc;
box-shadow: 0 4px 12px rgb(15 23 42 / 8%);
color: #374151;
}
.launcher-agent-chat-waiting > span {
width: 14px;
height: 14px;
flex: 0 0 auto;
border: 2px solid #cbd5e1;
border-top-color: #111827;
border-radius: 50%;
animation: launcher-agent-chat-spin 0.8s linear infinite;
}
.launcher-agent-chat-waiting strong {
display: block;
min-width: 0;
font-size: 12px;
overflow-wrap: anywhere;
}
.launcher-agent-chat-waiting small {
display: block;
margin-top: 2px;
color: #6b7280;
font-size: 11px;
}
@keyframes launcher-agent-chat-spin {
to {
transform: rotate(360deg);
}
}
@media (prefers-reduced-motion: reduce) {
.launcher-agent-chat-waiting > span {
animation: none;
}
}
.launcher-agent-chat-composer {
grid-row: 6;
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
align-items: center;
gap: 8px;
padding: 12px;
border-top: 1px solid #e5e7eb;
}
.launcher-agent-chat-composer input {
min-width: 0;
height: 36px;
padding: 0 12px;
border: 1px solid #d8dde5;
border-radius: 8px;
color: #111827;
background: #fff;
}
.launcher-agent-chat-composer button {
height: 36px;
padding: 0 14px;
border: 0;
border-radius: 8px;
background: #111827;
color: #fff;
}
.launcher-agent-chat-mode {
display: grid;
grid-template-columns: repeat(3, auto);
gap: 2px;
padding: 2px;
border: 1px solid #d8dde5;
border-radius: 8px;
background: #f3f4f6;
}
.launcher-agent-chat-mode button {
height: 30px;
padding: 0 9px;
border-radius: 6px;
background: transparent;
color: #6b7280;
font-size: 12px;
}
.launcher-agent-chat-mode button.is-active {
background: #fff;
box-shadow: 0 1px 2px rgb(15 23 42 / 10%);
color: #111827;
}
.launcher-agent-goal-composer-summary {
min-width: 0;
height: 36px;
padding: 0 12px;
border: 1px solid #d8dde5;
border-radius: 8px;
background: #f8fafc;
color: #44536a;
font-size: 12px;
line-height: 34px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-agent-runtime-stack {
display: grid;
gap: 8px;
}
.launcher-agent-runtime-stack .agent-runtime-status {
margin-top: 0;
}
.launcher-agent-goal-status {
display: grid;
gap: 7px;
margin: 12px 14px 0;
padding: 10px 12px;
border: 1px solid #cbd5e1;
border-radius: 8px;
background: #fff;
color: #111827;
}
.launcher-agent-goal-status header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 10px;
}
.launcher-agent-goal-status header > div:first-child,
.launcher-agent-goal-copy {
display: grid;
min-width: 0;
gap: 3px;
}
.launcher-agent-goal-status strong {
font-size: 13px;
}
.launcher-agent-goal-status p,
.launcher-agent-goal-status small {
margin: 0;
color: #647084;
font-size: 12px;
overflow-wrap: anywhere;
}
.launcher-agent-goal-actions {
display: flex;
flex: 0 0 auto;
flex-wrap: wrap;
justify-content: flex-end;
gap: 6px;
}
.launcher-agent-goal-actions button {
display: inline-flex;
align-items: center;
gap: 5px;
height: 28px;
padding: 0 9px;
border: 1px solid #d8dde5;
border-radius: 7px;
background: #fff;
color: #111827;
font-size: 12px;
}
.launcher-agent-goal-actions button:disabled {
background: #eef2f7;
color: #9aa3b2;
}
.agent-llm-warning {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
margin: 12px 14px 0;
padding: 10px 12px;
border: 1px solid #f4c7a1;
border-radius: 8px;
background: #fff7ed;
color: #8a3b12;
font-size: 13px;
}
.agent-llm-warning strong {
min-width: 0;
font-weight: 700;
overflow-wrap: anywhere;
}
.agent-llm-warning button {
flex: 0 0 auto;
height: 30px;
padding: 0 10px;
border: 1px solid #f4c7a1;
border-radius: 7px;
background: #fff;
color: #8a3b12;
}
.agent-runtime-status {
display: grid;
gap: 6px;
margin: 12px 14px 0;
padding: 10px 12px;
border: 1px solid #d8dde5;
border-radius: 8px;
background: #f8fafd;
color: #111827;
}
.agent-conversation-panel > .agent-runtime-status {
margin: 0;
}
.agent-runtime-status header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.agent-runtime-status .agent-runtime-status-header-actions {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
}
.agent-runtime-status-header-actions small {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.agent-runtime-status .agent-runtime-collapse-toggle {
display: grid;
width: 28px;
height: 28px;
flex: 0 0 auto;
padding: 0;
border: 1px solid #d8dde5;
border-radius: 7px;
background: #fff;
color: #44536a;
cursor: pointer;
place-items: center;
}
.agent-runtime-status .agent-runtime-collapse-toggle:hover,
.agent-runtime-status .agent-runtime-collapse-toggle:focus-visible {
border-color: #aeb8c7;
background: #f3f6fa;
}
.agent-runtime-status .agent-runtime-status-details {
display: grid;
gap: 6px;
}
.agent-runtime-status .agent-runtime-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.agent-runtime-status .agent-runtime-actions button {
height: 28px;
padding: 0 10px;
border: 1px solid #d8dde5;
border-radius: 7px;
background: #fff;
color: #111827;
font-size: 12px;
}
.agent-runtime-status .agent-runtime-actions button:disabled {
color: #9aa3b2;
background: #eef2f7;
}
.agent-runtime-status strong {
font-size: 13px;
}
.agent-runtime-status p,
.agent-runtime-status ol {
margin: 0;
}
.agent-runtime-status p,
.agent-runtime-status li,
.agent-runtime-status small {
color: #647084;
font-size: 12px;
overflow-wrap: anywhere;
}
.agent-runtime-status ol {
display: grid;
gap: 3px;
padding-left: 18px;
}
.agent-runtime-status div {
display: grid;
gap: 3px;
}
.agent-runtime-status .agent-runtime-event-toggle {
justify-self: start;
min-height: 24px;
padding: 0;
border: 0;
background: transparent;
color: #44536a;
font-size: 12px;
text-decoration: underline;
text-underline-offset: 2px;
}
.agent-runtime-status .agent-runtime-user-input {
display: grid;
gap: 10px;
padding-top: 10px;
border-top: 1px solid #d8dde5;
}
.agent-runtime-user-input header small {
color: #8a3b12;
}
.agent-runtime-user-input fieldset {
display: grid;
min-width: 0;
gap: 8px;
margin: 0;
padding: 0;
border: 0;
}
.agent-runtime-user-input legend {
padding: 0;
color: #111827;
font-size: 12px;
font-weight: 700;
}
.agent-runtime-user-input-options {
grid-template-columns: repeat(auto-fit, minmax(168px, 1fr));
gap: 8px;
}
.agent-runtime-user-input-options button {
display: grid;
min-height: 56px;
gap: 3px;
padding: 8px 10px;
border: 1px solid #cfd6e1;
border-radius: 7px;
background: #fff;
color: #111827;
text-align: left;
cursor: pointer;
}
.agent-runtime-user-input-options button:hover,
.agent-runtime-user-input-options button:focus-visible {
border-color: #9da8b8;
background: #f5f7fa;
}
.agent-runtime-user-input-options button[aria-pressed='true'] {
border-color: #e46f2c;
background: #fff7ed;
box-shadow: inset 0 0 0 1px #e46f2c;
}
.agent-runtime-user-input-options button:disabled {
cursor: default;
opacity: 0.68;
}
.agent-runtime-user-input textarea {
width: 100%;
min-height: 58px;
padding: 8px 10px;
border: 1px solid #cfd6e1;
border-radius: 7px;
background: #fff;
color: #111827;
font: inherit;
line-height: 1.45;
resize: vertical;
}
.agent-runtime-user-input textarea:focus-visible {
border-color: #e46f2c;
outline: 2px solid rgb(228 111 44 / 16%);
outline-offset: 1px;
}
.agent-runtime-user-input .agent-runtime-user-input-submit {
justify-self: end;
min-height: 32px;
padding: 0 12px;
border: 1px solid #cf5f22;
border-radius: 7px;
background: #e46f2c;
color: #fff;
font-size: 12px;
font-weight: 700;
}
.agent-runtime-user-input .agent-runtime-user-input-submit:disabled {
border-color: #cfd6e1;
background: #e8ecf2;
color: #8b95a5;
}
.agent-runtime-status .agent-runtime-user-input-missing {
padding-top: 8px;
border-top: 1px solid #d8dde5;
color: #9a3412;
}
.launcher-project-development {
padding-top: 92px;
}
.launcher-development-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
}
.launcher-development-grid article,
.launcher-development-canvas,
.launcher-development-assets {
border: 1px solid #e5e7eb;
border-radius: 8px;
background: #fff;
}
.launcher-development-grid article {
display: grid;
align-content: start;
gap: 8px;
min-height: 108px;
padding: 14px;
}
.launcher-development-grid span,
.launcher-development-assets h2 {
color: #6b7280;
font-size: 12px;
font-weight: 500;
}
.launcher-development-grid strong {
min-width: 0;
color: #111827;
font-size: 15px;
overflow-wrap: anywhere;
}
.launcher-development-grid small {
color: #8b8b8b;
font-size: 11px;
}
.launcher-development-canvas {
display: grid;
min-height: 300px;
background: linear-gradient(#f3f4f6 1px, transparent 1px),
linear-gradient(90deg, #f3f4f6 1px, transparent 1px), #fff;
background-size: 24px 24px;
place-items: center;
}
.launcher-development-canvas > div {
display: grid;
justify-items: center;
gap: 8px;
color: #6b7280;
}
.launcher-development-canvas strong {
color: #111827;
font-size: 16px;
}
.launcher-development-assets {
display: grid;
gap: 8px;
padding: 14px;
}
.launcher-development-assets h2,
.launcher-development-assets p {
margin: 0;
}
.launcher-development-assets div {
display: grid;
grid-template-columns: minmax(0, 0.45fr) minmax(0, 1fr);
gap: 12px;
min-height: 32px;
align-items: center;
}
.launcher-development-assets span,
.launcher-development-assets small {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-development-assets span {
color: #111827;
font-size: 12px;
}
.launcher-development-assets small,
.launcher-development-assets p {
color: #6b7280;
font-size: 12px;
}
.supervisor-chat-only-shell {
display: grid;
grid-template-rows: 64px minmax(0, 1fr) auto;
width: 100%;
height: 100vh;
min-width: 0;
min-height: 480px;
overflow: hidden;
background: #f5f6f8;
color: #111827;
}
.supervisor-chat-only-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
min-width: 0;
padding: 0 18px;
border-bottom: 1px solid #e1e5eb;
background: #fff;
}
.supervisor-chat-only-header > div,
.supervisor-chat-only-header-status {
display: flex;
align-items: center;
min-width: 0;
}
.supervisor-chat-only-header > div:first-child {
gap: 10px;
}
.supervisor-chat-only-header strong {
flex: 0 0 auto;
font-size: 15px;
}
.supervisor-chat-only-header span {
min-width: 0;
overflow: hidden;
color: #6b7280;
font-size: 12px;
text-overflow: ellipsis;
white-space: nowrap;
}
.supervisor-chat-only-header-status {
justify-content: flex-end;
gap: 10px;
max-width: 52%;
}
.supervisor-chat-only-header-status button {
display: grid;
width: 34px;
height: 34px;
flex: 0 0 auto;
padding: 0;
border: 1px solid #d8dde5;
border-radius: 6px;
background: #fff;
color: #374151;
place-items: center;
}
.supervisor-chat-only-message-list {
display: flex;
flex-direction: column;
gap: 10px;
min-width: 0;
min-height: 0;
padding: 22px clamp(16px, 4vw, 40px);
border: 0;
overflow-y: auto;
overscroll-behavior: contain;
scrollbar-gutter: stable;
}
.supervisor-chat-only-message-list .message {
display: grid;
gap: 5px;
align-self: flex-start;
width: fit-content;
max-width: min(720px, 86%);
margin: 0;
padding: 10px 12px;
border: 1px solid #dfe3e9;
border-radius: 8px;
background: #fff;
color: #263142;
line-height: 1.55;
}
.supervisor-chat-only-message-list .message--user {
align-self: flex-end;
border-color: #cfd6df;
background: #e9edf2;
color: #111827;
}
.supervisor-chat-only-message-list .supervisor-chat-only-stream {
border-color: #b9d8c5;
}
.supervisor-chat-only-waiting {
position: static;
align-self: flex-start;
}
.supervisor-chat-only-runtime-controls {
align-self: stretch;
width: 100%;
max-width: 720px;
}
.supervisor-chat-only-runtime-controls .agent-runtime-user-input {
display: grid;
gap: 10px;
padding: 14px;
border: 1px solid #d8dde5;
border-radius: 8px;
background: #f7f8fa;
}
.supervisor-chat-only-runtime-controls .agent-runtime-user-input header {
display: grid;
gap: 3px;
}
.supervisor-chat-only-runtime-controls .pending-command,
.supervisor-chat-only-runtime-controls .agent-runtime-user-input {
margin: 0;
}
.supervisor-chat-only-runtime-controls .pending-command {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
}
.pending-command-actions {
display: flex;
align-items: center;
gap: 8px;
flex: 0 0 auto;
}
.supervisor-chat-only-composer {
display: grid;
grid-template-columns: minmax(0, 1fr) 42px;
align-items: end;
gap: 10px;
padding: 14px clamp(16px, 4vw, 40px) 18px;
border-top: 1px solid #e1e5eb;
background: #fff;
}
.supervisor-chat-only-composer textarea {
width: 100%;
min-width: 0;
height: 74px;
max-height: 74px;
padding: 11px 12px;
overflow-y: auto;
resize: none;
border: 1px solid #cfd6df;
border-radius: 8px;
background: #fff;
color: #111827;
font: inherit;
line-height: 1.5;
}
.supervisor-chat-only-composer textarea:focus-visible {
border-color: #6b7280;
outline: 2px solid rgb(107 114 128 / 18%);
outline-offset: 1px;
}
.supervisor-chat-only-composer button {
display: grid;
width: 42px;
height: 42px;
padding: 0;
border: 0;
border-radius: 8px;
background: #111827;
color: #fff;
place-items: center;
}
.supervisor-chat-only-composer button:disabled,
.supervisor-chat-only-composer textarea:disabled {
cursor: not-allowed;
opacity: 0.55;
}
.local-game-preview-frame {
position: relative;
width: 100%;
height: 100%;
min-width: 0;
min-height: 0;
overflow: hidden;
background: #05070b;
}
.local-game-preview-frame iframe {
position: absolute;
top: 50%;
left: 50%;
display: block;
max-width: none;
max-height: none;
border: 0;
background: #fff;
transform-origin: center;
}
@media (max-width: 600px) {
.supervisor-chat-only-header {
padding: 0 12px;
}
.supervisor-chat-only-header > div:first-child > span {
display: none;
}
.supervisor-chat-only-header-status {
max-width: 58%;
}
.supervisor-chat-only-message-list .message {
max-width: 92%;
}
.supervisor-chat-only-composer {
padding-right: 12px;
padding-left: 12px;
}
}
.project-supervisor-surface {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(220px, 280px);
gap: 18px;
min-width: 0;
min-height: 560px;
}
.project-supervisor-conversation {
display: grid;
grid-template-rows: minmax(340px, 1fr) auto auto auto;
align-content: stretch;
gap: 10px;
min-width: 0;
}
.project-supervisor-message-list {
min-height: 340px;
max-height: calc(100vh - 330px);
border-radius: 8px;
background: #fff;
}
.project-supervisor-process-card {
position: relative;
isolation: isolate;
display: grid;
gap: 9px;
margin-top: 12px;
padding: 12px 14px;
border: 1px solid #b9d8c5;
border-radius: 8px;
background: #f1f8f3;
color: #1f3d2a;
overflow: hidden;
}
.project-supervisor-process-card::after {
content: '';
position: absolute;
z-index: -1;
inset: 0 auto 0 -35%;
width: 28%;
background: linear-gradient(
90deg,
transparent,
rgb(255 255 255 / 28%),
transparent
);
pointer-events: none;
opacity: 0;
}
.project-supervisor-process-card.is-active::after {
opacity: 1;
animation: project-supervisor-process-sweep 1.8s ease-in-out infinite;
}
@keyframes project-supervisor-process-sweep {
from {
transform: translateX(0);
}
to {
transform: translateX(520%);
}
}
.project-supervisor-process-card > header {
display: flex;
align-items: center;
gap: 8px;
}
.project-supervisor-process-card > header > span {
width: 8px;
height: 8px;
flex: 0 0 auto;
border-radius: 50%;
background: #2f855a;
box-shadow: 0 0 0 4px rgb(47 133 90 / 14%);
animation: project-supervisor-process-pulse 1.2s ease-in-out infinite;
}
@keyframes project-supervisor-process-pulse {
50% {
opacity: 0.42;
transform: scale(0.76);
}
}
@media (prefers-reduced-motion: reduce) {
.project-supervisor-process-card > header > span {
animation: none;
}
.project-supervisor-process-card.is-active::after {
animation: none;
}
}
.project-supervisor-process-card p {
margin: 0;
color: #263142;
font-size: 13px;
line-height: 1.55;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
max-height: 1.55em;
white-space: pre-wrap;
overflow-wrap: anywhere;
overflow: hidden;
}
.project-supervisor-process-card p.is-expanded {
display: block;
max-height: 180px;
overflow: auto;
scrollbar-color: rgb(47 111 75 / 58%) transparent;
}
.project-supervisor-process-card p.is-expanded::-webkit-scrollbar-track,
.project-supervisor-process-card p.is-expanded::-webkit-scrollbar-corner {
background: transparent;
}
.project-supervisor-process-detail {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: start;
gap: 8px;
}
.project-supervisor-process-toggle {
align-self: start;
padding: 0;
border: 0;
background: transparent;
color: #2f6f4b;
font: inherit;
font-size: 12px;
cursor: pointer;
white-space: nowrap;
}
.game-workbench-chat .project-supervisor-process-card {
border-color: var(--platform-surface-border);
background: var(--platform-warm-bg);
color: var(--platform-text-strong);
}
.game-workbench-chat .project-supervisor-process-card p {
color: var(--platform-text-base);
}
.project-supervisor-surface .agent-runtime-status {
margin: 0;
}
.project-supervisor-surface .agent-runtime-status header,
.project-supervisor-collaboration header {
align-items: center;
}
.project-runtime-title {
display: inline-flex;
align-items: center;
gap: 7px;
min-width: 0;
}
.project-runtime-live-dot {
width: 8px;
height: 8px;
flex: 0 0 auto;
border-radius: 50%;
background: #94a3b8;
}
.project-runtime-live-dot.is-running {
background: #22a35a;
box-shadow: 0 0 0 4px rgb(34 163 90 / 13%);
animation: project-runtime-pulse 1.6s ease-in-out infinite;
}
.project-runtime-live-dot.is-waiting {
background: #df8a16;
box-shadow: 0 0 0 4px rgb(223 138 22 / 13%);
}
.project-runtime-live-dot.is-failed {
background: #d64545;
box-shadow: 0 0 0 4px rgb(214 69 69 / 13%);
}
.project-runtime-live-dot.is-completed {
background: #2878d4;
}
@keyframes project-runtime-pulse {
50% {
opacity: 0.5;
transform: scale(0.82);
}
}
.agent-runtime-status .project-runtime-overview {
gap: 5px;
padding: 9px 10px;
border-radius: 8px;
background: #eef4ff;
}
.project-runtime-overview > span {
color: #53657c;
font-size: 11px;
}
.agent-runtime-status .project-runtime-plan-progress {
grid-template-columns: auto minmax(0, 1fr);
align-items: center;
gap: 8px;
}
.project-runtime-plan-progress span {
color: #53657c;
font-size: 10px;
}
.project-runtime-plan-progress progress {
width: 100%;
height: 6px;
accent-color: #2c73d2;
}
.agent-runtime-status .project-runtime-professional-list {
gap: 7px;
padding-top: 7px;
border-top: 1px solid #d8dde5;
}
.project-runtime-professional-list article {
display: grid;
gap: 4px;
padding: 8px 9px;
border: 1px solid #dfe5ed;
border-left-width: 3px;
border-radius: 8px;
background: #fff;
}
.project-runtime-professional-list article.is-running {
border-left-color: #22a35a;
}
.project-runtime-professional-list article.is-waiting {
border-left-color: #df8a16;
background: #fffaf0;
}
.project-runtime-professional-list article.is-failed {
border-left-color: #d64545;
background: #fff7f7;
}
.project-runtime-professional-list article.is-completed {
border-left-color: #2878d4;
}
.project-runtime-professional-list article > header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.project-runtime-professional-list article > header span {
color: #475569;
font-size: 10px;
font-weight: 700;
}
.project-runtime-professional-list article p {
display: -webkit-box;
overflow: hidden;
color: #334155;
font-size: 11px;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.agent-runtime-status .project-runtime-professional-actions {
grid-template-columns: minmax(0, 1fr) auto auto;
align-items: center;
gap: 6px;
margin-top: 3px;
}
.project-runtime-professional-actions span {
min-width: 0;
overflow: hidden;
color: #8a5a12;
font-size: 10px;
text-overflow: ellipsis;
white-space: nowrap;
}
.project-runtime-professional-actions button {
height: 25px;
padding: 0 8px;
border: 1px solid #d8b677;
border-radius: 6px;
background: #fff;
color: #785012;
font-size: 10px;
}
.project-runtime-professional-actions button:last-child {
border-color: #2c73d2;
background: #2c73d2;
color: #fff;
}
.project-runtime-professional-actions button:disabled {
opacity: 0.55;
}
.agent-runtime-status .project-runtime-error {
color: #b42323;
}
.agent-runtime-status .project-runtime-retry-feedback {
display: block;
margin-top: 4px;
color: #2c5f9f;
font-size: 10px;
}
.agent-runtime-status .project-runtime-recovery {
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
gap: 7px;
padding: 8px;
border: 1px solid #efc3bd;
border-radius: 8px;
background: #fff7f5;
}
.project-runtime-recovery > span {
display: grid;
min-width: 0;
gap: 2px;
color: #7f2f2a;
font-size: 11px;
}
.project-runtime-recovery > span small {
color: #775b58;
font-size: 10px;
}
.project-runtime-recovery > button {
min-height: 30px;
padding: 0 10px;
border: 1px solid #d6614f;
border-radius: 7px;
background: #d6614f;
color: #fff;
font-size: 10px;
font-weight: 700;
white-space: nowrap;
}
.project-runtime-recovery > button:disabled {
opacity: 0.58;
}
.project-runtime-recovery > .project-runtime-retry-feedback {
grid-column: 1 / -1;
margin: 0;
}
.agent-runtime-status .project-runtime-pending-command {
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
gap: 12px;
margin-top: 4px;
padding: 10px 12px;
border: 1px solid var(--platform-surface-border);
border-radius: 10px;
background: var(--platform-warm-bg);
}
.agent-runtime-status .project-runtime-pending-command button {
min-width: 52px;
height: 34px;
flex: 0 0 auto;
border: 1px solid var(--platform-surface-border);
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
font-size: 11px;
font-weight: 800;
}
.agent-runtime-status .project-runtime-pending-command small {
font-size: 10px;
}
.project-supervisor-composer {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: end;
gap: 10px;
}
.project-supervisor-composer textarea {
min-width: 0;
min-height: 72px;
max-height: 180px;
padding: 10px 12px;
resize: vertical;
border: 1px solid #cfd7e6;
border-radius: 8px;
background: #fff;
color: #111827;
font: inherit;
line-height: 1.5;
}
/* 只发给提交按钮:这里原来是 `.project-supervisor-composer button`,会把 `position`、
`width`、`border-radius` 广播到输入区里的每一个按钮上——`.project-supervisor-composer
.is-direct-codex .project-supervisor-composer button` 那条绝对定位规则就是这样把
「AI 润色」从输入区网格里摘出去、浮到文本区右侧的。 */
.project-supervisor-submit-button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-width: 84px;
height: 40px;
padding: 0 16px;
border: 1px solid #1f6feb;
border-radius: 8px;
background: #1f6feb;
color: #fff;
}
.project-supervisor-submit-button:disabled {
border-color: #cfd6e1;
background: #e8ecf2;
color: #8b95a5;
}
.project-supervisor-workspace-status {
color: #7b8492;
font-size: 11px;
overflow-wrap: anywhere;
}
.project-supervisor-collaboration {
min-width: 0;
padding-left: 18px;
border-left: 1px solid #e5e7eb;
}
.project-supervisor-collaboration header {
display: flex;
justify-content: space-between;
gap: 10px;
margin-bottom: 8px;
}
.project-supervisor-collaboration h2,
.project-supervisor-collaboration p {
margin: 0;
}
.project-supervisor-collaboration h2 {
color: #111827;
font-size: 14px;
}
.project-supervisor-collaboration header small,
.project-supervisor-collaboration p {
color: #8b8b8b;
font-size: 11px;
}
.project-supervisor-collaboration > div {
display: grid;
}
.project-supervisor-collaboration article {
display: grid;
gap: 5px;
min-width: 0;
padding: 10px 0;
border-top: 1px solid #eef0f3;
}
.project-supervisor-collaboration article strong {
color: #111827;
font-size: 12px;
}
.project-supervisor-collaboration article span,
.project-supervisor-collaboration article small {
color: #647084;
font-size: 11px;
overflow-wrap: anywhere;
}
.launcher-card-collage {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-template-rows: repeat(2, 1fr);
gap: 2px;
}
.launcher-card-collage span:nth-child(1) {
background: radial-gradient(circle at 45% 38%, #6b5c43 0 18%, transparent 19%),
radial-gradient(circle at 62% 54%, #2f2a23 0 25%, transparent 26%),
linear-gradient(135deg, #91a17e, #2c3327);
}
.launcher-card-collage span:nth-child(2) {
background: radial-gradient(circle at 58% 45%, #b28b5a 0 16%, transparent 17%),
radial-gradient(circle at 48% 55%, #302114 0 24%, transparent 25%),
linear-gradient(135deg, #d9e8ef, #9fb0a0);
}
.launcher-card-collage span:nth-child(3) {
background: radial-gradient(circle at 50% 54%, #eac9c0 0 22%, transparent 23%),
linear-gradient(135deg, #f7d9d5, #dab6aa);
}
.launcher-card-collage span:nth-child(4) {
background: radial-gradient(circle at 56% 50%, #32271b 0 22%, transparent 23%),
linear-gradient(135deg, #8e6c4e, #2b211b);
}
.launcher-card-ui > div {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 8px;
padding: 16px;
background: #fff7f2;
}
.launcher-card-ui span {
border-radius: 4px;
background:
linear-gradient(#ff8d5c 0 0) 12px 12px / 40px 4px no-repeat,
linear-gradient(#ffd4c2 0 0) 12px 24px / 70px 4px no-repeat,
linear-gradient(#fee4d8, #fff);
box-shadow: inset 0 0 0 1px #fed7c8;
}
.launcher-card-pattern > div {
display: grid;
grid-template-columns: repeat(2, 1fr);
background: linear-gradient(
45deg,
transparent 46%,
#fff 46% 54%,
transparent 54%
),
linear-gradient(135deg, #55405a, #e4b2a7);
}
.launcher-card-pattern span {
display: grid;
color: #fff;
font-size: 38px;
place-items: center;
text-shadow: 0 2px 8px rgb(0 0 0 / 18%);
}
.launcher-card-orange > div {
display: grid;
grid-template-columns: 1.1fr 1fr;
background: #fff8ee;
}
.launcher-card-orange span:first-child {
display: grid;
color: #ff7a1a;
font-size: 32px;
font-weight: 900;
place-items: start;
padding: 18px;
}
.launcher-card-orange span:last-child {
display: grid;
color: #f06d3d;
font-size: 96px;
font-weight: 900;
line-height: 1;
place-items: center;
}
@media (max-width: 760px) {
.launcher-main {
grid-template-rows: auto auto auto;
overflow: visible;
}
.launcher-promo {
justify-content: flex-start;
min-height: 38px;
padding: 7px 10px;
overflow: hidden;
font-size: 11px;
}
.launcher-promo
span:not(.launcher-countdown):not(:nth-child(3)):not(:nth-child(6)):not(
:nth-child(9)
) {
display: none;
}
.launcher-promo strong {
overflow: hidden;
text-overflow: ellipsis;
}
.launcher-account-bar {
position: static;
justify-content: flex-end;
padding: 18px 14px 0;
}
.launcher-account-bar span {
max-width: 148px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.launcher-page {
width: min(100%, calc(100vw - 76px));
}
.launcher-projects-page {
width: calc(100vw - var(--launcher-sidebar-width));
padding: 72px 18px 20px;
}
.launcher-agent-chat-page > header,
.launcher-agent-chat-main > header {
align-items: stretch;
flex-direction: column;
gap: 10px;
}
.launcher-agent-chat-main > header > small {
max-width: 100%;
overflow-wrap: anywhere;
}
.launcher-development-grid {
grid-template-columns: 1fr;
}
.launcher-agent-chat-layout {
grid-template-columns: 1fr;
min-height: auto;
}
.launcher-agent-picker {
max-height: 240px;
}
.launcher-agent-chat-main {
min-height: 620px;
}
.launcher-agent-chat-composer {
grid-template-columns: minmax(0, 1fr) auto;
}
.launcher-agent-chat-mode {
grid-column: 1 / -1;
justify-self: start;
}
.launcher-agent-goal-status header {
align-items: stretch;
flex-direction: column;
}
.launcher-agent-goal-actions {
justify-content: flex-start;
}
.agent-runtime-user-input-options {
grid-template-columns: 1fr;
}
.agent-runtime-user-input .agent-runtime-user-input-submit {
width: 100%;
justify-self: stretch;
}
.launcher-agent-session-bar {
grid-template-columns: auto minmax(0, 1fr);
}
.launcher-agent-session-status {
display: none;
}
.launcher-development-assets div {
grid-template-columns: 1fr;
}
.project-supervisor-surface {
grid-template-columns: 1fr;
min-height: auto;
}
.project-supervisor-conversation {
grid-template-rows: minmax(320px, auto) auto auto auto;
}
.project-supervisor-message-list {
max-height: 52vh;
}
.project-supervisor-composer {
grid-template-columns: 1fr;
}
.project-supervisor-submit-button {
width: 100%;
}
.project-supervisor-collaboration {
padding: 14px 0 0;
border-top: 1px solid #e5e7eb;
border-left: 0;
}
}
.launcher-dialog-backdrop {
position: fixed;
top: var(--window-chrome-height);
right: 0;
bottom: 0;
left: 0;
z-index: 200;
display: grid;
padding: 24px;
background: rgb(0 0 0 / 56%);
place-items: center;
}
.launcher-dialog {
width: min(420px, 100%);
padding: 20px;
border: 1px solid #e5e7eb;
border-radius: 8px;
background: #fff;
color: #171717;
box-shadow: 0 18px 52px rgb(0 0 0 / 18%);
}
.launcher-dialog h2 {
margin: 0 0 10px;
font-size: 18px;
}
.launcher-dialog p {
margin: 0;
color: #6b7280;
overflow-wrap: anywhere;
}
.project-professional-result-dialog {
width: min(760px, 100%);
max-height: min(760px, calc(100vh - 48px));
overflow: hidden;
}
.project-professional-result-dialog header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
margin-bottom: 14px;
}
.project-professional-result-dialog header button {
min-height: 32px;
padding: 0 12px;
border: 1px solid #e1c8bb;
border-radius: 8px;
background: #fff;
color: #7a4c37;
}
.project-professional-result-dialog pre {
max-height: min(620px, calc(100vh - 170px));
margin: 0;
overflow: auto;
padding: 16px;
border-radius: 10px;
background: #f8f2ee;
color: #49372f;
font: inherit;
line-height: 1.65;
white-space: pre-wrap;
overflow-wrap: anywhere;
user-select: text;
}
.launcher-agent-goal-dialog {
width: min(560px, 100%);
max-height: min(760px, calc(100vh - 48px));
overflow-y: auto;
}
.launcher-agent-goal-fields {
display: grid;
gap: 12px;
}
.launcher-agent-goal-fields label {
display: grid;
gap: 6px;
color: #44536a;
font-size: 12px;
font-weight: 700;
}
.launcher-agent-goal-fields textarea {
width: 100%;
min-width: 0;
padding: 9px 10px;
border: 1px solid #d8dde5;
border-radius: 8px;
background: #fff;
color: #111827;
font: inherit;
line-height: 1.5;
resize: vertical;
}
.launcher-agent-goal-fields textarea:focus-visible {
border-color: #64748b;
outline: 2px solid rgb(100 116 139 / 18%);
outline-offset: 1px;
}
.launcher-dialog .launcher-agent-goal-dialog-error {
margin-top: 10px;
color: #b42318;
font-size: 12px;
}
.launcher-dialog-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 18px;
}
.launcher-dialog-actions button {
height: 34px;
padding: 0 14px;
border: 1px solid #d1d5db;
border-radius: 6px;
background: #fff;
color: #171717;
cursor: pointer;
}
.launcher-dialog-actions button:last-child {
border-color: #111827;
background: #111827;
color: #fff;
}
.app-shell {
min-height: 100vh;
background: #f5f7fb;
}
.app-shell--user {
display: flex;
justify-content: center;
padding: 24px;
}
.app-shell--dev {
display: grid;
grid-template-columns: minmax(360px, 0.85fr) minmax(520px, 1.15fr);
gap: 1px;
background: #d9dee8;
}
.chat-pane {
display: flex;
flex-direction: column;
gap: 16px;
min-width: 0;
padding: 18px;
background: #fff;
}
.app-shell--user .chat-pane {
width: min(900px, 100%);
min-height: calc(100vh - 48px);
border: 1px solid #d9dee8;
}
.app-shell--dev .chat-pane {
min-height: 100vh;
}
.chat-header,
.panel-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.chat-header-title {
display: grid;
gap: 4px;
min-width: 0;
}
.chat-header-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.chat-quick-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.panel-header {
margin-bottom: 10px;
}
.panel-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.panel-header button,
.chat-header button,
.chat-quick-actions button,
.local-project-form button,
.panel-actions select {
height: 32px;
padding: 0 12px;
border: 1px solid #cfd7e6;
border-radius: 6px;
}
.panel-header button,
.chat-header button,
.chat-quick-actions button,
.local-project-form button {
color: #fff;
background: #1f6feb;
}
.panel-actions select {
background: #fff;
}
h1,
h2,
p {
margin: 0;
}
h1 {
font-size: 24px;
}
h2 {
margin-bottom: 14px;
font-size: 16px;
}
.chat-header span,
.chat-header small,
.task-pane span,
.log-pane p {
color: #647084;
}
.chat-header small {
overflow-wrap: anywhere;
}
.run-history {
display: flex;
flex-wrap: wrap;
gap: 8px;
max-height: 190px;
overflow: auto;
}
.run-history button {
display: grid;
gap: 2px;
min-width: 150px;
max-width: 100%;
padding: 7px 9px;
border: 1px solid #dce3ee;
border-radius: 6px;
background: #f8fafc;
color: #18202f;
text-align: left;
}
.run-history button[aria-current='true'],
.trace-history button[aria-current='true'] {
border-color: #1f6feb;
background: #eef5ff;
}
.run-history small {
color: #647084;
overflow-wrap: anywhere;
}
.run-history-more {
align-self: center;
}
.settings-overlay {
position: fixed;
top: var(--window-chrome-height);
right: 0;
bottom: 0;
left: 0;
z-index: 220;
display: grid;
place-items: center;
padding: 24px;
background: rgb(24 32 47 / 48%);
backdrop-filter: blur(6px);
}
.runtime-settings-toast {
position: absolute;
top: 24px;
right: 24px;
z-index: 1;
display: inline-flex;
align-items: center;
gap: 8px;
max-width: min(420px, calc(100vw - 48px));
padding: 11px 14px;
border: 1px solid var(--platform-success-border);
border-radius: 12px;
background: #edf8ef;
box-shadow: var(--platform-panel-shadow);
color: var(--platform-success-text);
font-size: 12px;
font-weight: 700;
pointer-events: none;
}
.runtime-settings-toast[data-tone='error'] {
border-color: var(--platform-warm-border);
background: #fff1ea;
color: var(--platform-warm-text);
}
.runtime-settings-toast span {
overflow-wrap: anywhere;
}
.settings-panel {
display: grid;
gap: 10px;
width: min(920px, 100%);
max-height: calc(100vh - 36px);
padding: 18px;
overflow: auto;
border: 1px solid #cfd7e6;
background: #fff;
}
.runtime-settings-panel {
--runtime-settings-fill: #fffdfa;
--runtime-settings-topbar-fill: #fffdf9;
--runtime-settings-nav-fill: #fdf7f1;
--runtime-settings-content-fill: #fffaf6;
--runtime-settings-subpanel-fill: #fffdfb;
grid-template-rows: auto minmax(0, 1fr) auto;
gap: 0;
width: min(1080px, 100%);
height: min(760px, calc(100dvh - var(--window-chrome-height) - 48px));
max-height: calc(100dvh - var(--window-chrome-height) - 48px);
padding: 0;
overflow: hidden;
border-color: var(--platform-modal-border);
border-radius: 18px;
background: var(--runtime-settings-fill);
box-shadow: var(--platform-panel-shadow);
}
.runtime-settings-header,
.runtime-settings-footer,
.runtime-settings-section-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
}
.runtime-settings-header {
min-height: 76px;
padding: 15px 18px 14px 22px;
border-bottom: 1px solid var(--platform-line-soft);
background: var(--runtime-settings-topbar-fill);
}
.runtime-settings-header > div {
display: grid;
gap: 3px;
}
.runtime-settings-eyebrow {
color: var(--platform-accent);
font-size: 9px;
font-weight: 900;
letter-spacing: 0.16em;
}
.runtime-settings-header h2 {
margin: 0;
color: var(--platform-text-strong);
font-size: 20px;
letter-spacing: -0.02em;
}
.runtime-settings-close {
display: grid;
width: 36px;
height: 36px;
padding: 0;
border: 1px solid var(--platform-surface-border);
border-radius: 10px;
background: var(--platform-button-ghost-fill);
color: var(--platform-button-ghost-text);
cursor: pointer;
place-items: center;
}
.runtime-settings-layout {
display: grid;
grid-template-columns: 224px minmax(0, 1fr);
min-height: 0;
overflow: hidden;
}
.runtime-settings-nav {
display: flex;
flex-direction: column;
justify-content: space-between;
gap: 18px;
min-height: 0;
padding: 16px 12px;
overflow-y: auto;
border-right: 1px solid var(--platform-line-soft);
background: var(--runtime-settings-nav-fill);
}
.runtime-settings-nav nav {
display: grid;
gap: 6px;
}
.runtime-settings-nav nav button {
display: grid;
grid-template-columns: 28px minmax(0, 1fr);
align-items: center;
gap: 8px;
min-height: 54px;
padding: 8px 10px;
border: 1px solid transparent;
border-radius: 12px;
background: transparent;
color: var(--platform-text-base);
text-align: left;
cursor: pointer;
}
.runtime-settings-nav nav button > svg {
color: var(--platform-text-soft);
justify-self: center;
}
.runtime-settings-nav nav button > span {
display: grid;
gap: 2px;
min-width: 0;
}
.runtime-settings-nav nav strong {
color: inherit;
font-size: 12px;
}
.runtime-settings-nav nav small {
overflow: hidden;
color: var(--platform-text-soft);
font-size: 9px;
text-overflow: ellipsis;
white-space: nowrap;
}
.runtime-settings-nav nav button:hover {
border-color: var(--platform-surface-border);
background: var(--platform-button-ghost-fill);
}
.runtime-settings-nav nav button.is-active {
border-color: var(--platform-nav-active-border);
background: var(--platform-nav-active-fill);
color: var(--platform-text-strong);
box-shadow: var(--platform-nav-active-shadow);
}
.runtime-settings-nav nav button.is-active > svg {
color: var(--platform-accent);
}
.runtime-settings-config-state {
display: grid;
gap: 3px;
padding: 10px;
border-top: 1px solid var(--platform-line-soft);
}
.runtime-settings-config-state span,
.runtime-settings-config-state small {
color: var(--platform-text-soft);
font-size: 9px;
}
.runtime-settings-config-state strong {
color: var(--platform-text-base);
font-size: 11px;
}
.runtime-settings-config-state small {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.runtime-settings-content {
min-width: 0;
min-height: 0;
padding: 22px 24px 28px;
overflow-y: auto;
background: var(--runtime-settings-content-fill);
}
.runtime-settings-section-header {
min-height: 44px;
margin-bottom: 18px;
}
.runtime-settings-section-header > div {
display: grid;
gap: 4px;
}
.runtime-settings-section-header h3,
.runtime-settings-section-header p {
margin: 0;
}
.runtime-settings-section-header h3 {
color: var(--platform-text-strong);
font-size: 17px;
}
.runtime-settings-section-header p,
.runtime-settings-section-header > span {
color: var(--platform-text-soft);
font-size: 11px;
}
.runtime-settings-section-actions {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 7px;
}
.runtime-settings-section-actions button,
.runtime-settings-extension-actions button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 5px;
min-height: 30px;
padding: 0 9px;
border: 1px solid var(--platform-surface-border);
border-radius: 8px;
background: var(--platform-button-ghost-fill);
color: var(--platform-text-base);
font-size: 11px;
cursor: pointer;
}
.runtime-settings-section-actions button:hover,
.runtime-settings-extension-actions button:hover {
border-color: var(--platform-surface-hover-border);
background: var(--platform-button-ghost-fill);
}
.runtime-settings-section-actions button:disabled,
.runtime-settings-extension-actions button:disabled {
cursor: default;
opacity: 0.55;
}
.runtime-settings-extensions {
display: grid;
gap: 10px;
}
.runtime-settings-inline-status {
margin: 0;
color: var(--platform-text-soft);
font-size: 11px;
}
.runtime-settings-extension-list {
display: grid;
gap: 8px;
}
.runtime-settings-extension-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 12px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 12px;
background: var(--runtime-settings-subpanel-fill);
}
.runtime-settings-extension-main {
display: grid;
min-width: 0;
gap: 3px;
}
.runtime-settings-extension-main strong,
.runtime-settings-extension-main input {
min-width: 0;
color: var(--platform-text-strong);
font-size: 13px;
font-weight: 800;
}
.runtime-settings-extension-main input {
width: min(100%, 300px);
padding: 6px 8px;
border: 1px solid var(--platform-surface-border);
border-radius: 7px;
background: var(--platform-input-fill);
}
.runtime-settings-extension-main > span,
.runtime-settings-extension-main > small,
.runtime-settings-extension-actions > span {
overflow: hidden;
color: var(--platform-text-soft);
font-size: 10px;
text-overflow: ellipsis;
white-space: nowrap;
}
.runtime-settings-extension-main > small {
color: var(--platform-danger, #b45309);
}
.runtime-settings-extension-actions {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
gap: 6px;
flex-shrink: 0;
}
.runtime-settings-extension-actions > span {
margin-right: 2px;
}
.runtime-settings-empty-state {
display: grid;
gap: 4px;
padding: 24px 14px;
border: 1px dashed var(--platform-subpanel-border);
border-radius: 12px;
color: var(--platform-text-soft);
text-align: center;
}
.runtime-settings-empty-state strong {
color: var(--platform-text-base);
font-size: 13px;
}
.runtime-settings-empty-state span {
font-size: 11px;
}
.runtime-settings-fields {
align-content: start;
}
.runtime-settings-fields > label {
padding: 13px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 12px;
background: var(--runtime-settings-subpanel-fill);
color: var(--platform-text-base);
}
.runtime-settings-fields input,
.runtime-settings-fields select {
border-color: var(--platform-surface-border);
background: var(--platform-input-fill);
color: var(--platform-text-strong);
}
.runtime-settings-fields input:focus-visible,
.runtime-settings-fields select:focus-visible {
border-color: var(--platform-surface-hover-border);
outline: none;
box-shadow: 0 0 0 3px var(--platform-input-focus-ring);
}
.runtime-settings-about {
grid-column: 1 / -1;
display: grid;
gap: 14px;
max-width: 680px;
}
.runtime-settings-about-hero {
display: flex;
align-items: center;
gap: 18px;
min-height: 158px;
padding: 24px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 16px;
background: var(--runtime-settings-subpanel-fill);
}
.runtime-settings-about-mark {
display: grid;
flex: 0 0 auto;
width: 72px;
height: 72px;
border: 1px solid var(--platform-nav-active-border);
border-radius: 20px;
background: var(--platform-nav-active-fill);
color: var(--platform-accent);
font-size: 32px;
font-weight: 900;
letter-spacing: -0.08em;
place-items: center;
box-shadow: var(--platform-nav-active-shadow);
}
.runtime-settings-about-mark img {
width: 100%;
height: 100%;
object-fit: contain;
transform: scale(1.35);
}
.runtime-settings-about-hero > div:last-child {
display: grid;
gap: 5px;
min-width: 0;
}
.runtime-settings-about-kicker {
color: var(--platform-accent);
font-size: 10px;
font-weight: 900;
letter-spacing: 0.16em;
}
.runtime-settings-about-hero h4 {
margin: 0;
color: var(--platform-text-strong);
font-size: 20px;
letter-spacing: -0.03em;
}
.runtime-settings-about-hero p {
margin: 0;
color: var(--platform-text-soft);
font-size: 12px;
}
.runtime-settings-about-meta {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
margin: 0;
}
.runtime-settings-about-meta > div {
display: grid;
gap: 7px;
padding: 14px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 12px;
background: var(--runtime-settings-subpanel-fill);
}
.runtime-settings-about-meta dt {
color: var(--platform-text-soft);
font-size: 10px;
}
.runtime-settings-about-meta dd {
margin: 0;
color: var(--platform-text-strong);
font-size: 14px;
font-weight: 800;
}
.runtime-settings-about-update {
display: flex;
align-items: center;
gap: 12px;
}
.runtime-settings-about-update button {
padding: 8px 14px;
border: 0;
border-radius: 8px;
background: var(--platform-accent);
color: #fff;
cursor: pointer;
font-weight: 700;
}
.runtime-settings-about-update button:disabled {
cursor: wait;
opacity: 0.65;
}
.runtime-settings-about-update span {
color: var(--platform-text-soft);
font-size: 12px;
}
.runtime-agent-list {
grid-column: 1 / -1;
display: grid;
gap: 8px;
}
.runtime-agent-card {
overflow: hidden;
border: 1px solid var(--platform-subpanel-border);
border-radius: 12px;
background: var(--runtime-settings-subpanel-fill);
}
.runtime-agent-card-summary {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
width: 100%;
min-height: 58px;
padding: 10px 14px;
border: 0;
background: transparent;
color: var(--platform-text-base);
text-align: left;
cursor: pointer;
}
.runtime-agent-card-summary:hover,
.runtime-agent-card-summary[aria-expanded='true'] {
background: var(--platform-button-ghost-fill);
}
.runtime-agent-card-summary:focus-visible {
outline: none;
box-shadow: inset 0 0 0 2px var(--platform-surface-hover-border);
}
.runtime-agent-card-summary > span:first-child {
display: grid;
gap: 2px;
}
.runtime-agent-card-summary strong {
color: var(--platform-text-strong);
font-size: 12px;
}
.runtime-agent-card-summary small,
.runtime-agent-card-summary > span:last-child {
color: var(--platform-text-soft);
font-size: 10px;
}
.runtime-agent-card-fields {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
padding: 14px;
border-top: 1px solid var(--platform-line-soft);
}
.runtime-agent-card-fields label {
display: grid;
gap: 6px;
min-width: 0;
color: var(--platform-text-base);
font-size: 11px;
}
.runtime-agent-card-fields input,
.runtime-agent-card-fields select {
width: 100%;
}
.runtime-settings-footer {
min-height: 66px;
padding: 11px 18px 11px 22px;
border-top: 1px solid var(--platform-line-soft);
background: var(--runtime-settings-topbar-fill);
}
.runtime-settings-footer .status-line {
display: inline-flex;
align-items: center;
gap: 6px;
min-width: 0;
margin: 0;
padding: 6px 9px;
overflow: hidden;
border: 1px solid transparent;
border-radius: 8px;
color: var(--platform-text-soft);
font-size: 10px;
text-overflow: ellipsis;
white-space: nowrap;
}
.runtime-settings-footer .status-line[data-tone='success'] {
border-color: var(--platform-success-border);
background: #edf8ef;
color: var(--platform-success-text);
}
.runtime-settings-footer .status-line[data-tone='warning'] {
border-color: var(--platform-warm-border);
background: var(--platform-warm-bg);
color: var(--platform-warm-text);
}
.runtime-settings-footer .status-line[data-tone='busy'] {
border-color: var(--platform-nav-active-border);
background: var(--platform-nav-active-fill);
color: var(--platform-accent);
}
.runtime-settings-footer .status-line .is-spinning {
animation: runtime-settings-spin 0.9s linear infinite;
}
@keyframes runtime-settings-spin {
to {
transform: rotate(360deg);
}
}
.runtime-settings-footer-actions {
display: flex;
align-items: center;
gap: 7px;
flex: 0 0 auto;
}
.runtime-settings-footer-actions button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-height: 34px;
padding: 0 12px;
border: 1px solid var(--platform-surface-border);
border-radius: 9px;
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
font-size: 11px;
font-weight: 700;
cursor: pointer;
}
.runtime-settings-footer-actions button:disabled {
cursor: wait;
opacity: 0.55;
}
.runtime-settings-footer-actions .runtime-settings-save {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
.settings-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.settings-grid label {
display: grid;
gap: 6px;
min-width: 0;
color: #647084;
font-size: 13px;
}
.settings-grid input,
.settings-grid select {
min-width: 0;
height: 36px;
padding: 0 10px;
border: 1px solid #cfd7e6;
border-radius: 6px;
color: #18202f;
background: #fff;
}
.settings-checkbox {
grid-template-columns: auto 1fr;
align-items: center;
align-self: end;
}
.settings-checkbox input {
width: 18px;
height: 18px;
padding: 0;
}
.message-list {
flex: 1;
border: 1px solid #dde3ee;
padding: 14px;
overflow: auto;
}
.message + .message {
margin-top: 10px;
}
.message-history-more {
width: 100%;
min-height: 32px;
margin-bottom: 10px;
border: 1px solid #cfd7e6;
border-radius: 6px;
color: #647084;
background: #f8fafd;
}
.message {
overflow-wrap: anywhere;
white-space: pre-wrap;
}
.message--user {
color: #1f6feb;
}
.message-action {
min-height: 32px;
margin-top: 6px;
border: 1px solid #cfd7e6;
border-radius: 6px;
color: #334155;
background: #f8fafd;
}
.pending-command {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 8px;
padding: 10px;
border: 1px solid #dde3ee;
background: #f8fafd;
}
.pending-command span {
display: grid;
gap: 3px;
min-width: 0;
margin-right: auto;
color: #647084;
}
.pending-command small {
overflow-wrap: anywhere;
font-size: 12px;
}
.pending-command button {
height: 32px;
padding: 0 12px;
border: 1px solid #cfd7e6;
border-radius: 6px;
color: #fff;
background: #1f6feb;
}
.resource-reference-input {
position: relative;
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: end;
gap: 8px;
min-width: 0;
flex: 1;
padding: 8px 8px 8px 12px;
border: 1px solid #cfd6df;
border-radius: 8px;
background: #fff;
color: #111827;
font: inherit;
}
.resource-reference-input:focus-within {
border-color: #6b7280;
outline: 2px solid rgb(107 114 128 / 18%);
outline-offset: 1px;
}
.resource-reference-input[data-disabled='true'] {
cursor: not-allowed;
opacity: 0.55;
}
.resource-reference-input-editor {
min-width: 0;
min-height: 72px;
max-height: 180px;
overflow-y: auto;
outline: 0;
line-height: 1.5;
white-space: pre-wrap;
overflow-wrap: anywhere;
}
.resource-reference-input.is-single-line .resource-reference-input-editor {
min-height: 24px;
max-height: 24px;
overflow: hidden;
white-space: nowrap;
}
.resource-reference-input-placeholder {
position: absolute;
top: 9px;
left: 13px;
pointer-events: none;
color: #8a94a6;
}
/* 输入区操作排是文本区下面的独立一行(`.resource-reference-input` 是行式网格,
第一行放编辑器)。`@` / AI 润色 / 恢复原文三个 28px 方钮共用一套外观,网格既有
的 `align-items: end` 已经把它们钉在行底,和下面那一排主操作对齐。
注意不要再给这一排加 `min-height`:网格行高由编辑器撑开,行高一旦被顶起来,
编辑器就会跟着变高。 */
.resource-reference-input-actions {
display: flex;
align-items: end;
gap: 6px;
}
.resource-reference-input-at,
.resource-reference-input-polish,
.resource-reference-input-restore {
display: grid;
width: 28px;
height: 28px;
flex: 0 0 28px;
padding: 0;
border: 1px solid #cfd6df;
border-radius: 8px;
background: #f8fafc;
color: #475569;
place-items: center;
cursor: pointer;
}
.resource-reference-input-at:hover:not(:disabled),
.resource-reference-input-polish:hover:not(:disabled),
.resource-reference-input-restore:hover:not(:disabled) {
border-color: #94a3b8;
color: #0f172a;
}
.resource-reference-input-at:disabled,
.resource-reference-input-polish:disabled,
.resource-reference-input-restore:disabled {
cursor: not-allowed;
opacity: 0.5;
}
/* 润色中 / 润色失败:整行独占,既不会压住上面的编辑器,也不会被操作排挤成两行。 */
.resource-reference-input-status {
grid-column: 1 / -1;
margin-top: 6px;
color: #b45309;
font-size: 12px;
line-height: 1.4;
}
.chat-prompt-polish-reminder {
display: grid;
gap: 12px;
}
.chat-prompt-polish-reminder-error {
color: #b45309;
}
.chat-prompt-polish-reminder-preference {
display: flex;
align-items: center;
gap: 8px;
color: #6b7280;
font-size: 13px;
}
.chat-prompt-polish-reminder-actions,
.chat-prompt-polish-reminder .launcher-dialog-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: flex-end;
}
.chat-prompt-polish-reminder .launcher-dialog-actions button {
display: inline-flex;
align-items: center;
gap: 6px;
}
.resource-reference-picker-scopes {
padding: 0 12px 4px;
}
.resource-reference-chip {
display: inline-flex;
align-items: center;
gap: 2px;
margin: 0 2px;
padding: 1px 4px 1px 6px;
border: 1px solid #bfdbfe;
border-radius: 7px;
background: #eff6ff;
color: #1d4ed8;
font-size: 12px;
font-weight: 650;
line-height: 1.5;
vertical-align: baseline;
white-space: nowrap;
}
.resource-reference-chip-label {
max-width: 180px;
overflow: hidden;
text-overflow: ellipsis;
}
.resource-reference-chip button {
display: grid;
width: 15px;
height: 15px;
padding: 0;
border: 0;
border-radius: 4px;
background: transparent;
color: inherit;
place-items: center;
cursor: pointer;
}
.resource-reference-chip button:hover {
background: rgb(29 78 216 / 12%);
}
.resource-reference-menu {
display: grid;
gap: 2px;
width: min(360px, calc(100vw - 48px));
max-height: min(240px, calc(100vh - 140px));
overflow: auto;
overscroll-behavior: contain;
padding: 6px;
border: 1px solid var(--platform-subpanel-border, #dbe3ef);
border-radius: 12px;
background: var(--platform-panel-fill, #fff);
box-shadow: 0 12px 28px rgba(15, 23, 42, 0.16);
scrollbar-color: #cbd5e1 transparent;
scrollbar-width: thin;
}
.resource-reference-menu-anchor {
z-index: 90;
}
.resource-reference-menu button {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
align-items: center;
gap: 12px;
width: 100%;
min-width: 0;
padding: 8px 10px;
border: 0;
border-radius: 8px;
background: transparent;
color: inherit;
text-align: left;
cursor: pointer;
}
.resource-reference-menu button:hover,
.resource-reference-menu button.is-active {
background: var(--platform-subpanel-fill, #f1f5f9);
}
.resource-reference-menu button > span {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.resource-reference-menu small {
max-width: 132px;
overflow: hidden;
color: var(--platform-muted-text, #64748b);
font-size: 11px;
text-overflow: ellipsis;
white-space: nowrap;
}
.resource-reference-picker {
position: absolute;
z-index: 80;
right: 0;
bottom: calc(100% + 8px);
display: grid;
grid-template-rows: auto auto auto auto minmax(0, 1fr) auto;
width: min(440px, 88vw);
max-height: min(480px, 70vh);
overflow: hidden;
border: 1px solid var(--platform-subpanel-border, #dbe3ef);
border-radius: 14px;
background: var(--platform-panel-fill, #fff);
box-shadow: 0 18px 48px rgba(15, 23, 42, 0.22);
}
.resource-reference-picker > header,
.resource-reference-picker > footer {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 10px 12px;
}
.resource-reference-picker > header {
border-bottom: 1px solid var(--platform-subpanel-border, #e2e8f0);
}
.resource-reference-picker > header button {
width: 24px;
height: 24px;
padding: 0;
border: 0;
border-radius: 6px;
background: transparent;
color: inherit;
cursor: pointer;
}
.resource-reference-picker-search {
display: grid;
grid-template-columns: auto minmax(0, 1fr);
align-items: center;
gap: 8px;
margin: 10px 12px 8px;
padding: 0 10px;
border: 1px solid var(--platform-surface-border, #dbe3ef);
border-radius: 9px;
background: var(--platform-input-fill, #fff);
}
.resource-reference-picker-search input {
height: 34px;
min-width: 0;
border: 0;
outline: 0;
background: transparent;
color: inherit;
font: inherit;
}
.resource-reference-picker-filters {
padding: 0 12px 8px;
}
.resource-reference-picker-list {
display: grid;
gap: 4px;
min-height: 0;
overflow: auto;
padding: 0 8px 8px;
}
.resource-reference-picker-list > button {
display: grid;
grid-template-columns: 44px minmax(0, 1fr) auto;
align-items: center;
gap: 10px;
width: 100%;
padding: 7px 8px;
border: 1px solid transparent;
border-radius: 10px;
background: transparent;
color: inherit;
text-align: left;
cursor: pointer;
}
.resource-reference-picker-list > button:hover,
.resource-reference-picker-list > button.is-selected {
border-color: var(--platform-nav-active-border, #bfdbfe);
background: var(--platform-subpanel-fill, #f1f5f9);
}
.resource-reference-picker-list > button > img,
.resource-reference-picker-list > button > svg {
display: grid;
width: 44px;
height: 44px;
border-radius: 8px;
background: var(--platform-subpanel-fill, #f1f5f9);
object-fit: cover;
place-items: center;
padding: 12px;
color: var(--platform-muted-text, #64748b);
}
.resource-reference-picker-list > button > img {
padding: 0;
}
.resource-reference-picker-list > button > span {
display: grid;
gap: 2px;
min-width: 0;
}
.resource-reference-picker-list > button strong,
.resource-reference-picker-list > button small {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.resource-reference-picker-list > button small,
.resource-reference-picker-empty,
.resource-reference-picker > footer span {
color: var(--platform-muted-text, #64748b);
font-size: 12px;
}
.resource-reference-picker-empty {
margin: 12px;
text-align: center;
}
.resource-reference-picker > footer {
border-top: 1px solid var(--platform-subpanel-border, #e2e8f0);
}
.resource-reference-picker > footer button {
min-height: 32px;
padding: 0 14px;
border: 1px solid var(--platform-button-primary-border, #2563eb);
border-radius: 8px;
background: var(--platform-button-primary-fill, #2563eb);
color: var(--platform-button-primary-text, #fff);
cursor: pointer;
}
.resource-reference-picker > footer button:disabled {
cursor: not-allowed;
opacity: 0.5;
}
.composer {
display: grid;
grid-template-columns: auto minmax(0, 1fr) auto;
gap: 10px;
}
.composer input,
.composer button,
.composer-upload-button {
height: 40px;
border: 1px solid #cfd7e6;
border-radius: 6px;
}
.composer input {
min-width: 0;
padding: 0 12px;
}
.composer button,
.composer-upload-button {
display: inline-grid;
padding: 0 18px;
place-items: center;
color: #fff;
background: #1f6feb;
cursor: pointer;
}
.composer-upload-button input {
display: none;
}
.agent-status-pane {
display: grid;
gap: 10px;
padding-top: 4px;
}
.agent-status-list {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 8px;
max-height: 220px;
overflow: auto;
}
.agent-status-list button {
display: grid;
gap: 4px;
min-width: 0;
padding: 9px;
border: 1px solid #dce3ee;
border-radius: 6px;
background: #fff;
color: #18202f;
text-align: left;
}
.agent-status-list span,
.agent-status-list small {
color: #647084;
font-size: 12px;
}
.agent-status-list small {
overflow-wrap: anywhere;
}
.agent-conversation-panel {
display: grid;
gap: 10px;
width: min(640px, 100%);
max-height: calc(100vh - 36px);
padding: 18px;
overflow: auto;
border: 1px solid #cfd7e6;
background: #fff;
}
.agent-conversation-list {
min-height: 220px;
max-height: 420px;
padding: 12px;
overflow: auto;
border: 1px solid #dde3ee;
}
.agent-conversation-list .message {
width: fit-content;
max-width: min(88%, 720px);
margin: 0;
padding: 9px 12px;
border-radius: 14px;
line-height: 1.55;
}
.agent-conversation-list .message + .message {
margin-top: 10px;
}
.agent-conversation-list .message--user {
margin-left: auto;
border: 1px solid #d8c4a8;
border-radius: 14px 14px 4px;
background: #fff7ed;
color: #8a4b08;
}
.agent-memory-box {
display: grid;
gap: 6px;
max-height: 180px;
padding: 10px;
overflow: auto;
border: 1px solid #dde3ee;
background: #f8fafd;
}
.agent-memory-box pre {
margin: 0;
overflow-wrap: anywhere;
white-space: pre-wrap;
}
.agent-memory-box small button {
height: 24px;
margin-left: 8px;
padding: 0 8px;
border: 1px solid #cfd7e6;
border-radius: 6px;
background: #fff;
color: #1f6feb;
cursor: pointer;
}
.agent-conversation-panel .composer {
grid-template-columns: minmax(0, 1fr) auto auto auto;
}
.workspace-panel {
display: grid;
gap: 12px;
width: min(680px, 100%);
max-height: calc(100vh - 36px);
padding: 18px;
overflow: auto;
border: 1px solid #cfd7e6;
background: #fff;
}
.workspace-picker {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 8px;
}
.workspace-picker input,
.workspace-picker button,
.workspace-list button {
min-width: 0;
height: 36px;
border: 1px solid #cfd7e6;
border-radius: 6px;
}
.workspace-picker input {
padding: 0 10px;
}
.workspace-picker button {
padding: 0 14px;
color: #fff;
background: #1f6feb;
}
.workspace-list {
display: grid;
gap: 8px;
}
.workspace-list button {
padding: 0 10px;
overflow: hidden;
background: #fff;
color: #18202f;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
}
.developer-pane {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
align-content: start;
gap: 1px;
min-width: 0;
background: #d9dee8;
}
.developer-panel {
min-width: 0;
padding: 18px;
background: #fff;
}
.developer-panel--wide {
grid-column: 1 / -1;
}
.task-pane article {
display: grid;
grid-template-columns: 84px 1fr;
gap: 12px;
padding: 10px 0;
border-bottom: 1px solid #edf1f7;
}
.capability-pane article {
display: grid;
grid-template-columns: 1fr auto;
gap: 12px;
padding: 8px 0;
border-bottom: 1px solid #edf1f7;
}
.capability-pane span {
color: #647084;
font-size: 12px;
}
.trace-pane article {
display: grid;
gap: 4px;
padding: 8px 0;
border-bottom: 1px solid #edf1f7;
}
.trace-pane span,
.trace-pane small {
color: #647084;
}
.trace-pane small {
overflow-wrap: anywhere;
font-size: 12px;
}
.trace-error {
margin-bottom: 10px;
padding: 8px;
border: 1px solid #efb3b3;
border-radius: 6px;
color: #8a1f1f;
background: #fff5f5;
overflow-wrap: anywhere;
}
.trace-artifacts {
display: grid;
gap: 4px;
margin-bottom: 10px;
}
.trace-task-graph {
display: grid;
gap: 4px;
margin-bottom: 10px;
padding: 8px;
border: 1px solid #dce3ee;
border-radius: 6px;
background: #f8fafc;
}
.trace-history {
display: flex;
flex-wrap: wrap;
gap: 6px;
max-height: 180px;
margin-bottom: 10px;
overflow: auto;
}
.trace-history button {
min-width: 0;
max-width: 100%;
padding: 5px 8px;
overflow-wrap: anywhere;
border: 1px solid #cfd7e6;
border-radius: 6px;
background: #fff;
color: #18202f;
font-size: 12px;
text-align: left;
}
.asset-pane code {
display: block;
margin-bottom: 10px;
padding: 9px 10px;
border: 1px solid #e1e7f0;
background: #f8fafd;
}
.local-project-form {
display: grid;
grid-template-columns: 1fr auto;
gap: 8px;
margin-bottom: 10px;
}
.local-project-form input,
.local-project-form button {
min-width: 0;
height: 36px;
border: 1px solid #cfd7e6;
border-radius: 6px;
}
.local-project-form input {
padding: 0 10px;
}
.asset-register-form {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
margin-bottom: 10px;
}
.asset-register-form input,
.asset-register-form select,
.asset-register-form button {
min-width: 0;
height: 34px;
border: 1px solid #cfd7e6;
border-radius: 6px;
}
.asset-register-form input,
.asset-register-form select {
padding: 0 10px;
}
.asset-register-form button {
color: #fff;
background: #1f6feb;
}
.status-line,
.manifest-path {
margin-bottom: 10px;
color: #647084;
font-size: 13px;
}
.manifest-path {
overflow-wrap: anywhere;
}
.file-pane input,
.file-pane textarea,
.memory-pane textarea {
display: block;
width: 100%;
margin-bottom: 10px;
padding: 10px;
border: 1px solid #cfd7e6;
border-radius: 6px;
}
.file-pane input {
height: 36px;
}
.file-pane textarea,
.memory-pane textarea {
min-height: 150px;
resize: vertical;
}
.file-list {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.file-list button {
display: grid;
gap: 2px;
padding: 6px 10px;
border: 1px solid #cfd7e6;
border-radius: 6px;
background: #fff;
text-align: left;
}
.file-list button small {
color: #647084;
}
.checkpoint-list-item {
display: flex;
align-items: center;
gap: 10px;
padding: 6px 8px;
border: 1px solid #cfd7e6;
border-radius: 6px;
background: #fff;
}
.checkpoint-summary {
display: inline-flex;
min-width: 160px;
flex-direction: column;
gap: 2px;
}
.checkpoint-summary small {
color: #64748b;
}
.limited-command-list {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 10px;
}
.limited-command-list button {
height: 32px;
padding: 0 12px;
border: 1px solid #cfd7e6;
border-radius: 6px;
color: #fff;
background: #1f6feb;
}
.project-log-content {
max-height: 180px;
margin: 0 0 10px;
padding: 10px;
overflow: auto;
border: 1px solid #dde3ee;
background: #f8fafd;
white-space: pre-wrap;
}
.preview-frame {
display: grid;
width: 100%;
min-height: 180px;
place-items: center;
border: 1px solid #cfd7e6;
background: #101827;
color: #d9e7ff;
}
iframe.preview-frame {
display: block;
height: 180px;
}
@media (max-width: 1100px) {
.app-shell--user {
padding: 0;
}
.app-shell--user .chat-pane {
min-height: 100vh;
border: 0;
}
.app-shell--dev {
grid-template-columns: 1fr;
}
.developer-pane {
grid-template-columns: 1fr;
}
.developer-panel--wide {
grid-column: auto;
}
.settings-grid {
grid-template-columns: 1fr;
}
.composer {
grid-template-columns: 1fr auto;
}
.composer-upload-button {
grid-column: 1 / -1;
}
}
@media (max-width: 760px) {
.settings-overlay {
padding: 0;
overflow: auto;
}
.runtime-settings-toast {
top: 12px;
right: 12px;
left: 12px;
max-width: none;
}
.runtime-settings-panel {
width: 100%;
height: calc(100dvh - var(--window-chrome-height));
max-height: calc(100dvh - var(--window-chrome-height));
border: 0;
border-radius: 0;
}
.runtime-settings-layout {
grid-template-columns: 1fr;
grid-template-rows: auto minmax(0, 1fr);
}
.runtime-settings-nav {
display: block;
padding: 8px 10px;
overflow-x: auto;
border-right: 0;
border-bottom: 1px solid var(--platform-line-soft);
}
.runtime-settings-nav nav {
display: flex;
width: max-content;
}
.runtime-settings-nav nav button {
grid-template-columns: 20px auto;
min-height: 40px;
}
.runtime-settings-nav nav small,
.runtime-settings-config-state {
display: none;
}
.runtime-settings-content {
padding: 18px 14px 22px;
}
.runtime-settings-section-header {
align-items: flex-start;
flex-direction: column;
}
.runtime-settings-section-actions {
justify-content: flex-start;
}
.runtime-settings-extension-item {
align-items: stretch;
flex-direction: column;
}
.runtime-settings-extension-actions {
justify-content: flex-start;
}
.runtime-agent-card-fields {
grid-template-columns: 1fr;
}
.runtime-settings-about-hero {
align-items: flex-start;
flex-direction: column;
min-height: 0;
}
.runtime-settings-about-meta {
grid-template-columns: 1fr;
}
.runtime-agent-card-summary > span:last-child {
max-width: 48%;
text-align: right;
}
.runtime-settings-footer {
align-items: stretch;
flex-direction: column;
gap: 8px;
}
.runtime-settings-footer-actions {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.runtime-settings-footer-actions button {
padding: 0 8px;
}
}
/* GameAgent V1.0 project workbench */
.game-project-workbench {
--game-workbench-stage-fill: #fffdfa;
--game-workbench-agent-fill: #fbf7f2;
width: calc(100vw - var(--launcher-sidebar-width));
max-width: none;
min-height: 0;
gap: 0;
margin: 0;
padding: 0;
overflow: hidden;
color: var(--platform-text-base);
}
.launcher-main:has(.game-project-workbench) {
padding-bottom: 0;
}
.game-workbench-layout {
position: relative;
z-index: 0;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(360px, 0.36fr);
gap: 0;
height: clamp(560px, calc(100dvh - 206px), 780px);
min-width: 0;
min-height: 0;
}
.game-workbench-layout.is-ui-editor {
grid-template-columns: minmax(0, 1fr);
}
.game-workbench-stage,
.game-workbench-chat {
min-width: 0;
overflow: hidden;
border: 0;
border-radius: 0;
border-left: 1px solid var(--platform-line-soft);
background: var(--game-workbench-agent-fill);
box-shadow: none;
}
.game-workbench-stage {
position: relative;
display: grid;
grid-template-rows: auto auto minmax(0, 1fr);
border-left: 0;
background: var(--game-workbench-stage-fill);
box-shadow: none;
}
.game-workbench-editor-shell {
border: 0;
border-radius: 0;
background: var(--game-workbench-stage-fill);
box-shadow: none;
}
.game-workbench-stage > .game-resource-manager {
grid-row: 3;
min-height: 0;
}
.game-workbench-chat {
border-color: var(--platform-line-soft);
box-shadow: var(--platform-nav-active-shadow);
}
.game-workbench-stage[data-resource-view-state='resources.ui-editor'] {
grid-template-rows: auto minmax(0, 1fr);
}
.game-workbench-stage[data-resource-view-state='resources.ui-editor']
> div:last-child {
grid-row: 2;
min-height: 0;
}
.game-workbench-toolbar {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 48px;
padding: 8px 12px;
background: transparent;
}
.game-workbench-tabs,
.game-workbench-view-actions {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 7px;
}
.game-workbench-tabs {
padding: 3px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 999px;
background: var(--platform-nav-fill);
}
.game-resource-sort-tabs {
flex-wrap: nowrap;
gap: 0;
padding: 0;
overflow: hidden;
}
.game-workbench-tabs.game-resource-sort-tabs button {
min-height: 36px;
border: 0;
border-radius: 0;
}
.game-workbench-tabs.game-resource-sort-tabs button + button {
border-left: 1px solid var(--platform-subpanel-border);
}
.game-workbench-tabs.game-resource-sort-tabs button.is-active {
border-color: transparent;
}
.game-workbench-tabs button,
.game-workbench-view-actions button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 5px;
min-height: 30px;
padding: 0 11px;
border: 1px solid transparent;
border-radius: 999px;
background: transparent;
color: var(--platform-button-ghost-text);
font-size: 12px;
font-weight: 700;
white-space: nowrap;
cursor: pointer;
}
.game-workbench-tabs button:focus-visible,
.game-workbench-view-actions button:focus-visible,
.game-workbench-approval-trigger:focus-visible,
.game-agent-dock-more:focus-visible {
outline: none;
box-shadow: 0 0 0 3px var(--platform-input-focus-ring);
}
.game-workbench-tabs.game-resource-sort-tabs button:focus-visible {
box-shadow: inset 0 0 0 3px var(--platform-input-focus-ring);
}
.game-workbench-tabs button.is-active,
.game-workbench-view-actions button.is-active {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
.game-workbench-tabs button:disabled,
.game-workbench-tabs button[data-unavailable='true'] {
color: var(--platform-text-muted);
cursor: not-allowed;
opacity: 0.6;
}
.game-workbench-view-actions button {
border-color: var(--platform-surface-border);
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
}
.game-workbench-view-actions .game-workbench-play-button {
position: absolute;
left: 50%;
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
transform: translateX(-50%);
}
.game-workbench-view-actions .game-workbench-play-button:disabled {
border-color: var(--platform-surface-border);
background: var(--platform-button-secondary-fill);
color: var(--platform-text-muted);
cursor: not-allowed;
opacity: 0.6;
}
.game-workbench-view-actions .game-workbench-inspect-button.is-active {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
.game-resource-reorder-status {
min-width: 0;
color: #9a725f;
font-size: 10px;
white-space: nowrap;
}
.game-run-unavailable {
margin: 0;
padding: 7px 14px;
border-bottom: 1px solid #f0dfd7;
background: #fffaf0;
color: #9b6c45;
font-size: 11px;
}
.game-resource-manager {
display: flex;
flex-direction: column;
flex: 1 1 auto;
min-height: 0;
}
.game-resource-book-manager {
position: relative;
overflow: hidden;
background: #fffdfa;
}
.game-resource-book-scene {
position: absolute;
z-index: 20;
/* 铺满管理区:栏目标题栏、栏目大纲与资源卡都从管理区顶边开始正常占位。 */
inset: 0;
overflow: hidden;
pointer-events: none;
transition: none;
}
.game-resource-book-scene-world {
position: absolute;
inset: 0;
transform-origin: 0 0;
transition: none;
}
.game-resource-book-scene--child {
pointer-events: auto;
}
.game-resource-book-zoom {
position: absolute;
right: 14px;
bottom: 14px;
z-index: 40;
display: inline-flex;
align-items: center;
gap: 2px;
height: 34px;
padding: 0 4px;
border: 1px solid #ecdcd4;
border-radius: 12px;
background: rgb(255 253 250 / 94%);
box-shadow: 0 6px 18px rgb(112 70 52 / 12%);
backdrop-filter: blur(6px);
}
.game-resource-book-zoom-button,
.game-resource-book-zoom-fit {
display: inline-flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
padding: 0;
border: 0;
border-radius: 8px;
background: transparent;
color: #8c6252;
cursor: pointer;
}
.game-resource-book-zoom-button:hover,
.game-resource-book-zoom-button:focus-visible,
.game-resource-book-zoom-fit:hover,
.game-resource-book-zoom-fit:focus-visible {
background: #f7ebe4;
color: #b5582f;
outline: 0;
}
.game-resource-book-zoom-value {
min-width: 42px;
color: #6d4b3f;
font-size: 11px;
font-variant-numeric: tabular-nums;
text-align: center;
white-space: nowrap;
}
.game-resource-book-zoom-fit {
margin-left: 2px;
}
.game-resource-book-scene--main.is-measuring {
visibility: hidden;
}
.game-resource-book-scene::before {
position: absolute;
z-index: 0;
inset: 0;
background:
radial-gradient(#eaded8 0.8px, transparent 0.8px) 0 0 / 18px 18px,
#fffdfa;
content: '';
opacity: 0;
pointer-events: none;
transition: none;
}
.game-resource-book-scene--child::before {
opacity: 1;
}
.game-resource-book-scene-titlebar {
position: absolute;
z-index: 30;
min-height: 42px;
border: 1px solid #ebd9cf;
border-radius: 16px 16px 0 0;
background: rgb(255 250 246 / 96%);
box-shadow: 0 8px 18px rgb(112 70 52 / 8%);
pointer-events: none;
transform: translateY(0);
/* FLIP 反向 transform 围绕节点自身原点缩放。 */
transform-origin: 0 0;
transition: none;
}
.game-resource-book-scene-titlebar.is-active {
border-radius: 0;
pointer-events: auto;
}
.game-resource-book-scene-titlebar .game-resource-book-titlebar {
min-height: 42px;
border-bottom: 0;
background: transparent;
}
.game-resource-book-scene-card {
position: absolute;
z-index: 25;
pointer-events: none;
/* 卡片包装节点是 0x0FLIP 反向 transform 围绕它的原点缩放。 */
transform-origin: 0 0;
translate: 0 0;
transition: none;
}
.game-resource-book-manager--main:has(
.game-resource-book-thumbnail[data-resource-book-category='code']:hover,
.game-resource-book-thumbnail[data-resource-book-category='code']:focus-visible
)
.game-resource-book-scene-titlebar[data-resource-book-category='code'],
.game-resource-book-manager--main:has(
.game-resource-book-thumbnail[data-resource-book-category='document']:hover,
.game-resource-book-thumbnail[data-resource-book-category='document']:focus-visible
)
.game-resource-book-scene-titlebar[data-resource-book-category='document'],
.game-resource-book-manager--main:has(
.game-resource-book-thumbnail[data-resource-book-category='version']:hover,
.game-resource-book-thumbnail[data-resource-book-category='version']:focus-visible
)
.game-resource-book-scene-titlebar[data-resource-book-category='version'],
.game-resource-book-manager--main:has(
.game-resource-book-thumbnail[data-resource-book-category='art']:hover,
.game-resource-book-thumbnail[data-resource-book-category='art']:focus-visible
)
.game-resource-book-scene-titlebar[data-resource-book-category='art'],
.game-resource-book-manager--main:has(
.game-resource-book-thumbnail[data-resource-book-category='audio']:hover,
.game-resource-book-thumbnail[data-resource-book-category='audio']:focus-visible
)
.game-resource-book-scene-titlebar[data-resource-book-category='audio'] {
border-top-color: #cc8060;
border-right-color: #cc8060;
border-bottom-color: #ebd9cf;
border-left-color: #cc8060;
}
.game-resource-book-scene-card .game-resource-card {
transition: box-shadow 180ms ease;
}
.game-resource-book-scene--main
.game-resource-book-scene-card
.game-resource-card {
border-radius: 10px;
box-shadow: 0 5px 12px rgb(112 70 52 / 10%);
}
.game-resource-book-scene--child
.game-resource-book-scene-card.is-expanded
.game-resource-card {
border-radius: 12px;
}
.game-resource-book-main.is-background,
.game-resource-canvas.is-background {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
opacity: 0;
pointer-events: none;
}
.game-resource-book-thumbnail-titlebar--placeholder {
min-height: 42px;
border-bottom: 1px solid #f0e2da;
background: rgb(255 250 246 / 90%);
}
.game-resource-book-main {
position: absolute;
inset: 0;
overflow: hidden;
touch-action: none;
user-select: none;
cursor: grab;
background:
radial-gradient(#eaded8 0.8px, transparent 0.8px) 0 0 / 18px 18px,
linear-gradient(145deg, #fffdfa 0%, #fff8f2 100%);
}
.game-resource-book-main:active {
cursor: grabbing;
}
.game-resource-book-main-world {
display: flex;
flex-direction: column;
min-height: 100%;
padding: clamp(24px, 4vw, 52px);
transform-origin: 0 0;
}
.game-resource-book-main-heading {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 24px;
max-width: 1120px;
margin: 0 auto 24px;
}
.game-resource-book-main-heading small {
display: block;
margin-bottom: 4px;
color: #b18370;
font-size: 11px;
letter-spacing: 0.12em;
text-transform: uppercase;
}
.game-resource-book-main-heading h2 {
margin: 0;
color: #56372d;
font-size: clamp(22px, 3vw, 32px);
line-height: 1.1;
}
.game-resource-book-main-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
gap: 18px;
max-width: 1120px;
margin: 0 auto;
}
.game-resource-book-thumbnail {
position: relative;
display: flex;
flex-direction: column;
min-height: 210px;
padding: 0;
overflow: hidden;
border: 1px solid #ebd9cf;
border-radius: 16px;
background: rgb(255 255 255 / 82%);
color: #67483d;
cursor: pointer;
text-align: left;
box-shadow: 0 12px 28px rgb(112 70 52 / 9%);
transition:
border-color 180ms ease,
box-shadow 180ms ease,
transform 180ms ease;
}
.game-resource-book-thumbnail:hover,
.game-resource-book-thumbnail:focus-visible {
border-color: #cc8060;
outline: 0;
box-shadow: 0 16px 34px rgb(158 87 57 / 18%);
transform: none;
}
.game-resource-book-thumbnail-titlebar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 42px;
padding: 0 14px;
border-bottom: 1px solid #f0e2da;
background: rgb(255 250 246 / 90%);
}
.game-resource-book-titlebar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
width: 100%;
min-height: 42px;
padding: 0 14px;
border-bottom: 1px solid #f0e2da;
background: rgb(255 250 246 / 90%);
}
.game-resource-book-titlebar-label,
.game-resource-book-titlebar-meta {
display: inline-flex;
align-items: center;
gap: 7px;
min-width: 0;
}
.game-resource-book-titlebar-label strong {
overflow: hidden;
font-size: 13px;
text-overflow: ellipsis;
white-space: nowrap;
}
.game-resource-book-titlebar-meta {
flex: 0 0 auto;
gap: 10px;
}
.game-resource-book-titlebar-meta small {
color: #b18f81;
font-size: 11px;
}
.game-resource-book-thumbnail-titlebar {
padding: 0;
border-bottom: 0;
}
.game-resource-book-thumbnail-titlebar > span {
display: inline-flex;
align-items: center;
gap: 7px;
min-width: 0;
}
.game-resource-book-thumbnail-titlebar strong {
overflow: hidden;
font-size: 13px;
text-overflow: ellipsis;
white-space: nowrap;
}
.game-resource-book-thumbnail-titlebar small {
flex: 0 0 auto;
color: #b18f81;
font-size: 11px;
}
.game-resource-book-thumbnail-body {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(94px, 1fr));
align-content: center;
gap: 12px;
flex: 1 1 auto;
min-height: 132px;
padding: 18px;
}
.game-resource-book-stack {
position: relative;
display: block;
min-height: 78px;
}
.game-resource-book-stack:has(.game-resource-card) {
min-height: 132px;
}
.game-resource-book-stack-card {
position: absolute;
inset: 0 0 auto;
display: flex;
flex-direction: column;
justify-content: center;
min-height: 64px;
padding: 8px 9px;
overflow: hidden;
border: 1px solid #e7cfc2;
border-radius: 10px;
background: linear-gradient(145deg, #fff 0%, #fff6ef 100%);
box-shadow: 0 5px 12px rgb(112 70 52 / 10%);
transform: translateY(calc(var(--stack-index, 0) * 5px));
}
.game-resource-book-stack-card:nth-last-child(2) {
transform: translateY(5px) rotate(-1deg);
}
.game-resource-book-stack-card:nth-last-child(3) {
transform: translateY(10px) rotate(1.4deg);
}
.game-resource-book-stack-card small {
overflow: hidden;
color: #b48876;
font-size: 9px;
text-overflow: ellipsis;
white-space: nowrap;
}
.game-resource-book-stack-card strong {
display: block;
margin-top: 4px;
overflow: hidden;
color: #68463a;
font-size: 10px;
text-overflow: ellipsis;
white-space: nowrap;
}
.game-resource-book-stack-card.is-blurred {
z-index: 0;
align-items: center;
color: #aa8576;
filter: blur(1.7px);
font-size: 12px;
opacity: 0.72;
transform: translateY(15px) scale(0.96);
}
.game-resource-book-stack-card--control {
width: 100%;
min-height: 128px;
padding: 0;
overflow: visible;
border: 0;
background: transparent;
box-shadow: none;
}
.game-resource-book-stack-card--control .game-resource-card {
width: 100%;
min-width: 0;
height: 100%;
min-height: 0;
}
.game-resource-book-thumbnail-empty {
display: grid;
min-height: 96px;
border: 1px dashed #e1cfc5;
border-radius: 12px;
color: #b79b8e;
font-size: 12px;
place-items: center;
}
.game-resource-book-thumbnail-footer {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 14px;
border-top: 1px solid #f0e2da;
color: #a98271;
font-size: 10px;
}
.game-resource-page-heading-meta {
display: inline-flex;
align-items: center;
gap: 10px;
}
.game-resource-page-collapse {
display: inline-flex;
align-items: center;
gap: 5px;
min-height: 28px;
padding: 0 9px;
border: 1px solid #e5cfc4;
border-radius: 8px;
background: rgb(255 250 246 / 85%);
color: #9d6650;
cursor: pointer;
font-size: 11px;
}
.game-resource-page-collapse:hover,
.game-resource-page-collapse:focus-visible {
border-color: #cc8060;
outline: 0;
box-shadow: 0 3px 10px rgb(158 87 57 / 14%);
}
@media (prefers-reduced-motion: reduce) {
.game-resource-book-main {
animation: none;
}
.game-resource-book-scene,
.game-resource-book-scene::before,
.game-resource-book-scene-titlebar,
.game-resource-book-scene-card,
.game-resource-book-scene-card .game-resource-card,
.game-resource-book-thumbnail {
transition: none !important;
}
}
/*
* 资源搜索浮层。
*
* 搜索条不再常驻:原来它和筛选条一起在管理区顶部占一条独立排布带(管理区 padding-top
* 加画本场景下移),栏目标题栏被挤到那条带下面仍然和搜索框叠在同一条水平带上。现在常态
* 只有右下角 Dock 里的搜索按钮,Ctrl/Cmd+FmacOS 为 Cmd+F)或点按钮才把浮层叫出来,
* Esc / 点外部收起(口径见 `useImageCanvasFloatingOptionDismiss`)。
*
* 浮层贴着右下角 Dock 向上展开:`bottom: 58px` = Dock 的 `bottom: 14px` + Dock 高度
* `34px` + 10px 间隙,所以它永远不会落到栏目标题栏(管理区顶边 min-height 42px)那条带上。
* `z-index: 40` 高于画本场景的 20,浮在资源卡与栏目标题栏之上。
*/
.game-resource-search {
position: absolute;
right: 14px;
bottom: 58px;
z-index: 40;
display: flex;
align-items: center;
gap: 8px;
width: min(320px, calc(100% - 28px));
padding: 0 10px;
border: 1px solid #ecdcd4;
border-radius: 10px;
background: #fff;
box-shadow: 0 6px 18px rgb(112 70 52 / 12%);
color: #a08073;
}
/*
* 搜索条件生效时(浮层收起也生效)Dock 上的搜索按钮保持高亮:筛选条件不会随浮层一起
* 消失,按钮必须能看出"当前有搜索",否则用户会以为资源丢了。复用 Dock 按钮的 hover 色。
*/
.game-resource-book-zoom-button.is-active {
background: #f7ebe4;
color: #b5582f;
}
.game-resource-search input {
width: 100%;
min-width: 0;
height: 34px;
padding: 0;
border: 0;
outline: 0;
background: transparent;
color: #50382f;
font-size: 12px;
}
/*
* 浮层提示(工作台状态提示、附件导入失败):不再占管理区顶部的排布带高度,改成绝对
* 定位的浮层,落在栏目标题栏(管理区顶边 min-height 42px)下面 16px 处居中。
*
* 容器整体 `pointer-events: none`,只有提示条自己恢复 `pointer-events: auto`:这条横跨
* 管理区的空盒子如果接收点击,就会把「资源总览」这类按钮的命中区域吃掉——那正是
* "回到资源总览点不动"的成因,所以命中的门槛只留在提示条自己的盒子上。
*/
.game-resource-book-notices {
position: absolute;
top: 58px;
left: 50%;
z-index: 40;
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
width: max-content;
max-width: min(420px, calc(100% - 28px));
transform: translateX(-50%);
pointer-events: none;
}
.game-resource-book-notices > * {
width: auto;
max-width: 100%;
pointer-events: auto;
}
.game-resource-classification-dialog {
width: min(480px, 100%);
}
.game-resource-classification-body {
display: grid;
gap: 10px;
}
.game-resource-classification-error {
margin: 0;
color: #b3261e;
font-size: 11px;
}
.game-resource-delete-dialog {
width: min(460px, 100%);
}
.game-resource-delete-dialog > footer {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 8px;
}
.game-resource-delete-body {
display: grid;
gap: 10px;
}
.game-resource-delete-body .game-resource-delete-summary {
margin: 0;
color: #6f5247;
font-size: 12px;
}
.game-resource-delete-versions {
display: grid;
gap: 6px;
margin: 0;
padding: 0;
max-height: 180px;
overflow: auto;
list-style: none;
}
.game-resource-delete-versions li {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 8px;
padding: 6px 8px;
border: 1px solid #f0ddd4;
border-radius: 10px;
background: #fff;
font-size: 11px;
}
.game-resource-delete-versions small {
color: #9a7d70;
font-size: 11px;
}
.game-resource-delete-option {
display: flex;
align-items: center;
gap: 8px;
font-size: 12px;
}
.game-resource-live-notice {
/* 「清除搜索并定位」只在搜索把刚提交的资源挡掉时出现,提示条同样要在画本场景之上。 */
position: relative;
z-index: 40;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
margin: 0;
padding: 8px 10px;
border: 1px solid #edc7b5;
border-radius: 10px;
background: #fff7f1;
color: #8d5b45;
font-size: 11px;
}
.game-resource-live-notice button {
flex: 0 0 auto;
border: 1px solid #dc9b7d;
border-radius: 8px;
background: #fff;
color: #9b5537;
}
.game-attachment-errors {
display: grid;
gap: 4px;
margin: 0;
padding: 8px 10px;
border: 1px solid #edc1ad;
border-radius: 10px;
background: #fff3ed;
}
.game-attachment-errors p {
display: flex;
align-items: baseline;
gap: 8px;
margin: 0;
color: #9e4d2f;
font-size: 10px;
}
.game-attachment-errors span {
min-width: 0;
overflow-wrap: anywhere;
}
.game-resource-canvas {
position: relative;
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
padding: 12px;
overflow: auto;
background-color: #fffdfa;
background-image: radial-gradient(#eaded8 0.8px, transparent 0.8px);
background-size: 18px 18px;
user-select: none;
}
.game-resource-canvas--dependency {
overflow: hidden;
cursor: grab;
overscroll-behavior: none;
touch-action: none;
}
.game-resource-canvas--dependency:active {
cursor: grabbing;
}
.game-resource-canvas--paged {
overflow: hidden;
cursor: grab;
overscroll-behavior: none;
touch-action: none;
}
.game-resource-canvas--paged:active {
cursor: grabbing;
}
.game-resource-canvas-content {
position: relative;
display: grid;
align-content: start;
width: 100%;
min-width: max(100%, 620px);
min-height: 100%;
}
.game-resource-canvas--dependency .game-resource-canvas-content {
display: block;
min-width: 0;
min-height: 0;
}
.game-resource-canvas-content--paged {
display: block;
flex: 1 1 auto;
min-width: 0;
min-height: 0;
}
.game-resource-page-shell {
position: relative;
width: 100%;
height: 100%;
}
.game-resource-page {
display: grid;
grid-template-rows: auto minmax(0, 1fr) auto;
gap: 10px;
height: 100%;
min-width: 0;
min-height: 0;
}
.game-resource-page-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 36px;
padding: 0 4px;
}
.game-resource-page-heading span {
display: inline-flex;
align-items: center;
gap: 8px;
color: #6d4b3f;
font-size: 13px;
}
.game-resource-page-heading strong {
font-size: 15px;
}
.game-resource-page-heading small {
color: #a98a7c;
font-size: 11px;
font-variant-numeric: tabular-nums;
}
.game-resource-page-canvas {
position: relative;
min-width: 0;
min-height: 0;
overflow: hidden;
border: 1px solid #ecdfd8;
border-radius: 12px;
background:
radial-gradient(#eaded8 0.8px, transparent 0.8px) 0 0 / 18px 18px,
#fffdfa;
}
.game-resource-canvas-reset {
position: absolute;
top: 12px;
right: 12px;
z-index: 3;
display: grid;
width: 30px;
height: 30px;
padding: 0;
border: 1px solid rgb(227 207 197 / 88%);
border-radius: 8px;
background: rgb(255 253 250 / 88%);
color: #8c6252;
cursor: pointer;
place-items: center;
box-shadow: 0 4px 12px rgb(112 70 52 / 10%);
backdrop-filter: blur(4px);
}
.game-resource-canvas-reset:hover,
.game-resource-canvas-reset:focus-visible {
border-color: #ce7650;
color: #bd5f37;
outline: 2px solid rgb(206 118 80 / 22%);
outline-offset: 1px;
}
.game-resource-page-world {
position: absolute;
top: 0;
left: 0;
transform-origin: 0 0;
}
.game-resource-page-empty {
position: absolute;
inset: 0;
display: grid;
padding: 24px;
color: #b0958a;
font-size: 12px;
place-items: center;
pointer-events: none;
}
.game-resource-next-page {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 38px;
padding: 0 14px;
border: 1px solid #e8d6cc;
border-radius: 10px;
background: #fff8f4;
color: #725348;
cursor: pointer;
}
.game-resource-next-page:hover,
.game-resource-next-page:focus-visible {
border-color: #d6946f;
color: #a9502a;
outline: 0;
}
.game-resource-next-page span {
color: #a98a7c;
font-size: 10px;
}
.game-resource-next-page strong {
font-size: 12px;
}
/*
* 「所有资源」页。
*
* 资源总览第 0 张卡打开的汇总页:左侧沿用栏目大纲,正文按栏目分组的滚动卡片网格。
* 整页自成一层(`z-index: 21`):栏目态的画本场景自带一层不透明底纹(`z-index: 20`),
* 只在 `z-index: auto` 上铺会被它盖住;同时它不落在 `.game-resource-canvas` 里,
* 那层挂着画布平移/框选的指针与滚轮处理器,会把这里的滚动吃掉。
*
* 卡片本体仍由栏目页同一颗卡片渲染器产出(尺寸取画布默认卡宽高),
* 因此这一页只补齐容器与网格,不新增卡片样式。
*/
.game-resource-all-resources-host {
position: absolute;
z-index: 21;
inset: 0;
padding: 12px;
overflow: hidden;
background-color: #fffdfa;
background-image: radial-gradient(#eaded8 0.8px, transparent 0.8px);
background-size: 18px 18px;
}
.game-resource-all-scroll {
display: grid;
gap: 14px;
align-content: start;
min-height: 0;
padding: 2px;
overflow: auto;
overscroll-behavior: contain;
}
.game-resource-all-section {
display: grid;
gap: 10px;
padding: 12px;
border: 1px solid #ecdfd8;
border-radius: 12px;
background: rgb(255 253 250 / 82%);
}
.game-resource-all-grid {
display: grid;
grid-template-columns: repeat(auto-fill, 180px);
gap: 14px;
}
.game-resource-all-card {
position: relative;
display: block;
}
/* 只浏览的页面不接拖拽:光标如实反映「点选 / 播放」,并且把纵向触摸手势交还给滚动容器
`.game-resource-card` 常态是 `touch-action: none`,那是画布拖卡需要的)。 */
.game-resource-all-grid .game-resource-card {
cursor: pointer;
touch-action: pan-y;
}
.game-resource-section-stack {
display: contents;
}
.game-resource-dependency-overlay {
position: absolute;
inset: 0;
z-index: 0;
width: 100%;
height: 100%;
overflow: visible;
pointer-events: none;
}
.game-resource-dependency-description {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0 0 0 0);
white-space: nowrap;
border: 0;
}
.game-resource-world-section-heading {
position: absolute;
right: 24px;
left: 24px;
z-index: 1;
display: flex;
align-items: center;
justify-content: space-between;
min-height: 32px;
padding: 0 8px;
border-bottom: 1px solid #eaded8;
color: #725348;
font-size: 12px;
font-weight: 800;
pointer-events: none;
}
.game-resource-world-section-heading > span {
display: inline-flex;
align-items: center;
gap: 6px;
}
.game-resource-world-section-heading small {
color: #9b6b56;
font-size: 10px;
font-weight: 700;
}
.game-resource-dependency-edge,
.game-resource-dependency-edge path {
fill: none;
stroke-linecap: round;
stroke-linejoin: round;
vector-effect: non-scaling-stroke;
}
.game-resource-dependency-edge--reference {
stroke: #c45f20;
stroke-width: 2.4px;
opacity: 1;
}
.game-resource-dependency-edge.is-cyclic,
.game-resource-dependency-edge.is-cyclic path {
stroke-dashoffset: 4;
}
.game-resource-dependency-marker--reference path {
fill: #c45f20;
stroke-linejoin: round;
}
.game-resource-section {
position: relative;
z-index: 1;
display: grid;
grid-template-rows: auto minmax(0, 1fr);
gap: 10px;
box-sizing: border-box;
height: var(--resource-section-height);
min-width: 620px;
min-height: 0;
padding: 14px 6px 18px;
overflow: hidden;
border-bottom: 1px solid #eaded8;
}
.game-resource-section:last-of-type {
border-bottom: 0;
}
.game-resource-section > header {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 22px;
}
.game-resource-section > header span {
display: inline-flex;
align-items: center;
gap: 6px;
color: #725348;
font-size: 12px;
font-weight: 800;
}
.game-resource-section-actions {
display: inline-flex;
align-items: center;
gap: 6px;
}
.game-resource-section-height-actions,
.game-resource-section-zoom-actions {
display: inline-flex;
align-items: center;
gap: 3px;
}
.game-resource-section-actions small {
display: grid;
min-width: 22px;
height: 22px;
padding: 0 6px;
border-radius: 999px;
background: #f3e6df;
color: #9b6b56;
font-size: 10px;
place-items: center;
}
.game-resource-section-actions button {
display: grid;
width: 24px;
height: 24px;
padding: 0;
border: 1px solid #e3cfc5;
border-radius: 7px;
background: rgb(255 255 255 / 88%);
color: #8c6252;
cursor: pointer;
place-items: center;
}
.game-resource-section-actions button:hover:not(:disabled),
.game-resource-section-actions button:focus-visible {
border-color: #ce7650;
outline: 2px solid rgb(206 118 80 / 22%);
outline-offset: 1px;
color: #bd5f37;
}
.game-resource-section-actions button:disabled {
border-color: #eadfd9;
background: #f7f1ed;
color: #c5afa5;
cursor: not-allowed;
opacity: 0.64;
}
.game-resource-section-actions .game-resource-section-zoom-value {
width: auto;
min-width: 40px;
padding: 0 6px;
font-size: 10px;
font-variant-numeric: tabular-nums;
}
.game-resource-section-viewport {
position: relative;
min-width: 0;
min-height: 0;
overflow: auto;
border-radius: 8px;
overscroll-behavior: contain;
scrollbar-gutter: stable;
}
.game-resource-canvas--dependency .game-resource-section {
overflow: visible;
}
.game-resource-canvas--dependency .game-resource-section-viewport {
overflow: visible;
scrollbar-gutter: auto;
}
.game-resource-canvas--dependency .game-resource-section-height-actions,
.game-resource-canvas--dependency .game-resource-section-zoom-actions {
display: none;
}
.game-resource-canvas--dependency .game-resource-section {
pointer-events: none;
}
.game-resource-canvas--dependency .game-resource-card,
.game-resource-canvas--dependency .game-resource-section > header {
pointer-events: auto;
}
.game-resource-section-viewport:focus-visible {
outline: 2px solid rgb(206 118 80 / 26%);
outline-offset: -2px;
}
.game-resource-section-viewport > p {
margin: 0;
color: #b0958a;
font-size: 11px;
}
.game-resource-plane-frame {
position: relative;
min-width: 0;
min-height: 0;
}
.game-resource-plane {
position: absolute;
top: 0;
left: 0;
min-width: 620px;
min-height: 108px;
transform: scale(var(--resource-section-zoom, 1));
transform-origin: 0 0;
}
.game-resource-card {
position: absolute;
z-index: 1;
top: 0;
left: 0;
width: var(--resource-card-width);
min-width: var(--resource-card-width);
height: var(--resource-card-height);
min-height: var(--resource-card-height);
padding: 0;
overflow: visible;
border: 0;
border-radius: 12px;
background: #fff;
color: #4e382f;
box-shadow: 0 6px 18px rgb(96 62 47 / 6%);
touch-action: manipulation;
user-select: none;
transform: translate3d(var(--resource-x, 0), var(--resource-y, 0), 0);
}
.game-resource-card {
cursor: grab;
touch-action: none;
}
.game-resource-card.is-dragging {
cursor: grabbing;
box-shadow:
0 14px 32px rgb(195 105 62 / 24%),
0 0 0 2px rgb(216 115 66 / 24%);
}
.game-resource-card:hover,
.game-resource-card:focus-within,
.game-resource-card.is-selected {
border-color: #d57b51;
outline: 0;
box-shadow: 0 8px 22px rgb(195 105 62 / 15%);
}
/* C5 卡片边框:只有被当前版本绑定使用的素材带边框,其余资源卡无边框。 */
.game-resource-card.is-current-version {
border: 1px solid #d87342;
box-shadow:
0 6px 18px rgb(96 62 47 / 10%),
0 0 0 2px rgb(216 115 66 / 14%);
}
.game-resource-card.is-relation-version-binding {
border-color: #d87342;
box-shadow:
0 8px 22px rgb(195 105 62 / 18%),
0 0 0 2px rgb(216 115 66 / 14%);
}
.game-resource-card-visual {
position: absolute;
inset: 0;
display: grid;
overflow: hidden;
border-radius: inherit;
background: linear-gradient(145deg, #fffaf6, #f6ece6);
color: #c46a40;
place-items: center;
}
.game-resource-card[data-preview-kind='raster-image']
.game-resource-card-visual,
.game-resource-card[data-preview-kind='media-image'] .game-resource-card-visual,
.game-resource-card[data-preview-kind='video'] .game-resource-card-visual {
background: linear-gradient(45deg, #f1ebe7 25%, transparent 25%),
linear-gradient(-45deg, #f1ebe7 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, #f1ebe7 75%),
linear-gradient(-45deg, transparent 75%, #f1ebe7 75%), #faf7f5;
background-position:
0 0,
0 8px,
8px -8px,
-8px 0;
background-size: 16px 16px;
}
.game-resource-card-visual > img,
.game-resource-card-visual > video {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
}
.game-resource-card-visual > video {
visibility: hidden;
background: #211d1b;
}
.game-resource-card-visual > video.is-decoded {
visibility: visible;
}
.game-resource-card-type-badge {
position: absolute;
top: 8px;
right: 8px;
z-index: 2;
display: inline-flex;
max-width: calc(100% - 16px);
align-items: center;
min-width: 0;
padding: 4px 8px;
overflow: hidden;
border: 1px solid rgb(255 255 255 / 72%);
border-radius: 999px;
background: rgb(75 48 38 / 84%);
color: #fff;
font-size: 10px;
font-weight: 900;
line-height: 1;
letter-spacing: 0.02em;
pointer-events: none;
text-overflow: ellipsis;
white-space: nowrap;
box-shadow: 0 8px 18px rgb(96 62 47 / 20%);
transform: scale(var(--genarrative-image-canvas-inverse-scale, 1));
transform-origin: top right;
}
.game-resource-card-media-control {
transform: scale(var(--genarrative-image-canvas-inverse-scale, 1));
transform-origin: bottom right;
}
.game-resource-card-select {
position: absolute;
z-index: 1;
inset: 0;
width: 100%;
height: 100%;
padding: 0;
border: 0;
border-radius: inherit;
background: transparent;
cursor: pointer;
touch-action: manipulation;
}
.game-resource-card-select:focus-visible {
outline: 3px solid rgb(213 123 81 / 55%);
outline-offset: -4px;
}
.game-resource-card-media-control {
position: absolute;
right: 9px;
bottom: 9px;
z-index: 2;
display: grid;
width: 34px;
height: 34px;
padding: 0;
border: 1px solid rgb(255 255 255 / 70%);
border-radius: 50%;
background: rgb(75 48 38 / 82%);
color: #fff;
box-shadow: 0 5px 14px rgb(52 30 22 / 24%);
cursor: pointer;
place-items: center;
}
.game-resource-card-media-control:hover,
.game-resource-card-media-control:focus-visible,
.game-resource-card-media-control[aria-pressed='true'] {
background: #c96f44;
outline: 2px solid rgb(255 255 255 / 92%);
outline-offset: 1px;
}
.game-resource-card-reference {
position: absolute;
right: 49px;
/* 与右侧 34px 播放钮圆心对齐:9 + 34 / 2 = 14 + 24 / 2。 */
bottom: 14px;
z-index: 2;
display: grid;
/* 视觉按 0.8× 缩小:30 → 24,内部图标 16 → 13 同步缩。 */
width: 24px;
height: 24px;
padding: 0;
border: 1px solid rgb(255 255 255 / 70%);
border-radius: 50%;
background: rgb(75 48 38 / 82%);
color: #fff;
box-shadow: 0 5px 14px rgb(52 30 22 / 24%);
cursor: pointer;
place-items: center;
}
/*
* 视觉缩小但热区不缩:伪元素撑出 44×44(本仓 window chrome / 素材选择列表同口径的最小
* 可点尺寸),只扩命中范围,不参与布局也不改变绘制;整体向左让 4px,让热区右边缘正好与
* 右侧 34px 播放钮的盒子相邻而不覆盖它。
*/
.game-resource-card-reference::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 44px;
height: 44px;
border-radius: 50%;
transform: translate(calc(-50% - 4px), -50%);
}
.game-resource-card-reference svg {
width: 13px;
height: 13px;
}
.game-resource-card:not(:has(.game-resource-card-media-control))
.game-resource-card-reference {
right: 9px;
}
.game-resource-card-reference:hover,
.game-resource-card-reference:focus-visible {
background: #c96f44;
outline: 2px solid rgb(255 255 255 / 92%);
outline-offset: 1px;
}
.game-resource-card-placeholder,
.game-resource-card-version-visual,
.game-resource-card-audio-visual {
display: grid;
width: 100%;
height: 100%;
place-items: center;
}
.game-resource-card-audio-visual {
position: relative;
background: linear-gradient(145deg, #fff8f1, #f2ded2);
}
.game-resource-card-audio-visual > span {
width: 92px;
height: 18px;
margin-top: -24px;
background: repeating-linear-gradient(
90deg,
rgb(196 106 64 / 32%) 0 3px,
transparent 3px 7px
);
mask-image: linear-gradient(
to bottom,
transparent,
#000 25%,
#000 75%,
transparent
);
}
.game-resource-card-audio-visual audio {
display: none;
}
.game-resource-card-document-summary {
display: -webkit-box;
max-height: 100%;
padding: 16px;
overflow: hidden;
color: #674c41;
font-size: 11px;
line-height: 1.55;
text-align: left;
white-space: normal;
-webkit-box-orient: vertical;
-webkit-line-clamp: 5;
}
.game-resource-card-version-visual {
align-content: center;
gap: 10px;
}
.game-resource-card-version-relations {
color: #8e6f62;
font-size: 9px;
font-weight: 700;
}
.game-resource-focus {
position: absolute;
top: 50%;
left: 50%;
z-index: 100;
display: grid;
grid-template-rows: auto minmax(0, 1fr);
min-width: 0;
min-height: 0;
width: min(560px, calc(100% - 32px));
max-height: calc(100% - 32px);
border: 1px solid #ead8cf;
border-radius: 16px;
box-shadow: 0 18px 52px rgb(73 42 29 / 20%);
overflow: hidden;
background: #fffdfa;
color: #563b31;
outline: 0;
transform: translate(-50%, -50%);
}
.game-resource-focus--art {
width: min(920px, calc(100% - 48px));
max-height: calc(100% - 48px);
}
.game-resource-image-preview {
display: grid;
min-height: 160px;
max-height: 280px;
padding: 12px;
border: 1px solid #ead8cf;
border-radius: 8px;
background: #f8f0eb;
place-items: center;
}
.game-resource-focus--art .game-resource-image-preview {
min-height: clamp(320px, 58vh, 720px);
max-height: none;
padding: 18px;
}
.game-resource-image-preview img {
display: block;
width: auto;
max-width: 100%;
height: auto;
max-height: 252px;
object-fit: contain;
outline: 1px solid rgb(0 0 0 / 10%);
outline-offset: -1px;
}
.game-resource-focus--art .game-resource-image-preview img,
.game-resource-focus--art .game-resource-image-preview video {
max-width: 100%;
max-height: min(62vh, 680px);
}
.game-resource-focus--art .game-resource-image-preview video {
display: block;
width: auto;
height: auto;
object-fit: contain;
}
.game-resource-focus-titlebar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 58px;
padding: 10px 14px 10px 16px;
border-bottom: 1px solid #ead8cf;
background: #fff8f3;
}
.game-resource-focus-heading {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
}
.game-resource-focus-heading > span:last-child {
display: grid;
min-width: 0;
}
.game-resource-focus-heading small {
color: #a27764;
font-size: 9px;
font-weight: 700;
}
.game-resource-focus-icon {
display: grid;
width: 36px;
height: 36px;
flex: 0 0 auto;
border-radius: 10px;
background: #fae9df;
color: #c46a40;
place-items: center;
}
.game-resource-focus-heading strong {
min-width: 0;
overflow: hidden;
font-size: 15px;
text-overflow: ellipsis;
white-space: nowrap;
}
.game-resource-focus-actions {
display: flex;
align-items: center;
gap: 8px;
flex: 0 0 auto;
}
.game-resource-focus-action {
min-height: 32px;
padding: 0 14px;
border: 1px solid #d78d69;
border-radius: 9px;
background: #fff;
color: #a65331;
font-size: 11px;
font-weight: 700;
cursor: pointer;
}
.game-resource-focus-body {
display: grid;
grid-auto-rows: max-content;
align-content: start;
gap: 6px;
min-height: 0;
padding: 24px 28px 28px;
overflow: auto;
overscroll-behavior: contain;
scrollbar-gutter: stable;
}
.game-resource-focus-close {
display: grid;
width: 28px;
height: 28px;
flex: 0 0 auto;
padding: 0;
border: 1px solid #ead8cf;
border-radius: 50%;
background: #fff;
color: #8d6d60;
place-items: center;
cursor: pointer;
}
.game-resource-editor {
display: grid;
grid-template-rows: auto minmax(0, 1fr);
width: 100%;
min-width: 0;
min-height: 0;
overflow: hidden;
background: #fffdfa;
color: #563b31;
}
.game-resource-editor-titlebar {
display: flex;
align-items: center;
gap: 12px;
min-height: 58px;
padding: 10px 16px;
border-bottom: 1px solid #ead8cf;
background: #fff8f3;
}
.game-resource-editor-titlebar > span {
display: grid;
min-width: 0;
}
.game-resource-editor-titlebar small {
color: #a27764;
font-size: 9px;
font-weight: 700;
}
.game-resource-editor-titlebar strong {
overflow: hidden;
font-size: 15px;
text-overflow: ellipsis;
white-space: nowrap;
}
.game-resource-editor-back {
display: inline-flex;
align-items: center;
gap: 4px;
min-height: 32px;
padding: 0 10px;
border: 1px solid #ead8cf;
border-radius: 9px;
background: #fff;
color: #795d52;
cursor: pointer;
}
.game-resource-editor-form {
display: grid;
align-content: start;
gap: 16px;
width: min(680px, calc(100% - 32px));
margin: 0 auto;
padding: 28px 0 36px;
overflow: auto;
}
.game-resource-editor-form label {
display: grid;
gap: 7px;
color: #76594e;
font-size: 11px;
font-weight: 700;
}
.game-resource-editor-form input,
.game-resource-editor-form textarea {
width: 100%;
min-width: 0;
padding: 10px 12px;
border: 1px solid #dfc9bf;
border-radius: 10px;
outline: 0;
background: #fff;
color: #50382f;
font: inherit;
font-size: 12px;
font-weight: 400;
}
.game-resource-editor-form textarea {
min-height: 150px;
resize: vertical;
line-height: 1.6;
}
.game-resource-editor-form input:focus,
.game-resource-editor-form textarea:focus {
border-color: #c8754e;
box-shadow: 0 0 0 3px rgb(200 117 78 / 13%);
}
.game-resource-editor-form input:disabled,
.game-resource-editor-form textarea:disabled {
background: #f7f1ed;
color: #806d64;
}
.game-resource-editor-semantic-note,
.game-resource-editor-error {
margin: 0;
padding: 10px 12px;
border-radius: 10px;
font-size: 11px;
line-height: 1.5;
}
.game-resource-editor-semantic-note {
border: 1px solid #ead8cf;
background: #fff8f3;
color: #80665b;
}
.game-resource-editor-error {
border: 1px solid #e5a78d;
background: #fff1eb;
color: #9e4d2f;
}
.game-resource-editor-actions {
display: flex;
justify-content: flex-end;
}
.game-resource-editor-actions button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
min-height: 36px;
padding: 0 16px;
border: 1px solid #bd603a;
border-radius: 10px;
background: #c96e47;
color: #fff;
font-size: 12px;
font-weight: 700;
cursor: pointer;
}
.game-resource-editor-actions button:disabled,
.game-resource-editor-back:disabled {
cursor: not-allowed;
opacity: 0.55;
}
.game-resource-editor-spinner {
animation: game-resource-editor-spin 0.9s linear infinite;
}
@keyframes game-resource-editor-spin {
to {
transform: rotate(360deg);
}
}
.game-resource-focus-metadata {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px 18px;
margin: 0 0 8px;
padding: 12px 14px;
border: 1px solid #eaded8;
border-radius: 12px;
background: #fff;
}
.game-resource-focus-metadata > div {
display: grid;
grid-template-columns: 72px minmax(0, 1fr);
gap: 8px;
min-width: 0;
}
.game-resource-focus-metadata dt,
.game-resource-focus-metadata dd {
margin: 0;
overflow-wrap: anywhere;
font-size: 10px;
}
.game-resource-focus-metadata dt {
color: #a08377;
}
.game-resource-focus-metadata dd {
color: #5d4339;
}
.game-resource-audio-preview {
position: relative;
display: grid;
min-width: 0;
min-height: 0;
margin-bottom: 8px;
overflow: hidden;
border: 1px solid #ead8cf;
border-radius: 12px;
background: #faf7f5;
place-items: center;
}
.game-resource-audio-preview {
align-content: center;
padding: 28px;
background: linear-gradient(145deg, #fffaf6, #f5e7df);
}
.game-resource-audio-preview audio {
width: min(620px, 100%);
}
.game-resource-audio-load {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
min-height: 38px;
padding: 0 16px;
border: 1px solid #ddb7a5;
border-radius: 999px;
background: #fff;
color: #a95734;
font-size: 12px;
font-weight: 800;
cursor: pointer;
}
.game-resource-audio-load:hover,
.game-resource-audio-load:focus-visible {
border-color: #c96f44;
outline: 2px solid rgb(201 111 68 / 24%);
outline-offset: 2px;
}
.game-resource-audio-preview p {
margin: 0;
padding: 20px;
color: #92776c;
font-size: 12px;
text-align: center;
}
.game-resource-document-body {
min-width: 0;
min-height: 0;
margin-top: 6px;
padding: 14px;
border-radius: 10px;
background: #f8f2ee;
color: #765c51;
font-size: 12px;
line-height: 1.6;
overflow: auto;
overflow-wrap: anywhere;
overscroll-behavior: contain;
scrollbar-gutter: stable;
user-select: text;
}
.game-resource-code-body {
min-width: 0;
overflow: auto;
border: 1px solid #eadbd4;
border-radius: 12px;
background: #2c2021;
color: #ffe8d8;
}
.game-resource-code-body pre {
min-width: max-content;
margin: 0;
padding: 14px;
font:
12px/1.55 ui-monospace,
SFMono-Regular,
Consolas,
monospace;
white-space: pre;
}
.game-resource-document-body > :first-child {
margin-top: 0;
}
.game-resource-document-body > :last-child {
margin-bottom: 0;
}
.game-resource-document-body h1,
.game-resource-document-body h2,
.game-resource-document-body h3,
.game-resource-document-body h4 {
margin: 1.15em 0 0.55em;
color: #63483d;
line-height: 1.35;
}
.game-resource-document-body h1 {
font-size: 17px;
}
.game-resource-document-body h2 {
font-size: 15px;
}
.game-resource-document-body h3,
.game-resource-document-body h4 {
font-size: 13px;
}
.game-resource-document-body p,
.game-resource-document-body ul,
.game-resource-document-body ol,
.game-resource-document-body blockquote,
.game-resource-document-body pre,
.game-resource-document-body table {
margin: 0 0 0.75em;
}
.game-resource-document-body ul,
.game-resource-document-body ol {
padding-left: 1.6em;
}
.game-resource-document-body li + li {
margin-top: 0.24em;
}
.game-resource-document-body blockquote {
padding: 0.55em 0.8em;
border-left: 3px solid #d99a77;
background: rgb(255 255 255 / 52%);
}
.game-resource-document-body code {
padding: 0.12em 0.32em;
border-radius: 4px;
background: #eaded7;
color: #735044;
}
.game-resource-document-body pre {
overflow-x: auto;
padding: 0.75em;
border-radius: 8px;
background: #eaded7;
}
.game-resource-document-body pre code {
padding: 0;
background: transparent;
}
.game-resource-document-body a {
color: #b65d37;
text-decoration: underline;
}
.game-resource-document-link-text {
color: #8f5e49;
text-decoration: underline dotted;
}
.game-resource-document-image-placeholder {
display: inline-block;
padding: 0.2em 0.45em;
border-radius: 5px;
background: #eaded7;
color: #806559;
}
.game-resource-document-body table {
width: 100%;
border-collapse: collapse;
}
.game-resource-document-body th,
.game-resource-document-body td {
padding: 0.45em 0.55em;
border: 1px solid #ddc9be;
text-align: left;
}
.game-run-surface {
position: relative;
display: grid;
grid-template-rows: minmax(300px, 1fr) auto;
grid-row: 2 / -1;
gap: 12px;
height: 100%;
min-height: 0;
padding: 12px;
background: transparent;
}
/* C7 版本入口:运行模块右上角,没有版本时不渲染。 */
.game-run-version-picker {
position: absolute;
top: 20px;
right: 20px;
z-index: 5;
}
.game-run-version-trigger {
display: inline-flex;
max-width: min(18rem, 60vw);
min-height: 30px;
align-items: center;
padding: 0 12px;
border: 1px solid #e5cfc4;
border-radius: 999px;
background: rgb(255 250 246 / 92%);
color: #8a4a30;
cursor: pointer;
font-size: 12px;
font-weight: 700;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.game-run-version-trigger:hover,
.game-run-version-trigger:focus-visible {
border-color: #cc8060;
outline: 0;
box-shadow: 0 3px 10px rgb(158 87 57 / 14%);
}
.game-run-version-menu {
display: grid;
gap: 2px;
max-height: min(20rem, 60vh);
min-width: 14rem;
padding: 6px;
border: 1px solid #e5cfc4;
border-radius: 12px;
background: #fffaf6;
box-shadow: 0 12px 28px rgb(120 70 45 / 18%);
overflow-y: auto;
z-index: 80;
}
.game-run-version-menu button {
display: grid;
gap: 2px;
padding: 7px 9px;
border: 0;
border-radius: 8px;
background: transparent;
color: #50382f;
cursor: pointer;
font-size: 12px;
text-align: left;
}
.game-run-version-menu button small {
color: #a08073;
font-size: 10px;
}
.game-run-version-menu button:hover,
.game-run-version-menu button:focus-visible {
background: #fdeee5;
outline: 0;
}
.game-run-version-menu button.is-selected {
background: #f8e2d6;
font-weight: 700;
}
.game-run-preview {
position: relative;
display: block;
min-height: 300px;
border: 1px dashed #dfb59f;
border-radius: 14px;
background: linear-gradient(145deg, #fffaf6, #f8ebe4);
color: #c06940;
text-align: center;
overflow: hidden;
}
.game-run-preview iframe {
min-height: 0;
}
.game-run-preview-empty {
display: grid;
align-content: center;
justify-items: center;
gap: 9px;
width: 100%;
height: 100%;
min-height: 300px;
}
.game-run-preview strong {
color: #563b31;
font-size: 15px;
}
.game-run-preview span {
max-width: min(480px, 80%);
color: #96796d;
font-size: 11px;
overflow-wrap: anywhere;
}
.game-run-panels {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.game-run-panels > section {
display: grid;
align-content: start;
gap: 8px;
min-width: 0;
min-height: 156px;
padding: 12px;
border: 1px solid #eadbd4;
border-radius: 12px;
background: #fff;
}
.game-run-panels header {
display: flex;
align-items: center;
gap: 6px;
color: #62483d;
font-size: 12px;
font-weight: 800;
}
.game-run-panels p,
.game-run-panels label,
.game-run-panels dt,
.game-run-panels dd {
margin: 0;
color: #927a70;
font-size: 10px;
}
.game-run-panels dl,
.game-run-panels dl div {
display: grid;
gap: 4px;
}
.game-run-panels dl {
margin: 0;
gap: 6px;
}
.game-run-panels dl div {
grid-template-columns: 52px minmax(0, 1fr);
}
.game-run-panels dd {
color: #533d34;
overflow-wrap: anywhere;
}
.game-run-panels label {
display: grid;
grid-template-columns: minmax(0, 1fr) 88px;
align-items: center;
gap: 8px;
}
.game-run-panels input {
min-width: 0;
height: 30px;
padding: 0 8px;
border: 1px solid #eadbd4;
border-radius: 8px;
background: #faf7f5;
color: #8f7d75;
font-size: 10px;
}
.game-workbench-chat {
display: grid;
grid-template-rows: auto minmax(0, 1fr);
min-height: 0;
}
.game-workbench-chat > header {
position: relative;
display: flex;
align-items: center;
gap: 9px;
padding: 4px 14px;
background: transparent;
}
.game-workbench-chat > header > div {
display: grid;
gap: 2px;
}
.launcher-main:has(.game-project-workbench) > .launcher-account-bar {
display: none;
}
.game-workbench-chat-title {
min-width: 0;
justify-items: start;
text-align: left;
}
.game-workbench-chat-wallet {
position: relative;
z-index: 1;
margin-left: auto;
}
.game-workbench-chat-wallet .launcher-account-bar {
position: static;
}
.game-workbench-editor-actions {
display: flex;
align-items: center;
gap: 8px;
}
.game-workbench-editor-wallet .launcher-account-bar {
position: static;
}
.game-workbench-approval-trigger {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 4px;
min-height: 28px;
margin-left: auto;
padding: 0 9px;
border: 1px solid var(--platform-surface-border);
border-radius: 999px;
background: var(--platform-button-ghost-fill);
color: var(--platform-button-ghost-text);
font-size: 10px;
font-weight: 700;
white-space: nowrap;
cursor: pointer;
}
.game-workbench-chat > header strong {
color: var(--platform-text-strong);
font-size: 13px;
}
.game-workbench-chat > header small {
color: var(--platform-text-soft);
font-size: 10px;
}
.game-workbench-chat .supervisor-chat-only-runtime-controls {
max-width: none;
}
.game-workbench-chat .supervisor-chat-only-runtime-controls .pending-command {
gap: 12px;
padding: 10px 12px;
border: 1px solid var(--platform-surface-border);
border-radius: 10px;
background: var(--platform-warm-bg);
}
.game-workbench-chat
.supervisor-chat-only-runtime-controls
.pending-command
> span {
gap: 4px;
min-width: 0;
margin: 0;
overflow-wrap: anywhere;
color: var(--platform-text-strong);
font-size: 12px;
font-weight: 800;
}
.game-workbench-chat
.supervisor-chat-only-runtime-controls
.pending-command
> span
small {
color: var(--platform-text-soft);
font-weight: 500;
line-height: 1.4;
}
.game-workbench-chat .pending-command-actions button {
min-width: 52px;
height: 34px;
flex: 0 0 auto;
border: 1px solid var(--platform-surface-border);
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
font-size: 11px;
font-weight: 800;
}
.game-workbench-chat .pending-command-actions button:last-child {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
.agent-runtime-status .project-runtime-pending-command > span {
min-width: 0;
margin: 0;
overflow-wrap: anywhere;
color: var(--platform-text-strong);
font-size: 12px;
font-weight: 800;
}
.agent-runtime-status .project-runtime-pending-command > span small {
display: block;
margin-top: 4px;
color: var(--platform-text-soft);
font-weight: 500;
line-height: 1.4;
}
.agent-runtime-status
.project-runtime-pending-command
.pending-command-actions {
display: flex;
align-items: center;
gap: 8px;
flex: 0 0 auto;
}
.agent-runtime-status
.project-runtime-pending-command
.pending-command-actions
button:last-child {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
.game-workbench-chat .agent-runtime-status .project-runtime-pending-command {
grid-template-columns: minmax(0, 1fr) 136px;
}
.game-workbench-chat
.agent-runtime-status
.project-runtime-pending-command
.pending-command-actions {
display: grid;
grid-template-columns: repeat(2, 64px);
gap: 8px;
width: 136px;
flex: 0 0 136px;
}
.game-workbench-chat
.agent-runtime-status
.project-runtime-pending-command
.pending-command-actions
button {
width: 64px;
min-width: 64px;
max-width: 64px;
padding: 0;
white-space: nowrap;
}
/* Runtime 确认卡在部分项目状态下位于状态包装层外,工作台样式直接绑定卡片自身,避免回落旧的蓝色按钮样式。 */
.game-workbench-chat .project-runtime-pending-command {
display: grid;
grid-template-columns: minmax(0, 1fr) 136px;
align-items: center;
gap: 12px;
padding: 10px 12px;
border: 1px solid var(--platform-surface-border);
border-radius: 10px;
background: var(--platform-warm-bg);
}
.game-workbench-chat
.project-supervisor-surface
> .project-runtime-pending-command,
.game-workbench-chat
.project-supervisor-conversation
.project-runtime-pending-command {
display: grid;
grid-template-columns: minmax(0, 1fr) 136px;
align-items: center;
gap: 12px;
width: 100%;
margin: 0;
padding: 10px 12px;
border: 1px solid var(--platform-surface-border);
border-radius: 10px;
background: var(--platform-warm-bg);
}
.game-workbench-chat
.project-supervisor-conversation
.project-runtime-pending-command
> span {
min-width: 0;
margin: 0;
overflow-wrap: anywhere;
color: var(--platform-text-strong);
font-size: 12px;
font-weight: 800;
}
.game-workbench-chat
.project-supervisor-conversation
.project-runtime-pending-command
> span
small {
display: block;
margin-top: 4px;
color: var(--platform-text-soft);
font-size: 10px;
font-weight: 500;
line-height: 1.4;
}
.game-workbench-chat
.project-supervisor-conversation
.project-runtime-pending-command
.pending-command-actions {
display: grid;
grid-template-columns: repeat(2, 64px);
gap: 8px;
width: 136px;
flex: 0 0 136px;
}
.game-workbench-chat
.project-supervisor-conversation
.project-runtime-pending-command
.pending-command-actions
button {
width: 64px;
min-width: 64px;
max-width: 64px;
height: 34px;
padding: 0;
border: 1px solid var(--platform-surface-border);
border-radius: 8px;
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
font-size: 11px;
font-weight: 800;
white-space: nowrap;
}
.game-workbench-chat
.project-supervisor-conversation
.project-runtime-pending-command
.pending-command-actions
button:last-child {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
/* 该卡片的两个操作按钮禁止被全局 button 规则压缩,确保“拒绝 / 确认”完整可见。 */
.project-runtime-pending-command .pending-command-actions button {
display: inline-flex !important;
width: 64px !important;
min-width: 64px !important;
max-width: 64px !important;
flex: 0 0 64px !important;
align-items: center;
justify-content: center;
padding: 0 !important;
overflow: visible;
white-space: nowrap;
}
.game-workbench-chat .project-runtime-pending-command > span {
min-width: 0;
margin: 0;
overflow-wrap: anywhere;
color: var(--platform-text-strong);
font-size: 12px;
font-weight: 800;
}
.game-workbench-chat .project-runtime-pending-command > span small {
display: block;
margin-top: 4px;
color: var(--platform-text-soft);
font-size: 10px;
font-weight: 500;
line-height: 1.4;
}
.game-workbench-chat .project-runtime-pending-command .pending-command-actions {
display: grid;
grid-template-columns: repeat(2, 64px);
gap: 8px;
width: 136px;
flex: 0 0 136px;
}
.game-workbench-chat
.project-runtime-pending-command
.pending-command-actions
button {
width: 64px;
min-width: 64px;
max-width: 64px;
height: 34px;
padding: 0;
border: 1px solid var(--platform-surface-border);
border-radius: 8px;
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
font-size: 11px;
font-weight: 800;
white-space: nowrap;
}
.game-workbench-chat
.project-runtime-pending-command
.pending-command-actions
button:last-child {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
.game-workbench-chat .project-supervisor-surface {
grid-template-columns: minmax(0, 1fr);
gap: 0;
height: 100%;
max-height: 100%;
min-height: 0;
padding: 10px;
overflow: hidden;
}
.game-workbench-chat .project-supervisor-conversation {
position: relative;
display: block;
height: 100%;
min-height: 0;
overflow: hidden;
}
.game-workbench-chat .project-supervisor-message-list {
height: 100%;
min-height: 96px;
max-height: none;
overflow-y: auto;
border: 1px solid var(--platform-subpanel-border);
background: var(--platform-input-fill);
padding-bottom: 196px;
scroll-padding-bottom: 196px;
scrollbar-gutter: stable;
}
/* Keep the transcript readable while making the user's turns immediately
distinct from the assistant stream, like a conventional chat surface. */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list
.message {
width: fit-content;
max-width: min(88%, 720px);
margin: 0;
padding: 9px 12px;
border-radius: 14px;
line-height: 1.55;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list
.message
+ .message {
margin-top: 10px;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list
.message--user {
margin-left: auto;
border: 1px solid var(--platform-button-primary-border);
border-radius: 14px 14px 4px;
background: var(--platform-warm-bg);
color: var(--platform-text-base);
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list
> .project-supervisor-process-card {
width: 100%;
}
.game-workbench-chat .agent-runtime-status {
max-height: clamp(120px, 24dvh, 240px);
min-height: 0;
overflow-y: auto;
border-color: var(--platform-subpanel-border);
background: var(--platform-neutral-bg);
color: var(--platform-text-strong);
overscroll-behavior: contain;
scrollbar-gutter: stable;
}
.game-workbench-chat .project-runtime-summary {
position: sticky;
top: -10px;
z-index: 3;
gap: 5px;
padding-bottom: 7px;
border-bottom: 1px solid var(--platform-line-soft);
background: var(--platform-neutral-bg);
}
.project-runtime-empty-state {
display: grid;
min-height: 112px;
place-content: center;
justify-items: center;
gap: 10px;
color: var(--platform-accent);
text-align: center;
}
.project-runtime-empty-state strong {
color: var(--platform-text-strong);
font-size: 13px;
}
.game-workbench-chat
.project-runtime-summary
> small[aria-label='项目总控 Agent 进度'] {
display: -webkit-box;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
}
.game-workbench-chat .project-runtime-professional-list {
gap: 5px;
padding-top: 5px;
border-top: 0;
}
.game-workbench-chat .project-runtime-professional-list article {
gap: 3px;
padding: 7px 8px;
border-color: var(--platform-subpanel-border);
background: var(--platform-input-fill);
}
.game-workbench-chat .project-runtime-overview,
.game-workbench-chat .agent-runtime-status .project-runtime-pending-command {
background: var(--platform-warm-bg);
}
.game-workbench-chat .project-runtime-overview > span,
.game-workbench-chat .project-runtime-plan-progress span,
.game-workbench-chat .project-runtime-professional-list article > header span,
.game-workbench-chat .project-runtime-professional-list article p,
.game-workbench-chat .project-supervisor-workspace-status {
color: var(--platform-text-base);
}
.game-workbench-chat .project-runtime-plan-progress progress {
accent-color: var(--platform-accent);
}
.game-workbench-chat .agent-runtime-status .project-runtime-professional-list {
border-top-color: var(--platform-line-soft);
}
.game-workbench-chat .project-runtime-professional-actions button {
border-color: var(--platform-surface-border);
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
white-space: nowrap;
}
.game-workbench-chat .project-runtime-professional-actions button:last-child,
.game-workbench-chat .project-runtime-recovery > button {
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
.game-workbench-chat .agent-runtime-status .project-runtime-recovery {
border-color: var(--platform-button-danger-border);
background: var(--platform-button-danger-fill);
}
.game-workbench-chat .project-runtime-recovery > span {
color: var(--platform-button-danger-text);
}
.game-workbench-chat .project-runtime-recovery > span small {
color: var(--platform-text-base);
}
.game-workbench-chat .message--user {
color: var(--platform-warm-text);
}
.game-workbench-chat .message-action,
.game-workbench-chat .message-history-more {
border-color: var(--platform-surface-border);
background: var(--platform-button-secondary-fill);
color: var(--platform-button-secondary-text);
}
.game-workbench-chat .project-runtime-professional-list .project-runtime-error {
display: -webkit-box;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
.game-workbench-chat .project-supervisor-collaboration {
display: none;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer {
grid-template-columns: minmax(0, 1fr) 82px;
align-items: stretch;
position: relative;
z-index: 2;
padding-top: 8px;
background: transparent;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
textarea {
height: 72px;
min-height: 72px;
max-height: 72px;
resize: none;
border-color: var(--platform-surface-border);
background: var(--platform-input-fill);
color: var(--platform-text-strong);
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
textarea:focus-visible {
border-color: var(--platform-surface-hover-border);
outline: none;
box-shadow: 0 0 0 3px var(--platform-input-focus-ring);
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.project-supervisor-submit-button {
width: auto;
height: auto;
min-height: 72px;
border-color: var(--platform-button-primary-border);
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
font-weight: 800;
white-space: nowrap;
}
/* 右侧对话采用简洁的 Codex 式消息流与编辑框,减少卡片嵌套和视觉噪音。
消息列表这只盒子就是"对话框"本身:它铺满整个会话区,输入区作为框内的一块内聚区块
浮在它底部(见下面 `.project-supervisor-composer` 的内缩),两者不再各画一只盒子
上下贴在一起。所以这里底边归 0,并用 `padding-bottom` 给输入区留出位置——
256px = 输入区最高约 230px(编辑器 min 96 / max 140 + 操作排 + 内边距)+ 12px 内缩
+ 约 14px 间距,滚到底时最后一条消息不会被输入区盖住。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
gap: 34px;
height: auto;
padding: 18px 20px 256px;
scroll-padding-bottom: 256px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 12px;
background: var(--platform-input-fill);
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list
.message {
display: block;
width: 100%;
max-width: 100%;
padding: 4px 0;
border: 0;
border-radius: 0;
background: transparent;
color: var(--platform-text-base);
font-size: 14px;
line-height: 1.85;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list
.message
+ .message {
margin-top: 0;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list
.message--user {
width: fit-content;
max-width: min(82%, 640px);
margin-left: auto;
padding: 11px 16px;
border: 1px solid var(--platform-button-primary-border);
border-radius: 14px 14px 4px;
background: var(--platform-warm-bg);
color: var(--platform-text-strong);
}
/* 输入区是对话框内部的一块:四边内缩 12px,不贴外框、也不与外框的描边重叠。
下方那条 `.project-supervisor-composer.is-direct-codex`(同类选择器多一个类,优先)
是最终生效的那份几何,这里保持同一组内缩值,避免两条绝对定位规则给出两个位置。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer {
display: block;
position: absolute;
right: 12px;
bottom: 12px;
left: 12px;
z-index: 5;
padding: 0;
pointer-events: none;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
textarea {
display: block;
width: 100%;
min-height: 88px;
max-height: 180px;
padding: 14px 48px 38px 15px;
border: 1px solid var(--platform-surface-border);
border-radius: 14px;
background: var(--platform-input-fill);
color: var(--platform-text-strong);
font-size: 13px;
line-height: 1.6;
resize: vertical;
pointer-events: auto;
}
/* 只发给提交按钮。这条原来是 `.project-supervisor-composer button` 的通用规则,
会把 `position: absolute; right: 10px; bottom: 10px` 广播给 composer 里的每一个
按钮——输入区里的「AI 润色」就是这样被摘出网格、浮到文本区右侧的。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.project-supervisor-submit-button {
position: absolute;
right: 10px;
bottom: 10px;
display: grid;
width: 30px;
min-width: 30px;
height: 30px;
min-height: 30px;
padding: 0;
border: 0;
border-radius: 9px;
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
place-items: center;
pointer-events: auto;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.project-supervisor-submit-button
svg {
width: 14px;
height: 14px;
}
.game-agent-dock {
position: relative;
z-index: 30;
isolation: isolate;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
overflow: visible;
min-height: 58px;
padding: 6px 10px;
border: 1px solid var(--platform-line-soft);
border-radius: 14px;
background: var(--platform-subpanel-fill);
box-shadow: var(--platform-nav-active-shadow);
}
.game-agent-dock-more {
flex: 0 0 auto;
min-height: 38px;
padding: 0 12px;
border: 1px solid var(--platform-surface-border);
border-radius: 12px;
background: var(--platform-button-ghost-fill);
color: var(--platform-button-ghost-text);
font-size: 11px;
font-weight: 800;
white-space: nowrap;
cursor: pointer;
}
.game-agent-dock-more:hover {
border-color: var(--platform-surface-hover-border);
color: var(--platform-text-strong);
}
.game-agent-dock-item {
position: relative;
display: grid;
grid-template-columns: 34px minmax(0, 1fr);
flex: 1 1 128px;
align-items: center;
gap: 8px;
min-width: 0;
max-width: 170px;
padding: 6px 8px;
border: 1px solid var(--platform-icon-border);
border-radius: 12px;
background: var(--platform-button-ghost-fill);
color: var(--platform-text-base);
text-align: left;
cursor: default;
}
.game-agent-avatar {
display: grid;
width: 34px;
height: 34px;
border-radius: 12px;
background: var(--platform-nav-active-fill);
color: var(--platform-warm-text);
font-size: 12px;
font-weight: 900;
place-items: center;
}
.game-agent-dock-item > span:nth-child(2) {
display: grid;
min-width: 0;
gap: 2px;
}
.game-agent-dock-item strong {
overflow: hidden;
color: var(--platform-text-strong);
font-size: 11px;
text-overflow: ellipsis;
white-space: nowrap;
}
.game-agent-dock-item small {
overflow: hidden;
color: var(--platform-text-soft);
font-size: 9px;
text-overflow: ellipsis;
white-space: nowrap;
}
.game-agent-dock-item.is-running::after {
position: absolute;
top: 8px;
right: 8px;
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--platform-success-text);
box-shadow: 0 0 0 3px var(--platform-success-border);
content: '';
}
.game-agent-dock-item.is-waiting::after,
.game-agent-dock-item.is-failed::after,
.game-agent-dock-item.is-completed::after {
position: absolute;
top: 8px;
right: 8px;
width: 7px;
height: 7px;
border-radius: 50%;
content: '';
}
.game-agent-dock-item.is-waiting::after {
background: var(--platform-warm-text);
box-shadow: 0 0 0 3px var(--platform-warm-border);
}
.game-agent-dock-item.is-failed::after {
background: var(--platform-button-danger-text);
box-shadow: 0 0 0 3px var(--platform-button-danger-border);
}
.game-agent-dock-item.is-completed::after {
background: var(--platform-accent);
box-shadow: 0 0 0 3px var(--platform-nav-active-border);
}
.game-agent-dock-detail {
position: absolute;
left: 50%;
bottom: calc(100% + 8px);
z-index: 20;
display: none;
width: 220px;
padding: 10px 12px;
border: 1px solid var(--platform-modal-border);
border-radius: 10px;
background: var(--platform-modal-fill);
color: var(--platform-text-strong);
box-shadow: var(--platform-panel-shadow);
transform: translateX(-50%);
}
.game-agent-dock-detail strong,
.game-agent-dock-detail small {
color: inherit;
}
.game-agent-dock-item:hover .game-agent-dock-detail {
display: grid;
gap: 4px;
}
.game-approval-backdrop {
position: fixed;
top: var(--window-chrome-height);
right: 0;
bottom: 0;
left: 0;
z-index: 260;
display: grid;
padding: 20px;
background: rgb(65 43 34 / 42%);
place-items: center;
}
.game-approval-dialog {
display: grid;
gap: 14px;
width: min(430px, 100%);
padding: 18px;
border: 1px solid #e4c8ba;
border-radius: 18px;
background: #fffaf7;
color: #4f362d;
box-shadow: 0 24px 64px rgb(62 37 27 / 24%);
}
.game-approval-dialog > header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
}
.game-approval-dialog h2,
.game-approval-dialog p {
margin: 0;
}
.game-approval-dialog h2 {
font-size: 16px;
}
.game-approval-dialog p {
margin-top: 4px;
color: #9a7d70;
font-size: 11px;
}
.game-resource-recovery-dialog {
width: min(620px, 100%);
max-height: min(720px, calc(100dvh - 40px));
overflow: auto;
}
.game-resource-recovery-list {
display: grid;
gap: 9px;
}
.game-resource-recovery-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
padding: 12px;
border: 1px solid #ead8cf;
border-radius: 13px;
background: #fff;
}
.game-resource-recovery-item > div {
display: grid;
min-width: 0;
gap: 4px;
}
.game-resource-recovery-item strong,
.game-resource-recovery-item small,
.game-resource-recovery-item span {
overflow-wrap: anywhere;
}
.game-resource-recovery-item small {
color: #9a7d70;
}
.game-resource-recovery-item > button,
.game-resource-recovery-error > button {
min-height: 34px;
padding: 0 13px;
border: 1px solid #ddb9a8;
border-radius: 999px;
background: #fff7f2;
color: #87513b;
cursor: pointer;
}
.game-resource-recovery-item > button:disabled,
.game-resource-recovery-error > button:disabled {
cursor: wait;
opacity: 0.56;
}
.game-resource-recovery-readonly {
flex: 0 0 auto;
padding: 7px 10px;
border-radius: 999px;
background: #f5efec;
color: #846f66;
font-size: 11px;
}
.game-resource-recovery-error {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 12px;
border-radius: 11px;
background: #fff0ea;
color: #9a452d;
font-size: 12px;
}
@media (max-width: 620px) {
.game-resource-recovery-item,
.game-resource-recovery-error {
align-items: stretch;
flex-direction: column;
}
.game-resource-recovery-item > button,
.game-resource-recovery-error > button {
width: 100%;
}
}
.game-approval-dialog > header button {
display: grid;
width: 30px;
height: 30px;
padding: 0;
border: 1px solid #e6d1c7;
border-radius: 50%;
background: #fff;
color: #84675b;
place-items: center;
cursor: pointer;
}
.game-approval-options {
display: grid;
gap: 8px;
}
.game-approval-options > button {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-height: 64px;
padding: 10px 12px;
border: 1px solid #e9d8d0;
border-radius: 12px;
background: #fff;
color: #5b4036;
text-align: left;
cursor: pointer;
}
.game-approval-options > button.is-selected {
border-color: #ce744b;
background: #fff3ec;
}
.game-approval-options > button.is-unavailable {
border-style: dashed;
cursor: help;
opacity: 0.62;
}
.game-approval-options > button.is-unavailable:hover {
border-color: #c98361;
opacity: 0.9;
}
.game-approval-notice {
margin: 0;
padding: 9px 11px;
border-radius: 10px;
background: #fff4ec;
color: #9a4c2e;
font-size: 12px;
}
.game-approval-options > button > span:first-child {
display: grid;
gap: 4px;
}
.game-approval-options strong {
font-size: 12px;
}
.game-approval-options small {
color: #9a7e72;
font-size: 10px;
}
.game-approval-check {
display: grid;
width: 24px;
height: 24px;
flex: 0 0 auto;
border: 1px solid #d7b8a8;
border-radius: 50%;
color: #c5673d;
font-size: 12px;
font-weight: 900;
place-items: center;
}
.game-approval-done {
justify-self: end;
min-width: 90px;
height: 34px;
border: 0;
border-radius: 999px;
background: #ca7048;
color: #fff;
cursor: pointer;
}
@media (min-width: 761px) {
.game-project-workbench {
grid-template-rows: minmax(0, 1fr) auto;
height: 100dvh;
}
.launcher-main-with-promo .game-project-workbench {
height: calc(100dvh - 32px);
}
.game-workbench-layout {
height: auto;
}
}
@media (max-width: 1000px) {
.game-workbench-layout {
grid-template-columns: minmax(0, 1fr) minmax(280px, 0.42fr);
}
.game-workbench-toolbar {
align-items: stretch;
flex-direction: column;
}
.game-workbench-view-actions {
justify-content: flex-end;
}
.game-workbench-view-actions .game-workbench-play-button {
position: static;
transform: none;
}
}
@media (max-width: 760px) {
.game-project-workbench {
width: min(100%, calc(100vw - var(--launcher-sidebar-width)));
padding-top: 0;
}
.game-workbench-layout {
grid-template-columns: 1fr;
height: auto;
min-height: auto;
}
.game-workbench-stage,
.game-workbench-chat {
min-height: 560px;
}
.game-workbench-chat {
border-top: 1px solid var(--platform-line-soft);
border-left: 0;
}
.game-workbench-toolbar,
.game-workbench-view-actions {
align-items: stretch;
flex-direction: column;
}
.game-workbench-tabs {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.game-resource-section {
min-width: 460px;
}
.game-run-panels {
grid-template-columns: 1fr;
}
.game-workbench-chat .project-supervisor-message-list {
max-height: 52vh;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list {
position: static;
min-height: 320px;
height: 52vh;
flex: 1 1 auto;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer {
position: relative;
right: auto;
bottom: auto;
left: auto;
flex: 0 0 auto;
}
/* 窄屏:输入框左右留白收紧,操作排(`@` / AI 润色 / 恢复原文)保持单行不换行,
编辑器靠 `minmax(0, 1fr)` 吸收宽度,不会挤出横向滚动条。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.resource-reference-input {
padding: 10px 12px 6px;
}
.game-workbench-chat .project-supervisor-surface,
.game-workbench-chat .project-supervisor-conversation {
height: auto;
max-height: none;
overflow: visible;
}
.game-workbench-chat .agent-runtime-status {
max-height: none;
overflow: visible;
scrollbar-gutter: auto;
}
.game-agent-dock {
align-items: stretch;
flex-direction: column;
}
.game-agent-dock-item {
width: 100%;
max-width: none;
}
.game-agent-dock-detail {
position: static;
width: auto;
margin-top: 6px;
transform: none;
grid-column: 1 / -1;
}
}
/* ============================================================
立项策划前端样式(PlanGddSurface / 阶段进度 / GDD 审批卡 / 交付行 /
planning-lane-runtime-strip)。
这一段曾在 #193「Codex/agent chat layout fix」重写聊天样式时被整体误删:
组件(TSX)原样保留、选择器全数消失,策划界面裸奔、正文弹层失去 fixed 定位
变成内联平铺。从 5802048c3^ 原样恢复。聊天区样式重构时请勿顺手清理本段——
这些选择器的使用方在 features/project-workspace/GddApprovalCard.tsx 与
PlanningLaneRuntimeStrip.tsx。
============================================================ */
/* 策划区是一个面:阶段进度是标题栏,审批卡是正文。边框和圆角只画在外壳上,里面两块
不再各自带框。 */
.plan-gdd-surface {
display: grid;
min-width: 0;
border: 1px solid #cfd7e6;
border-radius: 10px;
background: #fff;
overflow: hidden;
}
.gdd-approval-card {
display: grid;
gap: 14px;
padding: 16px 18px 18px;
background: #f8fbff;
}
.plan-gdd-surface--with-card .plan-gdd-stage-progress {
border-bottom: 1px solid #dbe4f1;
}
.plan-gdd-stage-progress {
display: grid;
gap: 6px;
padding: 10px 12px;
background: #fff;
color: #526173;
font-size: 12px;
}
.plan-gdd-stage-progress__header,
.plan-gdd-stage-progress__meta {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: space-between;
gap: 8px 14px;
}
/* 批准后的交付行。它是策划阶段唯一的产物出口,所以给一条分隔线把它和上面的状态
区分开,而不是混成第三行元信息。 */
.plan-gdd-stage-progress__delivery {
display: grid;
gap: 8px;
margin-top: 4px;
padding-top: 9px;
border-top: 1px solid #e6ecf5;
}
.plan-gdd-stage-progress__delivery code {
min-width: 0;
color: #3c4a5c;
font-size: 11px;
overflow-wrap: anywhere;
}
.plan-gdd-stage-progress__delivery-actions {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.plan-gdd-stage-progress__delivery-actions button {
min-height: 30px;
padding: 0 12px;
border: 1px solid #cfd7e6;
border-radius: 6px;
color: #27364a;
background: #fff;
font-size: 12px;
}
.plan-gdd-stage-progress__delivery-actions button:hover:not(:disabled),
.plan-gdd-stage-progress__delivery-actions button:focus-visible {
border-color: #1f6feb;
color: #1f6feb;
}
.plan-gdd-stage-progress__delivery-actions button:disabled {
opacity: 0.58;
}
.plan-gdd-stage-progress__delivery-error {
color: #b42323;
overflow-wrap: anywhere;
}
.plan-gdd-stage-progress__header strong {
color: #27364a;
}
.plan-gdd-stage-progress__header span {
padding: 3px 8px;
border-radius: 999px;
background: #eef6ff;
color: #1f6feb;
}
.gdd-approval-card__header {
display: grid;
gap: 5px;
min-width: 0;
}
.gdd-approval-card h2,
.gdd-approval-card h3,
.gdd-approval-card p {
margin: 0;
}
.gdd-approval-card h2 {
font-size: 18px;
}
.gdd-approval-card__header p {
color: #526173;
overflow-wrap: anywhere;
}
.gdd-approval-card__details-trace {
color: #6b7a8c;
font-size: 11px;
overflow-wrap: anywhere;
}
.gdd-approval-card__details-trigger {
justify-self: start;
min-height: 30px;
padding: 0 10px;
border: 1px solid #cfd7e6;
border-radius: 6px;
color: #27364a;
background: #fff;
}
.gdd-approval-card__decisions {
display: grid;
gap: 8px;
}
.gdd-approval-card__decisions article {
display: grid;
gap: 3px;
padding: 9px 10px;
border: 1px solid #e2e8f0;
border-radius: 7px;
background: #fff;
}
.gdd-approval-card__decisions article span {
color: #1f6feb;
font-size: 12px;
}
.gdd-approval-card__decisions article small {
color: #526173;
overflow-wrap: anywhere;
}
.gdd-approval-card__actions,
.gdd-approval-card__dialog-actions,
.gdd-approval-card__recovery {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
.gdd-approval-card__actions button,
.gdd-approval-card__dialog-actions button,
.gdd-approval-card__recovery button {
min-height: 32px;
padding: 0 12px;
border: 1px solid #cfd7e6;
border-radius: 6px;
color: #fff;
background: #1f6feb;
}
.gdd-approval-card__actions button:nth-child(n + 2),
.gdd-approval-card__dialog-actions button:first-child {
color: #27364a;
background: #fff;
}
.gdd-approval-card button:disabled {
cursor: not-allowed;
opacity: 0.55;
}
.gdd-approval-card__recovery {
justify-content: space-between;
padding: 9px 10px;
border-radius: 7px;
color: #854d0e;
background: #fff7df;
font-size: 13px;
}
.gdd-approval-card__error {
padding: 9px 10px;
border-radius: 7px;
color: #991b1b;
background: #fff1f2;
overflow-wrap: anywhere;
}
.gdd-approval-card__dialog-backdrop {
position: fixed;
top: var(--window-chrome-height);
right: 0;
bottom: 0;
left: 0;
z-index: 220;
display: grid;
padding: 24px;
background: rgb(0 0 0 / 56%);
place-items: center;
}
.gdd-approval-card__dialog {
display: grid;
gap: 12px;
width: min(520px, 100%);
padding: 20px;
border: 1px solid #e5e7eb;
border-radius: 8px;
background: #fff;
box-shadow: 0 18px 52px rgb(0 0 0 / 18%);
}
.gdd-approval-card__details {
max-height: min(760px, calc(100vh - 32px));
overflow: auto;
}
.gdd-approval-card__details header,
.gdd-approval-card__details article {
display: grid;
gap: 5px;
}
.gdd-approval-card__details article {
padding-top: 10px;
border-top: 1px solid #e2e8f0;
}
.gdd-approval-card__details p {
white-space: pre-line;
overflow-wrap: anywhere;
}
.gdd-approval-card__dialog textarea {
width: 100%;
min-height: 110px;
padding: 9px;
border: 1px solid #cfd7e6;
border-radius: 6px;
resize: vertical;
}
.gdd-approval-card__dialog-hint {
padding: 9px 10px;
border-radius: 7px;
color: #854d0e;
background: #fff7df;
font-size: 13px;
}
/* 审批卡是这一列里唯一没有天花板的成员:Fast GDD 的决定项越多它越高,能把消息列表和运行
时面板一起挤出可视区。和 `.agent-runtime-status` 一样给它自己的上限加内部滚动,而不是
让它去挤别人。 */
/* 策划链路的会话列比另外两条多一个成员:策划面(阶段进度 + 审批卡)。#1935802048c3
「Codex/agent chat layout fix」)把这个容器从基础规则继承来的 `display: grid` 改成
`display: block`、并把消息列表从 `flex: 1 1 auto` 改成 `height: 100%`,于是列表独吞
整列高度,排在它后面的策划窄条、待确认命令、输入框和状态行全部被 `overflow: hidden`
静默裁掉——组件照常渲染、DOM 里查得到,只是位置落在裁剪线外,屏幕上什么都没有。
实测:窄条 top=858 而容器 bottom=788,超出 384pxscrollHeight 1235 vs clientHeight 734。
同一批改动还删掉了 `.game-workbench-chat .project-supervisor-composer` 的 4 条规则,
所以列表上那个 `padding-bottom: 196px`(本意是给「浮起来的输入框」留位)从来没有对应
的定位规则,那个模型压根没成立过。
命中判据是两个类的并集,两个都只属于策划链路,做游戏与做素材保持 master 的 block
列原样不动。为什么不能只认策划面:`PlanGddSurface` 在 `planGddState === null` 时整个
返回 null,而 `planGddState` 初值就是 null、要靠一次独立的 IPC 才填上。首帧竞态、以及
hydrate 持续失败时,策划 run 照跑、澄清卡照渲染,只认策划面就会漏掉这一格,裁剪原样
复发。窄条自己在场就等价于「有东西要用户动手」,把它并进来之后,「卡片存在」和「列
布局生效」才是同一件事。
用 flex 列而不是 grid:子元素个数随待确认命令的有无浮动,固定行模板会错位;而且下面
那条 `.plan-gdd-surface { flex: 0 0 auto }` 本来就是照 flex 写的,容器变成 flex 之后它
才真正生效——在此之前它一直是死声明。 */
.game-workbench-chat
.project-supervisor-conversation:has(
.plan-gdd-surface,
.planning-lane-runtime-strip
) {
display: flex;
flex-direction: column;
gap: 10px;
/* 兜底:正常情况下上面的行分配已经让整列放得下,这条不会产生滚动条。但审批卡展开
到 52dvh 且窄条同时在场时仍可能超出,届时给滚动而不是继承 `overflow: hidden`
的裁剪——这个 bug 的全部代价就来自「悄悄裁掉」,宁可多一根滚动条。 */
overflow-y: auto;
}
/* 整列里只有消息列表可收缩:其余成员各自有天花板(策划面按内容、窄条 52dvh 且内滚、
输入框定高),由列表吸收剩余空间。`height: 100%` 必须撤掉,否则它照旧独吞整列;
`padding-bottom` 也一并收回,输入框已经回到文档流里,不再需要给它留空。 */
.game-workbench-chat
.project-supervisor-conversation:has(
.plan-gdd-surface,
.planning-lane-runtime-strip
)
.project-supervisor-message-list {
flex: 1 1 auto;
height: auto;
min-height: 96px;
padding-bottom: 12px;
scroll-padding-bottom: 12px;
}
/* 这三个成员不参与压缩:消息列表变长时不能把它们挤没——它们正是用户唯一需要动手的
地方(澄清卡、输入框)。 */
.game-workbench-chat
.project-supervisor-conversation:has(
.plan-gdd-surface,
.planning-lane-runtime-strip
)
.planning-lane-runtime-strip,
.game-workbench-chat
.project-supervisor-conversation:has(
.plan-gdd-surface,
.planning-lane-runtime-strip
)
.project-supervisor-composer,
.game-workbench-chat
.project-supervisor-conversation:has(
.plan-gdd-surface,
.planning-lane-runtime-strip
)
.project-supervisor-workspace-status {
flex: 0 0 auto;
}
/* 这个面不参与 flex 压缩。它自己不会长高:标题栏是固定几行,审批卡下面有自己的
max-height 和内滚,所以高度天然有界。让它可压缩的话,`overflow: hidden`(画圆角
要的)会把底部切掉——批准后交付行正好在那儿,表现是路径和两个按钮凭空消失。 */
.game-workbench-chat .plan-gdd-surface {
flex: 0 0 auto;
}
/* 只有审批卡在场时才需要「标题栏定高 + 正文占余下」的两行轨道。批准后卡片收掉,
面里只剩标题栏,这条声明会给它套上一个不存在的第二行。 */
.game-workbench-chat .plan-gdd-surface--with-card {
min-height: 0;
grid-template-rows: auto minmax(0, 1fr);
}
.game-workbench-chat .gdd-approval-card {
min-height: 0;
max-height: clamp(240px, 52dvh, 640px);
overflow-y: auto;
overscroll-behavior: contain;
scrollbar-gutter: stable;
}
/* 上面 24dvh/240px 的天花板是给做游戏链路常驻的调试面板设的。策划链路的窄条只在
需要用户动手时出现(澄清卡 / 失败恢复),内容是要读完再回答的题面,给它和审批
卡同级的空间。 */
.game-workbench-chat .planning-lane-runtime-strip {
max-height: clamp(240px, 52dvh, 640px);
}
/* 做方案在拿到第一个已登记资源之前,左边的资源画布是空的;工作台此时收成单栏,
对话铺满。类名由 view/project-development/index.tsx 的 conversationOnlyWorkbench
拼上(planningStartMode && resources.length === 0),画布是 display: none 不是
不渲染——页签、缩放、选中状态都保留,第一个资源登记后自动恢复双栏。
同批规则曾与上面的策划样式一起被 #193 误删。 */
.game-workbench-layout.is-conversation-only {
grid-template-columns: minmax(0, 1fr);
}
.game-workbench-layout.is-conversation-only .game-workbench-stage {
display: none;
}
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select {
position: absolute;
bottom: 10px;
right: 86px;
display: flex;
align-items: center;
justify-content: flex-end;
gap: 4px;
max-width: calc(100% - 120px);
pointer-events: auto;
}
.project-supervisor-surface.is-direct-codex .conversation-model-trigger {
display: inline-flex;
align-items: center;
gap: 6px;
min-width: 0;
max-width: 180px;
height: 30px;
padding: 0 6px;
border: 0;
border-radius: 7px;
background: transparent;
color: var(--platform-text-soft, #6b7280);
font: inherit;
font-size: 12px;
cursor: pointer;
}
.home-input-model-select {
position: relative;
min-width: 0;
}
.conversation-model-trigger {
display: inline-flex;
align-items: center;
gap: 6px;
min-width: 0;
max-width: 180px;
height: 30px;
padding: 0 6px;
border: 0;
border-radius: 7px;
background: transparent;
color: var(--platform-text-soft, #6b7280);
font: inherit;
font-size: 12px;
cursor: pointer;
}
.conversation-model-trigger:hover,
.conversation-model-trigger:focus-visible,
.conversation-model-trigger[aria-expanded='true'] {
background: color-mix(
in srgb,
var(--platform-button-ghost-fill, #f3f4f6) 80%,
transparent
);
color: var(--platform-text-strong, #30343b);
outline: none;
}
.conversation-model-trigger-status {
width: 7px;
height: 7px;
flex: 0 0 auto;
border: 1px solid currentColor;
border-radius: 50%;
opacity: 0.65;
}
.conversation-model-trigger-label {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.conversation-model-menu {
position: absolute;
right: 0;
bottom: calc(100% + 8px);
z-index: 20;
display: grid;
min-width: 150px;
max-width: 190px;
padding: 5px;
border: 1px solid var(--platform-surface-border, #e5e7eb);
border-radius: 10px;
background: var(--platform-input-fill, #fff) !important;
box-shadow:
0 14px 30px rgb(31 41 55 / 13%),
0 2px 6px rgb(31 41 55 / 5%);
pointer-events: auto;
}
.conversation-model-menu button {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
min-width: 0;
min-height: 32px;
padding: 0 9px;
border: 0;
border-radius: 6px;
background: transparent;
color: var(--platform-text-base, #374151);
font: inherit;
font-size: 12px;
text-align: left;
cursor: pointer;
}
.conversation-model-menu button:hover,
.conversation-model-menu button:focus-visible,
.conversation-model-menu button[aria-selected='true'] {
background: var(--platform-button-ghost-fill, #f3f4f6);
color: var(--platform-text-strong, #111827);
outline: none;
}
.conversation-model-menu-option-main {
display: flex;
align-items: center;
gap: 6px;
min-width: 0;
overflow: hidden;
}
.conversation-model-menu-default {
flex: 0 0 auto;
padding: 0 5px;
border: 1px solid var(--platform-line-soft, #e2cbb8);
border-radius: 5px;
background: var(--platform-button-secondary-fill, rgba(255, 253, 250, 0.78));
color: var(--platform-text-soft, #988476);
font-size: 10px;
font-style: normal;
line-height: 1.7;
}
.conversation-model-menu-loading {
display: flex;
align-items: center;
min-height: 32px;
padding: 0 9px;
color: var(--platform-text-soft, #6b7280);
font-size: 12px;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select
.conversation-model-menu
button {
position: static !important;
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
width: 100% !important;
min-width: 0 !important;
min-height: 32px !important;
height: 32px !important;
margin: 0 !important;
padding: 0 9px !important;
border: 0 !important;
border-radius: 6px !important;
background: transparent !important;
color: var(--platform-text-base, #374151) !important;
box-shadow: none !important;
font-size: 12px !important;
font-weight: 500 !important;
white-space: nowrap !important;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select
.conversation-model-menu
button:hover,
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select
.conversation-model-menu
button:focus-visible,
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select
.conversation-model-menu
button[aria-selected='true'] {
background: #f3f1ee !important;
color: var(--platform-text-strong, #1f2937) !important;
outline: none !important;
}
.conversation-model-menu-divider {
height: 1px;
margin: 4px 5px;
background: var(--platform-line-soft, #ece9e5);
}
.conversation-model-menu-refresh {
justify-content: flex-start !important;
gap: 7px !important;
color: var(--platform-text-soft, #6b7280) !important;
}
.conversation-model-menu-refresh:hover,
.conversation-model-menu-refresh:focus-visible {
color: var(--platform-text-strong, #1f2937) !important;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select
.conversation-model-trigger {
position: static !important;
display: inline-flex !important;
width: auto !important;
min-width: 0 !important;
min-height: 30px !important;
height: 30px !important;
padding: 0 7px !important;
border: 0 !important;
border-radius: 7px !important;
background: transparent !important;
color: var(--platform-text-soft, #6b7280) !important;
box-shadow: none !important;
font-size: 12px !important;
font-weight: 500 !important;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select
.conversation-model-trigger:hover,
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select
.conversation-model-trigger:focus-visible,
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select
.conversation-model-trigger[aria-expanded='true'] {
background: var(--platform-button-ghost-fill, #f3f4f6) !important;
color: var(--platform-text-strong, #30343b) !important;
}
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-trigger {
min-width: 0;
max-width: 180px;
height: 30px;
}
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.conversation-model-select
.conversation-model-menu
button {
position: static;
width: auto;
min-height: 32px;
}
.conversation-model-select [role='alert'] {
position: absolute;
bottom: 36px;
right: 0;
max-width: 220px;
color: #b42318;
background: #fff;
font-size: 12px;
}
.conversation-model-select [role='status'] {
position: absolute;
bottom: 36px;
right: 0;
max-width: 220px;
color: #6b7280;
background: #fff;
font-size: 12px;
}
/* Direct Codex composer: keep the editor and its actions in one vertical
structure instead of positioning each control independently. */
/* 输入区在对话框(`.project-supervisor-message-list` 那只铺满会话区的盒子)内部,
四边各内缩 12px:左右下三边显式钉住,上边由 `max-height: calc(100% - 24px)`
24px = 上下各 12px)兜底,所以输入区整块落在外框之内,四条边都不与外框描边重合,
底边还留出 12px 边距(外框底边在下面那条"最终几何"规则里钉的是 0)。
圆角收成与外框同一档,读起来是"框内的输入块",而不是贴在对话框下面、四边描边与
下边竖线连成一体的第二只盒子。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex {
display: grid;
grid-template-columns: minmax(0, 1fr);
grid-template-rows: auto auto;
gap: 0;
align-items: stretch;
position: absolute;
right: 12px;
bottom: 12px;
left: 12px;
max-height: calc(100% - 24px);
z-index: 5;
padding: 8px 12px;
border: 1px solid var(--platform-surface-border);
border-radius: 12px;
background: var(--platform-input-fill);
box-shadow: 0 8px 24px rgb(31 41 55 / 8%);
pointer-events: auto;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.resource-reference-input {
width: 100%;
min-height: 56px;
padding: 0 0 4px;
border: 0;
border-radius: 0;
background: transparent;
box-shadow: none;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.resource-reference-input:focus-within {
border: 0;
outline: none;
box-shadow: none;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.resource-reference-input-placeholder {
top: 0;
left: 0;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-composer-controls {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
min-width: 0;
padding-top: 2px;
pointer-events: auto;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-composer-controls
.project-supervisor-composer-controls-left,
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-composer-controls
.project-supervisor-composer-controls-right {
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-composer-controls-right {
flex: 0 0 auto;
margin-left: auto;
}
/* 模型选择钮在控制排里按流式排布,但它同时是**弹层锚点**`.conversation-model-menu`
`bottom: calc(100% + 8px)`)与模型提示(`[role='alert'] / [role='status']`
`bottom: 36px`)都是 `position: absolute`,包含块必须是这颗容器。这里原来写的是
`position: static !important`(当初为抵消上面那条遗留的「模型选择钮绝对定位」规则),
锚点于是回落到最近的有定位祖先——也就是 `position: absolute` 的 composer 盒子:
菜单跑到**整个 composer 上方**、和触发钮之间隔着整个输入区,输入区一变高(多行、
引用 chip、AI 润色)菜单与提示就跟着往上飘,看起来就是"编辑框把弹层挤开了"。
`relative` 不会把它移出控制排(`right/bottom: auto` 仍在原位),只补回锚点。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-composer-controls
.conversation-model-select {
flex: 0 1 auto;
min-width: 0;
position: relative !important;
right: auto !important;
bottom: auto !important;
max-width: 180px;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-composer-controls
.conversation-model-trigger {
flex: 0 1 auto;
min-width: 0;
max-width: 180px;
color: var(--platform-text-base) !important;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-composer-controls
.conversation-model-trigger-label {
flex: 0 1 auto;
min-width: 0;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-composer-controls
.project-supervisor-reference-trigger,
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-composer-controls
.project-supervisor-submit-button {
position: static !important;
right: auto !important;
bottom: auto !important;
display: grid;
width: 30px;
min-width: 30px;
height: 30px;
min-height: 30px;
padding: 0;
border: 0;
border-radius: 9px;
flex: 0 0 30px;
place-items: center;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-reference-trigger {
background: transparent;
color: var(--platform-text-soft);
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-reference-trigger:hover:not(:disabled),
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-reference-trigger:focus-visible {
background: var(--platform-button-ghost-fill);
color: var(--platform-text-strong);
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer.is-direct-codex
.project-supervisor-submit-button {
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
}
/* 对话框盒子的最终几何,故意放在文件靠后的位置:它与上面那条同选择器同权重
`.game-workbench-chat .project-supervisor-surface.is-direct-codex
.project-supervisor-message-list`),按"后写胜出"把两处会顶掉它的规则压回去——
一是 `:has(.plan-gdd-surface, .planning-lane-runtime-strip)` 给列表留的
`padding-bottom: 12px`,二是下面窄屏块之前可能出现的任何底边偏移。
这里曾经是一条 `bottom: 156px`"列表在上、输入区在下"那版两盒布局的残留:给下面那只
浮起来的输入区预留高度),它把上面那条 `bottom: 0` 悄悄顶掉,外框底边落在输入区腰上、
输入区下半截露在框外——用户看到的就是"外框底边与输入区压在一起、没把输入区包住"。
所以:外框四边一律贴会话区(top/right/bottom/left 全 0),它才是把输入区包住的那只框;
输入区靠自己的 12px 内缩与它留出边距,两条边不会再重合。
要改列表底边只改这一段,不要再在别处写第二条同选择器规则。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list {
top: 0;
right: 0;
bottom: 0;
left: 0;
padding-bottom: 256px;
scroll-padding-bottom: 256px;
}
/* 窄屏(≤760px)这一列是"消息列表 + 输入区"的纵向堆叠,输入区不再浮在列表里,所以外框
改画在两者共同的父节点 `.project-supervisor-conversation` 上:它同时把列表和输入区圈进
来。列表自己那只框在窄屏撤掉(否则框里再套一只框),输入区回到文档流,靠外框的 12px
内边距与四条边框各留出一圈边距——任一条边都不与外框重合,内容随列高增长也不会溢出。
宽屏那套留白算式(256 = 12px 内缩 + 228px 输入区最高高度 + 16px 间距)只服务于
"输入区浮在列表之上"这个模型;窄屏输入区在流内,天然不会被消息盖住,所以列表底边只留
12px 与输入区顶边分开。 */
@media (max-width: 760px) {
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-conversation {
padding: 12px;
border: 1px solid var(--platform-subpanel-border);
border-radius: 12px;
background: var(--platform-input-fill);
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-message-list {
padding-bottom: 12px;
scroll-padding-bottom: 12px;
border: 0;
border-radius: 0;
background: transparent;
}
/* 输入区回到文档流。这条选择器比上面那条 `.project-supervisor-composer.is-direct-codex`
多带一层 `.project-supervisor-conversation`,权重比它高,窄屏才能把它顶回来——
原来窄屏那条(同权重、写得更早)其实一直是被顶掉的那条。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-conversation
.project-supervisor-composer.is-direct-codex {
position: relative;
right: auto;
bottom: auto;
left: auto;
max-height: none;
}
}
.resource-reference-input-editor::-webkit-scrollbar {
width: 10px;
}
.resource-reference-input-editor::-webkit-scrollbar-thumb {
border: 2px solid transparent;
border-radius: 999px;
background: #94a3b8;
background-clip: padding-box;
}
.resource-reference-input-editor::-webkit-scrollbar-track {
background: transparent;
}
.project-supervisor-composer .resource-reference-input {
min-height: 72px;
}
.supervisor-chat-only-composer .resource-reference-input {
min-height: 74px;
}
.supervisor-chat-only-composer .resource-reference-input-editor {
min-height: 54px;
max-height: 54px;
}
.composer .resource-reference-input {
align-items: center;
min-height: 42px;
padding: 4px 6px 4px 12px;
}
.composer .resource-reference-input-editor {
min-height: 24px;
max-height: 24px;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.resource-reference-input {
display: grid;
width: 100%;
padding: 12px 15px 6px;
border-color: var(--platform-surface-border);
border-radius: 14px;
background: var(--platform-input-fill);
color: var(--platform-text-strong);
pointer-events: auto;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.resource-reference-input:focus-within {
border-color: var(--platform-surface-hover-border);
outline: none;
box-shadow: 0 0 0 3px var(--platform-input-focus-ring);
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.resource-reference-input-editor {
min-height: 96px;
max-height: 140px;
overflow-y: auto;
padding: 0;
font-size: 13px;
line-height: 1.6;
}
/* 陶泥儿输入区的操作排(`@` / AI 润色 / 恢复原文)回到文档流:`grid-column: 1 / -1`
让它独占编辑器下面的一行,`align-items: end` + `justify-content: flex-end` 把它
贴到输入框右下角。之前这里用 `position: absolute; right: 48px; bottom: 10px`
把整排从网格里摘出来浮在输入框中间,AI 润色因此看起来压在文本区里、和下面那排
主操作(`.project-supervisor-composer-controls` 的 `@` / 快速 / 发送)脱节。
不设 `min-height`:这一行的高度由 28px 方钮自己撑开,行高一旦被顶起来会连带把
编辑器的 `min-height: 96px` 改掉。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.resource-reference-input-actions {
grid-column: 1 / -1;
position: static;
display: flex;
align-items: end;
justify-content: flex-end;
min-width: 0;
height: auto;
}
/* 「润色中… / 润色失败」和应用排同一行:状态文字靠左占剩余宽度,操作排靠右。
单独占一行会把输入框整体顶高 22.8px,把操作排和下面那排主操作推开一个状态行的
距离;共行则状态出现/消失都不改变输入框高度。 */
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.resource-reference-input-status {
grid-column: 1 / -1;
grid-row: 2;
align-self: center;
min-width: 0;
margin-top: 0;
}
.game-workbench-chat
.project-supervisor-surface.is-direct-codex
.project-supervisor-composer
.resource-reference-input-at {
position: static !important;
right: auto !important;
bottom: auto !important;
display: grid;
width: 30px;
min-width: 30px;
height: 30px;
min-height: 30px;
padding: 0;
border: 0;
border-radius: 9px;
background: var(--platform-button-primary-fill);
color: var(--platform-button-primary-text);
place-items: center;
}