@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: flex; align-items: center; justify-content: center; 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%); } .launcher-runs-titlebar { position: relative; display: inline-flex; min-width: 0; max-width: min(42vw, 460px, 100%); -webkit-app-region: no-drag; } .launcher-runs-titlebar-trigger { display: inline-flex; align-items: center; min-width: 0; max-width: 100%; gap: 7px; padding: 6px 9px; border: 1px solid transparent; border-radius: 8px; background: transparent; color: var(--platform-text-base, #6f5848); font: inherit; cursor: pointer; transition: background 150ms ease, border-color 150ms ease, color 150ms ease; } .launcher-runs-titlebar-trigger:hover, .launcher-runs-titlebar-trigger:focus-visible, .launcher-runs-titlebar-trigger[aria-expanded='true'] { border-color: var(--platform-surface-border, #ead8cb); background: rgb(255 255 255 / 72%); color: var(--platform-text-strong, #3d1f10); outline: none; } .launcher-runs-titlebar-name { min-width: 0; overflow: hidden; font-size: 11px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; } .launcher-runs-titlebar-count { display: inline-grid; min-width: 18px; height: 18px; padding: 0 4px; place-items: center; border-radius: 9px; background: rgb(199 101 61 / 12%); color: var(--platform-accent, #c7653d); font-size: 10px; font-weight: 750; } .launcher-runs-titlebar-chevron { flex: 0 0 auto; color: var(--platform-text-muted, #a38f80); transition: transform 150ms ease; } .launcher-runs-titlebar-chevron.is-open { transform: rotate(180deg); } .launcher-runs-titlebar-menu { position: absolute; top: calc(100% + 8px); left: 50%; z-index: 40; width: min(360px, calc(100vw - 32px)); padding: 10px; border: 1px solid var(--platform-subpanel-border, #ead8cb); border-radius: 12px; background: var(--platform-subpanel-fill, #fffaf5); box-shadow: 0 14px 36px rgb(31 24 16 / 18%); color: var(--platform-text-base, #6f5848); transform: translateX(-50%); } .launcher-runs-titlebar-menu-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 2px 5px 8px; border-bottom: 1px solid var(--platform-surface-border, #ead8cb); color: var(--platform-text-strong, #3d1f10); font-size: 11px; } .launcher-runs-titlebar-menu-header span { color: var(--platform-text-muted, #a38f80); font-size: 10px; } .launcher-runs-titlebar-list { display: grid; gap: 3px; max-height: min(52vh, 360px); margin: 7px 0 0; padding: 0; overflow-y: auto; list-style: none; } .launcher-runs-titlebar-item { display: grid; width: 100%; gap: 3px; padding: 8px 9px; border: 0; border-radius: 8px; background: transparent; color: inherit; text-align: left; cursor: pointer; } .launcher-runs-titlebar-item:hover, .launcher-runs-titlebar-item:focus-visible, .launcher-runs-titlebar-item[aria-current='true'] { background: rgb(199 101 61 / 10%); outline: none; } .launcher-runs-titlebar-item:disabled { cursor: default; } .launcher-runs-titlebar-item-name { overflow: hidden; color: var(--platform-text-strong, #3d1f10); font-size: 12px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; } .launcher-runs-titlebar-item-meta, .launcher-runs-titlebar--error { color: var(--platform-text-muted, #a38f80); font-size: 10px; } .launcher-runs-titlebar--error { display: inline-flex; align-items: center; padding: 5px 8px; border-radius: 7px; background: rgb(199 101 61 / 8%); } .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: grid; padding-inline: 48px; } .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-runs-panel { position: absolute; top: 16px; left: 24px; z-index: 3; width: min(280px, calc(100% - 260px)); padding: 10px 12px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: color-mix(in srgb, var(--platform-subpanel-fill) 94%, transparent); box-shadow: 0 8px 24px rgb(31 24 16 / 8%); } .launcher-runs-panel-header { display: flex; align-items: center; gap: 7px; color: var(--platform-text-strong); font-size: 12px; } .launcher-runs-panel-dot { width: 7px; height: 7px; border-radius: 50%; background: #4d9f54; box-shadow: 0 0 0 3px rgb(77 159 84 / 14%); } .launcher-runs-panel-list { display: grid; gap: 4px; margin: 7px 0 0; padding: 0; list-style: none; } .launcher-runs-panel-item { display: grid; width: 100%; gap: 2px; padding: 6px 7px; border: 0; border-radius: 8px; background: transparent; color: inherit; text-align: left; cursor: pointer; } .launcher-runs-panel-item:hover, .launcher-runs-panel-item[aria-current='true'] { background: rgb(255 255 255 / 72%); } .launcher-runs-panel-item:disabled { cursor: default; } .launcher-runs-panel-name { overflow: hidden; color: var(--platform-text-strong); font-size: 12px; font-weight: 650; text-overflow: ellipsis; white-space: nowrap; } .launcher-runs-panel-meta, .launcher-runs-panel-note { color: var(--platform-text-muted); font-size: 11px; } .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-redeem-modal { width: min(360px, calc(100vw - 32px)); padding: 0; border: 1px solid var(--platform-subpanel-border); border-radius: 18px; overflow: hidden; } .launcher-redeem-modal-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 18px; border-bottom: 1px solid var(--platform-surface-border); font-size: 15px; } .launcher-redeem-modal-header button { border: 0; background: transparent; color: var(--platform-text-muted); font-size: 20px; cursor: pointer; } .launcher-redeem-modal-form { display: grid; gap: 12px; padding: 18px; } .launcher-redeem-modal-form input { width: 100%; box-sizing: border-box; padding: 11px 12px; border: 1px solid var(--platform-subpanel-border); border-radius: 10px; background: var(--platform-body-fill); color: var(--platform-text-strong); } .launcher-redeem-modal-form p { margin: 0; font-size: 12px; } .launcher-redeem-modal-form p[role='alert'] { color: #b5432e; } .launcher-redeem-modal-form p[role='status'] { color: #34804b; } .launcher-redeem-modal-form > button { padding: 11px 14px; border: 0; border-radius: 10px; background: var(--platform-accent, #c7653d); color: #fff; font-weight: 700; cursor: pointer; } .launcher-redeem-modal-form > button:disabled { cursor: default; opacity: 0.5; } .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; min-height: 78px; box-sizing: border-box; margin-top: 12px; padding: 12px 14px; border: 1px solid #b9d8c5; border-radius: 8px; background: #f1f8f3; 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; } .project-supervisor-process-elapsed { margin-left: auto !important; color: inherit; font-size: inherit; font-style: normal; font-weight: 500; white-space: nowrap; } @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: inherit; font-size: inherit; 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: inherit; 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); } .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-custom-llm { grid-column: 1 / -1; display: grid; gap: 12px; min-width: 0; } .runtime-custom-llm-discover { display: inline-flex; align-items: center; justify-content: center; gap: 6px; justify-self: start; min-height: 34px; padding: 0 14px; 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-custom-llm-discover:disabled { cursor: not-allowed; opacity: 0.55; } .runtime-custom-model-columns { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr)); gap: 16px; } .runtime-custom-model-columns > section { min-width: 0; padding: 12px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; } .runtime-custom-model-list { max-height: 240px; overflow: auto; overflow-wrap: anywhere; } .runtime-custom-model-list .settings-checkbox { display: flex; align-items: start; gap: 8px; margin: 8px 0; } .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; } .agc-plugin-panel-overlay { z-index: 230; } .agc-plugin-panel { width: min(900px, 94vw); overflow: hidden; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--platform-subpanel-fill); } .agc-plugin-panel > header { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 12px; color: var(--platform-text-strong); font-size: 12px; } .agc-plugin-panel iframe { display: block; width: 100%; height: min(640px, 75vh); border: 0; background: var(--platform-input-fill); } .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-readonly-field { display: grid; gap: 3px; min-width: 0; padding: 13px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--runtime-settings-subpanel-fill); } .runtime-settings-readonly-field > span { color: var(--platform-text-soft); font-size: 11px; } .runtime-settings-readonly-field > strong { color: var(--platform-text-strong); font-size: 14px; line-height: 1.35; } .runtime-settings-readonly-field > small { color: var(--platform-text-soft); font-size: 10px; line-height: 1.4; } .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; } /* 这里不能加 `white-space: pre-wrap`:Markdown 渲染出来的块之间会带换行文本节点, pre-wrap 会把那些 `\n` 变成真实的空行(表现就是列表项之间出现大段空白)。 需要保留换行的地方(流式原文、行内代码)各自已经有 `whitespace-pre-wrap`。 */ .message { overflow-wrap: anywhere; } .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 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; } /* 搜索 + 功能分类 + 标签由共享筛选条(`PlatformResourceFilterBar`)渲染, 这里只给它留出面板内的边距;两个页签各自持有自己那一份筛选状态。 */ .resource-reference-picker-filters { min-width: 0; padding: 10px 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-account { position: absolute; top: 8px; right: 12px; z-index: 4; } .game-workbench-layout-account .launcher-account-bar { position: static; } .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; } /* 左侧控件组:「资源管理 / 运行」分段 + 紧贴其后的「播放」。 * 整组在工具条里左对齐,取代播放按钮原先的居中悬浮(absolute + translateX(-50%))。 */ .game-workbench-view-tabs { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; } .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; } /* 「依赖 / 类型」内部用 0 间距(共享边界的连通分段),但与同一行其他按钮之间必须跟行的间距 * 一致:这一行是 `gap: 7px` 的 flex 容器,分段控件曾在它里面自带 `padding: 3px`,靠那 3px * 把自己和前一枚按钮顶开,于是「整理画布 → 生成任务 → 依赖」的视觉间距只有 10px, * 而其余按钮之间是 24px——一行里两套间距。这里把它补到 24px,整行只剩一套间距。 */ .game-workbench-tabs.game-resource-sort-tabs { margin-left: 17px; } .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-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-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-tabs .game-workbench-play-button { position: static; border-color: var(--platform-button-primary-border); background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); transform: none; } .game-workbench-view-tabs .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); } /** * 布局状态提示:**绝对定位,不参与动作行的排版**。 * * 它不是按钮,但曾经是动作行里的一个 flex 子项:文案从空 →「保存中」→「布局已保存」→ * 失败原因会随保存过程变长,于是把右侧那几枚按钮按文本宽度顶开——同一行在不同时刻的按钮 * 间距就不一样(实测同一份截图里「整理画布 → 生成任务」的空隙 80px,其余两处 64/66px, * 差值正是这条提示当时的宽度)。定位后位置固定,行内只剩按钮之间那一套间距。 */ .game-resource-reorder-status { position: absolute; bottom: 4px; left: 12px; max-width: calc(100% - 24px); overflow: hidden; color: #9a725f; font-size: 10px; text-overflow: ellipsis; 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; } /* * 卡片宿主节点。`--preview` 是「所有资源」卡那一摞预览的宿主:几何与外观和栏目卡的 * 宿主完全共用(它同样是 0x0 的定位包装 + `renderCard` 出的真实卡片), * 但刻意不叫 `.game-resource-book-scene-card`——转场层按这个类名收集 FLIP 节点, * 而同一张资源卡在它自己的栏目摞里已经是一个可选中、带记录的宿主了。 */ .game-resource-book-scene-card, .game-resource-book-preview-card { position: absolute; z-index: 25; pointer-events: none; /* 卡片包装节点是 0x0,FLIP 反向 transform 围绕它的原点缩放。 */ transform-origin: 0 0; translate: 0 0; transition: none; } /* 缩略卡悬停 / 聚焦时高亮它所在栏目(那一摞)的标题条。 取值必须与 `PROJECT_RESOURCE_CANVAS_SECTIONS`(7 个现行分区)逐一对齐: `code` / `art` 是旧四、五栏目的历史值,总览里不会渲染,写它们等于空规则; 少写一个现行分区,对应栏目就完全没有悬停高亮。 */ .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='ui-interaction']:hover, .game-resource-book-thumbnail[data-resource-book-category='ui-interaction']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='ui-interaction'], .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='character']:hover, .game-resource-book-thumbnail[data-resource-book-category='character']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='character'], .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='scene']:hover, .game-resource-book-thumbnail[data-resource-book-category='scene']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='scene'], .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'], .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='unclassified']:hover, .game-resource-book-thumbnail[data-resource-book-category='unclassified']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='unclassified'], .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'] { border-top-color: #cc8060; border-right-color: #cc8060; border-bottom-color: #ebd9cf; border-left-color: #cc8060; } .game-resource-book-scene-card .game-resource-card, .game-resource-book-preview-card .game-resource-card { transition: box-shadow 180ms ease; } .game-resource-book-scene--main .game-resource-book-scene-card .game-resource-card, .game-resource-book-scene--main .game-resource-book-preview-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; } /* * `width: 100%` 与下面的 `.game-resource-book-main-grid` 是同一条约束,别删。 * * 这两块都是 `.game-resource-book-main-world`(`display: flex; flex-direction: column`) * 的子项,而交叉轴上的 auto 外边距(`margin: 0 auto`)会吃掉全部自由空间并取消 `stretch`, * 使子项退化成 **fit-content** 定宽:标题栏于是只占 `

` 的宽度,`space-between` 无从展开。 * 显式给 `width: 100%` 让 inline size 确定,再交给 `max-width` 与 auto 外边距居中。 */ .game-resource-book-main-heading { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; width: 100%; 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; } /* * `width: 100%` 不能删——它是「资源总览 8 张栏目缩略卡保持多列」的唯一依据。 * * 本网格的父级 `.game-resource-book-main-world` 是列向 flex 容器,而 `margin: 0 auto` 在 * 交叉轴上会吃掉全部自由空间、取消 `align-self: stretch`,让本元素按 **fit-content** 定宽。 * fit-content 定宽时,网格的 inline size 在内在尺寸计算阶段是**不定**的,按 CSS Grid 规范 * 此时 `auto-fit` 的重复次数解析为 **1**,`minmax(min(100%, 280px), 1fr)` 里的 `100%` 也无从 * 解析 ⇒ 永远只出 1 列,且该列被容器撑成一张缩略卡那么宽(实测 2560×910 窗口:grid 宽 432px、 * `getComputedStyle(grid).gridTemplateColumns === "432px"`、8 张缩略卡同 left、top 步距 230)。 * * `width: 100%` 先把 inline size 定下来(父内容宽 → 被 `max-width` 截到 1120px),`auto-fit` * 才会按 1120px 解析重复次数:3×280 + 2×18 = 876 ≤ 1120,4×280 + 3×18 = 1174 > 1120 ⇒ 3 列。 * 删掉它 = 资源总览退回一条纵向长条(单列 × 8 卡 × 212px)。 */ .game-resource-book-main-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr)); gap: 18px; width: 100%; 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-preview-card, .game-resource-book-preview-card .game-resource-card, .game-resource-book-thumbnail { transition: none !important; } } /* * 有筛选条件时(浮层收起也生效)Dock 上的放大镜按钮保持高亮:筛选条件不会随浮层一起 * 消失,按钮必须能看出"当前有搜索",否则用户会以为资源丢了。复用 Dock 按钮的 hover 色。 */ .game-resource-book-zoom-button.is-active { background: #f7ebe4; color: #b5582f; } /* * 资源筛选浮层,也是画布唯一的搜索入口:贴着右下角 Dock 向上展开,`bottom: 58px` = * Dock 的 `bottom: 14px` + Dock 高度 `34px` + 10px 间隙,所以它永远不会落到栏目标题栏 * (管理区顶边 min-height 42px)那条带上;`z-index: 40` 高于画本场景的 20,浮在资源卡与 * 栏目标题栏之上。 * * 定位留在宿主:共享的 `PlatformFilterPanel` 不自带 position,由这层给出锚点。 */ .game-resource-filter-panel { position: absolute; right: 14px; bottom: 58px; z-index: 40; } .game-resource-filter-panel__card { max-height: calc(100% - 72px); overflow-y: auto; } /* * 浮层提示(工作台状态提示、附件导入失败):不再占管理区顶部的排布带高度,改成绝对 * 定位的浮层,落在栏目标题栏(管理区顶边 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; } /* * 清单快照被 CAS 拒收时的提示位(工作台顶层)。 * * 用绝对定位而不是插进 grid 行:`.launcher-main` 的行高参与了工作台的高度 clamp, * 多一行会把资源画布挤矮。容器整体 `pointer-events: none`、只有提示条自己恢复命中, * 与 `.game-resource-book-notices` 同一套口径,避免空盒子吃掉下面的点击。 */ .launcher-manifest-merge-notices { position: absolute; top: 12px; left: 50%; z-index: 60; display: flex; flex-direction: column; align-items: center; gap: 8px; width: max-content; max-width: min(520px, calc(100% - 24px)); transform: translateX(-50%); pointer-events: none; } .launcher-manifest-merge-notices > * { width: auto; max-width: 100%; pointer-events: auto; } /* * 「编辑素材标签」是三段式:标题、标签区、底部「添加」。 * * 面板本体 `display: grid`(见 `.game-approval-dialog`),这里把它切成 * `auto / minmax(0, 1fr) / auto` 三行,标题与底部常驻、只有中间一行伸缩; * `max-height` 兜住上界。少了任何一半,标签一多整块面板就顶出视口, * 靠上的标签既看不见也滚不到(外层遮罩是不安全居中,全链没有可滚容器)。 */ .game-resource-classification-dialog { width: min(480px, 100%); max-height: min(720px, calc(100dvh - 40px)); grid-template-rows: auto minmax(0, 1fr) auto; } /* * 滚动落在 body 这一行:`min-height: 0` 是网格项能被 `1fr` 压缩的前提, * 否则内容高度会顶回轨道、`overflow-y` 永远不触发。 */ .game-resource-classification-body { display: grid; gap: 10px; min-height: 0; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; } /* * 「编辑素材标签」底部只有一个「添加」,靠右下角。 * * 面板本身是 `display: grid`,footer 作为网格项默认铺满整行;这里只把它改成靠右的行内排布, * 按钮宽度仍由共享的 `PlatformActionButton` 决定。 */ .game-resource-classification-footer { display: flex; justify-content: flex-end; } .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; } /* * 「替换素材」候选弹窗里候选卡的媒体区。 * * 缩略图由资源卡同一条预览管线(`useProjectResourceCardPreviews`)给出 Blob URL 后渲染, * 所以这里只负责"铺满弹窗给的 20 高度媒体槽 + 居中":读不到预览时它是类型占位的容器, * 读到之后就是真实缩略图的容器,两种状态同一块版面、不跳尺寸。 */ .game-resource-replacement-media { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; overflow: hidden; color: #8d7a6b; } .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; } .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; /* * 边框**常驻 1px 透明**,状态只改颜色。 * * 卡片是 `box-sizing: border-box`,且卡面(`.game-resource-card-visual`)与角标都是 * 绝对定位、以 **padding box** 为包含块:底态若是 `border: 0`,悬停 / 选中时才出现的 * 1px 边框会把内容盒四边各吃掉 1px,卡面与角标当场位移并缩小 2px —— 用户看到的就是 * 「一悬浮,卡片里面的东西跟着动」。常驻透明边框让所有状态的 padding box 完全一致, * 外尺寸仍然等于 `--resource-card-width/height`(border-box),画布坐标不受影响。 */ border: 1px solid transparent; 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%); } /* 基态已经是 1px 透明边框,这里只把颜色点亮;宽度与圆角保持 1px / 12px, padding box 不变,因此卡面与角标在状态切换时不会位移。 */ .game-resource-card:hover, .game-resource-card:focus-within, .game-resource-card.is-selected { border: 1px solid #d57b51; outline: 0; box-shadow: 0 8px 22px rgb(195 105 62 / 15%); } /* * 版本相关的卡片状态优先级(三组选择器权重相同,靠源文件顺序定胜负,顺序是承重的): * 1. `is-relation-version-binding`:选中版本卡 → 高亮该版本绑定的资源; * 2. `is-current-version`:正在使用的版本绑定的素材 → 常驻的呼吸光环; * 3. `.is-current-version` 的选中 / 悬停 / 拖拽变体:显式提权到 (0,3,0), * 把「用户此刻的操作」赢面拿回来,不再和 `.is-selected` 拼先后。 * 后面的规则压前面的,所以「当前版本」压过「版本聚焦」,选中态压过两者。 */ /* 版本聚焦:卡片本体是 `border: 0`,旧规则只写 `border-color`,等于没有边框可染色, * 从未生效过。这里补回真实边框与 ring,让「点击版本卡后高亮引用资源」这条语义 * (PRD §版本,`selectedVersionBindingResourceIds`)真的看得见。 */ .game-resource-card.is-relation-version-binding { border: 1px solid #d87342; box-shadow: 0 8px 22px rgb(195 105 62 / 18%), 0 0 0 2px rgb(216 115 66 / 32%); } @keyframes game-resource-card-current-version-breathe { 0%, 100% { opacity: 0.58; } 50% { opacity: 1; } } /* C5 卡片边框:只有被当前版本绑定使用的素材带边框,其余资源卡无边框。 */ .game-resource-card.is-current-version { border: 1px solid #d87342; box-shadow: 0 6px 18px rgb(96 62 47 / 10%), 0 0 0 3px rgb(216 115 66 / 32%), 0 0 20px rgb(216 115 66 / 34%); } /* * 「微微发光」:光环挂在伪元素上,只呼吸 opacity(照本页既有的 * `.ui-editor-status-attention::after` 写法),不动边框宽度、不动布局。 * 声明档位 38%,呼吸区间 0.58 ↔ 1 ⇒ 视觉上约 22% ↔ 38%。 * 静态的那一层留在卡片本体的 `box-shadow` 上,关掉动画也看得见。 */ .game-resource-card.is-current-version::after { position: absolute; inset: 0; border-radius: inherit; box-shadow: 0 0 0 3px rgb(216 115 66 / 38%), 0 0 20px rgb(216 115 66 / 38%); content: ''; pointer-events: none; animation: game-resource-card-current-version-breathe 2.4s ease-in-out infinite; } .game-resource-card.is-current-version.is-selected, .game-resource-card.is-current-version:hover, .game-resource-card.is-current-version:focus-within, .game-resource-card.is-current-version.is-dragging { border-color: #d57b51; box-shadow: 0 8px 22px rgb(195 105 62 / 15%), 0 0 0 3px rgb(216 115 66 / 38%), 0 0 20px rgb(216 115 66 / 38%); } @media (prefers-reduced-motion: reduce) { /* 收敛动画但不收敛可见性:光环静态停在可见档位。 */ .game-resource-card.is-current-version::after { animation: none; opacity: 0.75; } } .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; } /* * 棋盘格底只铺给**这张图真的有 alpha 通道**的卡(`data-preview-has-alpha='true'`, * 判据来自原生侧头部解析,见 `src-tauri/src/image_inspect.rs`),不再按「预览分支是图片」 * 无条件铺。 * * 原因:AI 生成的「透明底」PNG 常常把棋盘格**画进像素里**。无条件铺底时,卡面棋盘格与图内 * 棋盘格叠在一起,验收无法区分「真透明底」与「假棋盘格」;改为按真实 alpha 判定后两者可分。 * * 没有该属性时(JPEG 恒不透明;media-image / video 目前没有头部 alpha 判据)退回 * `.game-resource-card-visual` 的既有纯色底(见上一条规则),不引入第二套底色, * 因此不会出现「半透明叠色」之类的问题。 */ .game-resource-card[data-preview-kind='raster-image'][data-preview-has-alpha='true'] .game-resource-card-visual, .game-resource-card[data-preview-kind='media-image'][data-preview-has-alpha='true'] .game-resource-card-visual, .game-resource-card[data-preview-kind='video'][data-preview-has-alpha='true'] .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-lineage-badge { position: absolute; bottom: 8px; left: 8px; z-index: 2; display: inline-flex; /* 右下角可能有媒体播放钮(34px + 9px),血缘角标不越过去。 */ max-width: calc(100% - 52px); align-items: center; min-width: 0; padding: 4px 8px; overflow: hidden; border: 1px solid rgb(255 255 255 / 72%); border-radius: 999px; background: rgb(196 105 62 / 90%); 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: bottom left; } .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-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; /* 文档卡预览改为"前几行"(最多 3 行),必须保留换行:折成一行就看不出结构了。 */ white-space: pre-line; word-break: break-word; -webkit-box-orient: vertical; -webkit-line-clamp: 3; } /* * 代码文件卡:不显示文件内容,只给代码图标 + 扩展名标签。 * 与 `.game-resource-card-version-visual` 共用同一套居中排布口径,视觉上仍是同一族卡片。 */ .game-resource-card-code-visual { display: grid; gap: 8px; width: 100%; height: 100%; background: linear-gradient(145deg, #fff8f1, #f2ded2); color: #8b5b45; /* 图标与标签作为一组整体垂直居中,与 `.game-resource-card-version-visual` 同口径。 */ align-content: center; place-items: center; } .game-resource-card-code-label { padding: 1px 7px; border: 1px solid rgb(139 91 69 / 28%); border-radius: 999px; background: rgb(255 255 255 / 72%); color: #8b5b45; font-size: 9px; font-weight: 700; letter-spacing: 0.04em; } .game-resource-card-version-visual { align-content: center; gap: 10px; } /* * 引擎资源卡(引擎三维模型 / 序列化资源 / 无法解码的容器)。 * * 三者的共同点:卡面要么是渲染出来的缩略图,要么是「类型 + 扩展名」的类型卡, * 都必须与既有卡片同族 —— 因此沿用同一套浅色渐变底与居中排布,不新造一套视觉语言。 */ .game-resource-card-model-visual { /* * 绝对定位铺满卡面:`width/height: 100%` 在 `place-items: center` 的网格里会因为 * 行高不确定而退化成"按内容定高",缩略图就以自然比例溢出卡面被裁掉(看起来像被拉伸)。 * 用 `inset: 0` 把盒子定死,图片才能在固定框里做 letterbox。 */ position: absolute; inset: 0; display: grid; width: 100%; height: 100%; background: linear-gradient(145deg, #f7f2ec, #e6ddd2); place-items: center; } .game-resource-card-model-visual img { /* * 图片绝对定位铺满宿主:宿主是 `place-items: center` 的网格,网格项的高度会退化成 * "按内容定高"(`height: 100%` 解析成 auto),缩略图就会按自身比例长过卡片并被裁掉。 * 铺满 + `object-fit: contain` 才是「不拉伸、不裁切」的口径。 */ position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; } .game-resource-card-engine-visual { position: absolute; inset: 0; display: grid; gap: 8px; width: 100%; height: 100%; padding: 12px; background: linear-gradient(145deg, #f7f2ec, #e6ddd2); color: #8b5b45; align-content: center; place-items: center; } .game-resource-card-engine-label { max-width: 100%; padding: 1px 7px; border: 1px solid rgb(139 91 69 / 28%); border-radius: 999px; background: rgb(255 255 255 / 72%); color: #8b5b45; font-size: 9px; font-weight: 700; letter-spacing: 0.04em; text-align: center; word-break: break-word; } /* 引擎序列化资源:结构摘要按"最多三行"截断,与文档卡的卡面口径一致。 */ .game-resource-card-structured-visual { position: absolute; inset: 0; display: grid; gap: 8px; width: 100%; height: 100%; padding: 14px; background: linear-gradient(145deg, #fff8f1, #f2ded2); color: #8b5b45; align-content: center; place-items: center; } .game-resource-card-structured-text { display: -webkit-box; max-height: 100%; overflow: hidden; color: #674c41; font-size: 11px; line-height: 1.55; text-align: left; word-break: break-word; -webkit-box-orient: vertical; -webkit-line-clamp: 3; } .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); } /* 面板纵向布局(2026-07 Codex 风格改造):这里保持 grid,不要改成 flex。 `.game-workbench-chat { grid-template-rows: auto minmax(0, 1fr) }` 原本是给「头部 + 内容」 两行用的;direct-codex 精简掉头部后,surface 变成第一个子元素、落进第一行 auto 轨道, 于是面板高度一大于内容(新会话只有一条欢迎消息时),surface 就被压成内容高度:消息列表 塌成几十像素、输入盒被拉伸到两百多像素。所以下面这份几何要靠 `height: 100%` 撑满轨道, 不能再叠加 `flex: 0 1 auto` 之类的 flex 简写(那会把 basis 变成 auto,同样压成内容高度)。 */ .game-workbench-chat .project-supervisor-surface { grid-row: 1 / -1; 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; } /* 输入盒的弹层必须能溢出面板:控制排最左侧是「推理档」,它的菜单 `.conversation-model-menu` 贴着触发钮右缘向左展开,窄布局(视口 ≤1000px 时对话面板 只有 280px 宽)下会伸到面板左侧之外;`.game-workbench-chat`、surface、conversation 这三层 `overflow: hidden` 会沿着各自的溢出边界把它裁掉,档位文字正好落在被裁掉的 那半边,于是点开只能看到一个空盒子。所以这里让这三层不再裁切:菜单自身位置、 尺寸都不变,只是允许它盖到左侧面板上完整显示。消息列表自带 `overflow-y: auto` (另一轴按规范计算为 auto),消息内容仍由列表自身裁剪。 */ .game-workbench-chat:has(.project-supervisor-composer.is-direct-codex) { overflow: visible; } .game-workbench-chat .project-supervisor-surface.is-direct-codex { overflow: visible; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-conversation { overflow: visible; } .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); /* 输入区回到文档流(见文件末尾「右侧对话面板 Codex 风格」区块):列表不再需要给一块 浮在自己身上的输入区预留高度,这里只留 `@` 引用菜单等浮层要的一点底部余量。 */ padding-bottom: 12px; scroll-padding-bottom: 12px; 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; } /* 这里原有一条 direct-codex 输入盒的旧几何规则(`grid-template-columns: 1fr 82px`、 `z-index: 2`、`padding-top: 8px`、`background: transparent`),是「输入区浮在消息列表上、 与 82px 发送钮列共用网格」那版布局的残留。新几何(单列、z-index 1、自带边框与底色、 盒内上下内边距相等)已由文件末尾「右侧对话面板 Codex 风格」区块的同名规则接管, 所以整条删除——留着会让 `padding-top: 8px` 这种长手写法继续生效, 把新规则里的 `padding: 10px 12px` 拆掉一半,重新造成上下留白不一致。 */ .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 桌面客户端的排版:消息列表是**唯一滚动区**,输入盒在它下方 (文档流、不重叠、不覆盖消息),所以这里不再给输入区预留 256px 底边留白—— 留白归 0,滚到底时最后一条消息不会被一段空白顶掉。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list { position: relative; top: 0; right: 0; bottom: 0; left: 0; gap: 14px; height: auto; min-height: 0; flex: 1 1 auto; padding: 14px 16px 0; scroll-padding-bottom: 0; border: 0; border-radius: 0; background: transparent; } /* 助手消息不做整块底色盒子(通透排版):只有用户消息是右对齐浅底气泡 + 主色描边。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list .message--assistant { border: 0; background: transparent; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list .message { width: fit-content; max-width: min(88%, 720px); padding: 0; border: 0; border-radius: 12px; background: transparent; line-height: 1.6; } .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: 9px 13px; 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 .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.3; } /* ReactMarkdown 的列表节点必须显式清零默认块间距;否则 p/ul 的 margin 会叠加成截图中的“假空行”。真正的 Markdown 空行仍由段落结构保留。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list .message--assistant ul, .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list .message--assistant ol { margin-block: 0.65em; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list .message--assistant li > p { margin-block: 0; } .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-base); } /* 输入区是对话框内部的一块:四边内缩 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; } } @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: relative; min-height: 96px; height: auto; flex: 1 1 auto; } /* 1000px 以下仍然是一列:顶栏、消息列表、输入盒依次排布,输入盒留在文档流里。 四边留白不再在这里另给一套值(曾写过 `margin: 8px 12px 12px`,正是"左右一个值、 上下另一个值"的来源之一),统一由文件末尾的输入盒规则声明为 16px。 */ .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; } .design-agent-approval, .design-agent-clarify { display: flex; flex-wrap: wrap; gap: 8px; padding: 10px 12px; } .design-agent-clarify { display: grid; } .design-agent-approval button, .design-agent-clarify button, .design-agent-file { min-height: 36px; padding: 0 12px; border: 1px solid #cfd7e6; border-radius: 8px; background: #fff; color: #27364a; } .design-agent-files { display: grid; gap: 4px; max-height: 28vh; overflow: auto; padding: 8px 12px 12px; } .design-agent-file { display: block; width: 100%; min-height: 32px; text-align: left; } .design-agent-file.is-dir { color: #7a8796; border: 0; background: transparent; } .design-agent-preview { position: fixed; inset: 12vh 8vw auto; z-index: 40; max-height: 76vh; overflow: auto; border: 1px solid #cfd7e6; border-radius: 12px; background: #fff; } .design-agent-preview header { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 12px; border-bottom: 1px solid #e6ecf5; } .design-agent-preview__body { padding: 12px; } /* 策划 Agent 使用 GameAgent 工作台的两栏外壳。左侧工作区即使为空也保持可见, 右侧只承载对话与阶段控制。 */ .game-project-workbench--design { --game-workbench-stage-fill: #fffdfa; --game-workbench-agent-fill: #fbf7f2; } .game-workbench-layout--design { height: clamp(600px, calc(100dvh - 154px), 900px); grid-template-columns: minmax(0, 1fr) minmax(380px, 0.42fr); } .game-workbench-layout--design .game-workbench-stage { display: block; min-height: 0; overflow: hidden; } .game-workbench-layout--design .game-workbench-chat { min-height: 0; } .design-workspace-panel { display: grid; grid-template-rows: auto auto minmax(0, 1fr); height: 100%; min-height: 0; padding: 22px; overflow: hidden; background: var(--game-workbench-stage-fill); } .design-workspace-panel__header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; padding-bottom: 18px; } .design-workspace-panel__actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; } .design-workspace-panel__eyebrow { display: block; margin-bottom: 6px; color: var(--platform-text-soft); font-size: 12px; letter-spacing: 0.08em; } .design-workspace-panel__header h1 { margin: 0; color: var(--platform-text-strong); font-size: clamp(22px, 2.4vw, 32px); line-height: 1.15; } .design-workspace-panel__header p { margin-top: 8px; color: var(--platform-text-base); font-size: 13px; } .design-workspace-panel__refresh, .design-workspace-preview header button { display: inline-flex; align-items: center; gap: 6px; min-height: 34px; padding: 0 11px; border: 1px solid var(--platform-surface-border); border-radius: 8px; background: var(--platform-button-secondary-fill); color: var(--platform-button-secondary-text); cursor: pointer; } .design-workspace-panel__refresh:disabled { cursor: wait; opacity: 0.6; } .design-phase-rail { display: flex; gap: 6px; padding: 12px 0 18px; overflow-x: auto; scrollbar-width: thin; } .design-phase-rail__item { display: inline-flex; align-items: center; gap: 7px; flex: 0 0 auto; min-height: 30px; padding: 0 10px; border: 1px solid var(--platform-line-soft); border-radius: 999px; color: var(--platform-text-soft); font-size: 12px; } .design-phase-rail__item.is-current { border-color: var(--platform-button-primary-border); background: var(--platform-warm-bg); color: var(--platform-text-strong); font-weight: 700; } .design-phase-rail__item.is-complete { color: var(--platform-text-base); } .design-phase-rail__make-game { display: inline-flex; align-items: center; flex: 0 0 auto; min-height: 30px; padding: 0 12px; border: 1px solid var(--platform-button-primary-border); border-radius: 999px; background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); font-size: 12px; font-weight: 700; cursor: pointer; } .design-phase-rail__make-game:hover { filter: brightness(0.97); } .design-phase-rail__marker { display: inline-grid; width: 18px; height: 18px; place-items: center; border-radius: 50%; background: var(--platform-line-soft); font-size: 10px; } .design-phase-rail__item.is-current .design-phase-rail__marker, .design-phase-rail__item.is-complete .design-phase-rail__marker { background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); } .design-workspace-panel__error, .design-agent-controls__error { margin: 0 0 10px; color: var(--platform-danger-text, #b42318); font-size: 12px; overflow-wrap: anywhere; } .design-workspace-panel__body { display: grid; grid-template-columns: minmax(220px, 0.34fr) minmax(0, 1fr); min-height: 0; overflow: hidden; border: 1px solid var(--platform-line-soft); border-radius: 12px; background: var(--platform-input-fill); } .design-workspace-tree { min-width: 0; overflow: auto; border-right: 1px solid var(--platform-line-soft); } .design-workspace-tree > header { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 12px 14px; border-bottom: 1px solid var(--platform-line-soft); background: var(--platform-neutral-bg); } .design-workspace-tree > header strong { color: var(--platform-text-strong); font-size: 13px; } .design-workspace-tree > header span { color: var(--platform-text-soft); font-size: 11px; } .design-workspace-tree__list { display: grid; gap: 2px; padding: 8px; } .design-workspace-tree__entry { display: flex; align-items: center; gap: 8px; width: 100%; min-height: 34px; padding-top: 0; padding-bottom: 0; border: 0; border-radius: 7px; background: transparent; color: var(--platform-text-base); font: inherit; font-size: 12px; text-align: left; overflow: hidden; } .design-workspace-tree__entry span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .design-workspace-tree__branch-spacer { display: block; width: 14px; flex: 0 0 14px; } button.design-workspace-tree__entry { cursor: pointer; } button.design-workspace-tree__entry:hover, .design-workspace-tree__entry.is-selected { background: var(--platform-warm-bg); color: var(--platform-text-strong); } .design-workspace-tree__entry.is-directory { color: var(--platform-text-soft); } .design-workspace-empty, .design-workspace-preview__placeholder { display: grid; place-items: center; gap: 8px; min-height: 150px; padding: 24px; color: var(--platform-text-soft); font-size: 12px; text-align: center; } .design-workspace-empty strong, .design-workspace-preview__placeholder strong { color: var(--platform-text-strong); font-size: 14px; } .design-workspace-preview { display: grid; grid-template-rows: auto minmax(0, 1fr); min-width: 0; min-height: 0; overflow: hidden; background: var(--platform-neutral-bg); } .design-workspace-preview > header { display: flex; align-items: center; gap: 12px; min-width: 0; padding: 10px 14px; border-bottom: 1px solid var(--platform-line-soft); } .design-workspace-preview > header strong { min-width: 0; overflow: hidden; color: var(--platform-text-strong); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } .design-workspace-preview__markdown, .design-workspace-preview > pre { min-height: 0; margin: 0; padding: 18px; overflow: auto; color: var(--platform-text-base); font-size: 13px; line-height: 1.65; white-space: pre-wrap; overflow-wrap: anywhere; } .design-agent-controls { display: grid; gap: 10px; padding: 12px 14px; border: 1px solid var(--platform-line-soft); border-radius: 10px; background: var(--platform-neutral-bg); } .design-agent-controls__header { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .design-agent-controls__header div { display: grid; gap: 3px; } .design-agent-controls__header span:first-child { color: var(--platform-text-soft); font-size: 11px; } .design-agent-controls__header strong { color: var(--platform-text-strong); font-size: 14px; } .design-agent-controls__status { color: var(--platform-accent); font-size: 11px; } .design-agent-approval, .design-agent-clarify { display: grid; gap: 9px; padding: 0; } .design-agent-pending-actions { display: grid; gap: 10px; margin-top: 2px; } .design-agent-approval p, .design-agent-clarify p { margin: 0; color: var(--platform-text-base); font-size: 12px; line-height: 1.5; } .design-agent-approval > div, .design-agent-clarify__options { display: flex; flex-wrap: wrap; gap: 8px; } .design-agent-approval button, .design-agent-clarify button, .design-agent-retry { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 34px; padding: 0 11px; border: 1px solid var(--platform-surface-border); border-radius: 8px; background: var(--platform-button-secondary-fill); color: var(--platform-button-secondary-text); font: inherit; font-size: 12px; cursor: pointer; } .design-agent-approval button:first-child { border-color: var(--platform-button-primary-border); background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); } .design-agent-approval button:disabled, .design-agent-clarify button:disabled, .design-agent-retry:disabled { cursor: wait; opacity: 0.58; } .design-agent-clarify textarea { width: 100%; min-height: 58px; padding: 9px 10px; resize: vertical; border: 1px solid var(--platform-surface-border); border-radius: 8px; background: var(--platform-input-fill); color: var(--platform-text-base); font: inherit; font-size: 12px; } .design-agent-retry { justify-self: start; } /* 策划聊天区包含阶段控制卡、消息、Runtime 状态和输入框。GameAgent 资源工作台的 消息列表默认占满整个聊天区,策划模式需要单独恢复五行布局,避免输入框被推到视口外。 */ /* 策划工作台保留标题行,避免共用跨行规则将标题挤到底部。 */ .game-workbench-layout--design .game-workbench-chat { grid-template-rows: auto minmax(0, 1fr); } .game-workbench-layout--design .game-workbench-chat .project-supervisor-surface { grid-row: 2; } .game-workbench-layout--design .project-supervisor-surface { display: block; height: 100%; min-height: 0; padding: 10px; overflow: hidden; } .game-workbench-layout--design .project-supervisor-conversation { display: grid; grid-template-rows: auto minmax(0, 1fr) auto auto auto; height: 100%; min-height: 0; overflow: hidden; } .game-workbench-layout--design .project-supervisor-message-list { height: auto; min-height: 0; max-height: none; padding-bottom: 12px; } .game-workbench-layout--design .project-supervisor-composer { min-height: 0; } @media (max-width: 760px) { .game-workbench-layout--design { height: auto; } .game-workbench-layout--design .game-workbench-stage, .game-workbench-layout--design .game-workbench-chat { min-height: 560px; } .game-workbench-layout--design .project-supervisor-surface, .game-workbench-layout--design .project-supervisor-conversation { height: 100%; } } .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` 一样给它自己的上限加内部滚动,而不是 让它去挤别人。 */ /* 策划链路的会话列比另外两条多一个成员:策划面(阶段进度 + 审批卡)。#193(5802048c3 「Codex/agent chat layout fix」)把这个容器从基础规则继承来的 `display: grid` 改成 `display: block`、并把消息列表从 `flex: 1 1 auto` 改成 `height: 100%`,于是列表独吞 整列高度,排在它后面的策划窄条、待确认命令、输入框和状态行全部被 `overflow: hidden` 静默裁掉——组件照常渲染、DOM 里查得到,只是位置落在裁剪线外,屏幕上什么都没有。 实测:窄条 top=858 而容器 bottom=788,超出 384px;scrollHeight 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; /* 条目多时菜单不能无限长:240px 与视口 40vh 取小者,超出部分在菜单内滚动 (窄屏 / 移动端优先下 40vh 更稳)。滚动不外溢给背后的消息列表,与 `.resource-reference-menu` 同一口径。 */ max-height: min(240px, 40vh); overflow: auto; overscroll-behavior: contain; 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 面板自己不留内边距:左右与四周的留白统一由子节点自己声明, 这样「消息内容 / 顶栏 / 输入盒」三者共用同一个基准值,不会再出现 「消息内缩 16px、输入盒只有 10px」这种左右不齐,或不一致的上/下间距。 (非 direct-codex 的面板仍走上面那条 `padding: 10px`。) */ .game-workbench-chat .project-supervisor-surface.is-direct-codex { padding: 0; } /* 输入盒是唯一有边框的容器,且**回到文档流**:它在消息列表下方(Codex 桌面客户端的 「整块面板 = 顶栏 + 消息流 + 输入盒」),不再浮在消息列表之上。 旧版那套「输入区绝对定位、消息列表用 196px 底边留白给它让位」已撤掉——两套叠着生效会 让消息被空白顶掉、输入盒盖住消息。 两行结构:文本区 / 控制排(`+` `@` · 模型下拉 · 发送)。原先那行「项目名 · 本地」信息标签 已按需求删掉,输入盒内不再复述当前项目。 四边留白统一 16px:左右与底边来自这里的外边距,顶边同样来自外边距(面板 padding 已归 0), 所以四边恒等;消息列表自身也是左右各 16px,输入盒与消息内容左右对齐。 盒内上下内边距同样取同一个值(10px),不写 `8px … 10px` 那种上下不一致的写法。 */ .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: relative; right: 0; bottom: 0; left: 0; margin: 16px; max-height: none; z-index: 1; /* 盒内内边距四边同值:文字/光标的左内缩与上内缩必须相等, 否则点进输入框时(`.resource-reference-input:focus-within` 会画出焦点环) 会明显看出文字离左边近、离上边远。 */ padding: 12px; border: 1px solid var(--platform-surface-border); border-radius: 14px; background: var(--platform-input-fill); box-shadow: none; 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; } /* direct-codex 输入区去默认灰描边,并且**不再画内层焦点环**:焦点可见性交给下面那条 `:focus-within` 的整只输入盒——在输入区上再套一圈光环会让它看起来是"第二层框", 文字/光标被圈在小框里、而 `+` `@` 发送那排控件在小框外, 观感上就是"光标和底下的控件对不齐"。 */ .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:focus-within { border-color: var(--platform-surface-hover-border); box-shadow: 0 0 0 3px var(--platform-input-focus-ring); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .resource-reference-input-placeholder { top: 0; left: 0; color: var(--platform-text-soft); } .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; } /* 左侧引用按钮保留输入盒的内边距,点击区域不向外偏移。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-controls .project-supervisor-composer-controls-left { margin-left: 0; } /* 模型选择钮在控制排里按流式排布,但它同时是**弹层锚点**:`.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-attachment-trigger, .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: 28px; min-width: 28px; height: 28px; min-height: 28px; padding: 0; border: 0; border-radius: 8px; flex: 0 0 28px; place-items: center; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-attachment-trigger, .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-attachment-trigger:hover:not(:disabled), .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-attachment-trigger:focus-visible, .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); } /* 发送钮是圆形主色块(Codex 观感):直径与左右两只方钮同档,圆角收到 999px。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-submit-button { width: 28px; min-width: 28px; height: 28px; min-height: 28px; border-radius: 999px; flex: 0 0 28px; background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); } /* ===== 输入盒新增控件(`+` 上传弹层 / 语音 / 推理档 / 终止钮 / 附件与队列 chip)===== 全部是**追加**规则:上面那三条共用尺寸/配色规则(`+`、`@`、发送钮)保持原样, 这里只给新增元素自己的几何与配色。 */ /* `+` 弹层的包含块:弹层是 absolute,锚点必须自己带定位,否则会挂到整只 composer 上。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-controls .project-supervisor-attachment-anchor { position: relative; display: grid; flex: 0 0 auto; place-items: center; } /* 原生文件选择器只作为 `+` 弹层的落点,不放进版式。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-upload-input { display: none; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-attachment-menu { position: absolute; bottom: calc(100% + 8px); left: 0; z-index: 3; display: grid; min-width: 168px; padding: 4px; border: 1px solid var(--platform-surface-border); border-radius: 10px; background: var(--platform-input-fill); box-shadow: 0 8px 24px rgb(0 0 0 / 18%); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-attachment-menu button { display: flex; align-items: center; gap: 8px; width: 100%; padding: 7px 8px; border: 0; border-radius: 8px; background: transparent; color: var(--platform-text-base); font-size: 12px; text-align: left; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-attachment-menu button:hover:not(:disabled), .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-attachment-menu button:focus-visible { background: var(--platform-button-ghost-fill); } /* 语音钮与终止钮沿用控制排方钮尺寸;这里补 `position: static` 等重置, 免得继承文件里更早那条广播式 `button` 规则。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-controls .project-supervisor-voice-trigger, .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-controls .project-supervisor-stop-button { position: static !important; right: auto !important; bottom: auto !important; display: grid; width: 28px; min-width: 28px; height: 28px; min-height: 28px; padding: 0; border: 0; border-radius: 8px; flex: 0 0 28px; place-items: center; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-voice-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-voice-trigger:hover:not(:disabled), .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-voice-trigger:focus-visible { background: var(--platform-button-ghost-fill); color: var(--platform-text-strong); } /* 录音态:实心强调色 + 呼吸光环,配上 aria-pressed 让"正在录"一眼可见。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-voice-trigger.is-recording { border-radius: 999px; background: var(--platform-accent, #c7653d); color: var(--platform-button-primary-text); animation: composer-voice-recording-pulse 1.4s ease-in-out infinite; } @keyframes composer-voice-recording-pulse { 0%, 100% { box-shadow: 0 0 0 0 rgb(199 101 61 / 45%); } 50% { box-shadow: 0 0 0 4px rgb(199 101 61 / 0%); } } /* 终止钮:发送钮的圆角几何不变,只用中性填充区分"这一步在停止"而不是"发送"。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-stop-button { border-radius: 999px; /* 停止是破坏性操作:用红色填充 + 红色图标,和发送/其它控件区分开。 */ background: rgb(197 62 62 / 14%); color: #c53e3e; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-stop-button:hover:not(:disabled), .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-stop-button:focus-visible { background: rgb(197 62 62 / 22%); color: #a82f2f; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-reasoning-effort { display: inline-flex; align-items: center; flex: 0 1 auto; min-width: 0; gap: 6px; } /* 推理档紧挨模型选择器:控件位只放当前档位,选项在原生菜单里。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-reasoning-effort-select { max-width: 76px; padding: 2px 4px; border: 0; border-radius: 8px; background: transparent; color: var(--platform-text-soft); font-size: 12px; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-reasoning-effort-select:hover:not(:disabled), .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-reasoning-effort-select:focus-visible { background: var(--platform-button-ghost-fill); color: var(--platform-text-strong); } /* 待发附件 / 队列 chip:压在输入区上方,横向排布、超出换行。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-attachments, .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-queue { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 0 0 6px; padding: 0; list-style: none; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-attachments li, .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-queue li { display: inline-flex; align-items: center; gap: 4px; max-width: 100%; padding: 3px 6px; border-radius: 999px; background: var(--platform-button-ghost-fill); color: var(--platform-text-soft); font-size: 12px; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-attachments li span, .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-queue .project-supervisor-composer-queue-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-attachments button, .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-queue button { display: grid; place-items: center; width: 18px; height: 18px; padding: 0; border: 0; border-radius: 999px; background: transparent; color: inherit; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-queue-order { opacity: 0.7; font-variant-numeric: tabular-nums; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer.is-direct-codex .project-supervisor-composer-notice { margin: 4px 0 0; color: var(--platform-text-soft); font-size: 12px; } /* 消息列表的最终几何,故意放在文件靠后的位置:它与上面那条同选择器同权重 (`.game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list`),按"后写胜出"把两处会顶掉它的规则压回去—— 一是 `:has(.plan-gdd-surface, .planning-lane-runtime-strip)` 给列表留的 `padding-bottom: 12px`,二是下面窄屏块之前可能出现的任何底边偏移。 这里曾经是一条 `padding-bottom: 256px`("输入区浮在列表之上"那版布局给浮层预留的高度), 在输入盒回到文档流之后,那段留白会变成凭空多出来的空白,把最后一条消息顶出可视区。 所以:列表底边归 0 留白;它靠 `flex: 1 1 auto` 吸收剩余高度,是整块面板里唯一的滚动区。 要改列表底边只改这一段,不要再在别处写第二条同选择器规则。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list { top: 0; right: 0; bottom: 0; left: 0; padding-bottom: 0; scroll-padding-bottom: 0; } /* 窄屏(≤760px)这一列是"消息列表 + 输入盒"的纵向堆叠。输入盒本来就在文档流里, 窄屏不再单独给它一套 `8px 12px 12px` 的不对称外边距——四边统一沿用上面那条 `margin: 16px`,避免又出现"左右一个值、上下另一个值"。 外框不再画在 `.project-supervisor-conversation` 上(那会在整块面板外面再套一圈框, 与「输入盒是唯一有边框的容器」相悖),列表底边也不留任何给浮层让位的空白。 */ @media (max-width: 760px) { .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-conversation { padding: 0; border: 0; border-radius: 0; background: transparent; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list { padding-bottom: 0; scroll-padding-bottom: 0; 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; } /* 1000px 那条 `.game-workbench-chat .project-supervisor-conversation` 的 `height: auto; max-height: none; overflow: visible` 是给旧结构写的;新结构里会话列 是「顶栏 + 唯一滚动区 + 输入盒」的定高 flex 列,窄屏也要把高度还给列本身,否则 消息列表拿不到剩余高度、整列会溢出面板。这条写在后面,按"后写胜出"盖回它。 `overflow-y` 仍沿用基础规则里的 `hidden`,这里不重复声明。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-conversation { height: 100%; 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-base); 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 { /* hint 是自制 span(不是原生 placeholder 属性),它和输入区各自取字号就会错位: 输入区写了 13px/1.6,而 `.resource-reference-input { font: inherit }` 让它继承到 面板的 16px/24px——同一段提示比实际光标大一圈、基线也不同,看起来就是"光标和 hint 没对齐"。字号下沉到两者的共同父级,双方共用同一套字体度量。 */ font-size: 13px; line-height: 1.6; } .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; } /* Lexical 会把内容包进 `

`,而全局规则给段落留了 `margin: 8px 0 0`: 输入区自己的文字因此比 hint(绝对定位在 top:0 的 span)低 8px,看起来就是 "光标和 hint 没对齐"。这里把段落在编辑器内清零,光标与 hint 落在同一行盒。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer .resource-reference-input-editor p { margin: 0; } /* 陶泥儿输入区的操作排(`AI 润色` / `恢复原文`)回到文档流:网格第二行右侧那一列, `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-row: 2; grid-column: 2; position: static; display: flex; align-items: end; justify-content: flex-end; min-width: 0; height: auto; } /* 「润色中… / 润色失败」和应用排**同一行**:状态文字在第二行左侧那一列(占剩余宽度), 操作排在第二行右侧那一列。单独占一行会把输入框整体顶高一个状态行的距离;而给它 `grid-column: 1 / -1` 又会和操作排落进同一个网格单元互相重叠(状态文字长时压到按钮下面)。 共行分列则状态出现/消失都不改变输入框高度,也不会互相压。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer .resource-reference-input-status { grid-row: 2; grid-column: 1; align-self: center; min-width: 0; margin-top: 0; } /* direct-codex 里 `ResourceReferenceInput` 收到的是 `showTriggerButton={!directCodex}`, 即输入框内的 `.resource-reference-input-at` 根本不会渲染(`@` 触发钮是下面控制排里的 `.project-supervisor-reference-trigger`)。这里原本有一条针对它的 `position: static !important` / 30px 主色方块规则,永远匹配不到,已删除; 要改 direct-codex 的 `@` 触发钮外观请改 `.project-supervisor-reference-trigger`。 */ .design-agent-reasoning { margin: 8px 0; } .design-agent-reasoning summary { cursor: pointer; } .design-agent-reasoning pre { margin: 6px 0 0; white-space: pre-wrap; font: inherit; } /* ============================================================ 右侧对话面板 Codex 风格(2026-07):整块替换原 direct-codex 输入区浮层布局 ============================================================ 面板结构从「消息列表当外框、输入区绝对定位浮在它底部」改成 Codex 桌面客户端的三段式: 顶部极简条(状态点 + 状态文案 + 设置齿轮)/ 消息列表(唯一滚动区,flex:1)/ 输入盒 (文档流,整块面板里唯一有边框的容器)。 上面几条同名旧规则已就地改写成新几何(不再有 position: absolute 与 196px/256px 底边 留白),这里只补新增节点的样式,并把旧的绿系执行过程卡收进暖色系。 全部颜色只用现有 `--platform-*` 变量,浅色主题下成立。 */ /* 顶部极简条:44px 高、无独立背景块,只有一条极细分隔线。 左右内缩与消息内容 / 输入盒统一为 16px(面板自身 padding 已归 0)。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 44px; flex: 0 0 auto; padding: 0 16px; border-bottom: 1px solid var(--platform-line-soft); background: transparent; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar-status { display: flex; align-items: center; gap: 7px; min-width: 0; color: var(--platform-text-base); font-size: 12px; line-height: 1.5; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar-status > span:last-child { min-width: 0; overflow-wrap: anywhere; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar-dot { width: 7px; height: 7px; flex: 0 0 7px; border: 1px solid var(--platform-button-primary-border); border-radius: 50%; background: var(--platform-neutral-bg); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar-dot.is-busy { border-color: transparent; background: var(--platform-accent); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-settings-trigger { display: grid; width: 28px; min-width: 28px; height: 28px; min-height: 28px; flex: 0 0 28px; padding: 0; place-items: center; border: 0; border-radius: 8px; background: transparent; color: var(--platform-text-soft); cursor: pointer; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-settings-trigger:hover, .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-settings-trigger:focus-visible { background: var(--platform-button-ghost-fill); color: var(--platform-text-strong); outline: none; } /* 空态:整块消息区水平垂直居中。标题允许换行(面板只有 340–520px,不写 nowrap)。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-empty-state { display: flex; height: 100%; min-height: 100%; flex-direction: column; align-items: center; justify-content: center; gap: 10px; padding: 24px 16px; color: var(--platform-text-soft); text-align: center; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-empty-state > svg { color: var(--platform-line-soft); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-empty-state > strong { max-width: 100%; color: var(--platform-text-strong); font-size: 15px; font-weight: 600; line-height: 1.5; white-space: normal; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-empty-state > small { max-width: 100%; color: var(--platform-text-soft); font-size: 12px; line-height: 1.6; white-space: normal; } /* 执行过程卡在暖色皮肤下不再用绿色系:改成中性描边 + 暖底,主色只留给状态点与发送钮。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list > .project-supervisor-process-card { border-color: var(--platform-line-soft); background: var(--platform-neutral-bg); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list > .project-supervisor-process-card > header > span { background: var(--platform-accent); } /* 设置浮层(新增):独立 backdrop + dialog,不再往面板下面追加内容。 */ .project-supervisor-settings-backdrop { position: fixed; top: var(--window-chrome-height); right: 0; bottom: 0; left: 0; z-index: 240; display: grid; padding: 20px; background: rgb(65 43 34 / 42%); place-items: center; } .project-supervisor-settings-dialog { display: grid; gap: 12px; width: min(420px, 100%); max-height: calc(100dvh - var(--window-chrome-height) - 40px); padding: 16px; overflow: auto; border: 1px solid var(--platform-surface-border); border-radius: 18px; background: var(--platform-modal-fill); color: var(--platform-text-strong); box-shadow: 0 24px 64px rgb(62 37 27 / 24%); } .project-supervisor-settings-dialog > header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; } .project-supervisor-settings-dialog h2, .project-supervisor-settings-dialog small { margin: 0; } .project-supervisor-settings-dialog h2 { font-size: 15px; } .project-supervisor-settings-dialog > header small { display: block; margin-top: 3px; color: var(--platform-text-soft); font-size: 11px; } .project-supervisor-settings-close { display: grid; width: 28px; min-width: 28px; height: 28px; min-height: 28px; flex: 0 0 28px; padding: 0; place-items: center; border: 0; border-radius: 8px; background: transparent; color: var(--platform-text-soft); cursor: pointer; } .project-supervisor-settings-close:hover, .project-supervisor-settings-close:focus-visible { background: var(--platform-button-ghost-fill); color: var(--platform-text-strong); outline: none; } .project-supervisor-settings-rows { display: grid; gap: 8px; } .project-supervisor-settings-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; min-width: 0; padding: 10px 12px; border: 1px solid var(--platform-surface-border); border-radius: 12px; background: var(--platform-button-secondary-fill); color: var(--platform-text-base); font: inherit; text-align: left; cursor: pointer; } .project-supervisor-settings-row.is-static { cursor: default; } .project-supervisor-settings-row:hover:not(.is-static), .project-supervisor-settings-row:focus-visible { border-color: var(--platform-surface-hover-border); color: var(--platform-text-strong); outline: none; } .project-supervisor-settings-row-main { display: flex; align-items: center; gap: 9px; min-width: 0; } .project-supervisor-settings-row-main > svg { flex: 0 0 auto; color: var(--platform-accent); } .project-supervisor-settings-row-main > span { display: grid; gap: 2px; min-width: 0; } .project-supervisor-settings-row-main strong { color: var(--platform-text-strong); font-size: 13px; } .project-supervisor-settings-row-main small { color: var(--platform-text-soft); font-size: 11px; } /* 泥点那一行:`walletEntry` 来自父级,自身不承载取数逻辑。 */ .project-supervisor-settings-row .game-workbench-chat-wallet { margin-left: auto; } /* 面板纵向布局兜底(实测修复,2026-07): 只改 `.game-workbench-chat .project-supervisor-surface.is-direct-codex` 的几何还不够—— 更早那条 `.game-workbench-chat .project-supervisor-surface { display: grid; ... }` 特异性同为 3 个类且写在前面,面板实际仍是「单行 grid」,`.project-supervisor-conversation` 被当成 grid 轨道拉高到面板高度;同时基础规则 `.project-supervisor-message-list { min-height: 340px }` 又给列表压了 340px 下限,两者叠加后列表被内容撑到数千像素、输入盒被顶到面板之外不可见。 这里显式把 surface / conversation 改成 flex 纵向链(多带一层 `.message-list` 提高特异性), 并解除列表的 340px 下限,保证「消息列表是唯一滚动区、输入盒恒在面板底部」。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .message-list.project-supervisor-message-list { min-height: 0; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-conversation { display: flex; height: 100%; min-height: 0; flex-direction: column; grid-template-rows: none; gap: 0; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-conversation > .message-list.project-supervisor-message-list { min-height: 0; flex: 1 1 auto; } /* ============================================================ 工具调用折叠块(2026-09):一回合一个块,Codex 风格 ============================================================ 契约见 `docs/technical/【技术方案】GameAgent对话工具调用卡片-2026-09-14.md`: 块头一行浅底圆角条目(图标 / 汇总 / 结束时间 / 总用时 / 折角),展开态每行一条工具, 行右侧是对齐的耗时,行可二级展开看命令、文件明细与输出。 折叠由 `