:root { --bg: #0d141a; --bg-grid: rgba(255,255,255,0.025); --rail: #080d12; --panel: #131d26; --panel-2: #182530; --panel-3: #0f1820; --line: #2b3a45; --line-soft: #1f2d37; --text: #d7e3e7; --muted: #81939f; --faint: #546672; --accent: #d7a13a; --accent-2: #4eb7a8; --danger: #cf6a54; --ok: #71bf78; --warn: #d7a13a; --shadow: 0 18px 46px rgba(0, 0, 0, 0.32); font-family: "Aptos Narrow", "DIN Condensed", "Liberation Sans Narrow", "Noto Sans", sans-serif; } * { box-sizing: border-box; } html, body, #root { min-height: 100%; } body { margin: 0; color: var(--text); background: linear-gradient(135deg, rgba(215, 161, 58, 0.08), transparent 28%), linear-gradient(315deg, rgba(78, 183, 168, 0.07), transparent 32%), repeating-linear-gradient(90deg, var(--bg-grid) 0, var(--bg-grid) 1px, transparent 1px, transparent 34px), repeating-linear-gradient(0deg, rgba(255,255,255,0.014) 0, rgba(255,255,255,0.014) 1px, transparent 1px, transparent 28px), var(--bg); font-size: 13px; letter-spacing: 0.01em; } button, input, select, textarea { font: inherit; } button { cursor: pointer; } code, pre, textarea { font-family: "Cascadia Mono", "IBM Plex Mono", "Liberation Mono", monospace; } .shell { display: grid; grid-template-columns: 184px minmax(0, 1fr); min-height: 100vh; } .rail { position: sticky; top: 0; height: 100vh; padding: 12px 10px; border-right: 1px solid var(--line); background: linear-gradient(180deg, #060a0f, var(--rail)); } .brand, .login-brand { display: flex; align-items: center; gap: 9px; } .brand { height: 42px; padding: 0 5px 12px; border-bottom: 1px solid var(--line-soft); margin-bottom: 10px; } .brand-mark { display: grid; place-items: center; width: 34px; height: 27px; border: 1px solid var(--accent); color: var(--accent); font-weight: 800; letter-spacing: 0.08em; } .brand-text { font-size: 15px; text-transform: uppercase; letter-spacing: 0.14em; } .module { display: grid; grid-template-columns: 42px 1fr; align-items: center; width: 100%; min-height: 34px; margin: 4px 0; padding: 6px 8px; border: 1px solid transparent; border-left: 3px solid transparent; color: var(--muted); background: transparent; text-align: left; } .module-code { color: var(--faint); font-size: 10px; letter-spacing: 0.16em; } .module:hover, .module.active { color: var(--text); background: rgba(255,255,255,0.045); border-left-color: var(--accent); } .workspace { min-width: 0; padding: 12px 14px 16px; } .topbar { display: flex; justify-content: space-between; align-items: center; gap: 14px; min-height: 54px; padding-bottom: 10px; border-bottom: 1px solid var(--line); } .eyebrow, .panel-eyebrow { margin: 0 0 2px; color: var(--accent); font-size: 10px; letter-spacing: 0.22em; text-transform: uppercase; } h1, h2 { margin: 0; font-weight: 650; } h1 { font-size: 21px; letter-spacing: 0.07em; } h2 { font-size: 14px; text-transform: uppercase; letter-spacing: 0.08em; } .status-strip { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border: 1px solid var(--line); background: rgba(0,0,0,0.16); color: var(--muted); white-space: nowrap; } .dot, .pulse { width: 8px; height: 8px; border-radius: 999px; background: var(--muted); box-shadow: 0 0 0 2px rgba(255,255,255,0.06); } .dot.ok, .pulse.online { background: var(--ok); } .dot.fail, .pulse.offline { background: var(--danger); } .user-pill { padding: 2px 7px; border: 1px solid var(--line-soft); color: var(--text); background: var(--panel-3); } .tabs { display: flex; gap: 6px; padding: 10px 0; overflow-x: auto; } .tab, .ghost-btn { border: 1px solid var(--line); background: rgba(12, 18, 24, 0.62); color: var(--muted); } .tab { min-width: 112px; padding: 7px 12px; } .tab.active, .tab:hover { color: var(--text); border-color: var(--accent-2); background: rgba(78, 183, 168, 0.12); } .ghost-btn { min-height: 28px; padding: 4px 8px; } .ghost-btn:hover { color: var(--text); border-color: var(--accent); } .ghost-btn.danger:hover { border-color: var(--danger); color: #ffd7cf; } .page-grid { display: grid; grid-template-columns: minmax(340px, 0.95fr) minmax(520px, 1.55fr); gap: 10px; align-items: start; } .overview-grid .panel:nth-child(n+3), .dispatch-grid .panel:first-child, .topology-grid .panel:nth-child(3) { grid-column: 1 / -1; } .panel { min-width: 0; border: 1px solid var(--line); background: linear-gradient(180deg, rgba(255,255,255,0.035), rgba(255,255,255,0.012)), var(--panel); box-shadow: var(--shadow); } .panel-head { display: flex; justify-content: space-between; align-items: center; gap: 10px; min-height: 40px; padding: 7px 10px; border-bottom: 1px solid var(--line); color: var(--muted); } .panel-actions { display: flex; gap: 6px; align-items: center; } .panel-body { padding: 10px; } .metric-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; } .metric-card { min-height: 76px; padding: 10px; border: 1px solid var(--line-soft); background: var(--panel-2); } .metric-card.clickable { cursor: pointer; outline: none; } .metric-card.clickable:hover, .metric-card.clickable:focus-visible { border-color: var(--accent); background: linear-gradient(90deg, rgba(215, 161, 58, 0.11), transparent 70%), var(--panel-2); } .metric-card.ok { border-color: rgba(113, 191, 120, 0.42); } .metric-card.warn { border-color: rgba(215, 161, 58, 0.45); } .metric-label { color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.12em; } .metric-value { margin-top: 8px; color: var(--text); font-size: 23px; font-weight: 760; } .metric-hint { margin-top: 3px; color: var(--muted); font-size: 11px; } .node-card-list, .compact-list, .log-list, .heartbeat-list, .endpoint-list, .policy-grid, .security-board, .result-grid { display: grid; gap: 8px; } .node-card, .compact-row, .log-row, .heartbeat-row, .endpoint-list article, .policy-grid article, .security-board article, .result-card, .label-card { border: 1px solid var(--line-soft); background: var(--panel-3); } .node-card, .result-card { padding: 9px; } .node-card-head { display: flex; justify-content: space-between; gap: 10px; margin-bottom: 8px; } .node-card code, .compact-row code, td code { display: block; margin-top: 2px; color: #bcd2d7; font-size: 12px; } .node-card-foot { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-top: 8px; color: var(--muted); } .node-version-line, .gateway-cell { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-bottom: 7px; color: var(--muted); } .gateway-cell { display: grid; gap: 4px; margin-bottom: 0; } .version-chip, .mode-chip { display: inline-flex; align-items: center; min-height: 22px; padding: 2px 7px; border: 1px solid rgba(78, 183, 168, 0.48); color: #c9f3ec; background: rgba(78, 183, 168, 0.1); font-family: "Cascadia Mono", "IBM Plex Mono", "Liberation Mono", monospace; font-size: 11px; letter-spacing: 0.04em; } .version-chip.unknown { color: var(--warn); border-color: rgba(215, 161, 58, 0.45); background: rgba(215, 161, 58, 0.08); } .mode-chip.schedule { color: #ffd7cf; border-color: rgba(207, 106, 84, 0.5); background: rgba(207, 106, 84, 0.1); } .node-availability-strip { display: flex; flex-wrap: wrap; gap: 5px; min-width: 220px; margin: 5px 0 7px; } .capability-badge { display: grid; grid-template-columns: auto auto; gap: 1px 6px; min-width: 104px; max-width: 190px; padding: 4px 6px; border: 1px solid var(--line); background: rgba(0,0,0,0.16); line-height: 1.22; } .capability-badge b { color: var(--muted); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; } .capability-badge strong { justify-self: end; font-size: 11px; } .capability-badge small { grid-column: 1 / -1; min-width: 0; overflow: hidden; color: var(--faint); font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } .capability-badge.ok { border-color: rgba(113, 191, 120, 0.42); background: rgba(113, 191, 120, 0.07); } .capability-badge.ok strong { color: var(--ok); } .capability-badge.warn { border-color: rgba(215, 161, 58, 0.45); background: rgba(215, 161, 58, 0.08); } .capability-badge.warn strong { color: var(--warn); } .capability-badge.fail { border-color: rgba(207, 106, 84, 0.45); background: rgba(207, 106, 84, 0.08); } .capability-badge.fail strong { color: var(--danger); } .status-badge { display: inline-flex; align-items: center; min-height: 22px; padding: 2px 7px; border: 1px solid var(--line); color: var(--muted); background: rgba(0,0,0,0.18); text-transform: uppercase; font-size: 11px; } .status-badge.online, .status-badge.succeeded, .status-badge.public { color: var(--ok); border-color: rgba(113, 191, 120, 0.45); } .status-badge.offline, .status-badge.failed, .status-badge.canceled { color: var(--danger); border-color: rgba(207, 106, 84, 0.45); } .status-badge.running, .status-badge.dispatched, .status-badge.accepted, .status-badge.internal { color: var(--accent-2); border-color: rgba(78, 183, 168, 0.45); } .status-badge.queued, .status-badge.staged, .status-badge.warn { color: var(--warn); border-color: rgba(215, 161, 58, 0.45); } .status-badge.private, .status-badge.p1, .status-badge.prioritized, .status-badge.verified { color: var(--accent-2); border-color: rgba(78, 183, 168, 0.45); } .status-badge.stale, .status-badge.invalid, .status-badge.abandoned { color: var(--warn); border-color: rgba(215, 161, 58, 0.45); } .docker-page { display: grid; gap: 10px; } .docker-node-strip { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 8px; } .docker-node-tile { display: grid; grid-template-columns: auto 1fr; gap: 3px 8px; align-items: center; padding: 8px; border: 1px solid var(--line); color: var(--muted); background: rgba(12, 18, 24, 0.62); text-align: left; } .docker-node-tile.active, .docker-node-tile:hover { color: var(--text); border-color: var(--accent-2); background: rgba(78, 183, 168, 0.1); } .docker-node-tile code, .docker-node-tile span:last-child { grid-column: 2; color: var(--muted); } .docker-layout { display: grid; grid-template-columns: minmax(620px, 1.65fr) minmax(280px, 0.75fr); gap: 10px; align-items: start; } .docker-hero { display: flex; justify-content: space-between; gap: 12px; padding: 10px; margin-bottom: 8px; border: 1px solid var(--line-soft); background: linear-gradient(90deg, rgba(78, 183, 168, 0.12), transparent 42%), var(--panel-3); } .docker-hero h3 { margin: 0; font-size: 20px; letter-spacing: 0.04em; } .docker-meta { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 7px; color: var(--muted); } .docker-meta span { padding: 2px 6px; border: 1px solid var(--line-soft); background: rgba(255,255,255,0.03); } .docker-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin-bottom: 8px; } .docker-volume-focus { display: grid; gap: 8px; padding: 10px; margin-bottom: 8px; border: 1px solid rgba(113, 191, 120, 0.34); background: linear-gradient(90deg, rgba(113, 191, 120, 0.11), transparent 55%), var(--panel-3); } .docker-volume-focus.missing { border-color: rgba(215, 161, 58, 0.45); background: linear-gradient(90deg, rgba(215, 161, 58, 0.12), transparent 55%), var(--panel-3); } .volume-focus-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; } .volume-focus-body { display: grid; gap: 5px; } .volume-focus-body strong { font-size: 15px; letter-spacing: 0.03em; } .volume-focus-body > span { color: var(--muted); } .volume-route { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 0.82fr); gap: 8px; align-items: center; color: var(--muted); } .volume-route code { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #c7ddd8; } .docker-meta.compact { margin-top: 2px; } .docker-section-head { display: flex; justify-content: space-between; align-items: center; gap: 8px; height: 34px; color: var(--muted); } .docker-section-head h3 { margin: 0; font-size: 13px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--text); } .docker-container-table { max-height: calc(100vh - 348px); } .docker-side-stack { display: grid; gap: 10px; } .docker-side-panel .panel-body { padding: 8px; } .docker-side-list { display: grid; gap: 6px; max-height: 230px; overflow: auto; } .docker-side-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 8px; padding: 7px; border: 1px solid var(--line-soft); background: var(--panel-3); } .docker-side-row strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .docker-side-row span { color: var(--muted); } .docker-side-row code { grid-column: 1 / -1; color: #bcd2d7; overflow: hidden; text-overflow: ellipsis; } .docker-side-row.database-volume { border-color: rgba(113, 191, 120, 0.54); background: linear-gradient(90deg, rgba(113, 191, 120, 0.14), transparent 70%), var(--panel-3); } .docker-side-row.database-volume strong { color: #d6f1df; } .docker-side-more { padding: 6px 7px; border: 1px dashed var(--line-soft); color: var(--muted); text-align: center; background: rgba(255,255,255,0.02); } .monitor-page { display: grid; gap: 10px; } .monitor-layout { display: grid; grid-template-columns: minmax(680px, 1.6fr) minmax(310px, 0.75fr); gap: 10px; align-items: start; } .monitor-hero { display: flex; justify-content: space-between; gap: 12px; padding: 10px; margin-bottom: 8px; border: 1px solid var(--line-soft); background: linear-gradient(90deg, rgba(215, 161, 58, 0.12), transparent 40%), linear-gradient(180deg, rgba(78, 183, 168, 0.08), transparent), var(--panel-3); } .monitor-hero h3 { margin: 0; font-size: 20px; letter-spacing: 0.04em; } .monitor-chart-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; } .metric-chart { min-width: 0; padding: 8px; border: 1px solid var(--line-soft); background: #0d161d; } .metric-chart-head, .metric-chart-foot { display: flex; justify-content: space-between; gap: 8px; align-items: center; } .metric-chart-head span { display: block; color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.12em; } .metric-chart-head strong { font-size: 24px; letter-spacing: 0.03em; } .metric-chart-head code { color: var(--faint); } .metric-chart svg { width: 100%; height: 116px; margin: 8px 0; border: 1px solid var(--line-soft); background: linear-gradient(180deg, transparent 48%, rgba(255,255,255,0.05) 49%, transparent 50%), repeating-linear-gradient(90deg, rgba(255,255,255,0.04) 0, rgba(255,255,255,0.04) 1px, transparent 1px, transparent 12px), #091015; } .metric-chart polygon { fill: rgba(78, 183, 168, 0.16); } .metric-chart polyline { fill: none; stroke: var(--accent-2); stroke-width: 1.8; vector-effect: non-scaling-stroke; } .metric-chart line { stroke: rgba(255,255,255,0.12); stroke-width: 1; vector-effect: non-scaling-stroke; } .metric-chart.cpu polyline { stroke: var(--accent); } .metric-chart.cpu polygon { fill: rgba(215, 161, 58, 0.16); } .metric-chart.disk polyline { stroke: #9db7ff; } .metric-chart.disk polygon { fill: rgba(157, 183, 255, 0.15); } .metric-chart-foot { color: var(--muted); font-size: 11px; } .monitor-summary-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin-top: 8px; } .monitor-side-stack { display: grid; gap: 10px; } .monitor-note-list, .upgrade-control { display: grid; gap: 8px; } .monitor-note-list article { display: grid; gap: 3px; padding: 7px; border: 1px solid var(--line-soft); background: var(--panel-3); } .monitor-note-list span, .upgrade-control p { margin: 0; color: var(--muted); } .upgrade-target-line { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; padding: 6px 7px; border: 1px solid var(--line-soft); background: rgba(78, 183, 168, 0.07); color: var(--muted); } .upgrade-actions { display: flex; gap: 6px; flex-wrap: wrap; } .upgrade-result { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 6px 8px; align-items: center; padding: 7px; border: 1px solid var(--line-soft); background: var(--panel-3); } .upgrade-result code { grid-column: 1 / -1; color: #bcd2d7; } .gateway-page { display: grid; gap: 10px; } .gateway-version-table { min-width: 1280px; } .gateway-version-table-wrap { max-height: 340px; } .capability-row { display: flex; flex-wrap: wrap; gap: 4px; min-width: 180px; } .latest-upgrade-cell { display: grid; gap: 4px; min-width: 220px; } .latest-upgrade-cell small, .gateway-record-meta, .upgrade-outcome { color: var(--muted); } .upgrade-outcome { display: block; min-width: 210px; max-width: 420px; overflow-wrap: anywhere; } .upgrade-outcome.failed { color: #ffd7cf; } .upgrade-outcome.succeeded { color: #d8f6dd; } .gateway-record-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(520px, 1fr)); gap: 8px; } .gateway-record-card { min-width: 0; padding: 8px; border: 1px solid var(--line-soft); background: var(--panel-3); } .gateway-record-head { display: flex; justify-content: space-between; gap: 10px; align-items: start; margin-bottom: 7px; } .gateway-record-head code { display: block; margin-top: 2px; color: #bcd2d7; } .gateway-record-meta { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 7px; } .gateway-record-meta span { padding: 2px 6px; border: 1px solid var(--line-soft); background: rgba(255,255,255,0.025); } .upgrade-record-table { min-width: 1080px; } .upgrade-record-table-wrap { max-height: 300px; border: 1px solid var(--line-soft); } .upgrade-record-table-wrap.compact { max-height: 230px; } .provider-upgrade-records-panel .panel-body { padding: 8px; } .chip-row, .summary-grid { display: flex; flex-wrap: wrap; gap: 5px; } .data-chip, .summary-item, .summary-value { display: inline-flex; gap: 5px; align-items: center; min-height: 22px; padding: 2px 6px; border: 1px solid var(--line-soft); background: rgba(255,255,255,0.03); color: var(--muted); } .data-chip b, .summary-item b { color: var(--accent-2); font-weight: 650; } .table-wrap { overflow: auto; max-height: calc(100vh - 174px); } table { width: 100%; border-collapse: collapse; min-width: 760px; } .node-list-table { min-width: 1180px; } .task-history-table { min-width: 1080px; } .microservice-table { min-width: 1320px; } .findjob-job-table table { min-width: 1180px; } th, td { padding: 7px 9px; border-bottom: 1px solid var(--line-soft); text-align: left; vertical-align: top; } th { position: sticky; top: 0; z-index: 1; background: #111a22; color: var(--accent); font-size: 11px; text-transform: uppercase; letter-spacing: 0.11em; } td { color: var(--text); } .task-duration { display: grid; gap: 2px; min-width: 118px; } .task-duration strong { color: var(--accent-2); font-family: "Cascadia Mono", "IBM Plex Mono", "Liberation Mono", monospace; font-size: 13px; } .task-duration span { color: var(--muted); font-size: 11px; } .task-diagnostic { display: grid; gap: 4px; min-width: 190px; max-width: 360px; } .task-diagnostic b { font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; } .task-diagnostic.ok b { color: var(--ok); } .task-diagnostic.warn b { color: var(--warn); } .task-diagnostic.failed b { color: var(--danger); } .diagnostic-reason { color: #ffd7cf; overflow-wrap: anywhere; } .diagnostic-meta { display: flex; flex-wrap: wrap; gap: 4px; } .compact-row, .heartbeat-row, .log-row, .endpoint-list article, .policy-grid article { display: grid; grid-template-columns: auto minmax(180px, 1fr) auto auto; align-items: center; gap: 10px; padding: 8px; } .log-row { grid-template-columns: 150px 52px 160px minmax(220px, 1fr) auto; } .log-row.error { border-color: rgba(207, 106, 84, 0.48); } .log-row.warn { border-color: rgba(215, 161, 58, 0.48); } .heartbeat-row { grid-template-columns: auto minmax(220px, 1fr) minmax(180px, auto) minmax(180px, auto); } .heartbeat-row span, .endpoint-list span, .policy-grid span { color: var(--muted); } .heartbeat-row b { display: block; margin-top: 2px; } .label-matrix { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 8px; } .label-card { padding: 8px; } .label-card span { display: block; color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em; } .label-card strong { display: block; margin: 5px 0; } .dispatch-form { display: grid; grid-template-columns: 1.2fr 180px 150px 1fr 140px auto; gap: 8px; align-items: end; } .dispatch-form label { display: grid; gap: 4px; color: var(--muted); font-size: 11px; text-transform: uppercase; letter-spacing: 0.12em; } .dispatch-actions { display: flex; gap: 6px; align-items: end; } .dispatch-actions button[type="submit"], .login-form button[type="submit"] { min-height: 32px; padding: 0 12px; border: 1px solid var(--accent); color: #151107; background: var(--accent); font-weight: 760; } .raw-editor-label, .wide { grid-column: 1 / -1; } input, select, textarea { width: 100%; border: 1px solid var(--line); color: var(--text); background: #0b1218; padding: 7px 8px; outline: none; } textarea { min-height: 96px; resize: vertical; } input:focus, select:focus, textarea:focus { border-color: var(--accent-2); } .result-card dl { display: grid; grid-template-columns: 90px 1fr; gap: 5px 8px; margin: 8px 0; } .result-card dt { color: var(--muted); } .result-card dd { margin: 0; } .result-grid { grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); } .microservice-page, .findjob-page, .pipeline-page, .met-page { display: grid; gap: 10px; } .microservice-actions, .inline-actions { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 8px; } .findjob-hero, .pipeline-hero { display: grid; grid-template-columns: minmax(260px, 1.4fr) minmax(260px, 0.9fr) minmax(220px, 0.7fr); gap: 8px; align-items: stretch; } .microservice-ref-card { display: grid; gap: 4px; min-width: 0; padding: 8px; border: 1px solid var(--line-soft); background: var(--panel-3); } .microservice-ref-card span { color: var(--muted); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; } .microservice-ref-card strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .findjob-grid { display: grid; grid-template-columns: minmax(360px, 0.9fr) minmax(560px, 1.35fr); gap: 10px; align-items: start; } .findjob-grid .panel:nth-child(3) { grid-column: 1 / -1; } .pipeline-grid { display: grid; grid-template-columns: minmax(360px, 0.9fr) minmax(520px, 1.25fr); gap: 10px; align-items: start; } .pipeline-grid .panel:nth-child(3), .pipeline-grid .panel:nth-child(5) { grid-column: 1 / -1; } .met-grid { display: grid; grid-template-columns: minmax(420px, 0.9fr) minmax(560px, 1.25fr); gap: 10px; align-items: start; } .met-grid .panel:nth-child(3), .met-grid .panel:nth-child(5) { grid-column: 1 / -1; } .met-progress { height: 6px; margin-top: 5px; overflow: hidden; border: 1px solid var(--line-soft); background: var(--panel-3); } .met-progress span { display: block; height: 100%; min-width: 2px; max-width: 100%; background: linear-gradient(90deg, var(--accent-2), var(--accent)); } .met-job-table { max-height: 460px; overflow: auto; } .met-queue-summary { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin: 0 0 8px; color: var(--muted); font-size: 12px; } .met-queue-summary > span:not(.status-badge) { padding: 4px 8px; border: 1px solid var(--line-soft); background: var(--panel-3); } .met-action-log { margin-top: 8px; padding: 7px 9px; border: 1px solid var(--line-soft); background: rgba(78, 183, 168, 0.08); color: var(--accent-2); font-size: 12px; } .met-control-strip, .met-tabs { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; } .met-control-strip label, .met-fork-card label { display: grid; gap: 4px; color: var(--muted); font-size: 11px; letter-spacing: 0.04em; } .met-control-strip input, .met-fork-card input, .met-fork-card select { min-height: 28px; padding: 4px 8px; } .met-control-strip input { width: 130px; } .met-tabs { padding: 8px; border-bottom: 1px solid var(--line-soft); } .met-tabs button { min-height: 28px; padding: 4px 10px; border: 1px solid var(--line-soft); background: var(--panel-3); color: var(--text); } .met-tabs button.active { border-color: var(--accent); background: rgba(215, 161, 58, 0.14); } .met-workspace { grid-column: 1 / -1; } .met-form-grid { display: grid; grid-template-columns: minmax(280px, 340px) minmax(560px, 1fr); gap: 10px; align-items: start; } .met-fork-card { display: grid; gap: 8px; padding: 10px; border: 1px solid var(--line-soft); background: var(--panel-3); } .met-fork-card h3 { margin: 0 0 2px; font-size: 13px; } .met-project-list { min-width: 0; border: 1px solid var(--line-soft); } .met-project-table { max-height: 520px; overflow: auto; } .ghost-btn.mini { min-height: 22px; padding: 2px 6px; font-size: 11px; } .pipeline-toolbar { display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-end; align-items: center; } .pipeline-toolbar select { width: min(280px, 42vw); min-height: 28px; padding: 4px 8px; } .pipeline-flow-frame { height: min(68vh, 720px); min-height: 520px; border: 1px solid var(--line-soft); background: radial-gradient(circle at 18% 22%, rgba(78, 183, 168, 0.11), transparent 30%), linear-gradient(135deg, rgba(215, 161, 58, 0.09), transparent 44%), #0b1319; } .pipeline-flow-frame .react-flow__pane { cursor: grab; } .pipeline-flow-frame .react-flow__controls { border: 1px solid var(--line); box-shadow: none; } .pipeline-flow-frame .react-flow__controls-button { border-bottom-color: var(--line-soft); background: #111a22; color: var(--text); } .pipeline-flow-frame .react-flow__controls-button svg { fill: currentColor; } .pipeline-flow-frame .react-flow__minimap { border: 1px solid var(--line); background: rgba(8, 13, 18, 0.88); } .pipeline-flow-frame .react-flow__edges { z-index: 30 !important; } .pipeline-flow-frame .react-flow__nodes { z-index: 20 !important; } .pipeline-flow-frame .react-flow__edge-path { stroke: rgba(129, 147, 159, 0.72); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; filter: drop-shadow(0 0 5px rgba(78, 183, 168, 0.12)); } .pipeline-flow-frame .react-flow__edge { opacity: 0.82; z-index: 30 !important; } .pipeline-flow-frame .react-flow__edge:hover, .pipeline-flow-frame .react-flow__edge.selected { opacity: 1; } .pipeline-flow-frame .react-flow__edge:hover .react-flow__edge-path, .pipeline-flow-frame .react-flow__edge.selected .react-flow__edge-path { stroke-width: 2.8; } .pipeline-flow-frame .react-flow__edge.succeeded .react-flow__edge-path { stroke: var(--accent-2); } .pipeline-flow-frame .react-flow__edge.running .react-flow__edge-path { stroke: var(--accent); } .pipeline-flow-frame .react-flow__edge.failed .react-flow__edge-path { stroke: var(--danger); } .pipeline-flow-frame .react-flow__edge.feedback .react-flow__edge-path { stroke-dasharray: 9 7; } .pipeline-flow-frame .react-flow__edge.overlap-colored .react-flow__edge-path { filter: drop-shadow(0 0 6px rgba(215, 161, 58, 0.16)); } .pipeline-flow-frame .pipeline-flow-handle { width: 9px; height: 18px; border: 1px solid rgba(78, 183, 168, 0.8); border-radius: 2px; background: #071016; } .pipeline-flow-frame .pipeline-flow-handle.input.top, .pipeline-flow-frame .pipeline-flow-handle.input.bottom { width: 18px; height: 9px; } .pipeline-flow-frame .pipeline-flow-handle.input.left { left: -6px; } .pipeline-flow-frame .pipeline-flow-handle.input.top { top: -6px; } .pipeline-flow-frame .pipeline-flow-handle.input.bottom { bottom: -6px; } .pipeline-flow-frame .pipeline-flow-handle.output.right { right: -6px; border-color: rgba(215, 161, 58, 0.86); } .pipeline-flow-node { width: 236px; border: 1px solid rgba(129, 147, 159, 0.4); background: linear-gradient(180deg, rgba(19, 29, 38, 0.98), rgba(10, 18, 24, 0.98)); color: var(--text); box-shadow: 0 14px 34px rgba(0,0,0,0.32); } .pipeline-flow-node-body { position: relative; padding: 10px 12px; } .pipeline-flow-node.succeeded { border-color: rgba(78, 183, 168, 0.72); } .pipeline-flow-node.running { border-color: rgba(215, 161, 58, 0.82); } .pipeline-flow-node.failed { border-color: rgba(207, 106, 84, 0.78); } .pipeline-flow-node.quality-gate { background: linear-gradient(180deg, rgba(22, 38, 34, 0.98), rgba(10, 19, 17, 0.98)); } .pipeline-flow-node.control-block { background: linear-gradient(180deg, rgba(36, 31, 20, 0.98), rgba(17, 15, 11, 0.98)); } .flow-node-label { display: grid; gap: 4px; min-width: 0; text-align: left; } .flow-node-label strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text); font-size: 12px; } .flow-node-label span { color: var(--muted); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; } .flow-node-label code { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--accent); } .pipeline-flow-summary { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; color: var(--muted); } .pipeline-flow-summary span { padding: 3px 7px; border: 1px solid var(--line-soft); background: rgba(255,255,255,0.03); } .component-strata { display: grid; grid-template-columns: repeat(auto-fill, minmax(128px, 1fr)); gap: 7px; } .component-stratum, .pipeline-run-card { display: grid; gap: 6px; padding: 9px; border: 1px solid var(--line-soft); background: var(--panel-3); } .component-stratum span { color: var(--muted); font-size: 10px; letter-spacing: 0.13em; text-transform: uppercase; } .component-stratum strong { color: var(--accent-2); font-size: 18px; } .pipeline-component-list { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 9px; } .pipeline-run-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 8px; } .pipeline-log-list { display: grid; gap: 4px; } .pipeline-log-list code { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 5px 7px; border: 1px solid var(--line-soft); background: rgba(0,0,0,0.18); color: #b9d5d8; } .draft-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 8px; } .draft-card { display: grid; gap: 6px; padding: 9px; border: 1px solid var(--line-soft); background: var(--panel-3); } .endpoint-list article { grid-template-columns: 150px minmax(220px, 1fr) auto; } .policy-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); } .policy-grid article { grid-template-columns: 1fr; align-items: start; } .policy-grid strong { font-size: 16px; } .paragraph { margin: 10px 0 0; } .security-board { grid-template-columns: repeat(3, minmax(0, 1fr)); } .security-board article { padding: 10px; display: grid; gap: 5px; } .security-board .allow { border-color: rgba(113,191,120,0.45); } .security-board .deny { border-color: rgba(207,106,84,0.45); } .security-board span { color: var(--muted); } .empty-state { display: grid; gap: 5px; min-height: 52px; align-content: start; justify-items: start; padding: 9px; border: 1px dashed var(--line); color: var(--muted); text-align: left; } .empty-state strong { color: var(--text); } .muted { color: var(--muted); } .login-screen, .loading-screen { min-height: 100vh; display: grid; place-items: center; padding: 18px; } .loading-screen { gap: 10px; align-content: center; color: var(--muted); } .login-card { width: min(440px, 100%); border: 1px solid var(--line); background: linear-gradient(180deg, rgba(255,255,255,0.045), rgba(255,255,255,0.018)), var(--panel); box-shadow: var(--shadow); padding: 18px; } .login-brand { padding-bottom: 14px; border-bottom: 1px solid var(--line-soft); margin-bottom: 14px; } .login-brand h1 { font-size: 24px; } .login-brand p { margin: 2px 0 0; color: var(--muted); text-transform: uppercase; letter-spacing: 0.14em; font-size: 11px; } .login-form { display: grid; gap: 10px; } .login-form label { display: grid; gap: 5px; color: var(--muted); } .login-note { margin-top: 12px; color: var(--muted); font-size: 12px; } .form-error { padding: 7px 8px; border: 1px solid rgba(207,106,84,0.5); color: #ffd7cf; background: rgba(207,106,84,0.1); } .modal-backdrop { position: fixed; inset: 0; z-index: 20; display: grid; place-items: center; padding: 18px; background: rgba(0,0,0,0.58); } .raw-dialog { width: min(920px, 96vw); max-height: 86vh; border: 1px solid var(--line); background: #0a1015; box-shadow: var(--shadow); } .raw-dialog-head { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 10px; border-bottom: 1px solid var(--line); } .raw-json { max-height: calc(86vh - 58px); overflow: auto; margin: 0; padding: 10px; color: #c5dadd; font-size: 12px; line-height: 1.45; } @media (max-width: 1120px) { .metric-grid, .policy-grid, .security-board, .docker-metrics, .monitor-chart-grid, .monitor-summary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .dispatch-form { grid-template-columns: 1fr 1fr; } .dispatch-actions { align-items: center; } .page-grid, .docker-layout, .monitor-layout, .findjob-grid, .findjob-hero, .pipeline-grid, .pipeline-hero { grid-template-columns: 1fr; } .findjob-grid .panel:nth-child(3), .pipeline-grid .panel:nth-child(3), .pipeline-grid .panel:nth-child(5) { grid-column: 1; } .gateway-record-grid { grid-template-columns: 1fr; } .overview-grid .panel:nth-child(n+3), .dispatch-grid .panel:first-child, .topology-grid .panel:nth-child(3) { grid-column: 1; } } @media (max-width: 760px) { body { font-size: 12px; } .shell { grid-template-columns: 1fr; grid-template-rows: auto minmax(0, 1fr); align-content: start; } .rail { position: static; height: 42px; display: flex; align-items: center; gap: 4px; padding: 4px 6px; overflow-x: auto; overflow-y: hidden; border-right: 0; border-bottom: 1px solid var(--line); } .brand { flex: 0 0 auto; height: 32px; margin: 0 3px 0 0; padding: 0 8px 0 0; border-bottom: 0; border-right: 1px solid var(--line-soft); } .brand-mark { width: 30px; height: 24px; font-size: 11px; } .brand-text { display: none; } .module { width: auto; min-width: 88px; min-height: 30px; grid-template-columns: auto 1fr; gap: 5px; padding: 4px 8px; margin: 0; border-left: 0; border-bottom: 2px solid transparent; white-space: nowrap; } .module-code { font-size: 9px; letter-spacing: 0.08em; } .module.active, .module:hover { border-bottom-color: var(--accent); } .workspace { padding: 10px; } .topbar { min-height: 36px; align-items: center; flex-direction: row; padding-bottom: 6px; } .topbar > div:first-child { min-width: 0; flex: 0 0 auto; } .topbar .eyebrow { display: none; } .topbar h1 { font-size: 14px; letter-spacing: 0.05em; white-space: nowrap; } .status-strip { min-width: 0; flex: 1 1 auto; justify-content: flex-end; gap: 5px; padding: 3px 4px; overflow-x: auto; flex-wrap: nowrap; white-space: nowrap; } .status-strip span:not(.dot):not([data-testid="conn-text"]):not(.user-pill) { display: none; } .status-strip .ghost-btn { min-height: 24px; padding: 2px 6px; } .tabs { height: 38px; align-items: center; padding: 5px 0; gap: 4px; overflow-y: hidden; } .tab { min-width: auto; min-height: 28px; padding: 4px 9px; white-space: nowrap; } .metric-grid, .policy-grid, .security-board, .dispatch-form, .docker-metrics, .monitor-chart-grid, .monitor-summary-grid, .gateway-record-grid { grid-template-columns: 1fr; } .compact-row, .heartbeat-row, .log-row, .endpoint-list article, .volume-route, .findjob-hero, .pipeline-hero { grid-template-columns: 1fr; align-items: start; } .docker-hero, .monitor-hero { flex-direction: column; } } .shell.rail-collapsed { grid-template-columns: 58px minmax(0, 1fr); } .rail-toggle { margin-left: auto; min-width: 24px; height: 24px; border: 1px solid var(--line-soft); color: var(--muted); background: rgba(0,0,0,0.18); } .rail-toggle:hover { color: var(--text); border-color: var(--accent); } .rail.collapsed { padding-inline: 8px; } .rail.collapsed .brand { justify-content: center; padding-inline: 0; } .rail.collapsed .brand-text, .rail.collapsed .module > span:not(.module-code) { display: none; } .rail.collapsed .rail-toggle { position: absolute; top: 44px; left: 8px; width: 40px; } .rail.collapsed .module { grid-template-columns: 1fr; justify-items: center; min-height: 38px; padding: 7px 4px; margin-top: 8px; } .rail.collapsed .module-code { font-size: 10px; letter-spacing: 0.08em; } .todo-note-page { display: grid; gap: 10px; } .todo-note-hero { display: grid; grid-template-columns: minmax(280px, 1.35fr) minmax(260px, 0.9fr) minmax(220px, 0.7fr); gap: 8px; align-items: stretch; } .todo-note-layout { display: grid; grid-template-columns: minmax(260px, 0.52fr) minmax(680px, 1.8fr); gap: 10px; align-items: start; } .todo-list-panel .panel-body, .todo-main-stack .panel-body { min-width: 0; } .todo-create-list, .todo-add-form { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 6px; align-items: center; } .todo-instance-list { display: grid; gap: 6px; margin-top: 8px; max-height: calc(100vh - 310px); overflow: auto; } .todo-instance-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 8px; padding: 8px; border: 1px solid var(--line-soft); color: var(--muted); background: var(--panel-3); text-align: left; } .todo-instance-row.active, .todo-instance-row:hover { color: var(--text); border-color: var(--accent-2); background: rgba(78, 183, 168, 0.09); } .todo-instance-row strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .todo-instance-row code { grid-column: 1 / -1; color: #bcd2d7; } .todo-workbench { display: grid; gap: 8px; font-size: var(--todo-font-size, 13px); } .todo-toolbar { display: grid; grid-template-columns: minmax(260px, 1fr) auto auto; gap: 8px; align-items: center; } .todo-filter-strip, .todo-toolbar-actions { display: flex; flex-wrap: wrap; gap: 5px; align-items: center; } .todo-filter { min-height: 28px; padding: 4px 8px; border: 1px solid var(--line); color: var(--muted); background: rgba(12, 18, 24, 0.62); } .todo-filter.active, .todo-filter:hover { color: var(--text); border-color: var(--accent-2); background: rgba(78, 183, 168, 0.11); } .todo-font-control { display: inline-flex; align-items: center; gap: 6px; color: var(--muted); } .todo-font-control input { width: 86px; padding: 0; } .todo-stats-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; } .todo-root-drop { padding: 6px 8px; border: 1px dashed var(--line); color: var(--muted); background: rgba(255,255,255,0.02); } .todo-tree { display: grid; gap: 5px; max-height: calc(100vh - 398px); min-height: 280px; overflow: auto; align-content: start; } .todo-row-wrap { display: grid; gap: 5px; } .todo-row { display: grid; grid-template-columns: 28px 24px minmax(240px, 1fr) 178px minmax(360px, auto); gap: 6px; align-items: center; margin-left: calc(var(--todo-depth, 0) * 18px); padding: 6px; border: 1px solid var(--line-soft); background: var(--panel-3); } .todo-row.completed { opacity: 0.76; } .todo-row.completed .todo-title-cell strong { text-decoration: line-through; color: var(--muted); } .todo-row.dragging { border-color: var(--accent); background: rgba(215, 161, 58, 0.08); } .todo-expand { min-width: 24px; height: 24px; border: 1px solid var(--line-soft); color: var(--muted); background: rgba(0,0,0,0.14); } .todo-expand:disabled { opacity: 0.45; cursor: default; } .todo-title-cell { min-width: 0; display: grid; gap: 3px; } .todo-title-cell strong { overflow-wrap: anywhere; color: var(--text); font-size: var(--todo-font-size, 13px); } .todo-meta-line { display: flex; flex-wrap: wrap; gap: 5px; color: var(--muted); font-size: 11px; } .todo-reminder { color: var(--accent); } .todo-reminder-input { min-width: 176px; padding: 5px 6px; } .todo-row-actions, .todo-edit-inline { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; } .todo-row-actions .ghost-btn { min-height: 24px; padding: 2px 6px; } .todo-children { display: grid; gap: 5px; } @media (max-width: 1120px) { .todo-note-layout, .todo-note-hero, .todo-toolbar { grid-template-columns: 1fr; } .todo-row { grid-template-columns: 28px 24px minmax(220px, 1fr); } .todo-reminder-input, .todo-row-actions { grid-column: 3; } .todo-stats-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 760px) { .shell.rail-collapsed { grid-template-columns: 1fr; grid-template-rows: auto minmax(0, 1fr); } .rail.collapsed { height: 42px; padding: 4px 6px; } .rail.collapsed .brand { justify-content: flex-start; padding: 0 8px 0 0; } .rail.collapsed .rail-toggle { position: static; width: 24px; flex: 0 0 auto; } .rail.collapsed .module { width: auto; min-width: 88px; min-height: 30px; grid-template-columns: auto 1fr; justify-items: start; gap: 5px; padding: 4px 8px; margin: 0; } .rail.collapsed .module > span:not(.module-code) { display: inline; } .todo-stats-grid, .todo-create-list, .todo-add-form { grid-template-columns: 1fr; } .todo-tree { max-height: none; min-height: 220px; } .todo-row { grid-template-columns: 24px minmax(0, 1fr); margin-left: 0; } .todo-row > input[type="checkbox"] { grid-column: 1; } .todo-title-cell, .todo-reminder-input, .todo-row-actions { grid-column: 1 / -1; } }