/* mindXtrain Coach — minimal, dark-friendly. No external CSS framework. */ :root { color-scheme: light dark; --bg: #0d1117; --fg: #e6edf3; --muted: #8b949e; --accent: #f7921e; /* AMD orange */ --accent-2: #2f81f7; /* link blue */ --card: #161b22; --border: #30363d; --code-bg: #010409; --ok: #2ea043; --warn: #d29922; --bad: #f85149; } * { box-sizing: border-box; } body { margin: 0; font-family: ui-sans-serif, system-ui, -apple-system, sans-serif; background: var(--bg); color: var(--fg); line-height: 1.5; } header { padding: 2rem 1.5rem 1rem; max-width: 1100px; margin: 0 auto; } h1 { margin: 0 0 0.75rem; font-size: 2rem; } h1 .muted { color: var(--accent); font-weight: 400; } h2 { margin: 0; font-size: 1.15rem; } .muted { color: var(--muted); } .pipeline { display: flex; align-items: center; gap: 0.5rem; margin: 0.75rem 0; font-size: 0.9rem; } .stage { border: 1px solid var(--border); border-radius: 6px; padding: 0.5rem 0.75rem; background: var(--card); text-align: center; min-width: 8rem; } .stage.active { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset; } .arrow { color: var(--muted); font-size: 1.25rem; } .lede { color: var(--muted); max-width: 70ch; margin-top: 0.5rem; } .coach-nav { margin-top: 0.9rem; display: flex; gap: 1.2rem; flex-wrap: wrap; } .coach-nav a { color: var(--accent-2); font-size: 0.88rem; text-decoration: none; } .coach-nav a:first-child { color: var(--accent); font-weight: 600; } .coach-nav a:hover { text-decoration: underline; } main { max-width: 1100px; margin: 0 auto; padding: 0 1.5rem 3rem; display: flex; flex-direction: column; gap: 1.25rem; } .card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 1.25rem 1.5rem; transition: border-color 200ms ease, box-shadow 200ms ease, opacity 200ms ease; scroll-margin-top: 1rem; } /* Inline "Check now"-style re-probe trigger in a card header. */ .link-button { background: none; border: none; color: var(--accent-2); cursor: pointer; font: inherit; padding: 0; text-decoration: underline; } .link-button:hover { color: var(--accent); } /* Auto-advance step states. .active = the step the user is on; .done = a completed step (kept visible for context); neither = pending. */ .card.active { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent) inset, 0 4px 18px rgba(247, 146, 30, 0.12); } .card.done { opacity: 0.78; border-color: var(--ok); } .card.done > header h2 .step { background: var(--ok); color: #fff; } .card.done > header h2 .step::before { content: "✓ "; font-weight: 700; } .card:not(.active):not(.done) { opacity: 0.72; } .card:not(.active):not(.done):hover { opacity: 0.95; } .card > header { display: flex; justify-content: space-between; align-items: baseline; padding: 0; margin: 0 0 0.75rem; max-width: none; } .step { display: inline-flex; width: 1.5rem; height: 1.5rem; border-radius: 50%; background: var(--accent); color: #000; align-items: center; justify-content: center; font-size: 0.85rem; font-weight: 600; margin-right: 0.5rem; } .hint { color: var(--muted); font-size: 0.85rem; } .prose { color: var(--muted); max-width: 75ch; } button { font: inherit; background: var(--accent); color: #000; border: 0; padding: 0.5rem 1rem; border-radius: 4px; cursor: pointer; font-weight: 600; } button:disabled { background: var(--border); color: var(--muted); cursor: not-allowed; } button:hover:not(:disabled) { filter: brightness(1.1); } input, textarea { font: inherit; background: var(--code-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; padding: 0.4rem 0.6rem; } input[type="number"] { width: 5rem; } textarea { width: 100%; resize: vertical; } .code { background: var(--code-bg); border: 1px solid var(--border); padding: 0.75rem 1rem; border-radius: 4px; overflow-x: auto; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.85rem; margin: 0.75rem 0 0; max-height: 24rem; } .grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 0.75rem; margin-bottom: 0.75rem; } .recipe { border: 1px solid var(--border); border-radius: 6px; padding: 0.75rem 0.9rem; background: var(--bg); cursor: pointer; transition: border-color 120ms ease; } .recipe:hover { border-color: var(--accent-2); } .recipe.selected { border-color: var(--accent); background: rgba(247, 146, 30, 0.05); } /* Training session — tiered metrics panel inside #step-train */ .sea-status { display: flex; align-items: center; gap: 0.6rem; margin: 0.5rem 0; padding: 0.5rem 0.7rem; border: 1px solid var(--border); border-radius: 6px; background: var(--code-bg); font-size: 0.85rem; } .sea-status .hint { text-transform: none; letter-spacing: 0; } .session-headline { display: flex; align-items: center; gap: 0.75rem; flex-wrap: wrap; margin: 0.5rem 0 0.75rem; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9rem; } .session-headline .hint { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em; } .session-headline .mono { color: var(--fg); } /* --- realtime training feedback: phase line, progress bar, result --- */ .train-phase { margin: 0.35rem 0 0.25rem; font-size: 0.95rem; font-weight: 500; color: var(--fg); } .train-progress { margin: 0.25rem 0 0.75rem; display: flex; align-items: center; gap: 0.6rem; } .progress-track { flex: 1; height: 8px; background: var(--border); border-radius: 4px; overflow: hidden; } .progress-fill { height: 100%; width: 0%; background: var(--accent); transition: width 0.4s ease; } .progress-fill.done { background: var(--ok); } .train-result { margin: 0.75rem 0; padding: 0.6rem 0.9rem; border-radius: 6px; border-left: 4px solid var(--ok); background: var(--code-bg); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.9rem; color: var(--fg); } .train-result.failed { border-left-color: var(--bad); } .core-pip { display: inline-block; width: 7px; height: 7px; margin-left: 2px; border-radius: 2px; background: var(--border); vertical-align: middle; } .core-pip.on { background: var(--accent); } #session-metrics > summary, #metrics-table-wrap > summary, #train-log-wrap > summary { cursor: pointer; user-select: none; font-size: 0.85rem; color: var(--muted); margin-bottom: 0.5rem; } #session-metrics > summary:hover, #metrics-table-wrap > summary:hover, #train-log-wrap > summary:hover { color: var(--fg); } #metrics-table-wrap { margin-top: 0.75rem; } #chart-window-note { margin: 0.25rem 0 0; } /* Create-script (dataset authoring) form. */ .dataset-form { display: flex; flex-direction: column; gap: 0.6rem; } .dataset-form label { display: flex; flex-direction: column; gap: 0.25rem; font-size: 0.9rem; } .dataset-form textarea { width: 100%; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; padding: 0.4rem 0.6rem; font-family: inherit; } .dataset-form .train-controls { flex-direction: row; align-items: center; flex-wrap: wrap; } /* Streaming chat transcript. */ .chat-transcript { max-height: 360px; overflow-y: auto; border: 1px solid var(--border); border-radius: 8px; padding: 0.5rem 0.75rem; margin: 0.5rem 0; display: flex; flex-direction: column; gap: 0.5rem; } .chat-msg { display: flex; flex-direction: column; gap: 0.15rem; } .chat-role { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.04em; color: var(--muted); } .chat-text { white-space: pre-wrap; } .chat-msg.chat-user .chat-text { color: var(--accent-2); } .chat-msg.chat-assistant .chat-text { color: var(--fg); } #step-chat textarea { flex: 1; min-width: 16rem; } .metrics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 0.75rem; margin: 0.25rem 0 0.75rem; } .spark-cell h4 { margin: 0 0 0.25rem; font-size: 0.7rem; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted); font-weight: 600; } .spark-cell svg { display: block; background: var(--code-bg); border: 1px solid var(--border); border-radius: 4px; width: 100%; max-width: 320px; } .spark-cell .mono { display: inline-block; margin-top: 0.2rem; font-size: 0.85rem; color: var(--fg); } .chronos-step { background: var(--accent-2); color: #fff; font-size: 0.95rem; } .chronos-headline { display: flex; align-items: center; gap: 0.75rem; font-size: 1.1rem; margin: 0.5rem 0 1rem; } .chronos-headline .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.95rem; } .chronos-charts { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 1rem; margin: 0.75rem 0; } .chronos-chart-wrap h3 { margin: 0 0 0.25rem; font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); font-weight: 600; } .chronos-chart-wrap svg { display: block; width: 100%; max-width: 320px; background: var(--code-bg); border: 1px solid var(--border); border-radius: 4px; } .chronos-confidence-row { display: flex; align-items: center; gap: 0.5rem; margin-top: 0.5rem; } /* Consensus tier colors — reused for the headline pill */ .badge-status.tier-correlated, .badge-status.tier-tight { background: rgba(46, 160, 67, 0.18); color: var(--ok); } .badge-status.tier-degraded, .badge-status.tier-loose { background: rgba(210, 153, 34, 0.18); color: var(--warn); } .badge-status.tier-drifted, .badge-status.tier-divergent, .badge-status.tier-unavailable, .badge-status.tier-offline { background: rgba(248, 81, 73, 0.18); color: var(--bad); } .badge-status.tier-unknown { background: var(--border); color: var(--muted); } .backend-badge { display: inline-flex; align-items: center; gap: 0.3rem; font-size: 0.7rem; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 500; letter-spacing: 0.05em; text-transform: uppercase; padding: 0.2rem 0.55rem; border-radius: 999px; vertical-align: middle; margin-left: 0.6rem; border: 1px solid var(--border); } .backend-badge::before { content: ""; display: inline-block; width: 0.5rem; height: 0.5rem; border-radius: 50%; background: var(--muted); } .backend-badge.ready { color: var(--ok); border-color: rgba(46, 160, 67, 0.4); background: rgba(46, 160, 67, 0.08); } .backend-badge.ready::before { background: var(--ok); } .backend-badge.notready { color: var(--muted); border-color: var(--border); background: rgba(139, 148, 158, 0.08); } .backend-badge.notready::before { background: var(--warn); } .recipe.recommended { border-color: var(--accent-2); box-shadow: 0 0 0 2px rgba(247, 146, 30, 0.25), 0 0 12px rgba(247, 146, 30, 0.15); position: relative; } .recipe.recommended::after { content: "recommended"; position: absolute; top: 0.4rem; right: 0.5rem; font-size: 0.65rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--accent); font-family: ui-monospace, monospace; } .recipe h3 { margin: 0 0 0.25rem; font-size: 1rem; font-family: ui-monospace, monospace; } .recipe .meta { color: var(--muted); font-size: 0.8rem; } .recipe .badge { display: inline-block; padding: 0.05rem 0.4rem; border-radius: 3px; background: var(--border); color: var(--fg); font-size: 0.7rem; margin-right: 0.25rem; } .summary { list-style: none; padding: 0; margin: 0.75rem 0 0; display: flex; flex-wrap: wrap; gap: 0.5rem; } .summary li { background: var(--code-bg); border: 1px solid var(--border); padding: 0.3rem 0.6rem; border-radius: 3px; font-family: ui-monospace, monospace; font-size: 0.8rem; } .cost-controls { display: flex; gap: 1rem; align-items: center; flex-wrap: wrap; margin-bottom: 0.75rem; } .cost-controls label { display: flex; flex-direction: column; gap: 0.25rem; font-size: 0.85rem; color: var(--muted); } table { width: 100%; border-collapse: collapse; margin-top: 0.5rem; } th, td { text-align: left; padding: 0.5rem 0.75rem; border-bottom: 1px solid var(--border); font-size: 0.9rem; } th { color: var(--muted); font-weight: 500; } td.fits-yes { color: var(--ok); } td.fits-no { color: var(--bad); } .headline { font-size: 1.15rem; margin-top: 1rem; padding: 0.75rem 1rem; border-left: 3px solid var(--accent); background: var(--code-bg); } #step-chat .hint.ready { color: var(--ok); } #step-chat .hint.notready { color: var(--warn); } /* --- step 4: live training -------------------------------------------- */ .train-controls { display: flex; gap: 0.75rem; align-items: center; flex-wrap: wrap; margin-bottom: 0.75rem; } .train-controls .mono { font-family: ui-monospace, monospace; font-size: 0.8rem; } .badge-status { display: inline-block; padding: 0.15rem 0.6rem; border-radius: 3px; font-size: 0.75rem; font-family: ui-monospace, monospace; border: 1px solid var(--border); background: var(--code-bg); color: var(--muted); text-transform: lowercase; letter-spacing: 0.04em; } .badge-status.running { color: var(--accent-2); border-color: var(--accent-2); } .badge-status.pending, .badge-status.launching { color: var(--warn); border-color: var(--warn); } .badge-status.succeeded { color: var(--ok); border-color: var(--ok); } .badge-status.failed, .badge-status.cancelled, .badge-status.disconnected { color: var(--bad); border-color: var(--bad); } #cancel-train { background: transparent; color: var(--bad); border: 1px solid var(--bad); } #cancel-train:hover:not(:disabled) { background: var(--bad); color: #000; filter: none; } .chart-wrap { background: var(--code-bg); border: 1px solid var(--border); border-radius: 4px; padding: 0.75rem; margin: 0.5rem 0; } .chart-wrap canvas { max-width: 100%; } #metrics-table { font-family: ui-monospace, monospace; font-size: 0.8rem; } #metrics-table th, #metrics-table td { padding: 0.25rem 0.6rem; } .log-tail { max-height: 18rem; overflow-y: auto; white-space: pre; } /* --- step 6: deploy --------------------------------------------------- */ .deploy-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(310px, 1fr)); gap: 0.85rem; margin-top: 0.75rem; } .deploy-card { border: 1px solid var(--border); border-radius: 6px; padding: 0.85rem 1rem; background: var(--bg); display: flex; flex-direction: column; } .deploy-card h3 { margin: 0 0 0.4rem; font-size: 1rem; font-family: ui-monospace, monospace; } .deploy-card .deploy-status { margin: 0; } .deploy-card .deploy-status.ready { color: var(--ok); } .deploy-card .deploy-status.notready { color: var(--warn); } .deploy-target { margin: 0.4rem 0 0.6rem; color: var(--muted); font-size: 0.8rem; font-family: ui-monospace, monospace; min-height: 1em; word-break: break-all; } .deploy-target.mono { font-family: ui-monospace, monospace; } .deploy-controls { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; } .deploy-controls .deploy-opt { font-size: 0.75rem; color: var(--muted); display: inline-flex; align-items: center; gap: 0.25rem; } .deploy-card .log-tail { margin-top: 0.6rem; max-height: 14rem; } [id^="cancel-github"], [id^="cancel-provision"], [id^="cancel-sync"] { background: transparent; color: var(--bad); border: 1px solid var(--bad); padding: 0.3rem 0.7rem; font-size: 0.85rem; } [id^="cancel-github"]:hover:not(:disabled), [id^="cancel-provision"]:hover:not(:disabled), [id^="cancel-sync"]:hover:not(:disabled) { background: var(--bad); color: #000; filter: none; } /* Advanced admin card -------------------------------------------------- */ .admin-card { border-left: 4px solid var(--accent-2); background: linear-gradient(180deg, rgba(47, 129, 247, 0.06) 0%, var(--card) 30%); } .admin-card > summary { cursor: pointer; list-style: none; display: flex; justify-content: space-between; align-items: baseline; } .admin-card > summary::-webkit-details-marker { display: none; } .admin-card > summary h2 { display: inline-block; } .admin-step { background: var(--accent-2); color: #fff; } .admin-metrics-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 0.5rem; margin: 0.75rem 0; } .admin-metric { background: var(--bg); border: 1px solid var(--border); border-radius: 6px; padding: 0.5rem 0.75rem; } .admin-metric-label { font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--muted); } .admin-metric-value { font-size: 1.2rem; font-weight: 600; font-variant-numeric: tabular-nums; } .admin-metric.warn { border-color: var(--warn); } .admin-metric.warn .admin-metric-value { color: var(--warn); } .admin-metric.bad { border-color: var(--bad); } .admin-metric.bad .admin-metric-value { color: var(--bad); } #admin-runs-table { width: 100%; border-collapse: collapse; margin: 0.5rem 0; font-size: 0.85rem; } #admin-runs-table th, #admin-runs-table td { text-align: left; padding: 0.25rem 0.5rem; border-bottom: 1px solid var(--border); } #admin-runs-table .status-running { color: var(--accent); } #admin-runs-table .status-succeeded { color: var(--ok); } #admin-runs-table .status-failed, #admin-runs-table .status-cancelled { color: var(--bad); } #admin-runs-table .status-pending { color: var(--muted); } #admin-firehose { font-size: 0.75rem; background: var(--code-bg); } /* Collapsible log fold (.log-tail > details) --------------------------- */ .log-tail details { margin-bottom: 0.5rem; background: rgba(255, 255, 255, 0.03); border-left: 2px solid var(--muted); padding: 0.25rem 0.5rem; border-radius: 4px; } .log-tail details summary { cursor: pointer; color: var(--muted); font-size: 0.75rem; padding: 0.15rem 0; user-select: none; } .log-tail details summary:hover { color: var(--fg); } .log-tail details[open] summary::before { content: "▾ "; } .log-tail details:not([open]) summary::before { content: "▸ "; } .log-tail pre.folded { margin: 0.25rem 0 0; padding: 0; font-size: 0.75rem; opacity: 0.85; background: transparent; border: none; white-space: pre-wrap; overflow: visible; max-height: none; } /* Hardware diagnostics card -------------------------------------------- */ .hw-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 0.75rem; margin: 0.5rem 0 1rem; } .hw-panel { background: var(--bg); border: 1px solid var(--border); border-radius: 6px; padding: 0.75rem 1rem; } .hw-panel h3 { margin: 0 0 0.5rem; font-size: 1rem; display: flex; justify-content: space-between; align-items: baseline; } .hw-panel h3::after { content: attr(data-status); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; } .hw-panel dl { margin: 0; display: grid; grid-template-columns: max-content 1fr; gap: 0.15rem 0.5rem; font-size: 0.85rem; } .hw-panel dt { color: var(--muted); } .hw-panel dd { margin: 0; font-family: ui-monospace, "Roboto Mono", monospace; font-size: 0.85rem; } .hw-panel.hw-ok { border-color: var(--ok); } .hw-panel.hw-off { opacity: 0.6; } .hw-note { margin: 0.5rem 0 0; font-style: italic; font-size: 0.8rem; } /* MEI card -------------------------------------------------------------- */ .mei-headline { display: flex; align-items: baseline; gap: 0.75rem; margin: 0.5rem 0 1rem; } .mei-composite-label { font-size: 0.85rem; text-transform: uppercase; letter-spacing: 0.1em; color: var(--muted); } .mei-composite-value { font-size: 2rem; font-weight: 700; color: var(--accent); font-variant-numeric: tabular-nums; } .mei-flag { font-size: 0.75rem; padding: 0.15rem 0.5rem; border-radius: 999px; background: rgba(210, 153, 34, 0.18); color: var(--warn); border: 1px solid var(--warn); } .mei-chart-wrap { max-width: 380px; margin: 0 auto 1rem; } #mei-subindex-list code { display: inline-block; min-width: 5rem; color: var(--muted); } .mei-controls { display: flex; gap: 0.5rem; align-items: center; margin: 0.75rem 0; } #mei-promote:disabled { opacity: 0.45; cursor: not-allowed; } #mei-promote:not(:disabled) { background: var(--ok); color: #000; border-color: var(--ok); } #mei-reasons li { color: var(--bad); } #mei-history-table { width: 100%; border-collapse: collapse; margin-top: 0.5rem; font-size: 0.85rem; } #mei-history-table th, #mei-history-table td { text-align: left; padding: 0.3rem 0.5rem; border-bottom: 1px solid var(--border); } #mei-history-table .promoted-mark { color: var(--ok); font-weight: 700; } footer { max-width: 1100px; margin: 2rem auto; padding: 0 1.5rem; color: var(--muted); font-size: 0.85rem; } footer a { color: var(--accent-2); }