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