:root { --bg: #0b0c0e; --card: #14161a; --border: #22252b; --text: #e6e6e6; --muted: #8a8f98; --up: #34d399; --down: #f87171; --warn: #f59e0b; --accent: #f0643c; color-scheme: dark; } body.light { --bg: #f4f5f7; --card: #ffffff; --border: #dde1e7; --text: #15171a; --muted: #646b75; color-scheme: light; } * { box-sizing: border-box; } body { margin: 0; background: var(--bg); color: var(--text); font: 14px/1.4 Inter, system-ui, -apple-system, sans-serif; } .mono, .val, .elapsed, .rate, .clocks .mono, .stat span:last-child, table, .json, .tip, .feed { font-family: "JetBrains Mono", ui-monospace, Menlo, Consolas, monospace; } .muted { color: var(--muted); } .warn { color: var(--warn); } .err { color: var(--down); } .up { color: var(--up); } .down { color: var(--down); } .pad { padding: 40px; } /* top bar */ .topbar { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 22px; padding: 10px 16px; border-bottom: 1px solid var(--border); position: sticky; top: 0; background: var(--bg); z-index: 5; } .brand { font-weight: 700; } .tabs { display: flex; gap: 4px; flex-wrap: wrap; } .tab { background: none; border: 0; color: var(--muted); padding: 6px 10px; border-radius: 6px; cursor: pointer; font: inherit; } .tab.on { color: var(--text); background: var(--card); } .cost { display: flex; flex-direction: column; } .cost .val { font-size: 22px; font-weight: 600; } .rate { color: var(--muted); font-size: 12px; } .lbl { color: var(--muted); font-size: 11px; letter-spacing: .06em; text-transform: uppercase; } .clocks { display: flex; gap: 14px; flex-wrap: wrap; font-size: 12px; } .clocks > div { display: flex; flex-direction: column; } .auth { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; } .badge { background: rgba(240, 100, 60, .15); color: var(--accent); padding: 3px 8px; border-radius: 999px; font-size: 12px; } /* buttons, inputs */ .btn { background: var(--accent); color: #fff; border: 0; border-radius: 6px; padding: 7px 12px; cursor: pointer; font: inherit; } .btn.ghost { background: transparent; color: var(--text); border: 1px solid var(--border); } textarea, input, select { background: var(--bg); color: var(--text); border: 1px solid var(--border); border-radius: 6px; padding: 6px 8px; font: inherit; } textarea { width: 100%; } .json { width: 100%; font-size: 12px; } .row { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-top: 8px; } .save { font-size: 12px; color: var(--muted); } .save.err { color: var(--down); } /* layout */ main { padding: 16px; display: flex; flex-direction: column; gap: 14px; max-width: 1400px; margin: 0 auto; } .card { background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 14px; min-width: 0; } .mhead { display: flex; gap: 8px; align-items: baseline; flex-wrap: wrap; margin-bottom: 8px; } .sec { margin: 8px 0 -4px; font-size: 13px; color: var(--muted); font-weight: 500; } .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 14px; } .runs { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 14px; } .run-head { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-bottom: 10px; } .dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; } .status { font-size: 12px; color: var(--muted); } .status.live { color: var(--up); } .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 10px; } .stat { display: flex; flex-direction: column; gap: 2px; } .stat .lbl { font-size: 10px; } /* charts & legends */ .legend { display: flex; gap: 14px; flex-wrap: wrap; font-size: 12px; color: var(--muted); margin-bottom: 6px; } .legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 5px; vertical-align: middle; } .legend b { color: var(--text); margin-left: 4px; } .chart { width: 100%; height: auto; display: block; } .chart text { fill: var(--muted); font-size: 11px; } .chart .grid { stroke: var(--border); stroke-width: 1; } .empty { color: var(--muted); padding: 30px 0; text-align: center; } .tip { position: fixed; pointer-events: none; background: var(--card); border: 1px solid var(--border); padding: 6px 8px; border-radius: 6px; font-size: 12px; z-index: 20; max-width: 260px; } .tip i { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 4px; } .toolbar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin: 0 0 10px; } .seg { display: inline-flex; border: 1px solid var(--border); border-radius: 6px; overflow: hidden; } .seg button { background: none; border: 0; color: var(--muted); padding: 5px 10px; cursor: pointer; font: inherit; } .seg button.on { background: var(--border); color: var(--text); } .smooth { font-size: 12px; color: var(--muted); display: flex; gap: 6px; align-items: center; } /* notices */ .notice { display: grid; grid-template-columns: 150px 1fr auto; gap: 10px; padding: 8px 0; border-bottom: 1px solid var(--border); } .notice:last-child { border-bottom: 0; } .ntext { white-space: pre-wrap; } .x { background: none; border: 0; color: var(--muted); cursor: pointer; font-size: 16px; } .notice-form { display: flex; flex-direction: column; gap: 8px; margin-bottom: 12px; } /* admin forms */ .admin { border-color: var(--accent); } .form-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 10px; margin-bottom: 8px; } .form-grid label { display: flex; flex-direction: column; gap: 4px; color: var(--muted); font-size: 12px; } /* tables */ .table-wrap { overflow-x: auto; } table { width: 100%; border-collapse: collapse; font-size: 12px; } th, td { padding: 6px 8px; border-bottom: 1px solid var(--border); text-align: left; white-space: nowrap; } th { color: var(--muted); font-weight: 500; } td.num { text-align: right; } .bar { height: 4px; background: var(--border); border-radius: 2px; margin-top: 4px; width: 120px; margin-left: auto; } .bar i { display: block; height: 100%; background: #3b82f6; border-radius: 2px; } .feed { max-height: 260px; overflow-y: auto; font-size: 12px; line-height: 1.7; } /* about */ .prose { line-height: 1.6; } .prose h2 { font-size: 18px; margin: 0 0 8px; } .prose p { margin: 0 0 10px; } .prose ul { margin: 0 0 10px; padding-left: 20px; } /* banners */ .banner { margin: 12px 16px 0; padding: 8px 12px; border-radius: 8px; background: rgba(245, 158, 11, .12); color: var(--warn); font-size: 13px; } .banner.err { background: rgba(248, 113, 113, .12); color: var(--down); } footer { text-align: center; color: var(--muted); font-size: 12px; padding: 20px; } @media (max-width: 640px) { .notice { grid-template-columns: 1fr; } .cost .val { font-size: 18px; } .auth { margin-left: 0; } }