:root { color: #182018; background: #ecede4; font-family: "IBM Plex Sans", "Aptos", "Segoe UI", sans-serif; --ink: #182018; --muted: #667064; --paper: rgba(255, 252, 239, 0.9); --paper-strong: #fffaf0; --line: rgba(26, 39, 27, 0.15); --green: #2f6f4f; --amber: #b86f23; --red: #a64235; --steel: #36556c; --blue: #284b8f; --shadow: 0 24px 60px rgba(42, 50, 40, 0.11); } * { box-sizing: border-box; } body { margin: 0; min-width: 320px; min-height: 100vh; background: radial-gradient(circle at 8% 8%, rgba(184, 111, 35, 0.2), transparent 27rem), radial-gradient(circle at 92% 16%, rgba(47, 111, 79, 0.17), transparent 28rem), linear-gradient(135deg, #f4f1e7 0%, #dfe5db 58%, #f4f1e7 100%); } button, input, select, textarea { font: inherit; } button { border: 1px solid var(--line); border-radius: 999px; padding: 0.66rem 1rem; color: var(--ink); background: #fffaf0; cursor: pointer; } button:hover:not(:disabled) { transform: translateY(-1px); } button:disabled { cursor: not-allowed; opacity: 0.52; } button.primary { color: #fffaf0; border-color: transparent; background: linear-gradient(135deg, #203d2f, #4f8565); box-shadow: 0 14px 32px rgba(36, 76, 56, 0.24); } button.ghost { background: rgba(255, 250, 240, 0.52); } button.wide { width: 100%; justify-content: center; } button.danger { color: #fffaf0; background: linear-gradient(135deg, #8f372d, #bd5d4d); } .loginShell { display: grid; grid-template-columns: minmax(300px, 420px); align-items: center; justify-content: center; min-height: 100vh; padding: clamp(24px, 5vw, 72px); } .loginHero { min-height: 560px; padding: clamp(28px, 5vw, 64px); border-radius: 38px; color: #fffaf0; background: linear-gradient(155deg, rgba(16, 27, 19, 0.98), rgba(26, 56, 42, 0.95)), radial-gradient(circle at 20% 20%, rgba(184, 111, 35, 0.34), transparent 18rem); box-shadow: var(--shadow); } .loginHero h1 { max-width: 780px; margin: 0 0 20px; font-size: clamp(3rem, 8vw, 7rem); line-height: 0.88; letter-spacing: -0.075em; } .loginHero p { max-width: 720px; color: rgba(255, 250, 240, 0.76); font-size: 1.08rem; } .loginCard { display: grid; gap: 16px; padding: 28px; border: 1px solid var(--line); border-radius: 30px; background: rgba(255, 252, 239, 0.84); box-shadow: var(--shadow); backdrop-filter: blur(14px); } .loginCard h1 { margin: 0 0 2px; font-size: 1.55rem; letter-spacing: -0.035em; } .loginHint { margin: 0; color: var(--muted); line-height: 1.45; } .checkLine { grid-template-columns: auto minmax(0, 1fr); align-items: center; color: var(--ink); } .checkLine input { width: 18px; height: 18px; } .consoleShell { display: grid; grid-template-columns: 310px minmax(0, 1fr); min-height: 100vh; } .sideRail { position: sticky; top: 0; height: 100vh; padding: 28px; color: #fffaf0; background: linear-gradient(160deg, rgba(16, 27, 19, 0.98), rgba(26, 56, 42, 0.96)), radial-gradient(circle at 20% 20%, rgba(184, 111, 35, 0.36), transparent 16rem); } .brandMark { display: inline-grid; width: 58px; height: 58px; place-items: center; margin-bottom: 28px; border: 1px solid rgba(255, 250, 240, 0.22); border-radius: 18px; background: rgba(255, 250, 240, 0.1); font-weight: 900; letter-spacing: 0.08em; } .sideKicker, .eyebrow { margin: 0 0 8px; color: #d59b54; font-size: 0.78rem; font-weight: 900; letter-spacing: 0.16em; text-transform: uppercase; } .sideRail h1 { margin: 0 0 12px; font-size: clamp(2.3rem, 4vw, 4.2rem); line-height: 0.9; letter-spacing: -0.06em; } .sideText { margin: 0 0 26px; color: rgba(255, 250, 240, 0.72); } .railNav { display: grid; gap: 8px; } .railNav button { justify-content: flex-start; border-color: rgba(255, 250, 240, 0.13); color: rgba(255, 250, 240, 0.76); background: transparent; text-align: left; } .railNav button.active { color: #182018; background: #fffaf0; } .workspace { width: min(1500px, calc(100vw - 340px)); padding: 28px 28px 54px; } .topBar { display: grid; grid-template-columns: minmax(0, 1fr) minmax(260px, 360px) auto minmax(220px, auto); align-items: center; gap: 20px; padding: 28px; border: 1px solid var(--line); border-radius: 30px; background: rgba(255, 252, 239, 0.72); box-shadow: var(--shadow); backdrop-filter: blur(16px); } .clusterPicker { display: grid; gap: 8px; min-width: 0; padding: 14px; border: 1px solid var(--line); border-radius: 22px; background: rgba(255, 255, 255, 0.5); } .clusterPicker span { color: var(--muted); font-size: 0.82rem; font-weight: 800; overflow-wrap: anywhere; } .profilePanel { display: grid; grid-template-columns: 1fr; gap: 8px; min-width: 240px; padding: 14px; border: 1px solid var(--line); border-radius: 22px; background: rgba(255, 255, 255, 0.48); } .profilePanel span { color: var(--muted); overflow-wrap: anywhere; } h2, h3, h4, p { margin-top: 0; } h2 { margin-bottom: 8px; font-size: clamp(2rem, 4vw, 4rem); line-height: 0.94; letter-spacing: -0.055em; } h3 { margin-bottom: 10px; font-size: 1.35rem; } .muted { color: var(--muted); } .controlBar, .grid, .stack { margin-top: 18px; } .controlBar { display: grid; grid-template-columns: minmax(220px, 0.45fr); gap: 14px; padding: 16px; border: 1px solid var(--line); border-radius: 22px; background: rgba(255, 252, 239, 0.62); } label { display: grid; gap: 7px; color: var(--muted); font-size: 0.82rem; font-weight: 800; } label small { color: var(--muted); font-weight: 600; line-height: 1.35; } input, select, textarea { min-width: 0; border: 1px solid var(--line); border-radius: 14px; padding: 0.75rem 0.85rem; color: var(--ink); background: rgba(255, 255, 255, 0.78); } textarea { min-height: 84px; resize: vertical; font-family: "Cascadia Code", "Consolas", monospace; font-size: 0.86rem; } details { display: grid; gap: 12px; margin: 14px 0; } summary { cursor: pointer; color: var(--steel); font-weight: 800; } .grid { display: grid; gap: 16px; } .grid.five { grid-template-columns: repeat(5, minmax(140px, 1fr)); } .grid.three { grid-template-columns: repeat(3, minmax(170px, 1fr)); } .grid.two { grid-template-columns: repeat(2, minmax(280px, 1fr)); } .span2 { grid-column: span 2; } .span3 { grid-column: span 3; } .stack { display: grid; gap: 14px; } .card, .metric, .empty, .errorPanel, .noticePanel { border: 1px solid var(--line); border-radius: 24px; background: var(--paper); box-shadow: var(--shadow); } .card, .empty { padding: 22px; } .metric { min-height: 128px; padding: 20px; } .metric span, .signal span, .stateLine span { display: block; color: var(--muted); font-weight: 800; } .metric span { margin-bottom: 16px; } .metric strong { font-size: 3.1rem; line-height: 1; } .green strong { color: var(--green); } .amber strong { color: var(--amber); } .red strong { color: var(--red); } .steel strong { color: var(--steel); } .cardHead, .roleRow, .requestCard, .vpnCard { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: start; gap: 16px; } .vpnCard { grid-template-columns: minmax(0, 1.2fr) minmax(220px, 0.8fr) auto; padding: 16px 0; border-bottom: 1px solid var(--line); } .nodeCard { display: grid; gap: 16px; } .nodeList { display: grid; gap: 8px; margin-top: 16px; } .nodeListGroup, .nodeListRow { border: 1px solid var(--line); border-radius: 16px; background: rgba(255, 255, 255, 0.42); } .nodeListGroup { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 12px; color: var(--green); } .nodeListRow { display: grid; grid-template-columns: minmax(240px, 1.2fr) auto minmax(110px, 0.55fr) minmax(130px, 0.7fr) auto auto; align-items: center; gap: 10px; padding: 10px; } .nodeListMain { display: grid; min-width: 0; gap: 3px; } .nodeListMain span { overflow: hidden; color: var(--muted); font-size: 0.82rem; text-overflow: ellipsis; white-space: nowrap; } .functionList { display: grid; gap: 8px; margin: 12px 0; } .functionRow { display: grid; grid-template-columns: minmax(180px, 1fr) auto auto auto auto minmax(220px, auto); align-items: center; gap: 10px; padding: 10px; border: 1px solid var(--line); border-radius: 16px; background: rgba(255, 255, 255, 0.42); } .nodePanel { display: grid; gap: 12px; padding: 14px; border: 1px solid var(--line); border-radius: 18px; background: rgba(255, 255, 255, 0.42); } .stateList { display: grid; gap: 10px; } .stateLine { display: grid; grid-template-columns: 130px minmax(0, 1fr); gap: 10px; align-items: baseline; } .stateLine strong { min-width: 0; overflow-wrap: anywhere; } .signalStrip { display: grid; grid-template-columns: repeat(4, minmax(120px, 1fr)); gap: 12px; } .signalStrip.compact { grid-template-columns: repeat(4, minmax(90px, 1fr)); } .signal { padding: 14px; border: 1px solid var(--line); border-radius: 18px; background: rgba(255, 255, 255, 0.48); } .signal strong { display: block; margin-top: 8px; font-size: 1.6rem; } .signalStrip.compact .signal strong { font-size: 1rem; } .clusterCatalog { display: grid; gap: 14px; } .clusterCard { display: grid; gap: 14px; padding: 16px; border: 1px solid var(--line); border-radius: 22px; background: rgba(255, 255, 255, 0.42); } .clusterCard.selected { border-color: rgba(47, 111, 79, 0.45); background: rgba(47, 111, 79, 0.08); } .clusterCardMain { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 16px; align-items: start; } .clusterCardMain h4 { margin-bottom: 6px; font-size: 1.3rem; } .clusterCardActions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; } .pill { display: inline-flex; align-items: center; width: fit-content; border-radius: 999px; padding: 0.34rem 0.72rem; color: var(--steel); background: rgba(54, 85, 108, 0.1); font-size: 0.78rem; font-weight: 900; } .pill.good { color: var(--green); background: rgba(47, 111, 79, 0.12); } .pill.bad { color: var(--red); background: rgba(177, 68, 52, 0.12); } .membershipList { display: flex; flex-wrap: wrap; gap: 6px; } .treeList { display: grid; gap: 12px; margin-top: 16px; } .treeBranch { display: grid; gap: 8px; padding: 12px; border-left: 3px solid rgba(47, 111, 79, 0.28); border-radius: 0 16px 16px 0; background: rgba(255, 255, 255, 0.32); } .treeBranch h4 { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 0; } .treeNodeList { display: flex; flex-wrap: wrap; gap: 6px; } .telemetryBox { display: grid; gap: 12px; } .sparkline { display: flex; align-items: end; gap: 3px; height: 92px; padding: 10px; border: 1px solid var(--line); border-radius: 16px; background: rgba(24, 32, 24, 0.06); } .sparkline span { flex: 1; min-width: 3px; border-radius: 999px 999px 0 0; background: linear-gradient(180deg, #4f8565, #203d2f); } .topologyShell { display: grid; gap: 14px; } .topologySvg { width: 100%; min-height: 440px; border: 1px solid var(--line); border-radius: 22px; color: rgba(24, 32, 24, 0.42); background: radial-gradient(circle at 50% 50%, rgba(47, 111, 79, 0.12), transparent 18rem), linear-gradient(135deg, rgba(255, 255, 255, 0.56), rgba(255, 250, 240, 0.32)); } .topologyRing { fill: none; stroke: rgba(47, 111, 79, 0.14); stroke-width: 2; stroke-dasharray: 12 10; } .topologyZone { fill: rgba(255, 252, 239, 0.44); stroke: rgba(24, 32, 24, 0.08); stroke-width: 2; } .topologyZone.ingress { fill: rgba(67, 122, 146, 0.11); } .topologyZone.core { fill: rgba(47, 111, 79, 0.09); } .topologyZone.egress { fill: rgba(176, 122, 50, 0.11); } .topologyLayerLabel { fill: var(--green); font-size: 22px; font-weight: 950; letter-spacing: 0.08em; text-anchor: middle; text-transform: uppercase; } .topologyLink { stroke-width: 4; stroke-linecap: round; opacity: 0.84; } .topologyLink.good { color: var(--green); stroke: var(--green); } .topologyLink.weak { color: var(--amber); stroke: var(--amber); } .topologyLink.bad { color: var(--red); stroke: var(--red); stroke-dasharray: 10 8; } .topologyPlacementLink { stroke: var(--steel); stroke-width: 3; stroke-linecap: round; stroke-dasharray: 7 8; opacity: 0.58; } .topologyPlacementLink.good { color: var(--green); stroke: var(--green); } .topologyPlacementLink.weak { color: var(--amber); stroke: var(--amber); } .topologyLinkLabel, .topologyNodeName, .topologyNodeMeta, .topologyEndpointName, .topologyEndpointMeta, .topologyEmpty { font-weight: 900; text-anchor: middle; paint-order: stroke; stroke: rgba(255, 252, 239, 0.92); stroke-width: 5px; stroke-linejoin: round; } .topologyLinkLabel { fill: var(--muted); font-size: 22px; } .topologyEndpointRect { fill: rgba(255, 252, 239, 0.94); stroke: var(--steel); stroke-width: 3; filter: drop-shadow(0 12px 18px rgba(24, 32, 24, 0.12)); } .topologyEndpointRect.active { stroke: var(--green); } .topologyEndpointRect.disabled { stroke: var(--red); } .topologyEndpointRect.maintenance { stroke: var(--amber); } .topologyEndpointName { fill: var(--ink); font-size: 18px; } .topologyEndpointMeta { fill: var(--muted); font-size: 15px; } .topologyNodeCircle { fill: rgba(255, 252, 239, 0.94); stroke: var(--steel); stroke-width: 4; filter: drop-shadow(0 14px 22px rgba(24, 32, 24, 0.14)); } .topologyNodeCircle.healthy { stroke: var(--green); } .topologyNodeCircle.critical, .topologyNodeCircle.failed { stroke: var(--red); } .topologyNodeName { fill: var(--ink); font-size: 23px; } .topologyNodeMeta { fill: var(--muted); font-size: 18px; } .topologyEmpty { fill: var(--muted); font-size: 24px; } .topologyLegend { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; color: var(--muted); font-size: 0.88rem; } .topologyLegend span { display: inline-flex; gap: 8px; align-items: center; } .legendLine { display: inline-block; width: 36px; height: 0; border-top: 3px solid var(--steel); } .legendLine.placement { border-top-style: dashed; border-color: var(--green); } .legendLine.observed { border-color: var(--amber); } .serviceTags { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 10px; } .serviceTag { display: grid; gap: 5px; padding: 12px; border: 1px solid var(--line); border-radius: 16px; background: rgba(255, 255, 255, 0.48); } .serviceTag span, .serviceTag small { color: var(--muted); } .serviceTag .pill { color: var(--steel); font-size: 0.7rem; } .serviceTag .pill.good { color: var(--green); } .serviceTag .pill.bad { color: var(--red); } .actions { display: flex; flex-wrap: wrap; gap: 10px; } .status { display: inline-flex; width: fit-content; margin-right: 6px; border-radius: 999px; padding: 0.32rem 0.7rem; color: white; background: var(--steel); font-size: 0.78rem; font-weight: 900; } .status.pending, .status.enabled, .status.connecting { background: var(--amber); } .status.active, .status.approved, .status.healthy, .status.authoritative { background: var(--green); } .status.rejected, .status.failed, .status.critical, .status.disabled, .status.revoked { background: var(--red); } .tableWrap { overflow-x: auto; } table { width: 100%; border-collapse: collapse; } th, td { padding: 0.86rem 0.66rem; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; } th { color: var(--muted); font-size: 0.74rem; letter-spacing: 0.1em; text-transform: uppercase; } .errorPanel, .noticePanel { margin-top: 18px; padding: 16px; } .errorPanel { color: #fff; background: var(--red); } .noticePanel { color: #fff; background: var(--green); } .formGrid { display: grid; grid-template-columns: repeat(2, minmax(180px, 1fr)); gap: 12px; margin-bottom: 14px; } .wideLabel { margin-bottom: 14px; } .checkGrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 10px; } .codePreview { max-height: 320px; overflow: auto; margin: 10px 0 0; padding: 14px; border: 1px solid var(--line); border-radius: 16px; color: var(--ink); background: rgba(24, 32, 24, 0.06); white-space: pre-wrap; } .modalBackdrop { position: fixed; inset: 0; z-index: 30; display: grid; place-items: center; padding: 28px; background: rgba(24, 32, 24, 0.36); backdrop-filter: blur(6px); } .modalCard { display: grid; gap: 18px; width: min(760px, 100%); max-height: min(760px, calc(100vh - 56px)); overflow: auto; padding: 24px; border: 1px solid var(--line); border-radius: 28px; background: var(--paper-strong); box-shadow: var(--shadow); } .modalCard.wide { width: min(1040px, 100%); } .inlineForm { display: flex; flex-wrap: wrap; gap: 12px; margin: 18px 0; } .inlineForm input { flex: 1 1 320px; } .secretOnce { display: grid; gap: 8px; margin-top: 16px; padding: 14px; border: 1px solid rgba(184, 111, 35, 0.38); border-radius: 18px; background: rgba(184, 111, 35, 0.1); } code { overflow-wrap: anywhere; font-family: "Cascadia Code", "Consolas", monospace; } .workloadBlock { display: grid; gap: 10px; padding-bottom: 16px; border-bottom: 1px solid var(--line); } @media (max-width: 1100px) { .consoleShell { grid-template-columns: 1fr; } .sideRail { position: relative; height: auto; } .workspace { width: 100%; } .grid.five, .grid.three, .grid.two, .controlBar, .topBar, .loginShell, .vpnCard { grid-template-columns: 1fr; } .loginHero { min-height: auto; } .span2, .span3 { grid-column: auto; } } @media (max-width: 720px) { .workspace, .sideRail { padding: 18px; } .formGrid, .signalStrip, .clusterCardMain, .cardHead, .roleRow, .requestCard { grid-template-columns: 1fr; } }