diff --git a/src/frontend/src/styles/global.css b/src/frontend/src/styles/global.css new file mode 100644 index 0000000..29eed81 --- /dev/null +++ b/src/frontend/src/styles/global.css @@ -0,0 +1,244 @@ +/* 墨子+ v2.0 Dashboard 全局样式 */ + +:root { + --bg: #0a1628; + --bg2: #111d33; + --panel: #162038; + --panel2: #1c2a48; + --fg: #e8eaf0; + --muted: #7a8ba8; + --acc: #4a9eff; + --acc2: #6cb6ff; + --line: #253350; + --ok: #22c55e; + --warn: #f59e0b; + --err: #ef4444; + --purple: #818cf8; + --radius: 8px; + --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; +} + +* { margin: 0; padding: 0; box-sizing: border-box; } + +body { + font-family: var(--font); + background: var(--bg); + color: var(--fg); + line-height: 1.5; + font-size: 14px; +} + +.app { + display: flex; + min-height: 100vh; +} + +/* Sidebar */ +.sidebar { + width: 200px; + background: var(--bg2); + border-right: 1px solid var(--line); + padding: 16px 0; + flex-shrink: 0; +} + +.sidebar-title { + padding: 0 16px 16px; + font-size: 16px; + font-weight: 700; + color: var(--acc); + border-bottom: 1px solid var(--line); + margin-bottom: 8px; +} + +.sidebar-nav { + display: flex; + flex-direction: column; + gap: 2px; + padding: 0 8px; +} + +.nav-item { + padding: 8px 12px; + border-radius: var(--radius); + cursor: pointer; + color: var(--muted); + transition: all 0.15s; + font-size: 13px; +} + +.nav-item:hover { background: var(--panel); color: var(--fg); } +.nav-item.active { background: var(--panel2); color: var(--acc); } + +/* Main content */ +.main { + flex: 1; + padding: 24px; + overflow-y: auto; +} + +.page-title { + font-size: 20px; + font-weight: 700; + margin-bottom: 20px; +} + +/* Cards */ +.card { + background: var(--panel); + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 16px; + margin-bottom: 12px; +} + +.card-title { + font-size: 15px; + font-weight: 600; + margin-bottom: 8px; +} + +/* Task board */ +.task-board { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + gap: 12px; +} + +.task-card { + background: var(--panel); + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 14px; + cursor: pointer; + transition: border-color 0.15s; +} + +.task-card:hover { border-color: var(--acc); } + +.task-card .title { + font-weight: 600; + margin-bottom: 6px; +} + +.task-card .meta { + font-size: 12px; + color: var(--muted); + display: flex; + gap: 12px; +} + +/* Status badges */ +.badge { + display: inline-block; + padding: 2px 8px; + border-radius: 4px; + font-size: 11px; + font-weight: 600; + text-transform: uppercase; +} + +.badge-pending { background: rgba(74, 158, 255, 0.15); color: var(--acc); } +.badge-working { background: rgba(245, 158, 11, 0.15); color: var(--warn); } +.badge-review { background: rgba(129, 140, 248, 0.15); color: var(--purple); } +.badge-done { background: rgba(34, 197, 94, 0.15); color: var(--ok); } +.badge-failed { background: rgba(239, 68, 68, 0.15); color: var(--err); } +.badge-blocked { background: rgba(122, 139, 168, 0.15); color: var(--muted); } + +/* Monitor */ +.stat-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + gap: 12px; + margin-bottom: 20px; +} + +.stat-card { + background: var(--panel); + border: 1px solid var(--line); + border-radius: var(--radius); + padding: 16px; + text-align: center; +} + +.stat-card .value { + font-size: 28px; + font-weight: 700; + color: var(--acc); +} + +.stat-card .label { + font-size: 12px; + color: var(--muted); + margin-top: 4px; +} + +/* Table */ +.table-wrapper { + overflow-x: auto; +} + +table { + width: 100%; + border-collapse: collapse; +} + +th, td { + text-align: left; + padding: 8px 12px; + border-bottom: 1px solid var(--line); + font-size: 13px; +} + +th { + color: var(--muted); + font-weight: 600; + font-size: 12px; + text-transform: uppercase; +} + +tr:hover td { background: var(--panel); } + +/* Button */ +.btn { + padding: 6px 14px; + border-radius: var(--radius); + border: 1px solid var(--line); + background: var(--panel2); + color: var(--fg); + cursor: pointer; + font-size: 13px; + transition: all 0.15s; +} + +.btn:hover { border-color: var(--acc); } +.btn-primary { background: var(--acc); color: #fff; border-color: var(--acc); } +.btn-primary:hover { background: var(--acc2); } + +/* Loading / Error */ +.loading { color: var(--muted); padding: 20px; } +.error { color: var(--err); padding: 20px; } + +/* Event log */ +.event-log { + max-height: 400px; + overflow-y: auto; + font-family: 'SF Mono', Monaco, monospace; + font-size: 12px; +} + +.event-item { + padding: 4px 0; + border-bottom: 1px solid var(--line); + color: var(--muted); +} + +.event-item .time { + color: var(--muted); + margin-right: 8px; +} + +.event-item .type { + color: var(--acc); + margin-right: 8px; +}