@import url('https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500;600;700&family=Fira+Sans:wght@400;500;600;700&display=swap'); @import 'reactflow/dist/style.css'; /* ===================================================================== FlowMaster Mission Control — INDUSTRIAL BLUEPRINT Doctrine: FM06/flow-master-design-philosophy - operations cockpit, industrial, instrumented, accountable - light paper canvas + navy frame + amber accent - 1px rules, square edges, monospace operational density ===================================================================== */ :root { /* Doctrinal hex tokens — declared once, referenced everywhere via var(). */ --bp-paper: #f5f7fb; --bp-paper-2: #e8edf5; --bp-paper-3: #d5dde9; --bp-navy: #1a2740; --bp-navy-2: #243453; --bp-muted: #4a5b80; --bp-muted-2: #7a8aa8; --bp-amber: #c46a14; --bp-ok: #3d6a2c; --bp-err: #a6342a; --bp-info: #1d6f82; --bp-mono: 'Fira Code', ui-monospace, monospace; --bp-sans: 'Fira Sans', system-ui, sans-serif; /* Derived alpha tokens via color-mix so the doctrinal palette stays canonical. */ --bp-grid-minor: color-mix(in srgb, var(--bp-navy) 13%, transparent); --bp-grid-major: color-mix(in srgb, var(--bp-navy) 33%, transparent); --bp-mask: color-mix(in srgb, var(--bp-navy) 18%, transparent); --bp-amber-soft: color-mix(in srgb, var(--bp-amber) 8%, transparent); --bp-amber-strong: color-mix(in srgb, var(--bp-amber) 16%, transparent); --bp-ok-soft: color-mix(in srgb, var(--bp-ok) 8%, transparent); --bp-ok-strong: color-mix(in srgb, var(--bp-ok) 16%, transparent); --bp-err-soft: color-mix(in srgb, var(--bp-err) 10%, transparent); --bp-info-soft: color-mix(in srgb, var(--bp-info) 10%, transparent); --bp-row-hover: color-mix(in srgb, var(--bp-navy) 5%, transparent); /* Backwards-compat aliases so existing class rules read from doctrine. */ --bg: var(--bp-paper); --bg-deep: var(--bp-paper); --surface: var(--bp-paper); --surface-2: var(--bp-paper-2); --surface-3: var(--bp-paper-3); --border: var(--bp-navy); --border-strong: var(--bp-navy); --border-glow: var(--bp-amber); --text: var(--bp-navy); --text-2: var(--bp-muted); --text-3: var(--bp-muted-2); --text-soft: var(--bp-navy-2); --primary: var(--bp-amber); --primary-deep: var(--bp-amber); --primary-soft: var(--bp-amber-soft); --accent: var(--bp-amber); --ok: var(--bp-ok); --run: var(--bp-amber); --queue: var(--bp-info); --block: var(--bp-err); --idle: var(--bp-muted-2); --syn: var(--bp-info); --ring: var(--bp-amber); --mono: var(--bp-mono); --sans: var(--bp-sans); --radius-sm: 0; --radius: 0; --radius-lg: 0; --radius-xl: 0; } html[data-theme="dark"] { --bp-paper: #0c1322; --bp-paper-2: #1a2740; --bp-paper-3: #243453; --bp-navy: #e6edf7; --bp-navy-2: #d5dde9; --bp-muted: #7a8aa8; --bp-muted-2: #4a5b80; } /* ===================================================================== Base ===================================================================== */ * { box-sizing: border-box; border-radius: 0; } html, body, #root { height: 100%; margin: 0; } body { background: var(--bp-paper); color: var(--bp-navy); font-family: var(--bp-mono); font-size: 12px; line-height: 1.55; -webkit-font-smoothing: antialiased; overflow: hidden; } .mono { font-family: var(--bp-mono); font-variant-numeric: tabular-nums; } button { font-family: inherit; cursor: pointer; border: 0; background: none; color: inherit; } button:focus-visible { outline: 2px solid var(--bp-amber); outline-offset: 1px; } :focus-visible { outline: 2px solid var(--bp-amber); outline-offset: 1px; } kbd { font-family: var(--bp-mono); font-size: 10px; background: var(--bp-paper-2); padding: 1px 5px; border: 1px solid var(--bp-navy); color: var(--bp-navy); } ::selection { background: var(--bp-amber); color: var(--bp-paper); } /* ===================================================================== Shell ===================================================================== */ .shell { display: grid; grid-template-rows: auto 1fr; height: 100%; min-height: 0; } .shell-landing { grid-template-rows: 1fr; } .scene { min-height: 0; overflow: hidden; } /* ===================================================================== Topbar (industrial instrument strip) ===================================================================== */ .topbar { position: relative; z-index: 190; display: grid; grid-template-columns: auto auto 1fr auto; align-items: stretch; gap: 0; padding: 0; height: 44px; border-bottom: 1px solid var(--bp-navy); background: var(--bp-paper); font-family: var(--bp-mono); font-size: 11px; } .brand-lock { display: inline-flex; align-items: center; gap: 8px; padding: 0 14px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; background: var(--bp-navy); color: var(--bp-paper); border-right: 1px solid var(--bp-navy); } .brand-btn { padding: 0 14px; } .brand-btn:hover { background: var(--bp-navy-2); } .brand-mark { width: 14px; height: 14px; background: var(--bp-amber); border: 1px solid var(--bp-paper); } .brand-mark.sm { width: 12px; height: 12px; } .brand-name { font-weight: 700; } .brand-divider { width: 1px; height: 14px; background: var(--bp-paper-2); opacity: 0.5; } .brand-sub { color: var(--bp-paper-2); font-weight: 500; letter-spacing: 0.1em; } .tabs { display: inline-flex; gap: 0; align-items: stretch; border-right: 1px solid var(--bp-navy); } .tab { display: inline-flex; align-items: center; gap: 6px; padding: 0 14px; border-right: 1px solid var(--bp-navy); color: var(--bp-muted); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; transition: background .12s, color .12s; } .tab:last-child { border-right: 0; } .tab:hover { background: var(--bp-paper-2); color: var(--bp-navy); } .tab-sel { background: var(--bp-amber); color: var(--bp-paper); } .tab-sel:hover { background: var(--bp-amber); color: var(--bp-paper); } .topbar-mid { display: flex; align-items: stretch; min-width: 0; } .topbar-context { display: inline-flex; align-items: stretch; gap: 0; min-width: 0; } .topbar-chip { display: inline-flex; align-items: center; gap: 6px; padding: 0 12px; border-right: 1px solid var(--bp-navy); font-size: 10.5px; color: var(--bp-muted); letter-spacing: 0.08em; text-transform: uppercase; max-width: 360px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .topbar-chip:first-child { border-left: 1px solid var(--bp-navy); } .topbar-actions { display: inline-flex; align-items: stretch; } .link-btn { display: inline-flex; align-items: center; gap: 6px; padding: 0 12px; border-left: 1px solid var(--bp-navy); color: var(--bp-muted); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; transition: background .12s, color .12s; } .link-btn:hover:not(:disabled) { background: var(--bp-paper-2); color: var(--bp-navy); } .link-btn:disabled { opacity: 0.45; cursor: not-allowed; } .link-btn.is-on { background: var(--bp-amber-soft); color: var(--bp-amber); } .user-btn .user-email { max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .badge { display: inline-flex; align-items: center; margin-left: 6px; font-size: 9.5px; font-weight: 700; padding: 1px 6px; background: var(--bp-navy); color: var(--bp-paper); } .mode-toggle { gap: 8px; } .mode-pill { display: inline-flex; align-items: center; font-size: 9.5px; font-weight: 700; letter-spacing: 0.14em; padding: 1px 6px; border: 1px solid currentColor; background: transparent; } .mode-snapshot { color: var(--bp-info); } .mode-snapshot.mode-pill { background: var(--bp-info-soft); } .mode-live { color: var(--bp-ok); } .mode-live.mode-pill { background: var(--bp-ok-soft); } .topbar-age { font-family: var(--bp-mono); font-size: 10px; color: var(--bp-muted-2); } .spin { width: 11px; height: 11px; border: 2px solid var(--bp-paper-3); border-top-color: var(--bp-amber); animation: spin 0.8s linear infinite; display: inline-block; } @keyframes spin { to { transform: rotate(360deg); } } @media (prefers-reduced-motion: reduce) { .spin { animation: none; } } /* ===================================================================== Mission Control ===================================================================== */ .mc { display: grid; grid-template-rows: auto auto 1fr auto; height: 100%; min-height: 0; } .mc-strip { display: flex; gap: 0; padding: 0; background: var(--bp-paper); border-bottom: 1px solid var(--bp-navy); overflow-x: auto; } .mc-tab { display: inline-flex; align-items: center; gap: 8px; padding: 7px 14px; border-right: 1px solid var(--bp-navy); color: var(--bp-muted); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; font-weight: 600; white-space: nowrap; transition: background .12s, color .12s; } .mc-tab:hover { background: var(--bp-paper-2); color: var(--bp-navy); } .mc-tab-sel { background: var(--bp-paper-2); color: var(--bp-navy); border-top: 2px solid var(--bp-amber); padding-top: 5px; } .mc-tab-dot { width: 7px; height: 7px; background: var(--bp-amber); } .mc-tab-label { font-size: 11px; } .mc-tab-mark { font-size: 9.5px; padding: 0 6px; letter-spacing: 0.14em; border: 1px solid currentColor; font-weight: 700; } .mc-tab-mark.is-live { color: var(--bp-ok); background: var(--bp-ok-soft); } .mc-tab-mark.is-syn { color: var(--bp-info); background: var(--bp-info-soft); } .mc-hero { display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 16px; padding: 14px 20px; border-bottom: 1px solid var(--bp-navy); background: var(--bp-paper); } .mc-hero-eyebrow { color: var(--bp-muted); font-size: 10px; text-transform: uppercase; letter-spacing: 0.18em; font-weight: 700; display: inline-flex; align-items: center; gap: 6px; } .mc-hero-title { margin: 4px 0 2px; font-family: var(--bp-mono); font-size: 18px; font-weight: 700; letter-spacing: 0.02em; text-transform: uppercase; } .mc-hero-sub { color: var(--bp-muted); font-size: 11.5px; letter-spacing: 0.04em; } .mc-hero-kpis { display: inline-flex; gap: 0; } .mc-kpi { background: var(--bp-paper); border: 1px solid var(--bp-navy); border-right-width: 0; padding: 6px 14px; min-width: 96px; text-align: right; } .mc-kpi:last-child { border-right-width: 1px; } .mc-kpi-v { font-size: 18px; font-weight: 700; font-family: var(--bp-mono); } .mc-kpi-l { font-size: 9.5px; color: var(--bp-muted); text-transform: uppercase; letter-spacing: 0.12em; margin-top: 2px; font-weight: 600; } .mc-body { display: grid; grid-template-columns: 300px 1fr 360px; min-height: 0; } .mc-main { position: relative; min-width: 0; background: var(--bp-paper-2); } .mc-main:has([data-canvas="blueprint"]) { background: transparent; padding: 8px; } .mc-banner { display: flex; align-items: center; gap: 8px; padding: 6px 16px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; font-weight: 600; border-bottom: 1px solid var(--bp-navy); } .mc-banner-info { background: var(--bp-info-soft); color: var(--bp-info); } .mc-banner-err { background: var(--bp-err-soft); color: var(--bp-err); } .mc-banner .mono { color: inherit; font-size: 11px; } /* ===================================================================== Left rail ===================================================================== */ .left-rail { border-right: 1px solid var(--bp-navy); background: var(--bp-paper); overflow-y: auto; min-height: 0; } .panel { padding: 12px; border-bottom: 1px solid var(--bp-navy); } .panel-h { margin: 0 0 10px; font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--bp-muted); font-weight: 700; display: flex; align-items: center; gap: 6px; } .panel-count { margin-left: auto; color: var(--bp-navy); background: var(--bp-paper-2); border: 1px solid var(--bp-navy); padding: 0 7px; font-size: 10px; font-weight: 700; letter-spacing: 0; } .kpi-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0; border: 1px solid var(--bp-navy); } .kpi { background: var(--bp-paper); border-right: 1px solid var(--bp-navy); border-bottom: 1px solid var(--bp-navy); padding: 8px 10px; } .kpi:nth-child(2n) { border-right: 0; } .kpi:nth-last-child(-n+2) { border-bottom: 0; } .kpi-v { font-size: 16px; font-weight: 700; font-family: var(--bp-mono); display: inline-flex; align-items: center; gap: 4px; color: var(--bp-navy); } .kpi-l { font-size: 9.5px; color: var(--bp-muted); text-transform: uppercase; letter-spacing: 0.12em; margin-top: 2px; font-weight: 600; } .kpi-t { font-size: 9.5px; color: var(--bp-muted-2); margin-top: 1px; } .cards { display: flex; flex-direction: column; gap: 0; border: 1px solid var(--bp-navy); } .qcard { display: block; width: 100%; text-align: left; background: var(--bp-paper); border-bottom: 1px solid var(--bp-navy); padding: 8px 10px; color: var(--bp-navy); font-family: var(--bp-mono); transition: background .12s; } .qcard:last-child { border-bottom: 0; } .qcard:hover { background: var(--bp-paper-2); } .qcard-sel { background: var(--bp-amber-soft); } .qcard-sel:hover { background: var(--bp-amber-soft); } .qcard-title { font-weight: 700; font-size: 11.5px; text-transform: uppercase; letter-spacing: 0.04em; } .qcard-meta { display: flex; gap: 10px; align-items: center; margin-top: 5px; color: var(--bp-muted); font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; } .qcard-status.is-err { color: var(--bp-err); } .qcard-age { display: inline-flex; align-items: center; gap: 3px; } .agent { background: var(--bp-paper); border: 1px solid var(--bp-navy); padding: 9px 10px; margin-bottom: 0; margin-top: 8px; } .agent:first-of-type { margin-top: 0; } .agent-row { display: flex; align-items: center; gap: 7px; } .agent-step { color: var(--bp-navy); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em; font-weight: 700; } .agent-intent { color: var(--bp-navy); font-size: 11.5px; margin: 6px 0 9px; font-family: var(--bp-mono); } .agent-acts { display: flex; gap: 0; border: 1px solid var(--bp-navy); } .agent-acts .btn { flex: 1; border: 0; border-right: 1px solid var(--bp-navy); border-radius: 0; } .agent-acts .btn:last-child { border-right: 0; } .start-btn { display: inline-flex; align-items: center; gap: 8px; width: 100%; justify-content: center; margin-top: 10px; padding: 8px 12px; border: 1px solid var(--bp-amber); background: var(--bp-amber); color: var(--bp-paper); font-family: var(--bp-mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; font-weight: 700; transition: filter .12s; } .start-btn:hover:not(:disabled) { filter: brightness(1.08); } .start-btn:disabled { opacity: 0.55; cursor: not-allowed; background: var(--bp-paper-2); color: var(--bp-muted); border-color: var(--bp-muted-2); } /* ===================================================================== Tags / pills / dots ===================================================================== */ .tag { display: inline-flex; align-items: center; gap: 4px; font-size: 9.5px; font-weight: 700; padding: 1px 6px; letter-spacing: 0.14em; text-transform: uppercase; border: 1px solid currentColor; } .tag-approval { color: var(--bp-amber); background: var(--bp-amber-soft); } .tag-agent { color: var(--bp-info); background: var(--bp-info-soft); } .tag-input { color: var(--bp-muted); background: var(--bp-paper-2); } .tag-live { color: var(--bp-ok); background: var(--bp-ok-soft); } .tag-syn { color: var(--bp-info); background: var(--bp-info-soft); } .pill { display: inline-flex; align-items: center; font-size: 10px; font-weight: 700; padding: 1px 6px; border: 1px solid currentColor; letter-spacing: 0.1em; text-transform: uppercase; } .pill-done { color: var(--bp-ok); background: var(--bp-ok-soft); } .pill-running { color: var(--bp-amber); background: var(--bp-amber-soft); } .pill-errored { color: var(--bp-err); background: var(--bp-err-soft); } .pill-queued { color: var(--bp-info); background: var(--bp-info-soft); } .pill-blocked { color: var(--bp-err); background: var(--bp-err-soft); } .pill-idle { color: var(--bp-muted); background: var(--bp-paper-2); } .dot { width: 7px; height: 7px; flex: none; display: inline-block; } .dot-done { background: var(--bp-ok); } .dot-running { background: var(--bp-amber); } .dot-queued { background: var(--bp-info); } .dot-errored, .dot-blocked { background: var(--bp-err); } .dot-idle { background: var(--bp-muted-2); } /* ===================================================================== Buttons ===================================================================== */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 7px; padding: 7px 12px; font-family: var(--bp-mono); font-size: 11px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; border: 1px solid var(--bp-navy); background: var(--bp-paper); color: var(--bp-navy); transition: background .12s, color .12s; } .btn:hover:not(:disabled) { background: var(--bp-paper-2); } .btn:disabled { opacity: 0.55; cursor: not-allowed; } .btn-primary { background: var(--bp-amber); border-color: var(--bp-amber); color: var(--bp-paper); } .btn-primary:hover:not(:disabled) { background: var(--bp-amber); filter: brightness(1.08); } .btn-ghost { background: transparent; border-color: var(--bp-navy); } .btn-ghost.is-on { background: var(--bp-amber-soft); border-color: var(--bp-amber); color: var(--bp-amber); } .btn-lg { padding: 10px 18px; font-size: 12px; } .btn-decline { color: var(--bp-err); border-color: var(--bp-err); } .btn-decline:hover:not(:disabled) { background: var(--bp-err-soft); } .preview-marker { display: inline-block; margin-left: 6px; padding: 0 6px; font-size: 9px; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase; border: 1px solid var(--bp-info); color: var(--bp-info); background: var(--bp-info-soft); } /* ===================================================================== Process graph (delegates to blueprint frame; minimal overrides here) ===================================================================== */ .graph-canvas { position: relative; width: 100%; height: 100%; } .react-flow__controls { background: var(--bp-paper); border: 1px solid var(--bp-navy); overflow: hidden; box-shadow: none; } .react-flow__controls-button { background: var(--bp-paper); border-bottom: 1px solid var(--bp-navy); color: var(--bp-navy); } .react-flow__controls-button:hover { background: var(--bp-paper-2); } .react-flow__attribution { display: none; } /* ===================================================================== Inspector (right rail) ===================================================================== */ .inspector { border-left: 1px solid var(--bp-navy); background: var(--bp-paper); display: flex; flex-direction: column; min-height: 0; } .inspector-head { padding: 12px 14px 8px; border-bottom: 1px solid var(--bp-navy); } .inspector-eyebrow { color: var(--bp-muted); font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.18em; font-weight: 700; } .inspector-title h3 { margin: 4px 0 6px; font-family: var(--bp-mono); font-size: 15px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; } .inspector-sub { color: var(--bp-muted); font-size: 10.5px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; text-transform: uppercase; letter-spacing: 0.08em; } .inspector-tabs { display: flex; gap: 0; margin-top: 10px; border: 1px solid var(--bp-navy); } .itab { flex: 1; display: inline-flex; align-items: center; justify-content: center; gap: 4px; padding: 5px 4px; font-size: 10px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase; border-right: 1px solid var(--bp-navy); color: var(--bp-muted); transition: background .12s, color .12s; } .itab:last-child { border-right: 0; } .itab:hover { color: var(--bp-navy); background: var(--bp-paper-2); } .itab-sel { background: var(--bp-amber); color: var(--bp-paper); } .itab-sel:hover { background: var(--bp-amber); color: var(--bp-paper); } .inspector-body { padding: 10px 14px 16px; overflow-y: auto; flex: 1; min-height: 0; } .i-section { display: flex; flex-direction: column; gap: 0; } .i-field { display: flex; justify-content: space-between; gap: 10px; padding: 5px 0; border-bottom: 1px solid var(--bp-paper-3); font-size: 11.5px; } .i-field span:first-child { color: var(--bp-muted); font-size: 10px; text-transform: uppercase; letter-spacing: 0.1em; font-weight: 600; } .i-field span:last-child { text-align: right; color: var(--bp-navy); } .i-h { margin: 14px 0 6px; font-size: 10px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--bp-muted); font-weight: 700; } .i-actions { display: flex; gap: 0; border: 1px solid var(--bp-navy); flex-wrap: wrap; } .i-actions .btn { flex: 1; border: 0; border-right: 1px solid var(--bp-navy); } .i-actions .btn:last-child { border-right: 0; } .rule { background: var(--bp-paper); border: 1px solid var(--bp-navy); border-left: 3px solid var(--bp-amber); padding: 8px 10px; margin-bottom: 6px; } .rule-head { display: flex; align-items: center; gap: 6px; color: var(--bp-navy); font-weight: 700; font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; } .rule-expr { color: var(--bp-muted); font-size: 11px; margin-top: 4px; } .evt { display: flex; gap: 8px; padding: 7px 0; border-bottom: 1px solid var(--bp-paper-3); } .evt-ts { color: var(--bp-muted-2); font-size: 10px; min-width: 50px; } .evt-who { color: var(--bp-info); font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; } .evt-sum { font-size: 11.5px; margin-top: 2px; color: var(--bp-navy-2); } .run { background: var(--bp-paper); border: 1px solid var(--bp-navy); padding: 7px 10px; margin-bottom: 4px; } .run-head { display: flex; align-items: center; gap: 8px; } .run-step { color: var(--bp-muted); font-size: 10.5px; margin-left: auto; text-transform: uppercase; letter-spacing: 0.06em; } .run-sub { color: var(--bp-muted-2); font-size: 10px; margin-top: 3px; } .raw-json { margin: 0; padding: 10px; background: var(--bp-paper); border: 1px solid var(--bp-navy); color: var(--bp-navy-2); font-family: var(--bp-mono); font-size: 11px; line-height: 1.5; overflow: auto; max-height: 60vh; } .empty { color: var(--bp-muted-2); font-size: 11px; padding: 14px 2px; text-align: center; text-transform: uppercase; letter-spacing: 0.1em; } /* ===================================================================== Telemetry strip ===================================================================== */ .telemetry { display: flex; align-items: center; gap: 16px; padding: 6px 16px; border-top: 1px solid var(--bp-navy); background: var(--bp-paper); min-height: 36px; font-size: 11px; color: var(--bp-muted); font-family: var(--bp-mono); } .t-block { display: inline-flex; align-items: center; gap: 6px; } .t-eyebrow { color: var(--bp-muted); font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 700; display: inline-flex; align-items: center; gap: 4px; } .t-v { color: var(--bp-navy); font-weight: 700; font-size: 12px; } .t-divider { width: 1px; height: 18px; background: var(--bp-navy); opacity: 0.4; } .t-spacer { flex: 1; } .spark { display: block; } .gauge { background: var(--bp-paper-2); border: 1px solid var(--bp-navy); overflow: hidden; } .gauge-fill { height: 100%; transition: width .35s; } .t-tick { width: 7px; height: 7px; background: var(--bp-amber); border: 1px solid var(--bp-navy); } /* ===================================================================== Command palette ===================================================================== */ .cmd-overlay { position: fixed; inset: 0; background: var(--bp-mask); display: flex; align-items: flex-start; justify-content: center; padding-top: 12vh; z-index: 200; } .cmd { width: min(640px, 92vw); background: var(--bp-paper); border: 1px solid var(--bp-navy); overflow: hidden; font-family: var(--bp-mono); } .cmd-input-row { display: flex; align-items: center; gap: 8px; padding: 10px 14px; border-bottom: 1px solid var(--bp-navy); background: var(--bp-paper-2); color: var(--bp-muted); } .cmd-input-row [cmdk-input] { flex: 1; border: 0; outline: 0; background: transparent; color: var(--bp-navy); font-size: 13px; font-family: var(--bp-mono); } .cmd-input-row [cmdk-input]::placeholder { color: var(--bp-muted-2); } .kbd-hint { font-size: 10px; color: var(--bp-muted); } .cmd [cmdk-list] { max-height: 380px; overflow: auto; padding: 4px; } .cmd [cmdk-group-heading] { color: var(--bp-muted); font-size: 9.5px; letter-spacing: 0.18em; text-transform: uppercase; padding: 7px 10px 3px; font-weight: 700; } .cmd [cmdk-item] { display: flex; align-items: center; gap: 10px; padding: 7px 10px; color: var(--bp-navy); cursor: pointer; font-size: 12px; border: 1px solid transparent; } .cmd [cmdk-item][data-selected='true'] { background: var(--bp-amber-soft); border-color: var(--bp-amber); color: var(--bp-navy); } .cmd-hint { margin-left: auto; color: var(--bp-muted-2); font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; } .cmd [cmdk-empty] { padding: 18px; text-align: center; color: var(--bp-muted-2); font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em; } /* ===================================================================== Landing ===================================================================== */ .landing { position: relative; height: 100%; min-height: 100vh; display: grid; grid-template-rows: auto 1fr auto; overflow-y: auto; background: var(--bp-paper); } .landing-bg, .landing-grid { display: none; } .landing-top { position: relative; z-index: 2; display: flex; align-items: center; justify-content: space-between; padding: 14px 24px; border-bottom: 1px solid var(--bp-navy); background: var(--bp-paper); } .landing-main { position: relative; z-index: 1; padding: 30px 40px 60px; max-width: 1200px; margin: 0 auto; width: 100%; display: grid; gap: 36px; } .landing-hero { display: flex; flex-direction: column; gap: 12px; max-width: 760px; } .hero-eyebrow { display: inline-flex; align-items: center; gap: 7px; font-size: 10.5px; color: var(--bp-muted); padding: 4px 10px; border: 1px solid var(--bp-navy); background: var(--bp-paper-2); width: max-content; text-transform: uppercase; letter-spacing: 0.18em; font-weight: 700; } .hero-title { font-family: var(--bp-mono); font-size: clamp(34px, 5vw, 52px); line-height: 1.05; margin: 4px 0 2px; font-weight: 700; letter-spacing: -0.01em; text-transform: uppercase; color: var(--bp-navy); } .hl { color: var(--bp-amber); background: none; -webkit-background-clip: initial; -webkit-text-fill-color: var(--bp-amber); } .hero-sub { color: var(--bp-muted); font-size: 14px; max-width: 640px; font-family: var(--bp-mono); line-height: 1.6; } .hero-actions { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; } .hero-stats { display: flex; gap: 0; margin-top: 18px; padding: 0; border: 1px solid var(--bp-navy); flex-wrap: wrap; background: var(--bp-paper); } .stat { display: inline-flex; align-items: baseline; gap: 8px; padding: 8px 14px; border-right: 1px solid var(--bp-navy); } .stat:last-child { border-right: 0; } .stat-v { font-size: 20px; font-weight: 700; font-family: var(--bp-mono); color: var(--bp-navy); } .stat-l { color: var(--bp-muted); font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.14em; font-weight: 600; } .landing-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 0; border: 1px solid var(--bp-navy); } .sc-card { display: flex; flex-direction: column; gap: 6px; text-align: left; background: var(--bp-paper); border-right: 1px solid var(--bp-navy); border-bottom: 1px solid var(--bp-navy); padding: 14px 16px 12px; color: var(--bp-navy); font-family: var(--bp-mono); position: relative; transition: background .12s; } .sc-card::before { display: none; } .sc-card:hover { background: var(--bp-paper-2); } .sc-card-top { display: flex; align-items: center; gap: 8px; } .sc-card-mark { width: 12px; height: 12px; background: var(--bp-amber); border: 1px solid var(--bp-navy); } .sc-card-title { margin: 6px 0 2px; font-size: 14px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; } .sc-card-sub { color: var(--bp-muted); font-size: 11px; margin: 0 0 8px; } .sc-card-meta { color: var(--bp-muted-2); font-size: 10px; display: inline-flex; gap: 6px; text-transform: uppercase; letter-spacing: 0.08em; } .sc-card-cta { display: inline-flex; align-items: center; gap: 6px; margin-top: 10px; color: var(--bp-amber); font-weight: 700; font-size: 11px; text-transform: uppercase; letter-spacing: 0.12em; } .landing-foot { position: relative; z-index: 1; padding: 10px 24px; border-top: 1px solid var(--bp-navy); background: var(--bp-paper-2); color: var(--bp-muted); font-size: 10.5px; text-align: center; text-transform: uppercase; letter-spacing: 0.14em; } /* ===================================================================== Run history ===================================================================== */ .rh { height: 100%; display: flex; flex-direction: column; min-height: 0; background: var(--bp-paper); } .rh-head { display: flex; align-items: end; justify-content: space-between; padding: 16px 20px; gap: 12px; border-bottom: 1px solid var(--bp-navy); } .rh-filters { display: inline-flex; gap: 0; border: 1px solid var(--bp-navy); } .rh-chip { padding: 5px 12px; font-size: 10.5px; letter-spacing: 0.12em; text-transform: uppercase; font-weight: 700; border-right: 1px solid var(--bp-navy); background: var(--bp-paper); color: var(--bp-muted); } .rh-chip:last-child { border-right: 0; } .rh-chip:hover { background: var(--bp-paper-2); color: var(--bp-navy); } .rh-chip-sel { background: var(--bp-amber); color: var(--bp-paper); } .rh-chip-sel:hover { background: var(--bp-amber); color: var(--bp-paper); } .rh-list { overflow-y: auto; padding: 8px 20px 24px; display: flex; flex-direction: column; gap: 0; border-top: 1px solid var(--bp-navy); } .rh-row { display: grid; grid-template-columns: 200px 180px minmax(0, 1.3fr) minmax(160px, 1fr) auto; align-items: center; gap: 14px; padding: 9px 12px; border-bottom: 1px solid var(--bp-paper-3); font-size: 11.5px; color: var(--bp-navy); font-family: var(--bp-mono); } .rh-row:hover { background: var(--bp-paper-2); } .rh-row-id { display: inline-flex; align-items: center; gap: 7px; min-width: 0; } .rh-row-id .mono { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; } .rh-dot { width: 10px; height: 10px; flex: none; border: 1px solid var(--bp-navy); } .rh-row-scenario { color: var(--bp-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; text-transform: uppercase; letter-spacing: 0.06em; } .rh-row-step { color: var(--bp-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; } .rh-row-bar { background: var(--bp-paper-2); height: 6px; overflow: hidden; border: 1px solid var(--bp-navy); } .rh-bar-fill { height: 100%; transition: width .3s; } .rh-row-meta { display: inline-flex; align-items: center; gap: 8px; color: var(--bp-muted); } /* ===================================================================== Studio + Settings (shared layout) ===================================================================== */ .studio, .settings { height: 100%; display: flex; flex-direction: column; overflow-y: auto; background: var(--bp-paper); } .studio-head { display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: 16px 22px; border-bottom: 1px solid var(--bp-navy); background: var(--bp-paper); } .studio-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(380px, 1fr)); gap: 0; padding: 0; border-bottom: 1px solid var(--bp-navy); } .studio-panel { background: var(--bp-paper); border-right: 1px solid var(--bp-navy); border-bottom: 1px solid var(--bp-navy); padding: 14px 16px; display: flex; flex-direction: column; gap: 12px; } .studio-panel > .panel-h { margin: -2px 0 4px; } .studio-field { display: flex; flex-direction: column; gap: 4px; font-size: 11px; color: var(--bp-muted); font-family: var(--bp-mono); } .studio-field > span { font-size: 9.5px; text-transform: uppercase; letter-spacing: 0.14em; color: var(--bp-muted); font-weight: 700; } .studio-input { font-family: var(--bp-mono); background: var(--bp-paper); border: 1px solid var(--bp-navy); padding: 6px 9px; color: var(--bp-navy); font-size: 12px; } .studio-input:focus { outline: 2px solid var(--bp-amber); outline-offset: 0; } .studio-input.mono { font-family: var(--bp-mono); } textarea.studio-input { resize: vertical; min-height: 56px; } select.studio-input { background: var(--bp-paper); } .studio-rows { display: flex; flex-direction: column; gap: 4px; } .studio-row { display: flex; align-items: center; gap: 6px; } .studio-row .studio-input { flex: 1; } .studio-row-id { color: var(--bp-muted-2); font-size: 10px; min-width: 32px; text-transform: uppercase; letter-spacing: 0.06em; } .studio-result { display: inline-flex; align-items: center; gap: 6px; padding: 7px 10px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; border: 1px solid currentColor; } .studio-result.ok { color: var(--bp-ok); background: var(--bp-ok-soft); } .studio-result.err { color: var(--bp-err); background: var(--bp-err-soft); } .settings-id { display: flex; flex-direction: column; gap: 2px; } .settings-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; } .settings-hint { color: var(--bp-muted-2); font-size: 10.5px; margin-top: 4px; text-transform: uppercase; letter-spacing: 0.06em; } .settings-toggle { display: inline-flex; align-items: center; gap: 8px; font-size: 12px; color: var(--bp-navy); } .settings-toggle input { accent-color: var(--bp-amber); width: 14px; height: 14px; } .settings-text { font-size: 12px; color: var(--bp-muted); line-height: 1.55; font-family: var(--bp-mono); } .settings-link { color: var(--bp-amber); text-decoration: underline; } .quick-users { display: flex; flex-wrap: wrap; gap: 0; margin-top: 6px; border: 1px solid var(--bp-navy); } .quick-users .link-btn { font-family: var(--bp-mono); font-size: 10px; border-left: 0; border-right: 1px solid var(--bp-navy); padding: 4px 8px; } .quick-users .link-btn:last-child { border-right: 0; } /* ===================================================================== Console drawer ===================================================================== */ .console { position: fixed; right: 0; top: 44px; bottom: 0; width: min(420px, 95vw); background: var(--bp-paper); border-left: 1px solid var(--bp-navy); display: grid; grid-template-rows: auto 1fr; z-index: 180; font-family: var(--bp-mono); } .console-head { display: flex; align-items: center; gap: 8px; padding: 7px 12px; border-bottom: 1px solid var(--bp-navy); background: var(--bp-paper-2); font-size: 10.5px; color: var(--bp-muted); text-transform: uppercase; letter-spacing: 0.1em; } .console-title { color: var(--bp-navy); font-weight: 700; } .console-count { background: var(--bp-paper); padding: 1px 7px; border: 1px solid var(--bp-navy); font-size: 10px; color: var(--bp-navy); letter-spacing: 0; } .console-filters { margin-left: auto; display: inline-flex; gap: 0; border: 1px solid var(--bp-navy); } .console-filter { padding: 2px 8px; font-size: 10px; color: var(--bp-muted); text-transform: uppercase; letter-spacing: 0.1em; font-weight: 700; border-right: 1px solid var(--bp-navy); } .console-filter:last-child { border-right: 0; } .console-filter:hover { color: var(--bp-navy); background: var(--bp-paper-2); } .console-filter.on { background: var(--bp-amber); color: var(--bp-paper); } .console-x { padding: 3px 5px; color: var(--bp-muted); } .console-x:hover { color: var(--bp-navy); background: var(--bp-paper-2); } .console-body { overflow-y: auto; padding: 4px; display: flex; flex-direction: column; gap: 2px; font-size: 11px; } .call { background: var(--bp-paper); border: 1px solid var(--bp-navy); border-left-width: 3px; } .call.ok { border-left-color: var(--bp-ok); } .call.warn { border-left-color: var(--bp-amber); } .call.err { border-left-color: var(--bp-err); } .call.info { border-left-color: var(--bp-muted-2); } .call-head { display: grid; grid-template-columns: 48px 42px 1fr auto; align-items: center; gap: 6px; width: 100%; padding: 5px 8px; text-align: left; font-size: 11px; font-family: var(--bp-mono); } .call-head:hover { background: var(--bp-paper-2); } .call-method { font-weight: 700; } .call-status { color: var(--bp-muted); } .call-path { color: var(--bp-navy); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .call-dur { color: var(--bp-muted-2); font-size: 10.5px; } .call-body { padding: 6px 8px 8px; border-top: 1px dashed var(--bp-navy); display: flex; flex-direction: column; gap: 6px; } .call-label { display: inline-flex; align-items: center; gap: 4px; color: var(--bp-muted); font-size: 9.5px; letter-spacing: 0.12em; text-transform: uppercase; font-weight: 700; } .call-err { color: var(--bp-err); } .call-json { margin: 0; padding: 7px 9px; background: var(--bp-paper-2); border: 1px solid var(--bp-navy); color: var(--bp-navy); font-family: var(--bp-mono); font-size: 10.5px; line-height: 1.45; overflow-x: auto; max-height: 240px; overflow-y: auto; } /* ===================================================================== Toaster ===================================================================== */ .toaster { position: fixed; right: 14px; bottom: 14px; z-index: 300; display: flex; flex-direction: column; gap: 6px; width: min(420px, 92vw); pointer-events: none; font-family: var(--bp-mono); } .toast { pointer-events: auto; display: flex; align-items: center; gap: 9px; padding: 8px 11px; background: var(--bp-paper); border: 1px solid var(--bp-navy); border-left-width: 3px; font-size: 11px; color: var(--bp-navy); } .toast-msg { flex: 1; line-height: 1.4; } .toast-x { padding: 2px; color: var(--bp-muted); } .toast-x:hover { color: var(--bp-navy); background: var(--bp-paper-2); } .toast-info { border-left-color: var(--bp-info); } .toast-ok { border-left-color: var(--bp-ok); } .toast-warn { border-left-color: var(--bp-amber); } .toast-err { border-left-color: var(--bp-err); } /* ===================================================================== Login Page ===================================================================== */ .login-page { display: flex; align-items: center; justify-content: center; min-height: 100vh; background: var(--bp-paper); background-image: linear-gradient(var(--bp-grid-minor) 1px, transparent 1px), linear-gradient(90deg, var(--bp-grid-minor) 1px, transparent 1px); background-size: 20px 20px; } .login-card { width: 380px; background: var(--bp-paper); border: 1px solid var(--bp-navy); padding: 24px 32px; position: relative; } .login-card::before { content: ''; position: absolute; top: 0; left: 0; width: 18px; height: 18px; border-right: 1px solid var(--bp-navy); border-bottom: 1px solid var(--bp-navy); background: var(--bp-paper-2); } .login-head { text-align: center; margin-bottom: 24px; } .login-head .brand-mark { display: inline-block; width: 24px; height: 24px; background: var(--bp-amber); border: 1px solid var(--bp-navy); margin-bottom: 12px; } .login-head h1 { margin: 0; font-family: var(--bp-mono); font-size: 16px; font-weight: 700; letter-spacing: 0.05em; color: var(--bp-navy); } .login-sub { margin-top: 4px; font-size: 10px; color: var(--bp-muted); letter-spacing: 0.15em; } .login-form { display: flex; flex-direction: column; gap: 16px; } .login-field { display: flex; flex-direction: column; gap: 6px; } .login-field label { font-size: 10px; font-weight: 700; color: var(--bp-muted); letter-spacing: 0.1em; } .login-input { background: var(--bp-paper); border: 1px solid var(--bp-navy); padding: 8px 12px; font-family: var(--bp-mono); font-size: 13px; color: var(--bp-navy); } .login-input:focus { outline: 2px solid var(--bp-amber); outline-offset: 0; } .login-input:disabled { opacity: 0.6; background: var(--bp-paper-2); } .login-row { display: flex; align-items: center; justify-content: space-between; margin-top: -4px; } .login-checkbox { display: flex; align-items: center; gap: 8px; font-size: 11px; color: var(--bp-navy); cursor: pointer; } .login-checkbox input { accent-color: var(--bp-amber); width: 14px; height: 14px; } .login-link { font-size: 11px; color: var(--bp-amber); text-decoration: underline; } .login-actions { margin-top: 8px; } .login-actions .btn { width: 100%; } .login-divider { display: flex; align-items: center; text-align: center; margin: 24px 0; } .login-divider::before, .login-divider::after { content: ''; flex: 1; border-bottom: 1px solid var(--bp-navy); opacity: 0.2; } .login-divider span { padding: 0 10px; font-size: 10px; color: var(--bp-muted); letter-spacing: 0.1em; } .login-sso-actions { display: flex; flex-direction: column; gap: 12px; } .login-personas { margin-top: 24px; padding-top: 16px; border-top: 1px solid var(--bp-navy); border-top-color: color-mix(in srgb, var(--bp-navy) 20%, transparent); } .login-persona-label { font-family: var(--bp-mono); font-size: 10px; letter-spacing: 0.1em; color: var(--bp-muted); margin-bottom: 8px; } .login-persona-row { display: flex; flex-wrap: wrap; gap: 6px; } .persona-chip { flex: 1 1 auto; padding: 6px 10px; background: var(--bp-paper); border: 1px solid var(--bp-navy); color: var(--bp-navy); font-family: var(--bp-mono); font-size: 10px; letter-spacing: 0.04em; cursor: pointer; transition: background 0.1s; } .persona-chip:hover:not(:disabled) { background: var(--bp-amber); color: var(--bp-paper); } .persona-chip:disabled { opacity: 0.5; cursor: not-allowed; } .sso-btn { display: flex; align-items: center; justify-content: center; gap: 10px; width: 100%; padding: 8px 12px; background: var(--bp-paper); border: 1px solid var(--bp-navy); color: var(--bp-navy); font-family: var(--bp-mono); font-size: 11px; font-weight: 700; letter-spacing: 0.05em; transition: background 0.1s; } .sso-btn:hover:not(:disabled) { background: var(--bp-paper-2); } .dev-login-btn { display: flex; align-items: center; justify-content: center; gap: 10px; width: 100%; padding: 8px 12px; background: var(--bp-paper-2); border: 1px dashed var(--bp-navy); color: var(--bp-muted); font-family: var(--bp-mono); font-size: 10px; font-weight: 700; letter-spacing: 0.05em; transition: background 0.1s, color 0.1s; } .dev-login-btn:hover:not(:disabled) { background: var(--bp-paper-3); color: var(--bp-navy); } .dev-login-btn:disabled, .sso-btn:disabled { opacity: 0.5; cursor: not-allowed; } .login-error { margin-bottom: 16px; padding: 8px 12px; background: var(--bp-err-soft); border-left: 2px solid var(--bp-err); color: var(--bp-err); font-size: 11px; } /* ===================================================================== Scrollbars ===================================================================== */ .scene ::-webkit-scrollbar, .left-rail::-webkit-scrollbar, .inspector-body::-webkit-scrollbar, .rh-list::-webkit-scrollbar, .cmd [cmdk-list]::-webkit-scrollbar, .landing::-webkit-scrollbar, .console-body::-webkit-scrollbar { width: 8px; height: 8px; } .scene ::-webkit-scrollbar-thumb, .left-rail::-webkit-scrollbar-thumb, .inspector-body::-webkit-scrollbar-thumb, .rh-list::-webkit-scrollbar-thumb, .cmd [cmdk-list]::-webkit-scrollbar-thumb, .landing::-webkit-scrollbar-thumb, .console-body::-webkit-scrollbar-thumb { background: var(--bp-navy); } .scene ::-webkit-scrollbar-track, .left-rail::-webkit-scrollbar-track, .inspector-body::-webkit-scrollbar-track, .rh-list::-webkit-scrollbar-track, .cmd [cmdk-list]::-webkit-scrollbar-track, .landing::-webkit-scrollbar-track, .console-body::-webkit-scrollbar-track { background: var(--bp-paper-2); } /* ===================================================================== INDUSTRIAL BLUEPRINT CANVAS ProcessGraph + BlueprintFrame (scoped via [data-canvas="blueprint"]) ===================================================================== */ .bp-frame { position: relative; width: 100%; height: 100%; display: grid; grid-template-rows: 32px 1fr 24px; background: var(--bp-paper); border: 1px solid var(--bp-navy); color: var(--bp-navy); font-family: var(--bp-mono); font-size: 11px; } .bp-readout { display: flex; align-items: center; gap: 0; padding: 0; background: var(--bp-paper); border-bottom: 1px solid var(--bp-navy); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--bp-navy); } .bp-readout-bottom { border-bottom: 0; border-top: 1px solid var(--bp-navy); font-size: 10px; padding: 0 0 0 4px; gap: 16px; color: var(--bp-muted); } .bp-readout-cell { display: inline-flex; align-items: center; height: 100%; padding: 0 10px; border-right: 1px solid var(--bp-navy); gap: 8px; font-weight: 500; } .bp-readout-lbl { color: var(--bp-muted); font-size: 9.5px; letter-spacing: 0.12em; } .bp-readout-val { color: var(--bp-navy); font-weight: 700; } .bp-readout-sep { width: 0; height: 100%; border-left: 1px dashed var(--bp-muted-2); } .bp-readout-status .bp-readout-val { padding: 1px 6px; border: 1px solid currentColor; } .bp-readout-live .bp-readout-val { color: var(--bp-ok); background: var(--bp-ok-soft); } .bp-readout-blueprint .bp-readout-val { color: var(--bp-amber); background: var(--bp-amber-soft); } .bp-readout-live { color: var(--bp-ok); } .bp-readout-blueprint { color: var(--bp-amber); } .bp-readout-snapshot .bp-readout-val { color: var(--bp-muted); } .bp-readout-tx .bp-readout-val { color: var(--bp-info); } .bp-canvas-wrap { position: relative; overflow: hidden; background: var(--bp-paper); } .bp-canvas { position: absolute; inset: 18px 0 0 18px; background: var(--bp-paper); } .bp-ruler { position: absolute; background: var(--bp-paper-2); color: var(--bp-muted); font-family: var(--bp-mono); font-size: 8.5px; letter-spacing: 0.04em; overflow: hidden; } .bp-ruler-top { top: 0; left: 18px; right: 0; height: 18px; border-bottom: 1px solid var(--bp-navy); } .bp-ruler-left { top: 18px; left: 0; bottom: 0; width: 18px; border-right: 1px solid var(--bp-navy); } .bp-tick { position: absolute; width: 1px; background: var(--bp-muted-2); pointer-events: none; } .bp-ruler-top .bp-tick { top: 12px; bottom: 0; } .bp-ruler-top .bp-tick.is-major { top: 6px; background: var(--bp-navy); } .bp-ruler-left .bp-tick { width: auto; height: 1px; left: 12px; right: 0; top: auto; background: var(--bp-muted-2); } .bp-ruler-left .bp-tick.is-major { left: 6px; background: var(--bp-navy); } .bp-tick-label { position: absolute; color: var(--bp-navy); font-weight: 600; } .bp-ruler-top .bp-tick-label { top: -10px; left: 2px; } .bp-ruler-left .bp-tick-label { left: -2px; top: -12px; transform: rotate(-90deg); transform-origin: left top; } .bp-corner-tl { position: absolute; top: 0; left: 0; width: 18px; height: 18px; background: var(--bp-navy); color: var(--bp-paper); display: grid; place-items: center; font-family: var(--bp-mono); font-size: 14px; font-weight: 700; } .bp-legend { display: inline-flex; align-items: center; gap: 6px; } .bp-swatch { display: inline-block; width: 12px; height: 4px; border: 1px solid var(--bp-navy); } .bp-swatch-done { background: var(--bp-ok); border-color: var(--bp-ok); } .bp-swatch-running { background: var(--bp-amber); border-color: var(--bp-amber); } .bp-swatch-queued { background: var(--bp-info); border-color: var(--bp-info); } .bp-swatch-errored { background: var(--bp-err); border-color: var(--bp-err); } .bp-swatch-idle { background: transparent; border-color: var(--bp-muted-2); border-style: dashed; } [data-canvas="blueprint"] .bp-node { width: 256px; background: var(--bp-paper); border: 1px solid var(--bp-navy); border-radius: 0; font-family: var(--bp-mono); color: var(--bp-navy); font-size: 11px; position: relative; } .bp-node-head { display: grid; grid-template-columns: 22px 1fr auto; align-items: center; background: var(--bp-navy); color: var(--bp-paper); padding: 3px 8px 3px 6px; border-bottom: 1px solid var(--bp-navy); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; } .bp-node-mark { font-size: 12px; line-height: 1; } .bp-node-kind { font-weight: 700; } .bp-node-state { color: var(--bp-paper-2); font-weight: 500; font-size: 9.5px; } .bp-node-body { display: flex; align-items: center; gap: 7px; padding: 10px 10px 9px; border-bottom: 1px solid var(--bp-navy); } .bp-node-name { font-weight: 600; font-size: 12px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--bp-navy); flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .bp-node-foot { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 3px 8px; background: var(--bp-paper-2); font-size: 9.5px; letter-spacing: 0.08em; color: var(--bp-muted); text-transform: uppercase; } .bp-node-id { font-weight: 700; color: var(--bp-navy); } .bp-node-gov { display: inline-flex; align-items: center; gap: 4px; color: var(--bp-amber); } .bp-node-running { border-color: var(--bp-amber); } .bp-node-running .bp-node-head { background: var(--bp-amber); } .bp-node-errored { border-color: var(--bp-err); } .bp-node-errored .bp-node-head { background: var(--bp-err); } .bp-node-done .bp-node-head { background: var(--bp-ok); } .bp-node-done { border-color: var(--bp-ok); } .bp-node-queued .bp-node-head { background: var(--bp-info); } .bp-node-queued { border-color: var(--bp-info); } .bp-node-idle .bp-node-head { background: var(--bp-muted); } .bp-node-idle { border-color: var(--bp-muted-2); border-style: dashed; } .bp-node-sel { outline: 2px solid var(--bp-amber); outline-offset: 0; } .bp-node-sel .bp-node-foot { background: var(--bp-amber-strong); } .bp-handle { background: var(--bp-navy); width: 6px; height: 6px; border-radius: 0; border: 0; } [data-canvas="blueprint"] .react-flow__controls, [data-canvas="blueprint"] .react-flow__minimap, [data-canvas="blueprint"] .bp-minimap { background: var(--bp-paper); border: 1px solid var(--bp-navy); border-radius: 0; overflow: hidden; box-shadow: none; } [data-canvas="blueprint"] .react-flow__controls-button { background: var(--bp-paper); border-bottom: 1px solid var(--bp-navy); color: var(--bp-navy); } [data-canvas="blueprint"] .react-flow__controls-button:hover { background: var(--bp-paper-2); } [data-canvas="blueprint"] .react-flow__controls-button svg { fill: var(--bp-navy); } [data-canvas="blueprint"] .react-flow__edge-text { font-family: var(--bp-mono); } [data-canvas="blueprint"] .react-flow__edge.selected .react-flow__edge-path, [data-canvas="blueprint"] .react-flow__edge:focus .react-flow__edge-path { stroke: var(--bp-amber); } [data-canvas="blueprint"] .react-flow__attribution { display: none; } /* Wizard */ .wizard-container { display: flex; flex-direction: column; gap: var(--space-xl); padding: var(--space-xl) var(--space-2xl); height: 100%; overflow-y: auto; } .wizard-header { display: flex; flex-direction: column; gap: var(--space-xl); } .wizard-progress { display: flex; align-items: center; gap: var(--space-xs); background: var(--paper); padding: var(--space-md); border: 1px solid var(--border); border-radius: var(--radius-sm); } .wizard-step-marker { display: flex; align-items: center; gap: var(--space-sm); color: var(--text-3); font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.5px; padding: var(--space-xs) var(--space-sm); border-radius: var(--radius-sm); } .wizard-step-marker.active { background: var(--amber); color: var(--navy); font-weight: 600; } .wizard-step-marker.past { color: var(--text-1); background: var(--ok-soft); } .step-num { width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: currentColor; color: var(--paper); font-size: 9px; font-weight: 700; } .wizard-step-marker.active .step-num { background: var(--navy); color: var(--amber); } .wizard-step-marker.past .step-num { background: var(--ok); color: var(--paper); } .step-chevron { color: var(--border); margin-left: var(--space-xs); } .wizard-content { display: flex; flex-direction: column; gap: var(--space-xl); max-width: 800px; } .wizard-panel { background: var(--paper); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: var(--space-xl); display: flex; flex-direction: column; gap: var(--space-lg); } .wizard-panel.success-panel { align-items: center; text-align: center; border-color: var(--ok); background: var(--ok-soft); } .success-icon { color: var(--ok); margin-bottom: var(--space-sm); } .field-group { display: flex; flex-direction: column; gap: var(--space-xs); } .field-group label { font-size: 13px; color: var(--text-2); font-weight: 500; } .field-group input, .field-group textarea { background: var(--paper-2); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: var(--space-sm) var(--space-md); color: var(--text-1); font-family: var(--font-sans); font-size: 14px; } .field-group input:focus, .field-group textarea:focus { outline: none; border-color: var(--amber); } .warning-text { color: var(--warn); font-size: 12px; margin-top: var(--space-xs); } .node-list, .field-list { display: flex; flex-direction: column; gap: var(--space-sm); } .node-card, .field-row { display: flex; align-items: center; gap: var(--space-md); background: var(--paper-2); border: 1px solid var(--border); padding: var(--space-sm) var(--space-md); border-radius: var(--radius-sm); } .node-header { display: flex; align-items: center; gap: var(--space-sm); flex: 1; } .node-idx { font-family: var(--font-mono); font-size: 11px; color: var(--text-3); background: var(--border); width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; border-radius: 50%; } .node-header input, .field-row input { background: transparent; border: 1px solid transparent; color: var(--text-1); font-family: var(--font-sans); font-size: 14px; width: 100%; padding: var(--space-xs) var(--space-sm); } .node-header input:hover, .field-row input:hover { border-color: var(--border); } .node-header input:focus, .field-row input:focus { outline: none; border-color: var(--amber); background: var(--paper); } .node-meta select, .field-row select { background: var(--paper); border: 1px solid var(--border); color: var(--text-2); font-size: 13px; padding: var(--space-xs) var(--space-sm); border-radius: var(--radius-sm); } .summary-stats { display: flex; gap: var(--space-xl); padding: var(--space-md); background: var(--paper-2); border-radius: var(--radius-sm); } .summary-stats div { display: flex; flex-direction: column; gap: var(--space-2xs); font-size: 18px; font-weight: 500; color: var(--text-1); } .summary-stats span { font-size: 11px; text-transform: uppercase; color: var(--text-3); letter-spacing: 0.5px; } .actions-row { display: flex; gap: var(--space-md); align-items: center; } .theme-toggle { display: inline-flex; align-items: center; gap: 6px; } .theme-toggle-label { font-size: 10px; letter-spacing: 0.08em; font-weight: 600; text-transform: uppercase; } .chat-scene { display: grid; grid-template-columns: 280px 1fr; gap: 16px; padding: 16px; height: calc(100vh - 60px); background: var(--bp-paper); } .chat-sidebar { border: 1px solid var(--bp-navy); background: var(--bp-paper); display: flex; flex-direction: column; overflow: hidden; } .chat-sidebar-head { padding: 12px; border-bottom: 1px solid var(--bp-navy); } .chat-new-thread { padding: 12px; border-bottom: 1px solid var(--bp-navy); display: flex; flex-direction: column; gap: 6px; } .chat-new-thread label { font-family: var(--bp-mono); font-size: 10px; letter-spacing: 0.08em; color: var(--bp-muted); text-transform: uppercase; } .chat-new-row { display: flex; gap: 6px; } .chat-new-row select { flex: 1; padding: 6px 8px; background: var(--bp-paper); border: 1px solid var(--bp-navy); color: var(--bp-navy); font-family: var(--bp-mono); font-size: 11px; } .chat-thread-list { flex: 1; overflow-y: auto; } .chat-thread-row { width: 100%; text-align: left; padding: 10px 12px; background: var(--bp-paper); border: 0; border-bottom: 1px solid color-mix(in srgb, var(--bp-navy) 15%, transparent); color: var(--bp-navy); cursor: pointer; display: flex; flex-direction: column; gap: 4px; } .chat-thread-row:hover { background: color-mix(in srgb, var(--bp-amber) 15%, var(--bp-paper)); } .chat-thread-row.active { background: color-mix(in srgb, var(--bp-amber) 30%, var(--bp-paper)); } .chat-thread-name { font-weight: 600; font-size: 12px; } .chat-thread-meta { font-family: var(--bp-mono); font-size: 10px; color: var(--bp-muted); } .chat-empty { padding: 16px; font-size: 11px; color: var(--bp-muted); text-align: center; } .chat-main { border: 1px solid var(--bp-navy); background: var(--bp-paper); display: flex; flex-direction: column; overflow: hidden; } .chat-empty-main { padding: 32px; color: var(--bp-muted); text-align: center; font-size: 12px; } .chat-main-head { padding: 12px 16px; border-bottom: 1px solid var(--bp-navy); } .chat-title { font-weight: 700; font-size: 13px; color: var(--bp-navy); } .chat-subtitle { font-family: var(--bp-mono); font-size: 10px; color: var(--bp-muted); margin-top: 2px; } .chat-messages { flex: 1; overflow-y: auto; padding: 16px; display: flex; flex-direction: column; gap: 10px; } .chat-bubble-row { display: flex; } .chat-bubble-row.mine { justify-content: flex-end; } .chat-bubble { max-width: 70%; padding: 8px 12px; background: var(--bp-paper); border: 1px solid var(--bp-navy); display: flex; flex-direction: column; gap: 4px; } .chat-bubble-row.mine .chat-bubble { background: color-mix(in srgb, var(--bp-amber) 20%, var(--bp-paper)); } .chat-bubble-author { font-family: var(--bp-mono); font-size: 10px; color: var(--bp-muted); } .chat-bubble-body { font-size: 12px; line-height: 1.4; color: var(--bp-navy); white-space: pre-wrap; word-break: break-word; } .chat-bubble-time { font-family: var(--bp-mono); font-size: 9px; color: var(--bp-muted); text-align: right; } .chat-composer { padding: 12px; border-top: 1px solid var(--bp-navy); display: flex; gap: 8px; align-items: flex-end; } .chat-composer textarea { flex: 1; padding: 8px; resize: none; background: var(--bp-paper); border: 1px solid var(--bp-navy); color: var(--bp-navy); font-family: var(--bp-mono); font-size: 12px; } @media (max-width: 700px) { .chat-scene { grid-template-columns: 1fr; height: auto; } .chat-sidebar { max-height: 240px; } }