MicroFish/frontend/src/App.vue

1045 lines
33 KiB
Vue

<template>
<div class="app-shell">
<div v-if="!isAuthed" class="demo-login">
<form class="demo-login__panel" @submit.prevent="submitPassword">
<div class="demo-login__brand">
<span class="brand-mark">
<span class="brand-mark-en">FORESIGHT</span>
<span class="brand-mark-sep"></span>
<span class="brand-mark-zh">先见之明</span>
</span>
</div>
<h1>AI DEMO 预览</h1>
<p>请输入演示密码进入现场回溯系统。</p>
<input
v-model="authInput"
class="demo-login__input"
type="password"
autocomplete="current-password"
placeholder="演示密码"
autofocus
/>
<button class="demo-login__button" type="submit">进入演示</button>
<p v-if="authError" class="demo-login__error">{{ authError }}</p>
</form>
</div>
<template v-else>
<Teleport to="#theme-toggle-anchor" v-if="anchorReady">
<button
class="theme-toggle"
:class="`theme-toggle--${theme}`"
type="button"
:aria-label="theme === 'dark' ? '切换为白天模式' : '切换为黑夜模式'"
:title="theme === 'dark' ? '白天模式' : '黑夜模式'"
@click="toggleTheme"
>
<svg
v-if="theme === 'dark'"
class="theme-toggle__icon"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.8"
stroke-linecap="round"
stroke-linejoin="round"
>
<circle cx="12" cy="12" r="4.2" />
<path d="M12 2.5v2.2" />
<path d="M12 19.3v2.2" />
<path d="M4.93 4.93l1.56 1.56" />
<path d="M17.51 17.51l1.56 1.56" />
<path d="M2.5 12h2.2" />
<path d="M19.3 12h2.2" />
<path d="M4.93 19.07l1.56-1.56" />
<path d="M17.51 6.49l1.56-1.56" />
</svg>
<svg
v-else
class="theme-toggle__icon"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.8"
stroke-linecap="round"
stroke-linejoin="round"
>
<path d="M20.3 14.3A8.9 8.9 0 0 1 9.7 3.7a9.1 9.1 0 1 0 10.6 10.6Z" />
</svg>
</button>
</Teleport>
<router-view />
</template>
</div>
</template>
<script setup>
import { onMounted, ref, watch, nextTick } from 'vue'
import { useRouter } from 'vue-router'
const router = useRouter()
const THEME_STORAGE_KEY = 'foresight-ui-theme'
const AUTH_STORAGE_KEY = 'foresight-demo-auth'
const DEMO_PASSWORD = import.meta.env.VITE_DEMO_PASSWORD || ''
const theme = ref('light')
const anchorReady = ref(false)
const authInput = ref('')
const authError = ref('')
const isAuthed = ref(!DEMO_PASSWORD)
const applyTheme = (nextTheme) => {
document.documentElement.setAttribute('data-theme', nextTheme)
document.documentElement.style.colorScheme = nextTheme
document.body.setAttribute('data-theme', nextTheme)
}
const toggleTheme = () => {
theme.value = theme.value === 'dark' ? 'light' : 'dark'
}
const checkAnchor = () => {
anchorReady.value = !!document.getElementById('theme-toggle-anchor')
}
const submitPassword = () => {
if (!DEMO_PASSWORD || authInput.value === DEMO_PASSWORD) {
window.localStorage.setItem(AUTH_STORAGE_KEY, 'ok')
authError.value = ''
isAuthed.value = true
nextTick(checkAnchor)
return
}
authError.value = '密码不正确,请重新输入'
}
onMounted(() => {
if (DEMO_PASSWORD && window.localStorage.getItem(AUTH_STORAGE_KEY) === 'ok') {
isAuthed.value = true
}
const savedTheme = window.localStorage.getItem(THEME_STORAGE_KEY)
if (savedTheme === 'dark' || savedTheme === 'light') {
theme.value = savedTheme
} else {
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
theme.value = prefersDark ? 'dark' : 'light'
}
applyTheme(theme.value)
nextTick(checkAnchor)
})
watch(theme, (nextTheme) => {
applyTheme(nextTheme)
window.localStorage.setItem(THEME_STORAGE_KEY, nextTheme)
window.dispatchEvent(new CustomEvent('foresight-theme-change', { detail: { theme: nextTheme } }))
})
router.afterEach(() => {
anchorReady.value = false
nextTick(checkAnchor)
})
</script>
<style>
:root {
--ui-bg: #ffffff;
--ui-surface: rgba(255, 255, 255, 0.92);
--ui-surface-strong: #ffffff;
--ui-text: #101321;
--ui-muted: #5f677b;
--ui-border: rgba(16, 19, 33, 0.12);
--ui-shadow: 0 18px 40px rgba(11, 19, 36, 0.12);
--ui-shadow-strong: 0 18px 44px rgba(11, 19, 36, 0.18);
--theme-toggle-fg: rgba(18, 24, 38, 0.86);
}
html, html[data-theme='light'] {
background: #ffffff !important;
}
html[data-theme='dark'][data-theme='dark'] {
background: #000000 !important;
}
html[data-theme='dark'] {
--ui-bg: #000000;
--ui-surface: #111111;
--ui-surface-strong: #1a1a1a;
--ui-text: #edf2ff;
--ui-muted: #94a2be;
--ui-border: rgba(255, 255, 255, 0.08);
--ui-shadow: 0 24px 56px rgba(0, 0, 0, 0.34);
--ui-shadow-strong: 0 28px 64px rgba(0, 0, 0, 0.42);
--theme-toggle-fg: rgba(242, 246, 255, 0.92);
}
/* 全局样式重置 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body,
#app,
.app-shell {
min-height: 100%;
}
body,
#app {
font-family: 'JetBrains Mono', 'Space Grotesk', 'Noto Sans SC', monospace;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: var(--ui-text);
background:
radial-gradient(circle at top right, rgba(110, 124, 155, 0.12), transparent 20%),
radial-gradient(circle at bottom left, rgba(110, 124, 155, 0.08), transparent 24%),
var(--ui-bg);
transition: background-color 220ms ease, color 220ms ease;
}
html[data-theme='dark'] body,
html[data-theme='dark'] #app {
background: #000000;
}
.app-shell {
position: relative;
}
.demo-login {
min-height: 100vh;
padding: 32px;
display: flex;
align-items: center;
justify-content: center;
background:
linear-gradient(135deg, rgba(16, 19, 33, 0.06), rgba(16, 19, 33, 0)),
var(--ui-bg);
}
.demo-login__panel {
width: min(420px, 100%);
padding: 34px 32px 30px;
border: 1px solid var(--ui-border);
border-radius: 8px;
background: var(--ui-surface-strong);
box-shadow: var(--ui-shadow);
}
.demo-login__brand {
margin-bottom: 22px;
color: var(--ui-muted);
font-size: 13px;
}
.demo-login h1 {
margin-bottom: 10px;
color: var(--ui-text);
font-size: 28px;
line-height: 1.18;
font-weight: 700;
letter-spacing: 0;
}
.demo-login p {
color: var(--ui-muted);
font-size: 14px;
line-height: 1.7;
}
.demo-login__input {
width: 100%;
height: 46px;
margin-top: 24px;
padding: 0 14px;
border: 1px solid var(--ui-border);
border-radius: 6px;
outline: none;
background: var(--ui-bg);
color: var(--ui-text);
font: inherit;
}
.demo-login__input:focus {
border-color: rgba(86, 126, 255, 0.72);
box-shadow: 0 0 0 3px rgba(86, 126, 255, 0.14);
}
.demo-login__input::placeholder {
color: var(--ui-muted);
}
.demo-login__button {
width: 100%;
height: 46px;
margin-top: 14px;
border: none;
border-radius: 6px;
background: #101321;
color: #ffffff;
font: inherit;
font-weight: 700;
cursor: pointer;
}
.demo-login__button:hover {
background: #232838;
}
.demo-login__error {
margin-top: 12px;
color: #c93f3f !important;
}
html[data-theme='dark'] .demo-login {
background:
linear-gradient(135deg, rgba(86, 126, 255, 0.12), rgba(86, 126, 255, 0)),
#000000;
}
html[data-theme='dark'] .demo-login__button {
background: #f4f7ff;
color: #05070d;
}
html[data-theme='dark'] .demo-login__button:hover {
background: #dfe7ff;
}
html[data-theme='dark'] .demo-login__error {
color: #ff8f8f !important;
}
.brand-mark {
display: inline-flex;
align-items: baseline;
white-space: nowrap;
}
.brand-mark-en {
letter-spacing: 0.08em;
}
.brand-mark-sep {
display: inline-block;
width: 1em;
}
.brand-mark-zh {
font-family: 'FangSong', 'STFangsong', 'Songti SC', serif;
letter-spacing: 0;
}
.theme-toggle {
position: relative;
width: 18px;
height: 18px;
padding: 0;
border: none;
background: transparent;
color: var(--theme-toggle-fg);
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
opacity: 0.92;
}
.theme-toggle__icon {
width: 16px;
height: 16px;
}
/* 滚动条样式 */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: rgba(127, 136, 152, 0.12);
}
::-webkit-scrollbar-thumb {
background: rgba(16, 19, 33, 0.46);
}
::-webkit-scrollbar-thumb:hover {
background: rgba(16, 19, 33, 0.7);
}
/* 全局按钮样式 */
button {
font-family: inherit;
}
/* 深色模式覆盖:优先接住现有界面里的主要容器和卡片 */
html[data-theme='dark'] .navbar,
html[data-theme='dark'] .app-header,
html[data-theme='dark'] .main-view,
html[data-theme='dark'] .content-area,
html[data-theme='dark'] .panel-wrapper,
html[data-theme='dark'] .left-panel,
html[data-theme='dark'] .right-panel,
html[data-theme='dark'] .graph-panel,
html[data-theme='dark'] .detail-panel,
html[data-theme='dark'] .detail-panel-large,
html[data-theme='dark'] .step-card,
html[data-theme='dark'] .info-card,
html[data-theme='dark'] .stat-card,
html[data-theme='dark'] .profile-card,
html[data-theme='dark'] .config-block,
html[data-theme='dark'] .agent-card,
html[data-theme='dark'] .platform-card,
html[data-theme='dark'] .phase-card,
html[data-theme='dark'] .process-phase,
html[data-theme='dark'] .log-container,
html[data-theme='dark'] .logs-panel,
html[data-theme='dark'] .report-panel,
html[data-theme='dark'] .interaction-panel,
html[data-theme='dark'] .tools-card,
html[data-theme='dark'] .project-header,
html[data-theme='dark'] .modal-content,
html[data-theme='dark'] .summary-card,
html[data-theme='dark'] .result-card,
html[data-theme='dark'] .analysis-card,
html[data-theme='dark'] .workspace-card,
html[data-theme='dark'] .preview-card,
html[data-theme='dark'] .setup-panel,
html[data-theme='dark'] .env-setup-panel,
html[data-theme='dark'] .config-detail-panel,
html[data-theme='dark'] .view-switcher,
html[data-theme='dark'] .workflow-step,
html[data-theme='dark'] .nav-status,
html[data-theme='dark'] .graph-building-hint,
html[data-theme='dark'] .timeline-breakdown,
html[data-theme='dark'] .detail-content,
html[data-theme='dark'] .detail-row,
html[data-theme='dark'] .empty-state,
html[data-theme='dark'] .log-entry,
html[data-theme='dark'] .results-header,
html[data-theme='dark'] .action-bar,
html[data-theme='dark'] .tools-card-body,
html[data-theme='dark'] .profile-card-body,
html[data-theme='dark'] .section-body,
html[data-theme='dark'] .scroll-container {
background: transparent !important;
color: var(--ui-text) !important;
border-color: var(--ui-border) !important;
}
html[data-theme='dark'] .left-panel,
html[data-theme='dark'] .right-panel,
html[data-theme='dark'] .step-card,
html[data-theme='dark'] .info-card,
html[data-theme='dark'] .profile-card,
html[data-theme='dark'] .agent-card,
html[data-theme='dark'] .platform-card,
html[data-theme='dark'] .process-phase,
html[data-theme='dark'] .timeline-card,
html[data-theme='dark'] .timeline-content,
html[data-theme='dark'] .narrative-box,
html[data-theme='dark'] .reasoning-item,
html[data-theme='dark'] .config-item,
html[data-theme='dark'] .period-item,
html[data-theme='dark'] .platform-status,
html[data-theme='dark'] .auto-info-card,
html[data-theme='dark'] .duration-badge,
html[data-theme='dark'] .profile-modal,
html[data-theme='dark'] .modal-header,
html[data-theme='dark'] .section-bio,
html[data-theme='dark'] .dimension-card,
html[data-theme='dark'] .actions-tooltip,
html[data-theme='dark'] .detail-panel,
html[data-theme='dark'] .graph-legend,
html[data-theme='dark'] .edge-labels-toggle,
html[data-theme='dark'] .tool-btn {
background: #141414 !important;
border-color: rgba(255, 255, 255, 0.08) !important;
box-shadow: var(--ui-shadow) !important;
}
html[data-theme='dark'] .panel-header,
html[data-theme='dark'] .card-header,
html[data-theme='dark'] .phase-header,
html[data-theme='dark'] .config-block-header,
html[data-theme='dark'] .profile-header,
html[data-theme='dark'] .agent-card-header,
html[data-theme='dark'] .platform-card-header,
html[data-theme='dark'] .preview-header,
html[data-theme='dark'] .project-title-row,
html[data-theme='dark'] .detail-panel-header {
border-color: var(--ui-border) !important;
}
html[data-theme='dark'] input,
html[data-theme='dark'] textarea,
html[data-theme='dark'] select,
html[data-theme='dark'] .search-input,
html[data-theme='dark'] .prompt-input,
html[data-theme='dark'] .dropdown-menu,
html[data-theme='dark'] .dropdown-list {
background: var(--ui-surface-strong) !important;
color: var(--ui-text) !important;
border-color: var(--ui-border) !important;
}
html[data-theme='dark'] .description,
html[data-theme='dark'] .api-note,
html[data-theme='dark'] .info-label,
html[data-theme='dark'] .stat-label,
html[data-theme='dark'] .config-item-label,
html[data-theme='dark'] .param-label,
html[data-theme='dark'] .period-label,
html[data-theme='dark'] .log-time,
html[data-theme='dark'] .meta-label,
html[data-theme='dark'] .detail-label,
html[data-theme='dark'] .step-name,
html[data-theme='dark'] .status-text,
html[data-theme='dark'] .timeline-label,
html[data-theme='dark'] .config-label,
html[data-theme='dark'] .param-label,
html[data-theme='dark'] .section-subtitle,
html[data-theme='dark'] .preview-subtitle {
color: var(--ui-muted) !important;
}
html[data-theme='dark'] .step-num,
html[data-theme='dark'] .step-badge,
html[data-theme='dark'] .header-title,
html[data-theme='dark'] .detail-title,
html[data-theme='dark'] .detail-value,
html[data-theme='dark'] .info-value,
html[data-theme='dark'] .stat-value,
html[data-theme='dark'] .profile-realname,
html[data-theme='dark'] .profile-username,
html[data-theme='dark'] .profile-profession,
html[data-theme='dark'] .profile-bio,
html[data-theme='dark'] .agent-name,
html[data-theme='dark'] .agent-id,
html[data-theme='dark'] .config-item-value,
html[data-theme='dark'] .param-value,
html[data-theme='dark'] .period-hours,
html[data-theme='dark'] .period-multiplier,
html[data-theme='dark'] .status-indicator,
html[data-theme='dark'] .status-indicator .dot,
html[data-theme='dark'] .project-title,
html[data-theme='dark'] .preview-title,
html[data-theme='dark'] .section-title,
html[data-theme='dark'] .result-title {
color: var(--ui-text) !important;
}
html[data-theme='dark'] .badge.pending,
html[data-theme='dark'] .status-badge,
html[data-theme='dark'] .topic-tag,
html[data-theme='dark'] .agent-type {
border-color: rgba(255, 255, 255, 0.1) !important;
}
html[data-theme='dark'] .switch-btn,
html[data-theme='dark'] .action-btn,
html[data-theme='dark'] .detail-close {
color: var(--ui-text) !important;
border-color: var(--ui-border) !important;
}
html[data-theme='dark'] .switch-btn:not(.active) {
background: rgba(255, 255, 255, 0.04) !important;
}
html[data-theme='dark'] .app-header,
html[data-theme='dark'] .navbar {
background: #000000 !important;
color: var(--ui-text) !important;
border-bottom: 1px solid rgba(255, 255, 255, 0.08) !important;
box-shadow: 0 10px 28px rgba(0, 0, 0, 0.3) !important;
}
html[data-theme='dark'] .main-view {
background: transparent !important;
}
html[data-theme='dark'] .content-area,
html[data-theme='dark'] .panel-wrapper,
html[data-theme='dark'] .env-setup-panel,
html[data-theme='dark'] .main-content-area {
background: transparent !important;
}
html[data-theme='dark'] .panel-wrapper.left {
border-right: 1px solid rgba(255, 255, 255, 0.08) !important;
}
html[data-theme='dark'] .view-switcher {
background: #111111 !important;
border: 1px solid rgba(255, 255, 255, 0.08) !important;
box-shadow: none !important;
}
html[data-theme='dark'] .switch-btn.active {
background: #222222 !important;
color: #ffffff !important;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3) !important;
}
html[data-theme='dark'] .toggle-label,
html[data-theme='dark'] .legend-label,
html[data-theme='dark'] .section-desc,
html[data-theme='dark'] .reasoning-text,
html[data-theme='dark'] .content-text,
html[data-theme='dark'] .quote-header,
html[data-theme='dark'] .repost-info,
html[data-theme='dark'] .like-info,
html[data-theme='dark'] .search-info,
html[data-theme='dark'] .follow-info,
html[data-theme='dark'] .vote-info,
html[data-theme='dark'] .idle-info,
html[data-theme='dark'] .comment-context,
html[data-theme='dark'] .card-footer,
html[data-theme='dark'] .platform-name,
html[data-theme='dark'] .tooltip-title,
html[data-theme='dark'] .topic-more,
html[data-theme='dark'] .legend-count {
color: var(--ui-muted) !important;
}
html[data-theme='dark'] .panel-title,
html[data-theme='dark'] .post-role,
html[data-theme='dark'] .total-count,
html[data-theme='dark'] .hot-topic-tag,
html[data-theme='dark'] .desc-highlight,
html[data-theme='dark'] .highlight-tip {
color: var(--ui-text) !important;
}
html[data-theme='dark'] .switch-btn:not(.active) {
color: var(--ui-muted) !important;
}
html[data-theme='dark'] .step-num,
html[data-theme='dark'] .status-indicator,
html[data-theme='dark'] .status-text,
html[data-theme='dark'] .step-name,
html[data-theme='dark'] .step-divider {
color: #dddddd !important;
}
html[data-theme='dark'] .step-divider {
background-color: rgba(255, 255, 255, 0.1) !important;
}
html[data-theme='dark'] .quoted-block,
html[data-theme='dark'] .repost-content,
html[data-theme='dark'] .search-query,
html[data-theme='dark'] .timeline-marker,
html[data-theme='dark'] .detail-summary,
html[data-theme='dark'] .properties-list,
html[data-theme='dark'] .episodes-list .episode-tag,
html[data-theme='dark'] .label-tag,
html[data-theme='dark'] .reasoning-item,
html[data-theme='dark'] .config-item,
html[data-theme='dark'] .period-item,
html[data-theme='dark'] .platform-card,
html[data-theme='dark'] .info-card,
html[data-theme='dark'] .stats-grid {
background: rgba(255, 255, 255, 0.05) !important;
border-color: rgba(255, 255, 255, 0.08) !important;
}
html[data-theme='dark'] .profile-profession,
html[data-theme='dark'] .topic-tag,
html[data-theme='dark'] .hot-topic-tag,
html[data-theme='dark'] .config-block-badge,
html[data-theme='dark'] .duration-badge,
html[data-theme='dark'] .agent-type,
html[data-theme='dark'] .badge.pending,
html[data-theme='dark'] .badge.accent,
html[data-theme='dark'] .topic-item,
html[data-theme='dark'] .label-tag,
html[data-theme='dark'] .episode-tag {
color: #cccccc !important;
-webkit-text-fill-color: #cccccc !important;
background: #1a1a1a !important;
border: 1px solid rgba(255, 255, 255, 0.1) !important;
text-shadow: none !important;
box-shadow: none !important;
}
html[data-theme='dark'] .profile-username,
html[data-theme='dark'] .profile-realname,
html[data-theme='dark'] .profile-bio,
html[data-theme='dark'] .topic-more,
html[data-theme='dark'] .param-value,
html[data-theme='dark'] .config-item-value,
html[data-theme='dark'] .info-value,
html[data-theme='dark'] .stat-value {
-webkit-text-fill-color: currentColor !important;
text-shadow: none !important;
}
html[data-theme='dark'] .graph-container,
html[data-theme='dark'] .graph-view,
html[data-theme='dark'] .content-area,
html[data-theme='dark'] .main-content {
background: transparent !important;
}
html[data-theme='dark'] .panel-header,
html[data-theme='dark'] .card-header,
html[data-theme='dark'] .phase-header,
html[data-theme='dark'] .detail-panel-header,
html[data-theme='dark'] .timeline-header {
background: rgba(255, 255, 255, 0.03) !important;
}
/* ============================================
NUCLEAR DARK THEME OVERRIDE
Uses doubled specificity to beat all scoped
CSS blue-tinted rules from child components.
Forces pure black/gray palette — no blue tints.
============================================ */
html[data-theme='dark'][data-theme='dark'] .process-page,
html[data-theme='dark'][data-theme='dark'] .main-view,
html[data-theme='dark'][data-theme='dark'] .content-area,
html[data-theme='dark'][data-theme='dark'] .panel-wrapper,
html[data-theme='dark'][data-theme='dark'] .panel-wrapper.left,
html[data-theme='dark'][data-theme='dark'] .panel-wrapper.right,
html[data-theme='dark'][data-theme='dark'] .workbench-panel,
html[data-theme='dark'][data-theme='dark'] .scroll-container,
html[data-theme='dark'][data-theme='dark'] .graph-container,
html[data-theme='dark'][data-theme='dark'] .graph-view {
background: #000000 !important;
background-color: #000000 !important;
background-image: none !important;
}
html[data-theme='dark'][data-theme='dark'] .app-header,
html[data-theme='dark'][data-theme='dark'] .navbar {
background: #000000 !important;
background-image: none !important;
border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
}
html[data-theme='dark'][data-theme='dark'] .step-card,
html[data-theme='dark'][data-theme='dark'] .process-phase,
html[data-theme='dark'][data-theme='dark'] .info-card,
html[data-theme='dark'][data-theme='dark'] .stat-card,
html[data-theme='dark'][data-theme='dark'] .profile-card,
html[data-theme='dark'][data-theme='dark'] .agent-card,
html[data-theme='dark'][data-theme='dark'] .platform-card,
html[data-theme='dark'][data-theme='dark'] .config-block,
html[data-theme='dark'][data-theme='dark'] .timeline-card,
html[data-theme='dark'][data-theme='dark'] .dimension-card,
html[data-theme='dark'][data-theme='dark'] .preview-card,
html[data-theme='dark'][data-theme='dark'] .workspace-card,
html[data-theme='dark'][data-theme='dark'] .analysis-card,
html[data-theme='dark'][data-theme='dark'] .result-card,
html[data-theme='dark'][data-theme='dark'] .summary-card,
html[data-theme='dark'][data-theme='dark'] .modal-content,
html[data-theme='dark'][data-theme='dark'] .detail-panel,
html[data-theme='dark'][data-theme='dark'] .detail-panel-large,
html[data-theme='dark'][data-theme='dark'] .graph-legend,
html[data-theme='dark'][data-theme='dark'] .view-switcher,
html[data-theme='dark'][data-theme='dark'] .system-logs,
html[data-theme='dark'][data-theme='dark'] .log-container,
html[data-theme='dark'][data-theme='dark'] .logs-panel {
background: #000000 !important;
background-image: none !important;
border: 1px solid rgba(255, 255, 255, 0.08) !important;
box-shadow: none !important;
}
/* Remove blue tint from all common child elements */
html[data-theme='dark'][data-theme='dark'] .quoted-block,
html[data-theme='dark'][data-theme='dark'] .repost-content,
html[data-theme='dark'][data-theme='dark'] .search-query,
html[data-theme='dark'][data-theme='dark'] .episode-tag,
html[data-theme='dark'][data-theme='dark'] .label-tag,
html[data-theme='dark'][data-theme='dark'] .topic-tag,
html[data-theme='dark'][data-theme='dark'] .hot-topic-tag,
html[data-theme='dark'][data-theme='dark'] .topic-item,
html[data-theme='dark'][data-theme='dark'] .entity-tag,
html[data-theme='dark'][data-theme='dark'] .config-item,
html[data-theme='dark'][data-theme='dark'] .reasoning-item,
html[data-theme='dark'][data-theme='dark'] .period-item,
html[data-theme='dark'][data-theme='dark'] .duration-badge,
html[data-theme='dark'][data-theme='dark'] .badge.pending,
html[data-theme='dark'][data-theme='dark'] .badge.accent,
html[data-theme='dark'][data-theme='dark'] .agent-type,
html[data-theme='dark'][data-theme='dark'] .config-block-badge {
background: #0d0d0d !important;
background-image: none !important;
border: 1px solid rgba(255, 255, 255, 0.08) !important;
color: #cccccc !important;
-webkit-text-fill-color: #cccccc !important;
box-shadow: none !important;
text-shadow: none !important;
}
/* Switch button active state */
html[data-theme='dark'][data-theme='dark'] .switch-btn.active {
background: #1a1a1a !important;
background-image: none !important;
color: #ffffff !important;
box-shadow: none !important;
}
html[data-theme='dark'][data-theme='dark'] .switch-btn:not(.active) {
background: transparent !important;
color: #888888 !important;
}
/* Panel headers — subtle differentiation */
html[data-theme='dark'][data-theme='dark'] .panel-header,
html[data-theme='dark'][data-theme='dark'] .card-header,
html[data-theme='dark'][data-theme='dark'] .phase-header,
html[data-theme='dark'][data-theme='dark'] .detail-panel-header,
html[data-theme='dark'][data-theme='dark'] .timeline-header,
html[data-theme='dark'][data-theme='dark'] .project-title-row,
html[data-theme='dark'][data-theme='dark'] .config-block-header {
background: transparent !important;
background-image: none !important;
border-bottom: 1px solid rgba(255, 255, 255, 0.06) !important;
backdrop-filter: none !important;
}
/* Text colors */
html[data-theme='dark'][data-theme='dark'] .step-name,
html[data-theme='dark'][data-theme='dark'] .phase-title,
html[data-theme='dark'][data-theme='dark'] .header-title,
html[data-theme='dark'][data-theme='dark'] .detail-title,
html[data-theme='dark'][data-theme='dark'] .panel-title,
html[data-theme='dark'][data-theme='dark'] .section-title {
color: #ffffff !important;
}
html[data-theme='dark'][data-theme='dark'] .phase-api,
html[data-theme='dark'][data-theme='dark'] .description,
html[data-theme='dark'][data-theme='dark'] .api-note,
html[data-theme='dark'][data-theme='dark'] .status-text,
html[data-theme='dark'][data-theme='dark'] .stat-item,
html[data-theme='dark'][data-theme='dark'] .stat-divider,
html[data-theme='dark'][data-theme='dark'] .log-time {
color: #888888 !important;
}
/* Force full-width responsive content */
html[data-theme='dark'][data-theme='dark'] .home-container,
html[data-theme='dark'][data-theme='dark'] .process-page,
html[data-theme='dark'][data-theme='dark'] .main-view {
width: 100% !important;
max-width: none !important;
}
/* Dark mode layout: override inner container max-width constraints */
html[data-theme='dark'][data-theme='dark'] .main-content {
max-width: none !important;
width: 100% !important;
}
html[data-theme='dark'][data-theme='dark'] .dashboard-section {
max-width: none !important;
width: 100% !important;
}
html[data-theme='dark'][data-theme='dark'] .content-area,
html[data-theme='dark'][data-theme='dark'] .main-content-area {
width: 100% !important;
max-width: none !important;
}
html[data-theme='dark'][data-theme='dark'] .panel-wrapper.left,
html[data-theme='dark'][data-theme='dark'] .panel-wrapper.right {
max-width: none !important;
}
/* Dark mode color polish: keep layout intact, only fix light surfaces and unreadable text */
html[data-theme='dark'][data-theme='dark'] .home-container,
html[data-theme='dark'][data-theme='dark'] .dashboard-section,
html[data-theme='dark'][data-theme='dark'] .history-database {
background: #000000 !important;
color: #edf2ff !important;
border-color: rgba(255, 255, 255, 0.1) !important;
}
html[data-theme='dark'][data-theme='dark'] .main-title,
html[data-theme='dark'][data-theme='dark'] .highlight-bold,
html[data-theme='dark'][data-theme='dark'] .slogan-text,
html[data-theme='dark'][data-theme='dark'] .metric-value,
html[data-theme='dark'][data-theme='dark'] .step-title,
html[data-theme='dark'][data-theme='dark'] .upload-title,
html[data-theme='dark'][data-theme='dark'] .console-label,
html[data-theme='dark'][data-theme='dark'] .file-name,
html[data-theme='dark'][data-theme='dark'] .card-title,
html[data-theme='dark'][data-theme='dark'] .modal-id,
html[data-theme='dark'][data-theme='dark'] .report-id,
html[data-theme='dark'][data-theme='dark'] .report-section-item.is-active .section-title,
html[data-theme='dark'][data-theme='dark'] .report-section-item.is-completed .section-title {
color: #f4f7fb !important;
-webkit-text-fill-color: #f4f7fb !important;
}
html[data-theme='dark'][data-theme='dark'] .gradient-text {
background: linear-gradient(90deg, #ffffff 0%, #a8b0c2 100%) !important;
-webkit-background-clip: text !important;
background-clip: text !important;
-webkit-text-fill-color: transparent !important;
}
html[data-theme='dark'][data-theme='dark'] .hero-desc,
html[data-theme='dark'][data-theme='dark'] .section-desc,
html[data-theme='dark'][data-theme='dark'] .step-desc,
html[data-theme='dark'][data-theme='dark'] .metric-label,
html[data-theme='dark'][data-theme='dark'] .version-text,
html[data-theme='dark'][data-theme='dark'] .console-header,
html[data-theme='dark'][data-theme='dark'] .console-meta,
html[data-theme='dark'][data-theme='dark'] .upload-hint,
html[data-theme='dark'][data-theme='dark'] .model-badge,
html[data-theme='dark'][data-theme='dark'] .card-desc,
html[data-theme='dark'][data-theme='dark'] .card-id,
html[data-theme='dark'][data-theme='dark'] .card-footer,
html[data-theme='dark'][data-theme='dark'] .modal-label,
html[data-theme='dark'][data-theme='dark'] .modal-create-time,
html[data-theme='dark'][data-theme='dark'] .sub-title,
html[data-theme='dark'][data-theme='dark'] .section-number {
color: #a5adbd !important;
-webkit-text-fill-color: #a5adbd !important;
}
html[data-theme='dark'][data-theme='dark'] .highlight-code,
html[data-theme='dark'][data-theme='dark'] .metric-card,
html[data-theme='dark'][data-theme='dark'] .steps-container,
html[data-theme='dark'][data-theme='dark'] .console-box,
html[data-theme='dark'][data-theme='dark'] .input-wrapper,
html[data-theme='dark'][data-theme='dark'] .upload-zone,
html[data-theme='dark'][data-theme='dark'] .file-item,
html[data-theme='dark'][data-theme='dark'] .project-card,
html[data-theme='dark'][data-theme='dark'] .card-files-wrapper,
html[data-theme='dark'][data-theme='dark'] .modal-content,
html[data-theme='dark'][data-theme='dark'] .modal-header,
html[data-theme='dark'][data-theme='dark'] .modal-requirement,
html[data-theme='dark'][data-theme='dark'] .report-style,
html[data-theme='dark'][data-theme='dark'] .section-header-row.clickable:hover,
html[data-theme='dark'][data-theme='dark'] .tools-card,
html[data-theme='dark'][data-theme='dark'] .chat-message,
html[data-theme='dark'][data-theme='dark'] .message-content,
html[data-theme='dark'][data-theme='dark'] .agent-dropdown,
html[data-theme='dark'][data-theme='dark'] .agent-option {
background: #111111 !important;
background-image: none !important;
color: #edf2ff !important;
border-color: rgba(255, 255, 255, 0.12) !important;
box-shadow: none !important;
}
html[data-theme='dark'][data-theme='dark'] .upload-zone:hover,
html[data-theme='dark'][data-theme='dark'] .upload-zone.drag-over,
html[data-theme='dark'][data-theme='dark'] .project-card:hover,
html[data-theme='dark'][data-theme='dark'] .file-item:hover,
html[data-theme='dark'][data-theme='dark'] .agent-option:hover,
html[data-theme='dark'][data-theme='dark'] .modal-close:hover {
background: #181818 !important;
background-image: none !important;
border-color: rgba(255, 255, 255, 0.22) !important;
color: #ffffff !important;
}
html[data-theme='dark'][data-theme='dark'] .upload-icon,
html[data-theme='dark'][data-theme='dark'] .files-more,
html[data-theme='dark'][data-theme='dark'] .files-empty,
html[data-theme='dark'][data-theme='dark'] .modal-progress,
html[data-theme='dark'][data-theme='dark'] .modal-close,
html[data-theme='dark'][data-theme='dark'] .report-tag {
background: #1a1a1a !important;
color: #d8deeb !important;
border-color: rgba(255, 255, 255, 0.12) !important;
}
html[data-theme='dark'][data-theme='dark'] .code-input,
html[data-theme='dark'][data-theme='dark'] .code-input::placeholder,
html[data-theme='dark'][data-theme='dark'] textarea::placeholder,
html[data-theme='dark'][data-theme='dark'] input::placeholder {
color: #c4cad6 !important;
-webkit-text-fill-color: #c4cad6 !important;
}
html[data-theme='dark'][data-theme='dark'] .start-engine-btn:disabled {
background: #202020 !important;
color: #8f96a3 !important;
border-color: rgba(255, 255, 255, 0.1) !important;
-webkit-text-fill-color: #8f96a3 !important;
}
html[data-theme='dark'][data-theme='dark'] .start-engine-btn:not(:disabled) {
background: #f4f7fb !important;
color: #050505 !important;
border-color: #f4f7fb !important;
-webkit-text-fill-color: #050505 !important;
}
html[data-theme='dark'][data-theme='dark'] .console-divider::before,
html[data-theme='dark'][data-theme='dark'] .console-divider::after,
html[data-theme='dark'][data-theme='dark'] .header-divider,
html[data-theme='dark'][data-theme='dark'] .section-line,
html[data-theme='dark'][data-theme='dark'] .card-footer,
html[data-theme='dark'][data-theme='dark'] .card-header,
html[data-theme='dark'][data-theme='dark'] .modal-header {
border-color: rgba(255, 255, 255, 0.1) !important;
background-color: rgba(255, 255, 255, 0.1) !important;
}
html[data-theme='dark'][data-theme='dark'] .console-divider span,
html[data-theme='dark'][data-theme='dark'] .section-title {
background: #000000 !important;
}
html[data-theme='dark'][data-theme='dark'] .grid-pattern {
background-image:
linear-gradient(to right, rgba(255, 255, 255, 0.06) 1px, transparent 1px),
linear-gradient(to bottom, rgba(255, 255, 255, 0.06) 1px, transparent 1px) !important;
}
html[data-theme='dark'][data-theme='dark'] .gradient-overlay {
background:
linear-gradient(to right, rgba(0, 0, 0, 0.9) 0%, transparent 15%, transparent 85%, rgba(0, 0, 0, 0.9) 100%),
linear-gradient(to bottom, rgba(0, 0, 0, 0.82) 0%, transparent 20%, transparent 80%, rgba(0, 0, 0, 0.82) 100%) !important;
}
html[data-theme='dark'][data-theme='dark'] .hero-logo-light {
display: none !important;
}
html[data-theme='dark'][data-theme='dark'] .hero-logo-dark {
display: block !important;
}
html[data-theme='light'] .hero-logo-dark,
html:not([data-theme='dark']) .hero-logo-dark {
display: none !important;
}
html[data-theme='dark'][data-theme='dark'] .corner-mark.top-left-only {
border-top-color: rgba(255, 255, 255, 0.35) !important;
border-left-color: rgba(255, 255, 255, 0.35) !important;
}
@media (max-width: 768px) {
.theme-toggle {
width: 16px;
height: 16px;
}
.theme-toggle__icon {
width: 14px;
height: 14px;
}
}
</style>