@import 'tailwindcss'; @source '../../../packages/shared/src/components'; /* 资源画布直接渲染仓库根 src/components/image-editor 下的共享图片画布组件(它们又用到 src/components/common)。这两个目录不在 app 根下,Tailwind 自动探测扫不到,缺了组件 自带的工具类(h-3 / rounded-full / inline-flex …)就会和网页端美术画布长得不一样。 */ @source '../../../src/components/image-editor'; @source '../../../src/components/common'; @import '@genarrative/shared/styles.css'; @import '../../../packages/shared/src/theme.css'; :root { color: #18202f; background: #f5f7fb; font-family: Inter, 'PingFang SC', 'Microsoft YaHei', system-ui, sans-serif; } * { box-sizing: border-box; } body { margin: 0; } #root { height: 100dvh; min-height: 0; } .app-update-notice { position: fixed; z-index: 40; top: calc(var(--window-chrome-height) + 12px); right: 16px; display: flex; align-items: center; gap: 16px; max-width: min(520px, calc(100vw - 32px)); padding: 12px 14px; border: 1px solid #efc9ae; border-radius: 12px; background: #fffaf5; box-shadow: 0 8px 24px rgb(100 49 26 / 16%); } .app-update-notice > div { display: grid; gap: 3px; min-width: 0; } .app-update-notice strong { color: #4a220f; font-size: 13px; } .app-update-notice span, .app-update-notice p { margin: 0; color: #8d6a58; font-size: 11px; } .app-update-notice p { max-width: 320px; max-height: 120px; overflow-y: auto; overflow-wrap: anywhere; white-space: pre-wrap; } .app-update-notice button { flex: 0 0 auto; padding: 7px 12px; border: 0; border-radius: 8px; background: #c7653d; color: white; cursor: pointer; font-size: 12px; font-weight: 700; } .app-update-notice button:disabled { cursor: wait; opacity: 0.65; } .app-update-notice .app-update-close { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; padding: 0; border: 0; border-radius: 6px; background: transparent; color: #8d6a58; cursor: pointer; } .app-update-notice .app-update-close:hover { background: rgb(199 101 61 / 12%); color: #4a220f; } .app-update-notice .app-update-close:disabled { cursor: wait; opacity: 0.5; } .app-update-overlay { position: fixed; z-index: 260; inset: 0; display: grid; padding: 24px; background: rgb(35 20 12 / 48%); place-items: center; pointer-events: auto; } .app-update-progress-dialog { display: grid; width: min(420px, calc(100vw - 48px)); gap: 12px; padding: 28px; border: 1px solid #efc9ae; border-radius: 18px; background: #fffaf5; box-shadow: 0 20px 60px rgb(38 18 8 / 28%); color: #4a220f; text-align: center; } .app-update-progress-icon { display: grid; width: 52px; height: 52px; margin: 0 auto; border-radius: 16px; background: #f6dfd0; color: #c7653d; place-items: center; } .app-update-progress-icon .is-spinning { animation: app-update-spin 0.9s linear infinite; } @keyframes app-update-spin { to { transform: rotate(360deg); } } .app-update-progress-dialog h2, .app-update-progress-dialog p, .app-update-progress-dialog small { margin: 0; } .app-update-progress-dialog h2 { font-size: 18px; } .app-update-progress-dialog p, .app-update-progress-dialog small { color: #8d6a58; font-size: 12px; } .app-update-progress-track { height: 8px; overflow: hidden; border-radius: 99px; background: #f1ded2; } .app-update-progress-track span { display: block; height: 100%; border-radius: inherit; background: #c7653d; transition: width 180ms ease; } .app-update-progress-dialog button { justify-self: center; min-width: 96px; padding: 8px 16px; border: 0; border-radius: 8px; background: #c7653d; color: #fff; cursor: pointer; font-weight: 700; } .app-update-progress-actions { display: flex; justify-content: center; gap: 10px; } :root { /* 网页内自绘标题栏占用的顶部高度;portal 到 body 的固定弹层也要从它下方开始。 */ --window-chrome-height: 50px; } /* portal 到 body 的全屏固定弹层从标题栏下方开始,避免与自绘标题栏重叠。 */ .fixed.inset-0 { top: var(--window-chrome-height); } /* 桌面壳统一承载标题栏,让 Tauri 与浏览器预览共用同一表面。 */ .window-chrome { --window-chrome-height: 50px; --window-chrome-title-side-space: 300px; position: relative; display: block; width: 100%; height: 100dvh; min-height: 0; overflow: hidden; background: var(--platform-body-fill, #fffdf9); color: var(--platform-text-strong, #3d1f10); } .window-chrome__bar { position: absolute; top: 0; right: 0; left: 0; z-index: 30; display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; min-width: 0; height: var(--window-chrome-height); padding: 0; overflow: visible; border-bottom: 1px solid var(--platform-surface-border, #ead8cb); background: radial-gradient( circle at 16% -80%, rgb(255 255 255 / 88%), transparent 38% ), radial-gradient(circle at 72% 0%, rgb(237 190 151 / 20%), transparent 28%), var( --platform-desktop-topbar-fill, linear-gradient(180deg, #fffefa, #fbf1e9) ); box-shadow: 0 5px 18px rgb(112 57 30 / 7%); user-select: none; -webkit-app-region: drag; } .window-chrome__bar::after { position: absolute; right: 0; bottom: -1px; left: 0; height: 1px; background: linear-gradient( 90deg, transparent, rgb(199 101 61 / 22%), transparent ); content: ''; pointer-events: none; } .window-chrome__leading, .window-chrome__trailing, .window-chrome__controls, .window-chrome__brand, .window-chrome__wallet-slot { -webkit-app-region: no-drag; } .window-chrome__leading, .window-chrome__trailing { display: flex; align-items: center; min-width: 0; } .window-chrome__leading { grid-column: 1; position: relative; z-index: 1; justify-self: start; gap: 12px; padding-left: 12px; } .window-chrome__brand { display: inline-flex; align-items: center; flex: 0 0 auto; gap: 8px; min-width: 132px; color: var(--platform-text-strong, #3d1f10); } .window-chrome__brand-mark { display: grid; width: 32px; height: 32px; place-items: center; border: 1px solid rgb(199 101 61 / 20%); border-radius: 11px; background: linear-gradient(145deg, #fffaf2 5%, #f4d8c3 100%); box-shadow: 0 5px 12px rgb(182 98 63 / 14%), inset 0 1px 0 rgb(255 255 255 / 90%); } .window-chrome__brand-mark img { width: 27px; height: 27px; object-fit: contain; filter: drop-shadow(0 3px 4px rgb(139 69 39 / 14%)); } .window-chrome__brand-copy { display: grid; gap: 1px; line-height: 1; } .window-chrome__brand-copy strong { color: var(--platform-brand-logo-title, #4a220f); font-size: 14px; font-weight: 800; letter-spacing: 0.02em; } .window-chrome__brand-copy span { color: var(--platform-brand-logo-subtitle, #c7653d); font-size: 9px; font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; } .window-chrome__drag-region { position: absolute; z-index: 0; inset: 0; display: grid; place-items: center; width: auto; min-width: 0; color: var(--platform-text-muted, #a38f80); font-size: 11px; font-weight: 650; letter-spacing: 0.04em; cursor: default; padding-inline: var(--window-chrome-title-side-space); -webkit-app-region: drag; } .window-chrome__title-wrap { position: relative; display: flex; align-items: center; justify-content: center; min-width: 0; max-width: min(42vw, 460px, 100%); } .window-chrome__title { display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .window-chrome__workspace-dot { position: absolute; top: 50%; right: calc(100% + 9px); width: 6px; height: 6px; margin: 0; border-radius: 50%; background: var(--platform-accent, #c7653d); box-shadow: 0 0 0 4px rgb(199 101 61 / 10%); transform: translateY(-50%); } .launcher-runs-titlebar { position: relative; display: inline-flex; min-width: 0; max-width: min(42vw, 460px, 100%); -webkit-app-region: no-drag; } .launcher-runs-titlebar-trigger { display: inline-flex; align-items: center; min-width: 0; max-width: 100%; gap: 7px; padding: 6px 9px; border: 1px solid transparent; border-radius: 8px; background: transparent; color: var(--platform-text-base, #6f5848); font: inherit; cursor: pointer; transition: background 150ms ease, border-color 150ms ease, color 150ms ease; } .launcher-runs-titlebar-trigger:hover, .launcher-runs-titlebar-trigger:focus-visible, .launcher-runs-titlebar-trigger[aria-expanded='true'] { border-color: var(--platform-surface-border, #ead8cb); background: rgb(255 255 255 / 72%); color: var(--platform-text-strong, #3d1f10); outline: none; } .launcher-runs-titlebar-name { min-width: 0; overflow: hidden; font-size: 11px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; } .launcher-runs-titlebar-count { display: inline-grid; min-width: 18px; height: 18px; padding: 0 4px; place-items: center; border-radius: 9px; background: rgb(199 101 61 / 12%); color: var(--platform-accent, #c7653d); font-size: 10px; font-weight: 750; } .launcher-runs-titlebar-chevron { flex: 0 0 auto; color: var(--platform-text-muted, #a38f80); transition: transform 150ms ease; } .launcher-runs-titlebar-chevron.is-open { transform: rotate(180deg); } .launcher-runs-titlebar-menu { position: absolute; top: calc(100% + 8px); left: 50%; z-index: 40; width: min(360px, calc(100vw - 32px)); padding: 10px; border: 1px solid var(--platform-subpanel-border, #ead8cb); border-radius: 12px; background: var(--platform-subpanel-fill, #fffaf5); box-shadow: 0 14px 36px rgb(31 24 16 / 18%); color: var(--platform-text-base, #6f5848); transform: translateX(-50%); } .launcher-runs-titlebar-menu-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 2px 5px 8px; border-bottom: 1px solid var(--platform-surface-border, #ead8cb); color: var(--platform-text-strong, #3d1f10); font-size: 11px; } .launcher-runs-titlebar-menu-header span { color: var(--platform-text-muted, #a38f80); font-size: 10px; } .launcher-runs-titlebar-list { display: grid; gap: 3px; max-height: min(52vh, 360px); margin: 7px 0 0; padding: 0; overflow-y: auto; list-style: none; } .launcher-runs-titlebar-item { display: grid; width: 100%; gap: 3px; padding: 8px 9px; border: 0; border-radius: 8px; background: transparent; color: inherit; text-align: left; cursor: pointer; } .launcher-runs-titlebar-item:hover, .launcher-runs-titlebar-item:focus-visible, .launcher-runs-titlebar-item[aria-current='true'] { background: rgb(199 101 61 / 10%); outline: none; } .launcher-runs-titlebar-item:disabled { cursor: default; } .launcher-runs-titlebar-item-name { overflow: hidden; color: var(--platform-text-strong, #3d1f10); font-size: 12px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; } .launcher-runs-titlebar-item-meta, .launcher-runs-titlebar--error { color: var(--platform-text-muted, #a38f80); font-size: 10px; } .launcher-runs-titlebar--error { display: inline-flex; align-items: center; padding: 5px 8px; border-radius: 7px; background: rgb(199 101 61 / 8%); } .window-chrome__trailing { grid-column: 3; position: relative; z-index: 1; justify-self: end; flex: 0 0 auto; gap: 12px; padding-left: 8px; } .window-chrome__wallet-slot { display: flex; align-items: center; min-width: 0; } .window-chrome__wallet-slot > .launcher-account-bar { position: static; top: auto; right: auto; } .window-chrome__controls { display: flex; align-self: stretch; } .window-chrome__control { display: grid; width: 44px; height: var(--window-chrome-height); place-items: center; border: 0; border-radius: 0; background: transparent; color: var(--platform-text-base, #6f5848); cursor: pointer; transition: background 150ms ease, color 150ms ease; } .window-chrome__control:hover, .window-chrome__control:focus-visible { background: rgb(204 117 76 / 12%); color: var(--platform-text-strong, #3d1f10); outline: none; } .window-chrome__control--close:hover, .window-chrome__control--close:focus-visible { background: #c7653d; color: #fffaf5; } .window-chrome__content { position: relative; z-index: 0; box-sizing: border-box; height: 100%; padding-top: var(--window-chrome-height); min-width: 0; min-height: 0; overflow: hidden; } .window-chrome__content > .client-auth-shell, .window-chrome__content > .launcher-shell, .window-chrome__content > .app-shell { height: 100%; min-height: 0; } .window-chrome__content > .launcher-shell > aside { height: 100%; min-height: 0; } .window-chrome__content > .launcher-shell .launcher-main, .window-chrome__content > .app-shell.app-shell--dev { min-height: 0; } .window-chrome__content > .app-shell.app-shell--user .chat-pane { min-height: calc(100% - 48px); } .window-chrome__content .launcher-projects-page, .window-chrome__content .launcher-main:has(.launcher-projects-page) { height: 100%; } .window-chrome__content > .launcher-shell .launcher-main { height: 100%; min-height: 0; padding-bottom: 0; } .window-chrome__content > .launcher-shell .launcher-main > .platform-theme { height: 100%; min-height: 0; overflow: auto; } .window-chrome__content .launcher-main:has(.game-project-workbench) { display: flex; flex-direction: column; height: 100%; min-height: 0; padding-bottom: 0; } .window-chrome__content .game-project-workbench { flex: 1 1 auto; height: auto; min-height: 0; } .window-chrome__content .game-workbench-layout { height: 100%; min-height: 0; } @media (max-width: 760px) { :root { --window-chrome-height: 46px; } .window-chrome { --window-chrome-height: 46px; } .window-chrome__bar { padding: 0; } .window-chrome__brand { min-width: 38px; } .window-chrome__brand-copy, .window-chrome__title { display: none; } .window-chrome__drag-region { display: grid; padding-inline: 48px; } .window-chrome__leading { gap: 5px; padding-left: 8px; } .window-chrome__trailing { padding-left: 2px; } .window-chrome__control { width: 40px; } } button, input, select, textarea { font: inherit; } @keyframes ui-editor-status-attention-arrive { 0%, 100% { transform: scale(1); } 16%, 50% { transform: scale(1.012); } 32%, 68% { transform: scale(0.996); } } @keyframes ui-editor-status-attention-ring { 0%, 100% { opacity: 0; transform: scale(0.96); } 16%, 48% { opacity: 0.78; transform: scale(1.01); } 32%, 68% { opacity: 0.2; transform: scale(1.025); } } @keyframes ui-editor-status-attention-breathe { 0%, 100% { opacity: 0.32; transform: scale(0.995); } 50% { opacity: 0.7; transform: scale(1.018); } } .ui-editor-status-attention { position: relative; z-index: 0; isolation: isolate; border: 2px solid rgb(var(--ui-editor-status-attention-rgb) / 88%); background: rgb(var(--ui-editor-status-attention-rgb) / 8%); box-shadow: 0 0 0 4px rgb(var(--ui-editor-status-attention-rgb) / 16%), 0 8px 20px rgb(var(--ui-editor-status-attention-rgb) / 12%); animation: ui-editor-status-attention-arrive 820ms cubic-bezier(0.2, 0.8, 0.2, 1); } .ui-editor-status-attention::after { position: absolute; z-index: -1; inset: -6px; border: 2px solid rgb(var(--ui-editor-status-attention-rgb) / 85%); border-radius: 12px; content: ''; pointer-events: none; animation: ui-editor-status-attention-ring 820ms ease-out, ui-editor-status-attention-breathe 1.8s ease-in-out 820ms infinite; } .ui-editor-status-attention--review { --ui-editor-status-attention-rgb: 245 158 11; } .ui-editor-status-attention--blocked { --ui-editor-status-attention-rgb: 239 68 68; } @media (prefers-reduced-motion: reduce) { .ui-editor-status-attention, .ui-editor-status-attention::after { animation: none; } .ui-editor-status-attention::after { opacity: 0.7; transform: scale(1.01); } } .client-auth-shell { display: grid; min-height: 100vh; padding: 24px; overflow-x: hidden; overflow-y: auto; background: var(--platform-body-fill); color: var(--platform-text-strong); place-items: center; } .client-auth-panel { position: relative; display: grid; width: min(360px, 100%); gap: 16px; padding: 28px; overflow: hidden; border: 1px solid var(--platform-surface-border); border-radius: 24px; background: var(--platform-panel-fill); box-shadow: var(--platform-panel-shadow); } .client-auth-panel::before { position: absolute; top: -94px; right: -76px; width: 204px; height: 204px; border-radius: 50%; background: radial-gradient( circle, var(--platform-hero-glow-b), transparent 68% ); content: ''; pointer-events: none; } .client-auth-logo { position: relative; z-index: 1; width: 56px; height: 56px; object-fit: contain; filter: drop-shadow(0 9px 15px rgb(182 98 63 / 18%)); } .client-auth-panel h1 { position: relative; z-index: 1; margin: 0; font-size: 24px; letter-spacing: 0; } .client-auth-panel p { position: relative; z-index: 1; margin: 6px 0 0; color: var(--platform-text-soft); font-size: 13px; } .client-auth-panel label { position: relative; z-index: 1; display: grid; gap: 7px; color: var(--platform-text-base); font-size: 13px; font-weight: 700; } .client-auth-panel input { height: 38px; min-width: 0; padding: 0 11px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--platform-input-fill); color: var(--platform-text-strong); font: inherit; transition: border-color 160ms ease, box-shadow 160ms ease, background 160ms ease; } .client-auth-panel select { height: 38px; min-width: 0; padding: 0 11px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--platform-input-fill); color: var(--platform-text-strong); font: inherit; transition: border-color 160ms ease, box-shadow 160ms ease, background 160ms ease; } .client-auth-panel select:focus { border-color: var(--platform-surface-hover-border); outline: 2px solid var(--platform-input-focus-ring); background: var(--platform-input-fill-focus); } .client-auth-panel input:focus { border-color: var(--platform-surface-hover-border); outline: 2px solid var(--platform-input-focus-ring); background: var(--platform-input-fill-focus); } .client-auth-panel button { position: relative; z-index: 1; height: 38px; border: 1px solid var(--platform-button-primary-border); border-radius: 12px; background: var(--platform-button-primary-fill); box-shadow: var(--platform-profile-action-shadow); color: var(--platform-button-primary-text); font-weight: 700; cursor: pointer; transition: transform 160ms ease, box-shadow 160ms ease, filter 160ms ease; } .client-auth-panel button:not(:disabled):hover { filter: brightness(1.04); transform: translateY(-1px); } .client-auth-panel button:not(:disabled):active { translate: 0 0; } .client-auth-panel button:disabled { cursor: default; opacity: 0.62; } .client-auth-tabs { position: relative; z-index: 1; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; padding: 4px; border: 1px solid var(--platform-subpanel-border); border-radius: 14px; background: var(--platform-subpanel-fill); } .client-auth-tabs button { border-color: transparent; background: transparent; box-shadow: none; color: var(--platform-text-soft); } .client-auth-tabs button.is-active { border-color: var(--platform-button-primary-border); background: var(--platform-button-primary-fill); box-shadow: 0 8px 18px rgb(182 98 63 / 18%); color: var(--platform-button-primary-text); } .client-auth-code-row { display: grid; grid-template-columns: minmax(0, 1fr) 104px; gap: 10px; align-items: end; } .client-auth-code-row button { padding: 0 10px; white-space: nowrap; } .client-auth-status { min-height: 18px; overflow-wrap: anywhere; } @media (max-width: 480px) { .client-auth-shell { padding: 16px; } .client-auth-panel { padding: 24px; border-radius: 20px; } } .launcher-shell { --launcher-sidebar-width: 64px; display: grid; grid-template-columns: var(--launcher-sidebar-width) minmax(0, 1fr); min-height: 100vh; background: #fff; color: #171717; } .launcher-shell.platform-theme { background: var(--platform-body-fill); color: var(--platform-text-strong); } .launcher-shell.platform-theme .launcher-main { background: var(--platform-body-fill); } .launcher-shell.platform-theme .launcher-promo { background: var(--platform-warm-bg); color: var(--platform-warm-text); } .launcher-shell.platform-theme .launcher-promo button { color: var(--platform-warm-text); } .launcher-shell.platform-theme .launcher-countdown { border-color: var(--platform-subpanel-border); background: var(--platform-subpanel-fill); color: var(--platform-text-strong); } .launcher-promo button { border: 0; cursor: pointer; } .launcher-main { position: relative; display: grid; grid-template-columns: minmax(0, 1fr); grid-template-rows: auto auto auto; align-content: start; min-width: 0; min-height: 100vh; padding: 0 0 42px; overflow: hidden; } .launcher-runs-panel { position: absolute; top: 16px; left: 24px; z-index: 3; width: min(280px, calc(100% - 260px)); padding: 10px 12px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: color-mix(in srgb, var(--platform-subpanel-fill) 94%, transparent); box-shadow: 0 8px 24px rgb(31 24 16 / 8%); } .launcher-runs-panel-header { display: flex; align-items: center; gap: 7px; color: var(--platform-text-strong); font-size: 12px; } .launcher-runs-panel-dot { width: 7px; height: 7px; border-radius: 50%; background: #4d9f54; box-shadow: 0 0 0 3px rgb(77 159 84 / 14%); } .launcher-runs-panel-list { display: grid; gap: 4px; margin: 7px 0 0; padding: 0; list-style: none; } .launcher-runs-panel-item { display: grid; width: 100%; gap: 2px; padding: 6px 7px; border: 0; border-radius: 8px; background: transparent; color: inherit; text-align: left; cursor: pointer; } .launcher-runs-panel-item:hover, .launcher-runs-panel-item[aria-current='true'] { background: rgb(255 255 255 / 72%); } .launcher-runs-panel-item:disabled { cursor: default; } .launcher-runs-panel-name { overflow: hidden; color: var(--platform-text-strong); font-size: 12px; font-weight: 650; text-overflow: ellipsis; white-space: nowrap; } .launcher-runs-panel-meta, .launcher-runs-panel-note { color: var(--platform-text-muted); font-size: 11px; } .launcher-promo { display: flex; align-items: center; justify-content: center; gap: 6px; min-height: 32px; padding: 0 220px 0 24px; background: #dfff4b; color: #111; font-size: 13px; white-space: nowrap; } .launcher-promo strong { font-weight: 700; } .launcher-promo button { padding: 0; background: transparent; color: #111; font-weight: 700; text-decoration: underline; } .launcher-countdown { display: grid; min-width: 18px; height: 20px; padding: 0 5px; border-radius: 7px; background: #fff; place-items: center; } .launcher-account-bar { position: absolute; top: 16px; right: 22px; display: flex; align-items: center; gap: 0; z-index: 2; } .launcher-main-with-promo .launcher-account-bar { top: 44px; } .launcher-redeem-modal { width: min(360px, calc(100vw - 32px)); padding: 0; border: 1px solid var(--platform-subpanel-border); border-radius: 18px; overflow: hidden; } .launcher-redeem-modal-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 18px; border-bottom: 1px solid var(--platform-surface-border); font-size: 15px; } .launcher-redeem-modal-header button { border: 0; background: transparent; color: var(--platform-text-muted); font-size: 20px; cursor: pointer; } .launcher-redeem-modal-form { display: grid; gap: 12px; padding: 18px; } .launcher-redeem-modal-form input { width: 100%; box-sizing: border-box; padding: 11px 12px; border: 1px solid var(--platform-subpanel-border); border-radius: 10px; background: var(--platform-body-fill); color: var(--platform-text-strong); } .launcher-redeem-modal-form p { margin: 0; font-size: 12px; } .launcher-redeem-modal-form p[role='alert'] { color: #b5432e; } .launcher-redeem-modal-form p[role='status'] { color: #34804b; } .launcher-redeem-modal-form > button { padding: 11px 14px; border: 0; border-radius: 10px; background: var(--platform-accent, #c7653d); color: #fff; font-weight: 700; cursor: pointer; } .launcher-redeem-modal-form > button:disabled { cursor: default; opacity: 0.5; } .launcher-project-list-actions { display: flex; align-items: center; gap: 10px; } .launcher-project-create > button { display: grid; border-style: dashed; color: #777; place-items: center; } .launcher-project-thumb { display: grid; place-items: center; } .launcher-project-thumb span { display: grid; width: 54px; height: 54px; border-radius: 14px; background: #fff; color: #f26d2d; font-size: 18px; font-weight: 800; place-items: center; box-shadow: 0 8px 22px rgb(242 109 45 / 16%); } .launcher-page { display: grid; gap: 22px; width: min(1054px, calc(100vw - 122px)); margin: 0 auto; padding: 118px 0 0; } .launcher-projects-page { display: flex; flex-direction: column; gap: 18px; width: calc(100vw - var(--launcher-sidebar-width)); max-width: none; flex: 1 1 auto; height: 100dvh; min-height: 0; margin: 0; padding: 92px 28px 24px; overflow: hidden; } .launcher-main:has(.launcher-projects-page) { display: flex; flex-direction: column; height: 100dvh; min-height: 0; padding-bottom: 0; } .launcher-page header { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; } .launcher-page h1 { margin: 0; color: #111827; font-size: 28px; letter-spacing: 0; } .launcher-page p { margin: 8px 0 0; color: #8b8b8b; font-size: 13px; } .launcher-project-runtime-summary { display: block; margin-top: 5px; color: #687386; font-size: 11px; overflow-wrap: anywhere; } .launcher-page-actions { display: flex; flex-wrap: wrap; gap: 8px; } .launcher-page-actions button, .launcher-page .launcher-project-list-actions button, .launcher-empty-projects button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 36px; padding: 0 12px; border: 1px solid var(--platform-surface-border); border-radius: 9px; background: var(--platform-button-secondary-fill); color: var(--platform-button-secondary-text); font-size: 12px; font-weight: 700; white-space: nowrap; cursor: pointer; } .launcher-page .launcher-project-list-actions button:disabled, .launcher-empty-projects button:disabled { cursor: not-allowed; opacity: 0.55; } .launcher-projects-page button:focus-visible, .launcher-project-search input:focus-visible { outline: 3px solid var(--platform-warm-text); outline-offset: 2px; } .launcher-projects-toolbar { display: grid; grid-template-columns: minmax(160px, 1fr) auto; align-items: center; gap: 24px; } .launcher-projects-heading { min-width: 0; } .launcher-projects-controls { display: flex; align-items: center; gap: 10px; } .launcher-project-search { display: flex; align-items: center; width: clamp(260px, 28vw, 390px); height: 38px; gap: 8px; padding: 0 10px; border: 1px solid var(--platform-surface-border); border-radius: 9px; background: var(--platform-input-fill); color: var(--platform-text-soft); } .launcher-project-search:focus-within { border-color: var(--platform-surface-hover-border); box-shadow: 0 0 0 3px var(--platform-input-focus-ring); } .launcher-project-search input { min-width: 0; flex: 1; border: 0; outline: 0; background: transparent; color: var(--platform-text-strong); font: inherit; font-size: 13px; } .launcher-project-search button { display: grid; width: 24px; height: 24px; padding: 0; border: 0; border-radius: 6px; background: transparent; color: var(--platform-text-soft); cursor: pointer; place-items: center; } .launcher-project-actions { display: flex; align-items: center; gap: 8px; } .launcher-project-actions button { display: inline-flex; align-items: center; justify-content: center; min-height: 38px; gap: 7px; padding: 0 14px; border: 1px solid var(--platform-surface-border); border-radius: 9px; font-size: 12px; font-weight: 800; white-space: nowrap; cursor: pointer; } .launcher-project-actions button:disabled { cursor: not-allowed; opacity: 0.55; } .launcher-project-actions .launcher-project-open-action { background: var(--platform-button-secondary-fill); color: var(--platform-button-secondary-text); } .launcher-project-actions .launcher-project-create-action { border-color: var(--platform-button-primary-border); background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); } .launcher-project-page-status { min-height: 18px; } .launcher-project-list-shell { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; overflow: hidden; border: 1px solid var(--platform-surface-border); border-radius: 12px; background: var(--platform-subpanel-fill); box-shadow: var(--platform-panel-shadow); } .launcher-project-table-header, .launcher-project-table article { display: grid; grid-template-columns: minmax(360px, 1fr) minmax(120px, 160px) minmax(150px, 190px) 104px; align-items: center; min-width: 0; } .launcher-project-table-header { height: 42px; flex-shrink: 0; padding: 0 14px; border-bottom: 1px solid var(--platform-surface-border); background: color-mix( in srgb, var(--platform-subpanel-fill) 82%, var(--platform-warm-bg) ); color: var(--platform-text-soft); font-size: 11px; font-weight: 800; letter-spacing: 0.03em; } .launcher-project-table-header span:last-child { text-align: center; } .launcher-project-table { display: grid; align-content: start; flex: 1 1 auto; min-height: 0; overflow-y: auto; } .launcher-project-table article { min-height: 66px; padding: 0 14px; border-bottom: 1px solid var(--platform-surface-border); background: var(--platform-subpanel-fill); transition: background 120ms ease; } .launcher-project-table article:last-child { border-bottom: 0; } .launcher-project-table article:has(.launcher-project-row-main:not(:disabled)):hover { background: var(--platform-nav-item-hover-fill); } .launcher-project-table article > .launcher-project-row-main { display: flex; align-items: center; justify-content: flex-start; width: 100%; height: 100%; min-width: 0; gap: 12px; padding: 0; border: 0; background: transparent; color: inherit; text-align: left; cursor: pointer; } .launcher-project-table article > .launcher-project-rename { display: flex; align-items: center; justify-content: flex-start; width: 100%; height: 100%; min-width: 0; gap: 12px; } .launcher-project-rename label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; } .launcher-project-rename input { width: min(100%, 320px); min-width: 0; min-height: 30px; padding: 0 8px; border: 1px solid var(--platform-surface-border); border-radius: 7px; color: var(--platform-text-strong); font-size: 13px; font-weight: 700; } .launcher-project-rename input:focus-visible { border-color: var(--platform-warm-text); outline: 2px solid transparent; } .launcher-project-rename-error { color: #a64735 !important; } .launcher-project-rename-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 5px; justify-self: end; width: 100%; } .launcher-project-rename-actions button { display: inline-flex; align-items: center; justify-content: center; min-height: 28px; gap: 3px; padding: 0 7px; border-radius: 7px; font-size: 11px; font-weight: 700; } .launcher-project-rename-actions button:first-child { border: 0; background: var(--platform-warm-text); color: #fff; } .launcher-project-rename-actions button:last-child { border: 1px solid var(--platform-surface-border); background: transparent; color: var(--platform-text-strong); } .launcher-project-table article > .launcher-project-row-main:disabled { cursor: not-allowed; opacity: 0.62; } .launcher-project-kind-icon { display: grid; width: 34px; height: 34px; flex: 0 0 auto; border-radius: 9px; background: var(--platform-warm-bg); color: var(--platform-warm-text); place-items: center; } .launcher-project-name-cell { display: grid; min-width: 0; gap: 4px; } .launcher-project-table article strong { display: block; overflow: hidden; color: var(--platform-text-strong); font-size: 13px; text-overflow: ellipsis; white-space: nowrap; } .launcher-project-table article small { display: block; width: 100%; min-width: 0; max-width: 100%; margin: 0; color: var(--platform-text-soft); font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .launcher-project-kind-cell { overflow: hidden; padding-right: 16px; color: var(--platform-text-base); font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } .launcher-project-status { display: inline-flex; align-items: center; justify-self: start; max-width: calc(100% - 12px); min-height: 24px; gap: 5px; overflow: hidden; padding: 0 8px; border-radius: 999px; font-size: 11px; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; } .launcher-project-status-ready { background: color-mix(in srgb, #2d9d62 12%, transparent); color: #237b4d; } .launcher-project-status-checking { background: color-mix(in srgb, var(--platform-warm-text) 12%, transparent); color: var(--platform-warm-text); } .launcher-project-status-warning { background: color-mix(in srgb, #d15f45 12%, transparent); color: #a64735; } .launcher-project-more { position: relative; display: grid; justify-self: center; } .launcher-project-more-trigger { display: grid; width: 34px; height: 34px; padding: 0; border: 0; border-radius: 8px; background: transparent; color: var(--platform-text-soft); cursor: pointer; place-items: center; } .launcher-project-more-trigger:hover, .launcher-project-more-trigger[aria-expanded='true'] { background: var(--platform-nav-item-hover-fill); color: var(--platform-text-strong); } .launcher-project-more-menu { position: absolute; top: 38px; right: 0; z-index: 20; display: grid; width: 164px; gap: 4px; padding: 6px; border: 1px solid var(--platform-surface-border); border-radius: 10px; background: var(--platform-subpanel-fill); box-shadow: 0 16px 34px rgb(75 47 32 / 18%); } .launcher-project-more-menu-drop-up { top: auto; bottom: 38px; } .launcher-project-more-menu button { display: flex; align-items: center; justify-content: flex-start; min-height: 34px; gap: 8px; padding: 0 9px; border: 0; border-radius: 7px; background: transparent; color: var(--platform-text-strong); font-size: 12px; font-weight: 700; cursor: pointer; } .launcher-project-more-menu button:hover { background: var(--platform-nav-item-hover-fill); } .launcher-project-more-menu button:disabled { cursor: not-allowed; opacity: 0.45; } .launcher-project-more-menu .launcher-project-remove-action { color: #a64735; } .launcher-empty-projects { display: grid; justify-items: center; gap: 12px; min-height: 260px; padding: 48px; color: var(--platform-text-soft); } .launcher-empty-projects strong { color: #111827; font-size: 15px; } .launcher-help-cards { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; } .launcher-help-cards article { display: grid; min-height: 118px; padding: 18px; border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; color: #111827; font-size: 14px; font-weight: 700; align-content: end; } .launcher-agent-chat-page { padding-top: 92px; } .launcher-agent-chat-page > header .launcher-project-list-actions button { height: 34px; padding: 0 12px; border: 1px solid #d8dde5; border-radius: 6px; background: #fff; color: #111827; font-size: 12px; white-space: nowrap; } .launcher-agent-chat-page > header .launcher-project-list-actions button:last-child { border-color: #111827; background: #111827; color: #fff; } .launcher-agent-chat-layout { display: grid; grid-template-columns: minmax(220px, 0.3fr) minmax(0, 1fr); align-items: start; gap: 12px; width: 100%; min-width: 0; min-height: min(620px, calc(100vh - 168px)); } .launcher-agent-chat-sidebar, .launcher-agent-chat-main { min-width: 0; border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; } .launcher-agent-chat-sidebar { display: grid; align-content: start; gap: 12px; padding: 12px; } .launcher-agent-chat-project { display: grid; gap: 10px; } .launcher-agent-chat-project label { display: grid; gap: 6px; color: #6b7280; font-size: 12px; } .launcher-agent-chat-project input { min-width: 0; height: 34px; padding: 0 10px; border: 1px solid #d8dde5; border-radius: 8px; color: #111827; background: #fff; } .launcher-agent-picker { display: grid; gap: 8px; max-height: 450px; overflow: auto; } .launcher-agent-picker button { display: grid; justify-items: start; gap: 5px; min-width: 0; padding: 10px; border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; color: #111827; text-align: left; } .launcher-agent-picker .launcher-agent-active { border-color: #8b5cf6; background: #f8f2ff; } .launcher-agent-picker strong, .launcher-agent-picker span, .launcher-agent-picker small { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .launcher-agent-picker strong { font-size: 13px; } .launcher-agent-picker span, .launcher-agent-picker small { color: #6b7280; font-size: 11px; } .launcher-agent-chat-main { display: grid; grid-template-rows: auto auto auto auto clamp(260px, 40vh, 380px) auto; align-content: start; width: 100%; overflow: visible; } .launcher-agent-chat-main > header { display: flex; justify-content: space-between; gap: 12px; padding: 14px; border-bottom: 1px solid #e5e7eb; } .launcher-agent-chat-main h2, .launcher-agent-chat-main p { margin: 0; } .launcher-agent-chat-main h2 { color: #111827; font-size: 16px; } .launcher-agent-chat-main p, .launcher-agent-chat-main small { color: #6b7280; font-size: 12px; } .launcher-agent-session-bar { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 8px; min-width: 0; padding: 8px 12px; border-bottom: 1px solid #e5e7eb; background: #f8fafc; } .launcher-agent-session-actions, .launcher-agent-session-list { display: flex; align-items: center; gap: 6px; } .launcher-agent-session-actions button { display: grid; width: 30px; height: 30px; padding: 0; border: 1px solid #d8dde5; border-radius: 6px; background: #fff; color: #374151; place-items: center; } .launcher-agent-session-list { min-width: 0; overflow-x: auto; } .launcher-agent-session-list button { display: flex; flex: 0 0 auto; align-items: center; gap: 7px; max-width: 190px; height: 30px; padding: 0 9px; border: 1px solid #d8dde5; border-radius: 6px; background: #fff; color: #374151; } .launcher-agent-session-list button span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .launcher-agent-session-list button small { flex: 0 0 auto; } .launcher-agent-session-list .launcher-agent-session-active { border-color: #7c3aed; background: #f5f0ff; color: #5b21b6; } .launcher-agent-session-list .launcher-agent-session-archived { border-style: dashed; color: #6b7280; } .launcher-agent-session-status { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .launcher-agent-chat-messages { grid-row: 5; display: grid; align-content: start; gap: 10px; height: clamp(260px, 40vh, 380px); min-height: 260px; max-height: 380px; padding: 14px; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; } .launcher-agent-chat-messages .message { max-width: min(720px, 88%); margin: 0; padding: 9px 12px; border-radius: 14px; line-height: 1.55; } .launcher-agent-chat-messages .message--user { justify-self: end; border: 1px solid #d8c4a8; border-radius: 14px 14px 4px; background: #fff7ed; color: #8a4b08; } .launcher-agent-chat-waiting { position: sticky; bottom: 0; display: flex; align-items: center; gap: 9px; width: fit-content; max-width: 100%; padding: 9px 11px; border: 1px solid #d8dde5; border-radius: 8px; background: #f8fafc; box-shadow: 0 4px 12px rgb(15 23 42 / 8%); color: #374151; } .launcher-agent-chat-waiting > span { width: 14px; height: 14px; flex: 0 0 auto; border: 2px solid #cbd5e1; border-top-color: #111827; border-radius: 50%; animation: launcher-agent-chat-spin 0.8s linear infinite; } .launcher-agent-chat-waiting strong { display: block; min-width: 0; font-size: 12px; overflow-wrap: anywhere; } .launcher-agent-chat-waiting small { display: block; margin-top: 2px; color: #6b7280; font-size: 11px; } @keyframes launcher-agent-chat-spin { to { transform: rotate(360deg); } } @media (prefers-reduced-motion: reduce) { .launcher-agent-chat-waiting > span { animation: none; } } .launcher-agent-chat-composer { grid-row: 6; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 8px; padding: 12px; border-top: 1px solid #e5e7eb; } .launcher-agent-chat-composer input { min-width: 0; height: 36px; padding: 0 12px; border: 1px solid #d8dde5; border-radius: 8px; color: #111827; background: #fff; } .launcher-agent-chat-composer button { height: 36px; padding: 0 14px; border: 0; border-radius: 8px; background: #111827; color: #fff; } .launcher-agent-chat-mode { display: grid; grid-template-columns: repeat(3, auto); gap: 2px; padding: 2px; border: 1px solid #d8dde5; border-radius: 8px; background: #f3f4f6; } .launcher-agent-chat-mode button { height: 30px; padding: 0 9px; border-radius: 6px; background: transparent; color: #6b7280; font-size: 12px; } .launcher-agent-chat-mode button.is-active { background: #fff; box-shadow: 0 1px 2px rgb(15 23 42 / 10%); color: #111827; } .launcher-agent-goal-composer-summary { min-width: 0; height: 36px; padding: 0 12px; border: 1px solid #d8dde5; border-radius: 8px; background: #f8fafc; color: #44536a; font-size: 12px; line-height: 34px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .launcher-agent-runtime-stack { display: grid; gap: 8px; } .launcher-agent-runtime-stack .agent-runtime-status { margin-top: 0; } .launcher-agent-goal-status { display: grid; gap: 7px; margin: 12px 14px 0; padding: 10px 12px; border: 1px solid #cbd5e1; border-radius: 8px; background: #fff; color: #111827; } .launcher-agent-goal-status header { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; } .launcher-agent-goal-status header > div:first-child, .launcher-agent-goal-copy { display: grid; min-width: 0; gap: 3px; } .launcher-agent-goal-status strong { font-size: 13px; } .launcher-agent-goal-status p, .launcher-agent-goal-status small { margin: 0; color: #647084; font-size: 12px; overflow-wrap: anywhere; } .launcher-agent-goal-actions { display: flex; flex: 0 0 auto; flex-wrap: wrap; justify-content: flex-end; gap: 6px; } .launcher-agent-goal-actions button { display: inline-flex; align-items: center; gap: 5px; height: 28px; padding: 0 9px; border: 1px solid #d8dde5; border-radius: 7px; background: #fff; color: #111827; font-size: 12px; } .launcher-agent-goal-actions button:disabled { background: #eef2f7; color: #9aa3b2; } .agent-llm-warning { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin: 12px 14px 0; padding: 10px 12px; border: 1px solid #f4c7a1; border-radius: 8px; background: #fff7ed; color: #8a3b12; font-size: 13px; } .agent-llm-warning strong { min-width: 0; font-weight: 700; overflow-wrap: anywhere; } .agent-llm-warning button { flex: 0 0 auto; height: 30px; padding: 0 10px; border: 1px solid #f4c7a1; border-radius: 7px; background: #fff; color: #8a3b12; } .agent-runtime-status { display: grid; gap: 6px; margin: 12px 14px 0; padding: 10px 12px; border: 1px solid #d8dde5; border-radius: 8px; background: #f8fafd; color: #111827; } .agent-conversation-panel > .agent-runtime-status { margin: 0; } .agent-runtime-status header { display: flex; align-items: center; justify-content: space-between; gap: 10px; } .agent-runtime-status .agent-runtime-status-header-actions { display: flex; align-items: center; gap: 8px; min-width: 0; } .agent-runtime-status-header-actions small { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .agent-runtime-status .agent-runtime-collapse-toggle { display: grid; width: 28px; height: 28px; flex: 0 0 auto; padding: 0; border: 1px solid #d8dde5; border-radius: 7px; background: #fff; color: #44536a; cursor: pointer; place-items: center; } .agent-runtime-status .agent-runtime-collapse-toggle:hover, .agent-runtime-status .agent-runtime-collapse-toggle:focus-visible { border-color: #aeb8c7; background: #f3f6fa; } .agent-runtime-status .agent-runtime-status-details { display: grid; gap: 6px; } .agent-runtime-status .agent-runtime-actions { display: flex; flex-wrap: wrap; gap: 8px; } .agent-runtime-status .agent-runtime-actions button { height: 28px; padding: 0 10px; border: 1px solid #d8dde5; border-radius: 7px; background: #fff; color: #111827; font-size: 12px; } .agent-runtime-status .agent-runtime-actions button:disabled { color: #9aa3b2; background: #eef2f7; } .agent-runtime-status strong { font-size: 13px; } .agent-runtime-status p, .agent-runtime-status ol { margin: 0; } .agent-runtime-status p, .agent-runtime-status li, .agent-runtime-status small { color: #647084; font-size: 12px; overflow-wrap: anywhere; } .agent-runtime-status ol { display: grid; gap: 3px; padding-left: 18px; } .agent-runtime-status div { display: grid; gap: 3px; } .agent-runtime-status .agent-runtime-event-toggle { justify-self: start; min-height: 24px; padding: 0; border: 0; background: transparent; color: #44536a; font-size: 12px; text-decoration: underline; text-underline-offset: 2px; } .agent-runtime-status .agent-runtime-user-input { display: grid; gap: 10px; padding-top: 10px; border-top: 1px solid #d8dde5; } .agent-runtime-user-input header small { color: #8a3b12; } .agent-runtime-user-input fieldset { display: grid; min-width: 0; gap: 8px; margin: 0; padding: 0; border: 0; } .agent-runtime-user-input legend { padding: 0; color: #111827; font-size: 12px; font-weight: 700; } .agent-runtime-user-input-options { grid-template-columns: repeat(auto-fit, minmax(168px, 1fr)); gap: 8px; } .agent-runtime-user-input-options button { display: grid; min-height: 56px; gap: 3px; padding: 8px 10px; border: 1px solid #cfd6e1; border-radius: 7px; background: #fff; color: #111827; text-align: left; cursor: pointer; } .agent-runtime-user-input-options button:hover, .agent-runtime-user-input-options button:focus-visible { border-color: #9da8b8; background: #f5f7fa; } .agent-runtime-user-input-options button[aria-pressed='true'] { border-color: #e46f2c; background: #fff7ed; box-shadow: inset 0 0 0 1px #e46f2c; } .agent-runtime-user-input-options button:disabled { cursor: default; opacity: 0.68; } .agent-runtime-user-input textarea { width: 100%; min-height: 58px; padding: 8px 10px; border: 1px solid #cfd6e1; border-radius: 7px; background: #fff; color: #111827; font: inherit; line-height: 1.45; resize: vertical; } .agent-runtime-user-input textarea:focus-visible { border-color: #e46f2c; outline: 2px solid rgb(228 111 44 / 16%); outline-offset: 1px; } .agent-runtime-user-input .agent-runtime-user-input-submit { justify-self: end; min-height: 32px; padding: 0 12px; border: 1px solid #cf5f22; border-radius: 7px; background: #e46f2c; color: #fff; font-size: 12px; font-weight: 700; } .agent-runtime-user-input .agent-runtime-user-input-submit:disabled { border-color: #cfd6e1; background: #e8ecf2; color: #8b95a5; } .agent-runtime-status .agent-runtime-user-input-missing { padding-top: 8px; border-top: 1px solid #d8dde5; color: #9a3412; } .launcher-project-development { padding-top: 92px; } .launcher-development-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; } .launcher-development-grid article, .launcher-development-canvas, .launcher-development-assets { border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; } .launcher-development-grid article { display: grid; align-content: start; gap: 8px; min-height: 108px; padding: 14px; } .launcher-development-grid span, .launcher-development-assets h2 { color: #6b7280; font-size: 12px; font-weight: 500; } .launcher-development-grid strong { min-width: 0; color: #111827; font-size: 15px; overflow-wrap: anywhere; } .launcher-development-grid small { color: #8b8b8b; font-size: 11px; } .launcher-development-canvas { display: grid; min-height: 300px; background: linear-gradient(#f3f4f6 1px, transparent 1px), linear-gradient(90deg, #f3f4f6 1px, transparent 1px), #fff; background-size: 24px 24px; place-items: center; } .launcher-development-canvas > div { display: grid; justify-items: center; gap: 8px; color: #6b7280; } .launcher-development-canvas strong { color: #111827; font-size: 16px; } .launcher-development-assets { display: grid; gap: 8px; padding: 14px; } .launcher-development-assets h2, .launcher-development-assets p { margin: 0; } .launcher-development-assets div { display: grid; grid-template-columns: minmax(0, 0.45fr) minmax(0, 1fr); gap: 12px; min-height: 32px; align-items: center; } .launcher-development-assets span, .launcher-development-assets small { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .launcher-development-assets span { color: #111827; font-size: 12px; } .launcher-development-assets small, .launcher-development-assets p { color: #6b7280; font-size: 12px; } .supervisor-chat-only-shell { display: grid; grid-template-rows: 64px minmax(0, 1fr) auto; width: 100%; height: 100vh; min-width: 0; min-height: 480px; overflow: hidden; background: #f5f6f8; color: #111827; } .supervisor-chat-only-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; min-width: 0; padding: 0 18px; border-bottom: 1px solid #e1e5eb; background: #fff; } .supervisor-chat-only-header > div, .supervisor-chat-only-header-status { display: flex; align-items: center; min-width: 0; } .supervisor-chat-only-header > div:first-child { gap: 10px; } .supervisor-chat-only-header strong { flex: 0 0 auto; font-size: 15px; } .supervisor-chat-only-header span { min-width: 0; overflow: hidden; color: #6b7280; font-size: 12px; text-overflow: ellipsis; white-space: nowrap; } .supervisor-chat-only-header-status { justify-content: flex-end; gap: 10px; max-width: 52%; } .supervisor-chat-only-header-status button { display: grid; width: 34px; height: 34px; flex: 0 0 auto; padding: 0; border: 1px solid #d8dde5; border-radius: 6px; background: #fff; color: #374151; place-items: center; } .supervisor-chat-only-message-list { display: flex; flex-direction: column; gap: 10px; min-width: 0; min-height: 0; padding: 22px clamp(16px, 4vw, 40px); border: 0; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; } .supervisor-chat-only-message-list .message { display: grid; gap: 5px; align-self: flex-start; width: fit-content; max-width: min(720px, 86%); margin: 0; padding: 10px 12px; border: 1px solid #dfe3e9; border-radius: 8px; background: #fff; color: #263142; line-height: 1.55; } .supervisor-chat-only-message-list .message--user { align-self: flex-end; border-color: #cfd6df; background: #e9edf2; color: #111827; } .supervisor-chat-only-message-list .supervisor-chat-only-stream { border-color: #b9d8c5; } .supervisor-chat-only-waiting { position: static; align-self: flex-start; } .supervisor-chat-only-runtime-controls { align-self: stretch; width: 100%; max-width: 720px; } .supervisor-chat-only-runtime-controls .agent-runtime-user-input { display: grid; gap: 10px; padding: 14px; border: 1px solid #d8dde5; border-radius: 8px; background: #f7f8fa; } .supervisor-chat-only-runtime-controls .agent-runtime-user-input header { display: grid; gap: 3px; } .supervisor-chat-only-runtime-controls .pending-command, .supervisor-chat-only-runtime-controls .agent-runtime-user-input { margin: 0; } .supervisor-chat-only-runtime-controls .pending-command { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; } .pending-command-actions { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; } .supervisor-chat-only-composer { display: grid; grid-template-columns: minmax(0, 1fr) 42px; align-items: end; gap: 10px; padding: 14px clamp(16px, 4vw, 40px) 18px; border-top: 1px solid #e1e5eb; background: #fff; } .supervisor-chat-only-composer textarea { width: 100%; min-width: 0; height: 74px; max-height: 74px; padding: 11px 12px; overflow-y: auto; resize: none; border: 1px solid #cfd6df; border-radius: 8px; background: #fff; color: #111827; font: inherit; line-height: 1.5; } .supervisor-chat-only-composer textarea:focus-visible { border-color: #6b7280; outline: 2px solid rgb(107 114 128 / 18%); outline-offset: 1px; } .supervisor-chat-only-composer button { display: grid; width: 42px; height: 42px; padding: 0; border: 0; border-radius: 8px; background: #111827; color: #fff; place-items: center; } .supervisor-chat-only-composer button:disabled, .supervisor-chat-only-composer textarea:disabled { cursor: not-allowed; opacity: 0.55; } .local-game-preview-frame { position: relative; width: 100%; height: 100%; min-width: 0; min-height: 0; overflow: hidden; background: #05070b; } .local-game-preview-frame iframe { position: absolute; top: 50%; left: 50%; display: block; max-width: none; max-height: none; border: 0; background: #fff; transform-origin: center; } @media (max-width: 600px) { .supervisor-chat-only-header { padding: 0 12px; } .supervisor-chat-only-header > div:first-child > span { display: none; } .supervisor-chat-only-header-status { max-width: 58%; } .supervisor-chat-only-message-list .message { max-width: 92%; } .supervisor-chat-only-composer { padding-right: 12px; padding-left: 12px; } } .project-supervisor-surface { display: grid; grid-template-columns: minmax(0, 1fr) minmax(220px, 280px); gap: 18px; min-width: 0; min-height: 560px; } .project-supervisor-conversation { display: grid; grid-template-rows: minmax(340px, 1fr) auto auto auto; align-content: stretch; gap: 10px; min-width: 0; } .project-supervisor-message-list { min-height: 340px; max-height: calc(100vh - 330px); border-radius: 8px; background: #fff; } .project-supervisor-process-card { position: relative; isolation: isolate; display: grid; gap: 9px; min-height: 78px; box-sizing: border-box; margin-top: 12px; padding: 12px 14px; border: 1px solid #b9d8c5; border-radius: 8px; background: #f1f8f3; overflow: hidden; } .project-supervisor-process-card::after { content: ''; position: absolute; z-index: -1; inset: 0 auto 0 -35%; width: 28%; background: linear-gradient( 90deg, transparent, rgb(255 255 255 / 28%), transparent ); pointer-events: none; opacity: 0; } .project-supervisor-process-card.is-active::after { opacity: 1; animation: project-supervisor-process-sweep 1.8s ease-in-out infinite; } @keyframes project-supervisor-process-sweep { from { transform: translateX(0); } to { transform: translateX(520%); } } .project-supervisor-process-card > header { display: flex; align-items: center; gap: 8px; } .project-supervisor-process-card > header > span { width: 8px; height: 8px; flex: 0 0 auto; border-radius: 50%; background: #2f855a; box-shadow: 0 0 0 4px rgb(47 133 90 / 14%); animation: project-supervisor-process-pulse 1.2s ease-in-out infinite; } .project-supervisor-process-elapsed { margin-left: auto !important; color: inherit; font-size: inherit; font-style: normal; font-weight: 500; white-space: nowrap; } @keyframes project-supervisor-process-pulse { 50% { opacity: 0.42; transform: scale(0.76); } } @media (prefers-reduced-motion: reduce) { .project-supervisor-process-card > header > span { animation: none; } .project-supervisor-process-card.is-active::after { animation: none; } } .project-supervisor-process-card p { margin: 0; color: inherit; font-size: inherit; line-height: 1.55; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; max-height: 1.55em; white-space: pre-wrap; overflow-wrap: anywhere; overflow: hidden; } .project-supervisor-process-card p.is-expanded { display: block; max-height: 180px; overflow: auto; scrollbar-color: rgb(47 111 75 / 58%) transparent; } .project-supervisor-process-card p.is-expanded::-webkit-scrollbar-track, .project-supervisor-process-card p.is-expanded::-webkit-scrollbar-corner { background: transparent; } .project-supervisor-process-detail { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 8px; } .project-supervisor-process-toggle { align-self: start; padding: 0; border: 0; background: transparent; color: inherit; font: inherit; font-size: 12px; cursor: pointer; white-space: nowrap; } .game-workbench-chat .project-supervisor-process-card { border-color: var(--platform-surface-border); background: var(--platform-warm-bg); } .project-supervisor-surface .agent-runtime-status { margin: 0; } .project-supervisor-surface .agent-runtime-status header, .project-supervisor-collaboration header { align-items: center; } .project-runtime-title { display: inline-flex; align-items: center; gap: 7px; min-width: 0; } .project-runtime-live-dot { width: 8px; height: 8px; flex: 0 0 auto; border-radius: 50%; background: #94a3b8; } .project-runtime-live-dot.is-running { background: #22a35a; box-shadow: 0 0 0 4px rgb(34 163 90 / 13%); animation: project-runtime-pulse 1.6s ease-in-out infinite; } .project-runtime-live-dot.is-waiting { background: #df8a16; box-shadow: 0 0 0 4px rgb(223 138 22 / 13%); } .project-runtime-live-dot.is-failed { background: #d64545; box-shadow: 0 0 0 4px rgb(214 69 69 / 13%); } .project-runtime-live-dot.is-completed { background: #2878d4; } @keyframes project-runtime-pulse { 50% { opacity: 0.5; transform: scale(0.82); } } .agent-runtime-status .project-runtime-overview { gap: 5px; padding: 9px 10px; border-radius: 8px; background: #eef4ff; } .project-runtime-overview > span { color: #53657c; font-size: 11px; } .agent-runtime-status .project-runtime-plan-progress { grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 8px; } .project-runtime-plan-progress span { color: #53657c; font-size: 10px; } .project-runtime-plan-progress progress { width: 100%; height: 6px; accent-color: #2c73d2; } .agent-runtime-status .project-runtime-professional-list { gap: 7px; padding-top: 7px; border-top: 1px solid #d8dde5; } .project-runtime-professional-list article { display: grid; gap: 4px; padding: 8px 9px; border: 1px solid #dfe5ed; border-left-width: 3px; border-radius: 8px; background: #fff; } .project-runtime-professional-list article.is-running { border-left-color: #22a35a; } .project-runtime-professional-list article.is-waiting { border-left-color: #df8a16; background: #fffaf0; } .project-runtime-professional-list article.is-failed { border-left-color: #d64545; background: #fff7f7; } .project-runtime-professional-list article.is-completed { border-left-color: #2878d4; } .project-runtime-professional-list article > header { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .project-runtime-professional-list article > header span { color: #475569; font-size: 10px; font-weight: 700; } .project-runtime-professional-list article p { display: -webkit-box; overflow: hidden; color: #334155; font-size: 11px; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } .agent-runtime-status .project-runtime-professional-actions { grid-template-columns: minmax(0, 1fr) auto auto; align-items: center; gap: 6px; margin-top: 3px; } .project-runtime-professional-actions span { min-width: 0; overflow: hidden; color: #8a5a12; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } .project-runtime-professional-actions button { height: 25px; padding: 0 8px; border: 1px solid #d8b677; border-radius: 6px; background: #fff; color: #785012; font-size: 10px; } .project-runtime-professional-actions button:last-child { border-color: #2c73d2; background: #2c73d2; color: #fff; } .project-runtime-professional-actions button:disabled { opacity: 0.55; } .agent-runtime-status .project-runtime-error { color: #b42323; } .agent-runtime-status .project-runtime-retry-feedback { display: block; margin-top: 4px; color: #2c5f9f; font-size: 10px; } .agent-runtime-status .project-runtime-recovery { grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 7px; padding: 8px; border: 1px solid #efc3bd; border-radius: 8px; background: #fff7f5; } .project-runtime-recovery > span { display: grid; min-width: 0; gap: 2px; color: #7f2f2a; font-size: 11px; } .project-runtime-recovery > span small { color: #775b58; font-size: 10px; } .project-runtime-recovery > button { min-height: 30px; padding: 0 10px; border: 1px solid #d6614f; border-radius: 7px; background: #d6614f; color: #fff; font-size: 10px; font-weight: 700; white-space: nowrap; } .project-runtime-recovery > button:disabled { opacity: 0.58; } .project-runtime-recovery > .project-runtime-retry-feedback { grid-column: 1 / -1; margin: 0; } .agent-runtime-status .project-runtime-pending-command { grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 12px; margin-top: 4px; padding: 10px 12px; border: 1px solid var(--platform-surface-border); border-radius: 10px; background: var(--platform-warm-bg); } .agent-runtime-status .project-runtime-pending-command button { min-width: 52px; height: 34px; flex: 0 0 auto; border: 1px solid var(--platform-surface-border); background: var(--platform-button-secondary-fill); color: var(--platform-button-secondary-text); font-size: 11px; font-weight: 800; } .agent-runtime-status .project-runtime-pending-command small { font-size: 10px; } .project-supervisor-composer { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: 10px; } .project-supervisor-composer textarea { min-width: 0; min-height: 72px; max-height: 180px; padding: 10px 12px; resize: vertical; border: 1px solid #cfd7e6; border-radius: 8px; background: #fff; color: #111827; font: inherit; line-height: 1.5; } /* 只发给提交按钮:这里原来是 `.project-supervisor-composer button`,会把 `position`、 `width`、`border-radius` 广播到输入区里的每一个按钮上——`.project-supervisor-composer .is-direct-codex .project-supervisor-composer button` 那条绝对定位规则就是这样把 「AI 润色」从输入区网格里摘出去、浮到文本区右侧的。 */ .project-supervisor-submit-button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-width: 84px; height: 40px; padding: 0 16px; border: 1px solid #1f6feb; border-radius: 8px; background: #1f6feb; color: #fff; } .project-supervisor-submit-button:disabled { border-color: #cfd6e1; background: #e8ecf2; color: #8b95a5; } .project-supervisor-workspace-status { color: #7b8492; font-size: 11px; overflow-wrap: anywhere; } .project-supervisor-collaboration { min-width: 0; padding-left: 18px; border-left: 1px solid #e5e7eb; } .project-supervisor-collaboration header { display: flex; justify-content: space-between; gap: 10px; margin-bottom: 8px; } .project-supervisor-collaboration h2, .project-supervisor-collaboration p { margin: 0; } .project-supervisor-collaboration h2 { color: #111827; font-size: 14px; } .project-supervisor-collaboration header small, .project-supervisor-collaboration p { color: #8b8b8b; font-size: 11px; } .project-supervisor-collaboration > div { display: grid; } .project-supervisor-collaboration article { display: grid; gap: 5px; min-width: 0; padding: 10px 0; border-top: 1px solid #eef0f3; } .project-supervisor-collaboration article strong { color: #111827; font-size: 12px; } .project-supervisor-collaboration article span, .project-supervisor-collaboration article small { color: #647084; font-size: 11px; overflow-wrap: anywhere; } .launcher-card-collage { display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 1fr); gap: 2px; } .launcher-card-collage span:nth-child(1) { background: radial-gradient(circle at 45% 38%, #6b5c43 0 18%, transparent 19%), radial-gradient(circle at 62% 54%, #2f2a23 0 25%, transparent 26%), linear-gradient(135deg, #91a17e, #2c3327); } .launcher-card-collage span:nth-child(2) { background: radial-gradient(circle at 58% 45%, #b28b5a 0 16%, transparent 17%), radial-gradient(circle at 48% 55%, #302114 0 24%, transparent 25%), linear-gradient(135deg, #d9e8ef, #9fb0a0); } .launcher-card-collage span:nth-child(3) { background: radial-gradient(circle at 50% 54%, #eac9c0 0 22%, transparent 23%), linear-gradient(135deg, #f7d9d5, #dab6aa); } .launcher-card-collage span:nth-child(4) { background: radial-gradient(circle at 56% 50%, #32271b 0 22%, transparent 23%), linear-gradient(135deg, #8e6c4e, #2b211b); } .launcher-card-ui > div { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; padding: 16px; background: #fff7f2; } .launcher-card-ui span { border-radius: 4px; background: linear-gradient(#ff8d5c 0 0) 12px 12px / 40px 4px no-repeat, linear-gradient(#ffd4c2 0 0) 12px 24px / 70px 4px no-repeat, linear-gradient(#fee4d8, #fff); box-shadow: inset 0 0 0 1px #fed7c8; } .launcher-card-pattern > div { display: grid; grid-template-columns: repeat(2, 1fr); background: linear-gradient( 45deg, transparent 46%, #fff 46% 54%, transparent 54% ), linear-gradient(135deg, #55405a, #e4b2a7); } .launcher-card-pattern span { display: grid; color: #fff; font-size: 38px; place-items: center; text-shadow: 0 2px 8px rgb(0 0 0 / 18%); } .launcher-card-orange > div { display: grid; grid-template-columns: 1.1fr 1fr; background: #fff8ee; } .launcher-card-orange span:first-child { display: grid; color: #ff7a1a; font-size: 32px; font-weight: 900; place-items: start; padding: 18px; } .launcher-card-orange span:last-child { display: grid; color: #f06d3d; font-size: 96px; font-weight: 900; line-height: 1; place-items: center; } @media (max-width: 760px) { .launcher-main { grid-template-rows: auto auto auto; overflow: visible; } .launcher-promo { justify-content: flex-start; min-height: 38px; padding: 7px 10px; overflow: hidden; font-size: 11px; } .launcher-promo span:not(.launcher-countdown):not(:nth-child(3)):not(:nth-child(6)):not( :nth-child(9) ) { display: none; } .launcher-promo strong { overflow: hidden; text-overflow: ellipsis; } .launcher-account-bar { position: static; justify-content: flex-end; padding: 18px 14px 0; } .launcher-account-bar span { max-width: 148px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .launcher-page { width: min(100%, calc(100vw - 76px)); } .launcher-projects-page { width: calc(100vw - var(--launcher-sidebar-width)); padding: 72px 18px 20px; } .launcher-agent-chat-page > header, .launcher-agent-chat-main > header { align-items: stretch; flex-direction: column; gap: 10px; } .launcher-agent-chat-main > header > small { max-width: 100%; overflow-wrap: anywhere; } .launcher-development-grid { grid-template-columns: 1fr; } .launcher-agent-chat-layout { grid-template-columns: 1fr; min-height: auto; } .launcher-agent-picker { max-height: 240px; } .launcher-agent-chat-main { min-height: 620px; } .launcher-agent-chat-composer { grid-template-columns: minmax(0, 1fr) auto; } .launcher-agent-chat-mode { grid-column: 1 / -1; justify-self: start; } .launcher-agent-goal-status header { align-items: stretch; flex-direction: column; } .launcher-agent-goal-actions { justify-content: flex-start; } .agent-runtime-user-input-options { grid-template-columns: 1fr; } .agent-runtime-user-input .agent-runtime-user-input-submit { width: 100%; justify-self: stretch; } .launcher-agent-session-bar { grid-template-columns: auto minmax(0, 1fr); } .launcher-agent-session-status { display: none; } .launcher-development-assets div { grid-template-columns: 1fr; } .project-supervisor-surface { grid-template-columns: 1fr; min-height: auto; } .project-supervisor-conversation { grid-template-rows: minmax(320px, auto) auto auto auto; } .project-supervisor-message-list { max-height: 52vh; } .project-supervisor-composer { grid-template-columns: 1fr; } .project-supervisor-submit-button { width: 100%; } .project-supervisor-collaboration { padding: 14px 0 0; border-top: 1px solid #e5e7eb; border-left: 0; } } .launcher-dialog-backdrop { position: fixed; top: var(--window-chrome-height); right: 0; bottom: 0; left: 0; z-index: 200; display: grid; padding: 24px; background: rgb(0 0 0 / 56%); place-items: center; } .launcher-dialog { width: min(420px, 100%); padding: 20px; border: 1px solid #e5e7eb; border-radius: 8px; background: #fff; color: #171717; box-shadow: 0 18px 52px rgb(0 0 0 / 18%); } .launcher-dialog h2 { margin: 0 0 10px; font-size: 18px; } .launcher-dialog p { margin: 0; color: #6b7280; overflow-wrap: anywhere; } .project-professional-result-dialog { width: min(760px, 100%); max-height: min(760px, calc(100vh - 48px)); overflow: hidden; } .project-professional-result-dialog header { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 14px; } .project-professional-result-dialog header button { min-height: 32px; padding: 0 12px; border: 1px solid #e1c8bb; border-radius: 8px; background: #fff; color: #7a4c37; } .project-professional-result-dialog pre { max-height: min(620px, calc(100vh - 170px)); margin: 0; overflow: auto; padding: 16px; border-radius: 10px; background: #f8f2ee; color: #49372f; font: inherit; line-height: 1.65; white-space: pre-wrap; overflow-wrap: anywhere; user-select: text; } .launcher-agent-goal-dialog { width: min(560px, 100%); max-height: min(760px, calc(100vh - 48px)); overflow-y: auto; } .launcher-agent-goal-fields { display: grid; gap: 12px; } .launcher-agent-goal-fields label { display: grid; gap: 6px; color: #44536a; font-size: 12px; font-weight: 700; } .launcher-agent-goal-fields textarea { width: 100%; min-width: 0; padding: 9px 10px; border: 1px solid #d8dde5; border-radius: 8px; background: #fff; color: #111827; font: inherit; line-height: 1.5; resize: vertical; } .launcher-agent-goal-fields textarea:focus-visible { border-color: #64748b; outline: 2px solid rgb(100 116 139 / 18%); outline-offset: 1px; } .launcher-dialog .launcher-agent-goal-dialog-error { margin-top: 10px; color: #b42318; font-size: 12px; } .launcher-dialog-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 18px; } .launcher-dialog-actions button { height: 34px; padding: 0 14px; border: 1px solid #d1d5db; border-radius: 6px; background: #fff; color: #171717; cursor: pointer; } .launcher-dialog-actions button:last-child { border-color: #111827; background: #111827; color: #fff; } .app-shell { min-height: 100vh; background: #f5f7fb; } .app-shell--user { display: flex; justify-content: center; padding: 24px; } .app-shell--dev { display: grid; grid-template-columns: minmax(360px, 0.85fr) minmax(520px, 1.15fr); gap: 1px; background: #d9dee8; } .chat-pane { display: flex; flex-direction: column; gap: 16px; min-width: 0; padding: 18px; background: #fff; } .app-shell--user .chat-pane { width: min(900px, 100%); min-height: calc(100vh - 48px); border: 1px solid #d9dee8; } .app-shell--dev .chat-pane { min-height: 100vh; } .chat-header, .panel-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .chat-header-title { display: grid; gap: 4px; min-width: 0; } .chat-header-actions { display: flex; flex-wrap: wrap; gap: 8px; } .chat-quick-actions { display: flex; flex-wrap: wrap; gap: 8px; } .panel-header { margin-bottom: 10px; } .panel-actions { display: flex; flex-wrap: wrap; gap: 8px; } .panel-header button, .chat-header button, .chat-quick-actions button, .local-project-form button, .panel-actions select { height: 32px; padding: 0 12px; border: 1px solid #cfd7e6; border-radius: 6px; } .panel-header button, .chat-header button, .chat-quick-actions button, .local-project-form button { color: #fff; background: #1f6feb; } .panel-actions select { background: #fff; } h1, h2, p { margin: 0; } h1 { font-size: 24px; } h2 { margin-bottom: 14px; font-size: 16px; } .chat-header span, .chat-header small, .task-pane span, .log-pane p { color: #647084; } .chat-header small { overflow-wrap: anywhere; } .run-history { display: flex; flex-wrap: wrap; gap: 8px; max-height: 190px; overflow: auto; } .run-history button { display: grid; gap: 2px; min-width: 150px; max-width: 100%; padding: 7px 9px; border: 1px solid #dce3ee; border-radius: 6px; background: #f8fafc; color: #18202f; text-align: left; } .run-history button[aria-current='true'], .trace-history button[aria-current='true'] { border-color: #1f6feb; background: #eef5ff; } .run-history small { color: #647084; overflow-wrap: anywhere; } .run-history-more { align-self: center; } .settings-overlay { position: fixed; top: var(--window-chrome-height); right: 0; bottom: 0; left: 0; z-index: 220; display: grid; place-items: center; padding: 24px; background: rgb(24 32 47 / 48%); backdrop-filter: blur(6px); } .runtime-custom-llm { grid-column: 1 / -1; display: grid; gap: 12px; min-width: 0; } .runtime-custom-llm-discover { display: inline-flex; align-items: center; justify-content: center; gap: 6px; justify-self: start; min-height: 34px; padding: 0 14px; border: 1px solid var(--platform-surface-border); border-radius: 9px; background: var(--platform-button-secondary-fill); color: var(--platform-button-secondary-text); font-size: 11px; font-weight: 700; cursor: pointer; } .runtime-custom-llm-discover:disabled { cursor: not-allowed; opacity: 0.55; } .runtime-custom-model-columns { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr)); gap: 16px; } .runtime-custom-model-columns > section { min-width: 0; padding: 12px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; } .runtime-custom-model-list { max-height: 240px; overflow: auto; overflow-wrap: anywhere; } .runtime-custom-model-list .settings-checkbox { display: flex; align-items: start; gap: 8px; margin: 8px 0; } .runtime-settings-toast { position: absolute; top: 24px; right: 24px; z-index: 1; display: inline-flex; align-items: center; gap: 8px; max-width: min(420px, calc(100vw - 48px)); padding: 11px 14px; border: 1px solid var(--platform-success-border); border-radius: 12px; background: #edf8ef; box-shadow: var(--platform-panel-shadow); color: var(--platform-success-text); font-size: 12px; font-weight: 700; pointer-events: none; } .runtime-settings-toast[data-tone='error'] { border-color: var(--platform-warm-border); background: #fff1ea; color: var(--platform-warm-text); } .runtime-settings-toast span { overflow-wrap: anywhere; } .settings-panel { display: grid; gap: 10px; width: min(920px, 100%); max-height: calc(100vh - 36px); padding: 18px; overflow: auto; border: 1px solid #cfd7e6; background: #fff; } .runtime-settings-panel { --runtime-settings-fill: #fffdfa; --runtime-settings-topbar-fill: #fffdf9; --runtime-settings-nav-fill: #fdf7f1; --runtime-settings-content-fill: #fffaf6; --runtime-settings-subpanel-fill: #fffdfb; grid-template-rows: auto minmax(0, 1fr) auto; gap: 0; width: min(1080px, 100%); height: min(760px, calc(100dvh - var(--window-chrome-height) - 48px)); max-height: calc(100dvh - var(--window-chrome-height) - 48px); padding: 0; overflow: hidden; border-color: var(--platform-modal-border); border-radius: 18px; background: var(--runtime-settings-fill); box-shadow: var(--platform-panel-shadow); } .runtime-settings-header, .runtime-settings-footer, .runtime-settings-section-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; } .runtime-settings-header { min-height: 76px; padding: 15px 18px 14px 22px; border-bottom: 1px solid var(--platform-line-soft); background: var(--runtime-settings-topbar-fill); } .runtime-settings-header > div { display: grid; gap: 3px; } .runtime-settings-eyebrow { color: var(--platform-accent); font-size: 9px; font-weight: 900; letter-spacing: 0.16em; } .runtime-settings-header h2 { margin: 0; color: var(--platform-text-strong); font-size: 20px; letter-spacing: -0.02em; } .runtime-settings-close { display: grid; width: 36px; height: 36px; padding: 0; border: 1px solid var(--platform-surface-border); border-radius: 10px; background: var(--platform-button-ghost-fill); color: var(--platform-button-ghost-text); cursor: pointer; place-items: center; } .runtime-settings-layout { display: grid; grid-template-columns: 224px minmax(0, 1fr); min-height: 0; overflow: hidden; } .runtime-settings-nav { display: flex; flex-direction: column; justify-content: space-between; gap: 18px; min-height: 0; padding: 16px 12px; overflow-y: auto; border-right: 1px solid var(--platform-line-soft); background: var(--runtime-settings-nav-fill); } .runtime-settings-nav nav { display: grid; gap: 6px; } .runtime-settings-nav nav button { display: grid; grid-template-columns: 28px minmax(0, 1fr); align-items: center; gap: 8px; min-height: 54px; padding: 8px 10px; border: 1px solid transparent; border-radius: 12px; background: transparent; color: var(--platform-text-base); text-align: left; cursor: pointer; } .runtime-settings-nav nav button > svg { color: var(--platform-text-soft); justify-self: center; } .runtime-settings-nav nav button > span { display: grid; gap: 2px; min-width: 0; } .runtime-settings-nav nav strong { color: inherit; font-size: 12px; } .runtime-settings-nav nav small { overflow: hidden; color: var(--platform-text-soft); font-size: 9px; text-overflow: ellipsis; white-space: nowrap; } .runtime-settings-nav nav button:hover { border-color: var(--platform-surface-border); background: var(--platform-button-ghost-fill); } .runtime-settings-nav nav button.is-active { border-color: var(--platform-nav-active-border); background: var(--platform-nav-active-fill); color: var(--platform-text-strong); box-shadow: var(--platform-nav-active-shadow); } .runtime-settings-nav nav button.is-active > svg { color: var(--platform-accent); } .runtime-settings-config-state { display: grid; gap: 3px; padding: 10px; border-top: 1px solid var(--platform-line-soft); } .runtime-settings-config-state span, .runtime-settings-config-state small { color: var(--platform-text-soft); font-size: 9px; } .runtime-settings-config-state strong { color: var(--platform-text-base); font-size: 11px; } .runtime-settings-config-state small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .runtime-settings-content { min-width: 0; min-height: 0; padding: 22px 24px 28px; overflow-y: auto; background: var(--runtime-settings-content-fill); } .runtime-settings-section-header { min-height: 44px; margin-bottom: 18px; } .runtime-settings-section-header > div { display: grid; gap: 4px; } .runtime-settings-section-header h3, .runtime-settings-section-header p { margin: 0; } .runtime-settings-section-header h3 { color: var(--platform-text-strong); font-size: 17px; } .runtime-settings-section-header p, .runtime-settings-section-header > span { color: var(--platform-text-soft); font-size: 11px; } .runtime-settings-section-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 7px; } .runtime-settings-section-actions button, .runtime-settings-extension-actions button { display: inline-flex; align-items: center; justify-content: center; gap: 5px; min-height: 30px; padding: 0 9px; border: 1px solid var(--platform-surface-border); border-radius: 8px; background: var(--platform-button-ghost-fill); color: var(--platform-text-base); font-size: 11px; cursor: pointer; } .runtime-settings-section-actions button:hover, .runtime-settings-extension-actions button:hover { border-color: var(--platform-surface-hover-border); background: var(--platform-button-ghost-fill); } .runtime-settings-section-actions button:disabled, .runtime-settings-extension-actions button:disabled { cursor: default; opacity: 0.55; } .runtime-settings-extensions { display: grid; gap: 10px; } .runtime-settings-inline-status { margin: 0; color: var(--platform-text-soft); font-size: 11px; } .runtime-settings-extension-list { display: grid; gap: 8px; } .runtime-settings-extension-item { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--runtime-settings-subpanel-fill); } .runtime-settings-extension-main { display: grid; min-width: 0; gap: 3px; } .runtime-settings-extension-main strong, .runtime-settings-extension-main input { min-width: 0; color: var(--platform-text-strong); font-size: 13px; font-weight: 800; } .runtime-settings-extension-main input { width: min(100%, 300px); padding: 6px 8px; border: 1px solid var(--platform-surface-border); border-radius: 7px; background: var(--platform-input-fill); } .runtime-settings-extension-main > span, .runtime-settings-extension-main > small, .runtime-settings-extension-actions > span { overflow: hidden; color: var(--platform-text-soft); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } .runtime-settings-extension-main > small { color: var(--platform-danger, #b45309); } .runtime-settings-extension-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 6px; flex-shrink: 0; } .runtime-settings-extension-actions > span { margin-right: 2px; } .runtime-settings-empty-state { display: grid; gap: 4px; padding: 24px 14px; border: 1px dashed var(--platform-subpanel-border); border-radius: 12px; color: var(--platform-text-soft); text-align: center; } .runtime-settings-empty-state strong { color: var(--platform-text-base); font-size: 13px; } .agc-plugin-panel-overlay { z-index: 230; } .agc-plugin-panel { width: min(900px, 94vw); overflow: hidden; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--platform-subpanel-fill); } .agc-plugin-panel > header { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 8px 12px; color: var(--platform-text-strong); font-size: 12px; } .agc-plugin-panel iframe { display: block; width: 100%; height: min(640px, 75vh); border: 0; background: var(--platform-input-fill); } .runtime-settings-empty-state span { font-size: 11px; } .runtime-settings-fields { align-content: start; } .runtime-settings-fields > label { padding: 13px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--runtime-settings-subpanel-fill); color: var(--platform-text-base); } /* 固定项(工作方式 / 智能服务 / 协议 / 推理档)按「标签 → 取值 → 说明」纵向排列。 */ .runtime-settings-readonly-field { display: grid; gap: 3px; min-width: 0; padding: 13px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--runtime-settings-subpanel-fill); } .runtime-settings-readonly-field > span { color: var(--platform-text-soft); font-size: 11px; } .runtime-settings-readonly-field > strong { color: var(--platform-text-strong); font-size: 14px; line-height: 1.35; } .runtime-settings-readonly-field > small { color: var(--platform-text-soft); font-size: 10px; line-height: 1.4; } .runtime-settings-fields input, .runtime-settings-fields select { border-color: var(--platform-surface-border); background: var(--platform-input-fill); color: var(--platform-text-strong); } .runtime-settings-fields input:focus-visible, .runtime-settings-fields select:focus-visible { border-color: var(--platform-surface-hover-border); outline: none; box-shadow: 0 0 0 3px var(--platform-input-focus-ring); } .runtime-settings-about { grid-column: 1 / -1; display: grid; gap: 14px; max-width: 680px; } .runtime-settings-about-hero { display: flex; align-items: center; gap: 18px; min-height: 158px; padding: 24px; border: 1px solid var(--platform-subpanel-border); border-radius: 16px; background: var(--runtime-settings-subpanel-fill); } .runtime-settings-about-mark { display: grid; flex: 0 0 auto; width: 72px; height: 72px; border: 1px solid var(--platform-nav-active-border); border-radius: 20px; background: var(--platform-nav-active-fill); color: var(--platform-accent); font-size: 32px; font-weight: 900; letter-spacing: -0.08em; place-items: center; box-shadow: var(--platform-nav-active-shadow); } .runtime-settings-about-mark img { width: 100%; height: 100%; object-fit: contain; transform: scale(1.35); } .runtime-settings-about-hero > div:last-child { display: grid; gap: 5px; min-width: 0; } .runtime-settings-about-kicker { color: var(--platform-accent); font-size: 10px; font-weight: 900; letter-spacing: 0.16em; } .runtime-settings-about-hero h4 { margin: 0; color: var(--platform-text-strong); font-size: 20px; letter-spacing: -0.03em; } .runtime-settings-about-hero p { margin: 0; color: var(--platform-text-soft); font-size: 12px; } .runtime-settings-about-meta { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin: 0; } .runtime-settings-about-meta > div { display: grid; gap: 7px; padding: 14px; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--runtime-settings-subpanel-fill); } .runtime-settings-about-meta dt { color: var(--platform-text-soft); font-size: 10px; } .runtime-settings-about-meta dd { margin: 0; color: var(--platform-text-strong); font-size: 14px; font-weight: 800; } .runtime-settings-about-update { display: flex; align-items: center; gap: 12px; } .runtime-settings-about-update button { padding: 8px 14px; border: 0; border-radius: 8px; background: var(--platform-accent); color: #fff; cursor: pointer; font-weight: 700; } .runtime-settings-about-update button:disabled { cursor: wait; opacity: 0.65; } .runtime-settings-about-update span { color: var(--platform-text-soft); font-size: 12px; } .runtime-agent-list { grid-column: 1 / -1; display: grid; gap: 8px; } .runtime-agent-card { overflow: hidden; border: 1px solid var(--platform-subpanel-border); border-radius: 12px; background: var(--runtime-settings-subpanel-fill); } .runtime-agent-card-summary { display: flex; align-items: center; justify-content: space-between; gap: 16px; width: 100%; min-height: 58px; padding: 10px 14px; border: 0; background: transparent; color: var(--platform-text-base); text-align: left; cursor: pointer; } .runtime-agent-card-summary:hover, .runtime-agent-card-summary[aria-expanded='true'] { background: var(--platform-button-ghost-fill); } .runtime-agent-card-summary:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--platform-surface-hover-border); } .runtime-agent-card-summary > span:first-child { display: grid; gap: 2px; } .runtime-agent-card-summary strong { color: var(--platform-text-strong); font-size: 12px; } .runtime-agent-card-summary small, .runtime-agent-card-summary > span:last-child { color: var(--platform-text-soft); font-size: 10px; } .runtime-agent-card-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; padding: 14px; border-top: 1px solid var(--platform-line-soft); } .runtime-agent-card-fields label { display: grid; gap: 6px; min-width: 0; color: var(--platform-text-base); font-size: 11px; } .runtime-agent-card-fields input, .runtime-agent-card-fields select { width: 100%; } .runtime-settings-footer { min-height: 66px; padding: 11px 18px 11px 22px; border-top: 1px solid var(--platform-line-soft); background: var(--runtime-settings-topbar-fill); } .runtime-settings-footer .status-line { display: inline-flex; align-items: center; gap: 6px; min-width: 0; margin: 0; padding: 6px 9px; overflow: hidden; border: 1px solid transparent; border-radius: 8px; color: var(--platform-text-soft); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } .runtime-settings-footer .status-line[data-tone='success'] { border-color: var(--platform-success-border); background: #edf8ef; color: var(--platform-success-text); } .runtime-settings-footer .status-line[data-tone='warning'] { border-color: var(--platform-warm-border); background: var(--platform-warm-bg); color: var(--platform-warm-text); } .runtime-settings-footer .status-line[data-tone='busy'] { border-color: var(--platform-nav-active-border); background: var(--platform-nav-active-fill); color: var(--platform-accent); } .runtime-settings-footer .status-line .is-spinning { animation: runtime-settings-spin 0.9s linear infinite; } @keyframes runtime-settings-spin { to { transform: rotate(360deg); } } .runtime-settings-footer-actions { display: flex; align-items: center; gap: 7px; flex: 0 0 auto; } .runtime-settings-footer-actions button { display: inline-flex; align-items: center; justify-content: center; gap: 6px; min-height: 34px; padding: 0 12px; border: 1px solid var(--platform-surface-border); border-radius: 9px; background: var(--platform-button-secondary-fill); color: var(--platform-button-secondary-text); font-size: 11px; font-weight: 700; cursor: pointer; } .runtime-settings-footer-actions button:disabled { cursor: wait; opacity: 0.55; } .runtime-settings-footer-actions .runtime-settings-save { border-color: var(--platform-button-primary-border); background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); } .settings-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; } .settings-grid label { display: grid; gap: 6px; min-width: 0; color: #647084; font-size: 13px; } .settings-grid input, .settings-grid select { min-width: 0; height: 36px; padding: 0 10px; border: 1px solid #cfd7e6; border-radius: 6px; color: #18202f; background: #fff; } .settings-checkbox { grid-template-columns: auto 1fr; align-items: center; align-self: end; } .settings-checkbox input { width: 18px; height: 18px; padding: 0; } .message-list { flex: 1; border: 1px solid #dde3ee; padding: 14px; overflow: auto; } .message + .message { margin-top: 10px; } .message-history-more { width: 100%; min-height: 32px; margin-bottom: 10px; border: 1px solid #cfd7e6; border-radius: 6px; color: #647084; background: #f8fafd; } /* 这里不能加 `white-space: pre-wrap`:Markdown 渲染出来的块之间会带换行文本节点, pre-wrap 会把那些 `\n` 变成真实的空行(表现就是列表项之间出现大段空白)。 需要保留换行的地方(流式原文、行内代码)各自已经有 `whitespace-pre-wrap`。 */ .message { overflow-wrap: anywhere; } .message--user { color: #1f6feb; } .message-action { min-height: 32px; margin-top: 6px; border: 1px solid #cfd7e6; border-radius: 6px; color: #334155; background: #f8fafd; } .pending-command { display: flex; align-items: center; justify-content: flex-end; gap: 8px; padding: 10px; border: 1px solid #dde3ee; background: #f8fafd; } .pending-command span { display: grid; gap: 3px; min-width: 0; margin-right: auto; color: #647084; } .pending-command small { overflow-wrap: anywhere; font-size: 12px; } .pending-command button { height: 32px; padding: 0 12px; border: 1px solid #cfd7e6; border-radius: 6px; color: #fff; background: #1f6feb; } .resource-reference-input { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: end; gap: 8px; min-width: 0; flex: 1; padding: 8px 8px 8px 12px; border: 1px solid #cfd6df; border-radius: 8px; background: #fff; color: #111827; font: inherit; } .resource-reference-input:focus-within { border-color: #6b7280; outline: 2px solid rgb(107 114 128 / 18%); outline-offset: 1px; } .resource-reference-input[data-disabled='true'] { cursor: not-allowed; opacity: 0.55; } .resource-reference-input-editor { min-width: 0; min-height: 72px; max-height: 180px; overflow-y: auto; outline: 0; line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; } .resource-reference-input.is-single-line .resource-reference-input-editor { min-height: 24px; max-height: 24px; overflow: hidden; white-space: nowrap; } .resource-reference-input-placeholder { position: absolute; top: 9px; left: 13px; pointer-events: none; color: #8a94a6; } /* 输入区操作排是文本区下面的独立一行(`.resource-reference-input` 是行式网格, 第一行放编辑器)。`@` / AI 润色 / 恢复原文三个 28px 方钮共用一套外观,网格既有 的 `align-items: end` 已经把它们钉在行底,和下面那一排主操作对齐。 注意不要再给这一排加 `min-height`:网格行高由编辑器撑开,行高一旦被顶起来, 编辑器就会跟着变高。 */ .resource-reference-input-actions { display: flex; align-items: end; gap: 6px; } .resource-reference-input-at, .resource-reference-input-polish, .resource-reference-input-restore { display: grid; width: 28px; height: 28px; flex: 0 0 28px; padding: 0; border: 1px solid #cfd6df; border-radius: 8px; background: #f8fafc; color: #475569; place-items: center; cursor: pointer; } .resource-reference-input-at:hover:not(:disabled), .resource-reference-input-polish:hover:not(:disabled), .resource-reference-input-restore:hover:not(:disabled) { border-color: #94a3b8; color: #0f172a; } .resource-reference-input-at:disabled, .resource-reference-input-polish:disabled, .resource-reference-input-restore:disabled { cursor: not-allowed; opacity: 0.5; } /* 润色中 / 润色失败:整行独占,既不会压住上面的编辑器,也不会被操作排挤成两行。 */ .resource-reference-input-status { grid-column: 1 / -1; margin-top: 6px; color: #b45309; font-size: 12px; line-height: 1.4; } .chat-prompt-polish-reminder { display: grid; gap: 12px; } .chat-prompt-polish-reminder-error { color: #b45309; } .chat-prompt-polish-reminder-preference { display: flex; align-items: center; gap: 8px; color: #6b7280; font-size: 13px; } .chat-prompt-polish-reminder-actions, .chat-prompt-polish-reminder .launcher-dialog-actions { display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; } .chat-prompt-polish-reminder .launcher-dialog-actions button { display: inline-flex; align-items: center; gap: 6px; } .resource-reference-picker-scopes { padding: 0 12px 4px; } .resource-reference-chip { display: inline-flex; align-items: center; gap: 2px; margin: 0 2px; padding: 1px 4px 1px 6px; border: 1px solid #bfdbfe; border-radius: 7px; background: #eff6ff; color: #1d4ed8; font-size: 12px; font-weight: 650; line-height: 1.5; vertical-align: baseline; white-space: nowrap; } .resource-reference-chip-label { max-width: 180px; overflow: hidden; text-overflow: ellipsis; } .resource-reference-chip button { display: grid; width: 15px; height: 15px; padding: 0; border: 0; border-radius: 4px; background: transparent; color: inherit; place-items: center; cursor: pointer; } .resource-reference-chip button:hover { background: rgb(29 78 216 / 12%); } .resource-reference-menu { display: grid; gap: 2px; width: min(360px, calc(100vw - 48px)); max-height: min(240px, calc(100vh - 140px)); overflow: auto; overscroll-behavior: contain; padding: 6px; border: 1px solid var(--platform-subpanel-border, #dbe3ef); border-radius: 12px; background: var(--platform-panel-fill, #fff); box-shadow: 0 12px 28px rgba(15, 23, 42, 0.16); scrollbar-color: #cbd5e1 transparent; scrollbar-width: thin; } .resource-reference-menu-anchor { z-index: 90; } .resource-reference-menu button { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 12px; width: 100%; min-width: 0; padding: 8px 10px; border: 0; border-radius: 8px; background: transparent; color: inherit; text-align: left; cursor: pointer; } .resource-reference-menu button:hover, .resource-reference-menu button.is-active { background: var(--platform-subpanel-fill, #f1f5f9); } .resource-reference-menu button > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .resource-reference-menu small { max-width: 132px; overflow: hidden; color: var(--platform-muted-text, #64748b); font-size: 11px; text-overflow: ellipsis; white-space: nowrap; } .resource-reference-picker { position: absolute; z-index: 80; right: 0; bottom: calc(100% + 8px); display: grid; grid-template-rows: auto auto auto minmax(0, 1fr) auto; width: min(440px, 88vw); max-height: min(480px, 70vh); overflow: hidden; border: 1px solid var(--platform-subpanel-border, #dbe3ef); border-radius: 14px; background: var(--platform-panel-fill, #fff); box-shadow: 0 18px 48px rgba(15, 23, 42, 0.22); } .resource-reference-picker > header, .resource-reference-picker > footer { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 12px; } .resource-reference-picker > header { border-bottom: 1px solid var(--platform-subpanel-border, #e2e8f0); } .resource-reference-picker > header button { width: 24px; height: 24px; padding: 0; border: 0; border-radius: 6px; background: transparent; color: inherit; cursor: pointer; } /* 搜索 + 功能分类 + 标签由共享筛选条(`PlatformResourceFilterBar`)渲染, 这里只给它留出面板内的边距;两个页签各自持有自己那一份筛选状态。 */ .resource-reference-picker-filters { min-width: 0; padding: 10px 12px 8px; } .resource-reference-picker-list { display: grid; gap: 4px; min-height: 0; overflow: auto; padding: 0 8px 8px; } .resource-reference-picker-list > button { display: grid; grid-template-columns: 44px minmax(0, 1fr) auto; align-items: center; gap: 10px; width: 100%; padding: 7px 8px; border: 1px solid transparent; border-radius: 10px; background: transparent; color: inherit; text-align: left; cursor: pointer; } .resource-reference-picker-list > button:hover, .resource-reference-picker-list > button.is-selected { border-color: var(--platform-nav-active-border, #bfdbfe); background: var(--platform-subpanel-fill, #f1f5f9); } .resource-reference-picker-list > button > img, .resource-reference-picker-list > button > svg { display: grid; width: 44px; height: 44px; border-radius: 8px; background: var(--platform-subpanel-fill, #f1f5f9); object-fit: cover; place-items: center; padding: 12px; color: var(--platform-muted-text, #64748b); } .resource-reference-picker-list > button > img { padding: 0; } .resource-reference-picker-list > button > span { display: grid; gap: 2px; min-width: 0; } .resource-reference-picker-list > button strong, .resource-reference-picker-list > button small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .resource-reference-picker-list > button small, .resource-reference-picker-empty, .resource-reference-picker > footer span { color: var(--platform-muted-text, #64748b); font-size: 12px; } .resource-reference-picker-empty { margin: 12px; text-align: center; } .resource-reference-picker > footer { border-top: 1px solid var(--platform-subpanel-border, #e2e8f0); } .resource-reference-picker > footer button { min-height: 32px; padding: 0 14px; border: 1px solid var(--platform-button-primary-border, #2563eb); border-radius: 8px; background: var(--platform-button-primary-fill, #2563eb); color: var(--platform-button-primary-text, #fff); cursor: pointer; } .resource-reference-picker > footer button:disabled { cursor: not-allowed; opacity: 0.5; } .composer { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 10px; } .composer input, .composer button, .composer-upload-button { height: 40px; border: 1px solid #cfd7e6; border-radius: 6px; } .composer input { min-width: 0; padding: 0 12px; } .composer button, .composer-upload-button { display: inline-grid; padding: 0 18px; place-items: center; color: #fff; background: #1f6feb; cursor: pointer; } .composer-upload-button input { display: none; } .agent-status-pane { display: grid; gap: 10px; padding-top: 4px; } .agent-status-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 8px; max-height: 220px; overflow: auto; } .agent-status-list button { display: grid; gap: 4px; min-width: 0; padding: 9px; border: 1px solid #dce3ee; border-radius: 6px; background: #fff; color: #18202f; text-align: left; } .agent-status-list span, .agent-status-list small { color: #647084; font-size: 12px; } .agent-status-list small { overflow-wrap: anywhere; } .agent-conversation-panel { display: grid; gap: 10px; width: min(640px, 100%); max-height: calc(100vh - 36px); padding: 18px; overflow: auto; border: 1px solid #cfd7e6; background: #fff; } .agent-conversation-list { min-height: 220px; max-height: 420px; padding: 12px; overflow: auto; border: 1px solid #dde3ee; } .agent-conversation-list .message { width: fit-content; max-width: min(88%, 720px); margin: 0; padding: 9px 12px; border-radius: 14px; line-height: 1.55; } .agent-conversation-list .message + .message { margin-top: 10px; } .agent-conversation-list .message--user { margin-left: auto; border: 1px solid #d8c4a8; border-radius: 14px 14px 4px; background: #fff7ed; color: #8a4b08; } .agent-memory-box { display: grid; gap: 6px; max-height: 180px; padding: 10px; overflow: auto; border: 1px solid #dde3ee; background: #f8fafd; } .agent-memory-box pre { margin: 0; overflow-wrap: anywhere; white-space: pre-wrap; } .agent-memory-box small button { height: 24px; margin-left: 8px; padding: 0 8px; border: 1px solid #cfd7e6; border-radius: 6px; background: #fff; color: #1f6feb; cursor: pointer; } .agent-conversation-panel .composer { grid-template-columns: minmax(0, 1fr) auto auto auto; } .workspace-panel { display: grid; gap: 12px; width: min(680px, 100%); max-height: calc(100vh - 36px); padding: 18px; overflow: auto; border: 1px solid #cfd7e6; background: #fff; } .workspace-picker { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; } .workspace-picker input, .workspace-picker button, .workspace-list button { min-width: 0; height: 36px; border: 1px solid #cfd7e6; border-radius: 6px; } .workspace-picker input { padding: 0 10px; } .workspace-picker button { padding: 0 14px; color: #fff; background: #1f6feb; } .workspace-list { display: grid; gap: 8px; } .workspace-list button { padding: 0 10px; overflow: hidden; background: #fff; color: #18202f; text-align: left; text-overflow: ellipsis; white-space: nowrap; } .developer-pane { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-content: start; gap: 1px; min-width: 0; background: #d9dee8; } .developer-panel { min-width: 0; padding: 18px; background: #fff; } .developer-panel--wide { grid-column: 1 / -1; } .task-pane article { display: grid; grid-template-columns: 84px 1fr; gap: 12px; padding: 10px 0; border-bottom: 1px solid #edf1f7; } .capability-pane article { display: grid; grid-template-columns: 1fr auto; gap: 12px; padding: 8px 0; border-bottom: 1px solid #edf1f7; } .capability-pane span { color: #647084; font-size: 12px; } .trace-pane article { display: grid; gap: 4px; padding: 8px 0; border-bottom: 1px solid #edf1f7; } .trace-pane span, .trace-pane small { color: #647084; } .trace-pane small { overflow-wrap: anywhere; font-size: 12px; } .trace-error { margin-bottom: 10px; padding: 8px; border: 1px solid #efb3b3; border-radius: 6px; color: #8a1f1f; background: #fff5f5; overflow-wrap: anywhere; } .trace-artifacts { display: grid; gap: 4px; margin-bottom: 10px; } .trace-task-graph { display: grid; gap: 4px; margin-bottom: 10px; padding: 8px; border: 1px solid #dce3ee; border-radius: 6px; background: #f8fafc; } .trace-history { display: flex; flex-wrap: wrap; gap: 6px; max-height: 180px; margin-bottom: 10px; overflow: auto; } .trace-history button { min-width: 0; max-width: 100%; padding: 5px 8px; overflow-wrap: anywhere; border: 1px solid #cfd7e6; border-radius: 6px; background: #fff; color: #18202f; font-size: 12px; text-align: left; } .asset-pane code { display: block; margin-bottom: 10px; padding: 9px 10px; border: 1px solid #e1e7f0; background: #f8fafd; } .local-project-form { display: grid; grid-template-columns: 1fr auto; gap: 8px; margin-bottom: 10px; } .local-project-form input, .local-project-form button { min-width: 0; height: 36px; border: 1px solid #cfd7e6; border-radius: 6px; } .local-project-form input { padding: 0 10px; } .asset-register-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; margin-bottom: 10px; } .asset-register-form input, .asset-register-form select, .asset-register-form button { min-width: 0; height: 34px; border: 1px solid #cfd7e6; border-radius: 6px; } .asset-register-form input, .asset-register-form select { padding: 0 10px; } .asset-register-form button { color: #fff; background: #1f6feb; } .status-line, .manifest-path { margin-bottom: 10px; color: #647084; font-size: 13px; } .manifest-path { overflow-wrap: anywhere; } .file-pane input, .file-pane textarea, .memory-pane textarea { display: block; width: 100%; margin-bottom: 10px; padding: 10px; border: 1px solid #cfd7e6; border-radius: 6px; } .file-pane input { height: 36px; } .file-pane textarea, .memory-pane textarea { min-height: 150px; resize: vertical; } .file-list { display: flex; flex-wrap: wrap; gap: 8px; } .file-list button { display: grid; gap: 2px; padding: 6px 10px; border: 1px solid #cfd7e6; border-radius: 6px; background: #fff; text-align: left; } .file-list button small { color: #647084; } .checkpoint-list-item { display: flex; align-items: center; gap: 10px; padding: 6px 8px; border: 1px solid #cfd7e6; border-radius: 6px; background: #fff; } .checkpoint-summary { display: inline-flex; min-width: 160px; flex-direction: column; gap: 2px; } .checkpoint-summary small { color: #64748b; } .limited-command-list { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 10px; } .limited-command-list button { height: 32px; padding: 0 12px; border: 1px solid #cfd7e6; border-radius: 6px; color: #fff; background: #1f6feb; } .project-log-content { max-height: 180px; margin: 0 0 10px; padding: 10px; overflow: auto; border: 1px solid #dde3ee; background: #f8fafd; white-space: pre-wrap; } .preview-frame { display: grid; width: 100%; min-height: 180px; place-items: center; border: 1px solid #cfd7e6; background: #101827; color: #d9e7ff; } iframe.preview-frame { display: block; height: 180px; } @media (max-width: 1100px) { .app-shell--user { padding: 0; } .app-shell--user .chat-pane { min-height: 100vh; border: 0; } .app-shell--dev { grid-template-columns: 1fr; } .developer-pane { grid-template-columns: 1fr; } .developer-panel--wide { grid-column: auto; } .settings-grid { grid-template-columns: 1fr; } .composer { grid-template-columns: 1fr auto; } .composer-upload-button { grid-column: 1 / -1; } } @media (max-width: 760px) { .settings-overlay { padding: 0; overflow: auto; } .runtime-settings-toast { top: 12px; right: 12px; left: 12px; max-width: none; } .runtime-settings-panel { width: 100%; height: calc(100dvh - var(--window-chrome-height)); max-height: calc(100dvh - var(--window-chrome-height)); border: 0; border-radius: 0; } .runtime-settings-layout { grid-template-columns: 1fr; grid-template-rows: auto minmax(0, 1fr); } .runtime-settings-nav { display: block; padding: 8px 10px; overflow-x: auto; border-right: 0; border-bottom: 1px solid var(--platform-line-soft); } .runtime-settings-nav nav { display: flex; width: max-content; } .runtime-settings-nav nav button { grid-template-columns: 20px auto; min-height: 40px; } .runtime-settings-nav nav small, .runtime-settings-config-state { display: none; } .runtime-settings-content { padding: 18px 14px 22px; } .runtime-settings-section-header { align-items: flex-start; flex-direction: column; } .runtime-settings-section-actions { justify-content: flex-start; } .runtime-settings-extension-item { align-items: stretch; flex-direction: column; } .runtime-settings-extension-actions { justify-content: flex-start; } .runtime-agent-card-fields { grid-template-columns: 1fr; } .runtime-settings-about-hero { align-items: flex-start; flex-direction: column; min-height: 0; } .runtime-settings-about-meta { grid-template-columns: 1fr; } .runtime-agent-card-summary > span:last-child { max-width: 48%; text-align: right; } .runtime-settings-footer { align-items: stretch; flex-direction: column; gap: 8px; } .runtime-settings-footer-actions { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); } .runtime-settings-footer-actions button { padding: 0 8px; } } /* GameAgent V1.0 project workbench */ .game-project-workbench { --game-workbench-stage-fill: #fffdfa; --game-workbench-agent-fill: #fbf7f2; width: calc(100vw - var(--launcher-sidebar-width)); max-width: none; min-height: 0; gap: 0; margin: 0; padding: 0; overflow: hidden; color: var(--platform-text-base); } .launcher-main:has(.game-project-workbench) { padding-bottom: 0; } .game-workbench-layout { position: relative; z-index: 0; display: grid; grid-template-columns: minmax(0, 1fr) minmax(360px, 0.36fr); gap: 0; height: clamp(560px, calc(100dvh - 206px), 780px); min-width: 0; min-height: 0; } .game-workbench-layout-account { position: absolute; top: 8px; right: 12px; z-index: 4; } .game-workbench-layout-account .launcher-account-bar { position: static; } .game-workbench-layout.is-ui-editor { grid-template-columns: minmax(0, 1fr); } .game-workbench-stage, .game-workbench-chat { min-width: 0; overflow: hidden; border: 0; border-radius: 0; border-left: 1px solid var(--platform-line-soft); background: var(--game-workbench-agent-fill); box-shadow: none; } .game-workbench-stage { position: relative; display: grid; grid-template-rows: auto auto minmax(0, 1fr); border-left: 0; background: var(--game-workbench-stage-fill); box-shadow: none; } .game-workbench-editor-shell { border: 0; border-radius: 0; background: var(--game-workbench-stage-fill); box-shadow: none; } .game-workbench-stage > .game-resource-manager { grid-row: 3; min-height: 0; } .game-workbench-chat { border-color: var(--platform-line-soft); box-shadow: var(--platform-nav-active-shadow); } .game-workbench-stage[data-resource-view-state='resources.ui-editor'] { grid-template-rows: auto minmax(0, 1fr); } .game-workbench-stage[data-resource-view-state='resources.ui-editor'] > div:last-child { grid-row: 2; min-height: 0; } .game-workbench-toolbar { position: relative; display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 48px; padding: 8px 12px; background: transparent; } /* 左侧控件组:「资源管理 / 运行」分段 + 紧贴其后的「播放」。 * 整组在工具条里左对齐,取代播放按钮原先的居中悬浮(absolute + translateX(-50%))。 */ .game-workbench-view-tabs { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; } .game-workbench-tabs, .game-workbench-view-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; } .game-workbench-tabs { padding: 3px; border: 1px solid var(--platform-subpanel-border); border-radius: 999px; background: var(--platform-nav-fill); } .game-resource-sort-tabs { flex-wrap: nowrap; gap: 0; padding: 0; overflow: hidden; } /* 「依赖 / 类型」内部用 0 间距(共享边界的连通分段),但与同一行其他按钮之间必须跟行的间距 * 一致:这一行是 `gap: 7px` 的 flex 容器,分段控件曾在它里面自带 `padding: 3px`,靠那 3px * 把自己和前一枚按钮顶开,于是「整理画布 → 生成任务 → 依赖」的视觉间距只有 10px, * 而其余按钮之间是 24px——一行里两套间距。这里把它补到 24px,整行只剩一套间距。 */ .game-workbench-tabs.game-resource-sort-tabs { margin-left: 17px; } .game-workbench-tabs.game-resource-sort-tabs button { min-height: 36px; border: 0; border-radius: 0; } .game-workbench-tabs.game-resource-sort-tabs button + button { border-left: 1px solid var(--platform-subpanel-border); } .game-workbench-tabs.game-resource-sort-tabs button.is-active { border-color: transparent; } /* 左侧控件组里的按钮(目前只有「播放」)与分段控件、右侧动作区共用同一套基础外观。 */ .game-workbench-tabs button, .game-workbench-view-tabs button, .game-workbench-view-actions button { display: inline-flex; align-items: center; justify-content: center; gap: 5px; min-height: 30px; padding: 0 11px; border: 1px solid transparent; border-radius: 999px; background: transparent; color: var(--platform-button-ghost-text); font-size: 12px; font-weight: 700; white-space: nowrap; cursor: pointer; } .game-workbench-tabs button:focus-visible, .game-workbench-view-tabs button:focus-visible, .game-workbench-view-actions button:focus-visible, .game-workbench-approval-trigger:focus-visible, .game-agent-dock-more:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--platform-input-focus-ring); } .game-workbench-tabs.game-resource-sort-tabs button:focus-visible { box-shadow: inset 0 0 0 3px var(--platform-input-focus-ring); } .game-workbench-tabs button.is-active, .game-workbench-view-actions button.is-active { border-color: var(--platform-button-primary-border); background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); } .game-workbench-tabs button:disabled, .game-workbench-tabs button[data-unavailable='true'] { color: var(--platform-text-muted); cursor: not-allowed; opacity: 0.6; } .game-workbench-view-actions button { border-color: var(--platform-surface-border); background: var(--platform-button-secondary-fill); color: var(--platform-button-secondary-text); } /* 「播放」与「资源管理 / 运行」同组,外观仍按主按钮走;禁用时退回次级按钮。 */ .game-workbench-view-tabs .game-workbench-play-button { position: static; border-color: var(--platform-button-primary-border); background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); transform: none; } .game-workbench-view-tabs .game-workbench-play-button:disabled { border-color: var(--platform-surface-border); background: var(--platform-button-secondary-fill); color: var(--platform-text-muted); cursor: not-allowed; opacity: 0.6; } .game-workbench-view-actions .game-workbench-inspect-button.is-active { border-color: var(--platform-button-primary-border); background: var(--platform-button-primary-fill); color: var(--platform-button-primary-text); } /** * 布局状态提示:**绝对定位,不参与动作行的排版**。 * * 它不是按钮,但曾经是动作行里的一个 flex 子项:文案从空 →「保存中」→「布局已保存」→ * 失败原因会随保存过程变长,于是把右侧那几枚按钮按文本宽度顶开——同一行在不同时刻的按钮 * 间距就不一样(实测同一份截图里「整理画布 → 生成任务」的空隙 80px,其余两处 64/66px, * 差值正是这条提示当时的宽度)。定位后位置固定,行内只剩按钮之间那一套间距。 */ .game-resource-reorder-status { position: absolute; bottom: 4px; left: 12px; max-width: calc(100% - 24px); overflow: hidden; color: #9a725f; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } .game-run-unavailable { margin: 0; padding: 7px 14px; border-bottom: 1px solid #f0dfd7; background: #fffaf0; color: #9b6c45; font-size: 11px; } .game-resource-manager { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; } .game-resource-book-manager { position: relative; overflow: hidden; background: #fffdfa; } .game-resource-book-scene { position: absolute; z-index: 20; /* 铺满管理区:栏目标题栏、栏目大纲与资源卡都从管理区顶边开始正常占位。 */ inset: 0; overflow: hidden; pointer-events: none; transition: none; } .game-resource-book-scene-world { position: absolute; inset: 0; transform-origin: 0 0; transition: none; } .game-resource-book-scene--child { pointer-events: auto; } .game-resource-book-zoom { position: absolute; right: 14px; bottom: 14px; z-index: 40; display: inline-flex; align-items: center; gap: 2px; height: 34px; padding: 0 4px; border: 1px solid #ecdcd4; border-radius: 12px; background: rgb(255 253 250 / 94%); box-shadow: 0 6px 18px rgb(112 70 52 / 12%); backdrop-filter: blur(6px); } .game-resource-book-zoom-button, .game-resource-book-zoom-fit { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; padding: 0; border: 0; border-radius: 8px; background: transparent; color: #8c6252; cursor: pointer; } .game-resource-book-zoom-button:hover, .game-resource-book-zoom-button:focus-visible, .game-resource-book-zoom-fit:hover, .game-resource-book-zoom-fit:focus-visible { background: #f7ebe4; color: #b5582f; outline: 0; } .game-resource-book-zoom-value { min-width: 42px; color: #6d4b3f; font-size: 11px; font-variant-numeric: tabular-nums; text-align: center; white-space: nowrap; } .game-resource-book-zoom-fit { margin-left: 2px; } .game-resource-book-scene--main.is-measuring { visibility: hidden; } .game-resource-book-scene::before { position: absolute; z-index: 0; inset: 0; background: radial-gradient(#eaded8 0.8px, transparent 0.8px) 0 0 / 18px 18px, #fffdfa; content: ''; opacity: 0; pointer-events: none; transition: none; } .game-resource-book-scene--child::before { opacity: 1; } .game-resource-book-scene-titlebar { position: absolute; z-index: 30; min-height: 42px; border: 1px solid #ebd9cf; border-radius: 16px 16px 0 0; background: rgb(255 250 246 / 96%); box-shadow: 0 8px 18px rgb(112 70 52 / 8%); pointer-events: none; transform: translateY(0); /* FLIP 反向 transform 围绕节点自身原点缩放。 */ transform-origin: 0 0; transition: none; } .game-resource-book-scene-titlebar.is-active { border-radius: 0; pointer-events: auto; } .game-resource-book-scene-titlebar .game-resource-book-titlebar { min-height: 42px; border-bottom: 0; background: transparent; } /* * 卡片宿主节点。`--preview` 是「所有资源」卡那一摞预览的宿主:几何与外观和栏目卡的 * 宿主完全共用(它同样是 0x0 的定位包装 + `renderCard` 出的真实卡片), * 但刻意不叫 `.game-resource-book-scene-card`——转场层按这个类名收集 FLIP 节点, * 而同一张资源卡在它自己的栏目摞里已经是一个可选中、带记录的宿主了。 */ .game-resource-book-scene-card, .game-resource-book-preview-card { position: absolute; z-index: 25; pointer-events: none; /* 卡片包装节点是 0x0,FLIP 反向 transform 围绕它的原点缩放。 */ transform-origin: 0 0; translate: 0 0; transition: none; } /* 缩略卡悬停 / 聚焦时高亮它所在栏目(那一摞)的标题条。 取值必须与 `PROJECT_RESOURCE_CANVAS_SECTIONS`(7 个现行分区)逐一对齐: `code` / `art` 是旧四、五栏目的历史值,总览里不会渲染,写它们等于空规则; 少写一个现行分区,对应栏目就完全没有悬停高亮。 */ .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='ui-interaction']:hover, .game-resource-book-thumbnail[data-resource-book-category='ui-interaction']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='ui-interaction'], .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='character']:hover, .game-resource-book-thumbnail[data-resource-book-category='character']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='character'], .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='scene']:hover, .game-resource-book-thumbnail[data-resource-book-category='scene']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='scene'], .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='audio']:hover, .game-resource-book-thumbnail[data-resource-book-category='audio']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='audio'], .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='document']:hover, .game-resource-book-thumbnail[data-resource-book-category='document']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='document'], .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='unclassified']:hover, .game-resource-book-thumbnail[data-resource-book-category='unclassified']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='unclassified'], .game-resource-book-manager--main:has( .game-resource-book-thumbnail[data-resource-book-category='version']:hover, .game-resource-book-thumbnail[data-resource-book-category='version']:focus-visible ) .game-resource-book-scene-titlebar[data-resource-book-category='version'] { border-top-color: #cc8060; border-right-color: #cc8060; border-bottom-color: #ebd9cf; border-left-color: #cc8060; } .game-resource-book-scene-card .game-resource-card, .game-resource-book-preview-card .game-resource-card { transition: box-shadow 180ms ease; } .game-resource-book-scene--main .game-resource-book-scene-card .game-resource-card, .game-resource-book-scene--main .game-resource-book-preview-card .game-resource-card { border-radius: 10px; box-shadow: 0 5px 12px rgb(112 70 52 / 10%); } .game-resource-book-scene--child .game-resource-book-scene-card.is-expanded .game-resource-card { border-radius: 12px; } .game-resource-book-main.is-background, .game-resource-canvas.is-background { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; pointer-events: none; } .game-resource-book-thumbnail-titlebar--placeholder { min-height: 42px; border-bottom: 1px solid #f0e2da; background: rgb(255 250 246 / 90%); } .game-resource-book-main { position: absolute; inset: 0; overflow: hidden; touch-action: none; user-select: none; cursor: grab; background: radial-gradient(#eaded8 0.8px, transparent 0.8px) 0 0 / 18px 18px, linear-gradient(145deg, #fffdfa 0%, #fff8f2 100%); } .game-resource-book-main:active { cursor: grabbing; } .game-resource-book-main-world { display: flex; flex-direction: column; min-height: 100%; padding: clamp(24px, 4vw, 52px); transform-origin: 0 0; } /* * `width: 100%` 与下面的 `.game-resource-book-main-grid` 是同一条约束,别删。 * * 这两块都是 `.game-resource-book-main-world`(`display: flex; flex-direction: column`) * 的子项,而交叉轴上的 auto 外边距(`margin: 0 auto`)会吃掉全部自由空间并取消 `stretch`, * 使子项退化成 **fit-content** 定宽:标题栏于是只占 `
`,而全局规则给段落留了 `margin: 8px 0 0`: 输入区自己的文字因此比 hint(绝对定位在 top:0 的 span)低 8px,看起来就是 "光标和 hint 没对齐"。这里把段落在编辑器内清零,光标与 hint 落在同一行盒。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer .resource-reference-input-editor p { margin: 0; } /* 陶泥儿输入区的操作排(`AI 润色` / `恢复原文`)回到文档流:网格第二行右侧那一列, `justify-content: flex-end` 贴住输入框右下角。之前这里用 `position: absolute; right: 48px; bottom: 10px` 把整排从网格里摘出来浮在输入框中间, AI 润色因此看起来压在文本区里、和下面那排主操作(`.project-supervisor-composer-controls` 的 `@` / 快速 / 发送)脱节。 不设 `min-height`:这一行的高度由 28px 方钮自己撑开,行高一旦被顶起来会连带把 编辑器的 `min-height: 96px` 改掉。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer .resource-reference-input-actions { grid-row: 2; grid-column: 2; position: static; display: flex; align-items: end; justify-content: flex-end; min-width: 0; height: auto; } /* 「润色中… / 润色失败」和应用排**同一行**:状态文字在第二行左侧那一列(占剩余宽度), 操作排在第二行右侧那一列。单独占一行会把输入框整体顶高一个状态行的距离;而给它 `grid-column: 1 / -1` 又会和操作排落进同一个网格单元互相重叠(状态文字长时压到按钮下面)。 共行分列则状态出现/消失都不改变输入框高度,也不会互相压。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-composer .resource-reference-input-status { grid-row: 2; grid-column: 1; align-self: center; min-width: 0; margin-top: 0; } /* direct-codex 里 `ResourceReferenceInput` 收到的是 `showTriggerButton={!directCodex}`, 即输入框内的 `.resource-reference-input-at` 根本不会渲染(`@` 触发钮是下面控制排里的 `.project-supervisor-reference-trigger`)。这里原本有一条针对它的 `position: static !important` / 30px 主色方块规则,永远匹配不到,已删除; 要改 direct-codex 的 `@` 触发钮外观请改 `.project-supervisor-reference-trigger`。 */ .design-agent-reasoning { margin: 8px 0; } .design-agent-reasoning summary { cursor: pointer; } .design-agent-reasoning pre { margin: 6px 0 0; white-space: pre-wrap; font: inherit; } /* ============================================================ 右侧对话面板 Codex 风格(2026-07):整块替换原 direct-codex 输入区浮层布局 ============================================================ 面板结构从「消息列表当外框、输入区绝对定位浮在它底部」改成 Codex 桌面客户端的三段式: 顶部极简条(状态点 + 状态文案 + 设置齿轮)/ 消息列表(唯一滚动区,flex:1)/ 输入盒 (文档流,整块面板里唯一有边框的容器)。 上面几条同名旧规则已就地改写成新几何(不再有 position: absolute 与 196px/256px 底边 留白),这里只补新增节点的样式,并把旧的绿系执行过程卡收进暖色系。 全部颜色只用现有 `--platform-*` 变量,浅色主题下成立。 */ /* 顶部极简条:44px 高、无独立背景块,只有一条极细分隔线。 左右内缩与消息内容 / 输入盒统一为 16px(面板自身 padding 已归 0)。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar { display: flex; align-items: center; justify-content: space-between; gap: 8px; min-height: 44px; flex: 0 0 auto; padding: 0 16px; border-bottom: 1px solid var(--platform-line-soft); background: transparent; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar-status { display: flex; align-items: center; gap: 7px; min-width: 0; color: var(--platform-text-base); font-size: 12px; line-height: 1.5; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar-status > span:last-child { min-width: 0; overflow-wrap: anywhere; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar-dot { width: 7px; height: 7px; flex: 0 0 7px; border: 1px solid var(--platform-button-primary-border); border-radius: 50%; background: var(--platform-neutral-bg); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-topbar-dot.is-busy { border-color: transparent; background: var(--platform-accent); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-settings-trigger { display: grid; width: 28px; min-width: 28px; height: 28px; min-height: 28px; flex: 0 0 28px; padding: 0; place-items: center; border: 0; border-radius: 8px; background: transparent; color: var(--platform-text-soft); cursor: pointer; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-settings-trigger:hover, .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-settings-trigger:focus-visible { background: var(--platform-button-ghost-fill); color: var(--platform-text-strong); outline: none; } /* 空态:整块消息区水平垂直居中。标题允许换行(面板只有 340–520px,不写 nowrap)。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-empty-state { display: flex; height: 100%; min-height: 100%; flex-direction: column; align-items: center; justify-content: center; gap: 10px; padding: 24px 16px; color: var(--platform-text-soft); text-align: center; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-empty-state > svg { color: var(--platform-line-soft); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-empty-state > strong { max-width: 100%; color: var(--platform-text-strong); font-size: 15px; font-weight: 600; line-height: 1.5; white-space: normal; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-empty-state > small { max-width: 100%; color: var(--platform-text-soft); font-size: 12px; line-height: 1.6; white-space: normal; } /* 执行过程卡在暖色皮肤下不再用绿色系:改成中性描边 + 暖底,主色只留给状态点与发送钮。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list > .project-supervisor-process-card { border-color: var(--platform-line-soft); background: var(--platform-neutral-bg); } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-message-list > .project-supervisor-process-card > header > span { background: var(--platform-accent); } /* 设置浮层(新增):独立 backdrop + dialog,不再往面板下面追加内容。 */ .project-supervisor-settings-backdrop { position: fixed; top: var(--window-chrome-height); right: 0; bottom: 0; left: 0; z-index: 240; display: grid; padding: 20px; background: rgb(65 43 34 / 42%); place-items: center; } .project-supervisor-settings-dialog { display: grid; gap: 12px; width: min(420px, 100%); max-height: calc(100dvh - var(--window-chrome-height) - 40px); padding: 16px; overflow: auto; border: 1px solid var(--platform-surface-border); border-radius: 18px; background: var(--platform-modal-fill); color: var(--platform-text-strong); box-shadow: 0 24px 64px rgb(62 37 27 / 24%); } .project-supervisor-settings-dialog > header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; } .project-supervisor-settings-dialog h2, .project-supervisor-settings-dialog small { margin: 0; } .project-supervisor-settings-dialog h2 { font-size: 15px; } .project-supervisor-settings-dialog > header small { display: block; margin-top: 3px; color: var(--platform-text-soft); font-size: 11px; } .project-supervisor-settings-close { display: grid; width: 28px; min-width: 28px; height: 28px; min-height: 28px; flex: 0 0 28px; padding: 0; place-items: center; border: 0; border-radius: 8px; background: transparent; color: var(--platform-text-soft); cursor: pointer; } .project-supervisor-settings-close:hover, .project-supervisor-settings-close:focus-visible { background: var(--platform-button-ghost-fill); color: var(--platform-text-strong); outline: none; } .project-supervisor-settings-rows { display: grid; gap: 8px; } .project-supervisor-settings-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; min-width: 0; padding: 10px 12px; border: 1px solid var(--platform-surface-border); border-radius: 12px; background: var(--platform-button-secondary-fill); color: var(--platform-text-base); font: inherit; text-align: left; cursor: pointer; } .project-supervisor-settings-row.is-static { cursor: default; } .project-supervisor-settings-row:hover:not(.is-static), .project-supervisor-settings-row:focus-visible { border-color: var(--platform-surface-hover-border); color: var(--platform-text-strong); outline: none; } .project-supervisor-settings-row-main { display: flex; align-items: center; gap: 9px; min-width: 0; } .project-supervisor-settings-row-main > svg { flex: 0 0 auto; color: var(--platform-accent); } .project-supervisor-settings-row-main > span { display: grid; gap: 2px; min-width: 0; } .project-supervisor-settings-row-main strong { color: var(--platform-text-strong); font-size: 13px; } .project-supervisor-settings-row-main small { color: var(--platform-text-soft); font-size: 11px; } /* 泥点那一行:`walletEntry` 来自父级,自身不承载取数逻辑。 */ .project-supervisor-settings-row .game-workbench-chat-wallet { margin-left: auto; } /* 面板纵向布局兜底(实测修复,2026-07): 只改 `.game-workbench-chat .project-supervisor-surface.is-direct-codex` 的几何还不够—— 更早那条 `.game-workbench-chat .project-supervisor-surface { display: grid; ... }` 特异性同为 3 个类且写在前面,面板实际仍是「单行 grid」,`.project-supervisor-conversation` 被当成 grid 轨道拉高到面板高度;同时基础规则 `.project-supervisor-message-list { min-height: 340px }` 又给列表压了 340px 下限,两者叠加后列表被内容撑到数千像素、输入盒被顶到面板之外不可见。 这里显式把 surface / conversation 改成 flex 纵向链(多带一层 `.message-list` 提高特异性), 并解除列表的 340px 下限,保证「消息列表是唯一滚动区、输入盒恒在面板底部」。 */ .game-workbench-chat .project-supervisor-surface.is-direct-codex .message-list.project-supervisor-message-list { min-height: 0; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-conversation { display: flex; height: 100%; min-height: 0; flex-direction: column; grid-template-rows: none; gap: 0; } .game-workbench-chat .project-supervisor-surface.is-direct-codex .project-supervisor-conversation > .message-list.project-supervisor-message-list { min-height: 0; flex: 1 1 auto; } /* ============================================================ 工具调用折叠块(2026-09):一回合一个块,Codex 风格 ============================================================ 契约见 `docs/technical/【技术方案】GameAgent对话工具调用卡片-2026-09-14.md`: 块头一行浅底圆角条目(图标 / 汇总 / 结束时间 / 总用时 / 折角),展开态每行一条工具, 行右侧是对齐的耗时,行可二级展开看命令、文件明细与输出。 折叠由 `