* { box-sizing: border-box; } :root { font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color: #eef2f7; background: #0b0f15; color-scheme: dark; font-synthesis: none; } body { margin: 0; min-width: 720px; min-height: 100vh; background: radial-gradient(circle at 12% -10%, rgba(44, 113, 90, .18), transparent 30rem), #0b0f15; } button, input, select { font: inherit; } button { cursor: pointer; } button:disabled { cursor: wait; opacity: .48; } .shell { max-width: 1180px; margin: 0 auto; padding: 28px; } .topbar { display: flex; align-items: center; justify-content: space-between; gap: 18px; margin-bottom: 22px; } .brand { display: flex; align-items: center; gap: 13px; } .mark { width: 42px; height: 42px; border-radius: 12px; display: grid; place-items: center; background: #b9f3d5; color: #092016; font-weight: 900; letter-spacing: -.04em; box-shadow: 0 0 0 1px rgba(185, 243, 213, .18); } h1 { margin: 0; font-size: 21px; letter-spacing: -.025em; } h2 { margin: 2px 0 0; font-size: 15px; letter-spacing: -.01em; } .subtitle { margin: 3px 0 0; color: #8491a3; font-size: 12.5px; } .eyebrow { color: #667386; font-size: 9px; font-weight: 800; letter-spacing: .14em; } .status { display: inline-flex; align-items: center; gap: 8px; border: 1px solid #28313d; background: #111720; border-radius: 999px; padding: 8px 12px; font-size: 11px; font-weight: 700; color: #99a5b5; } .dot, .state-dot { width: 7px; height: 7px; border-radius: 50%; flex: 0 0 auto; background: #647083; } .status.live .dot, #virtual-printer-state.ready + .state-dot { background: #65d69a; } .status.live { border-color: #254b3b; color: #b9f3d5; background: #0f211a; } .status.error-state { color: #ffc7c7; border-color: #5d3131; background: #231414; } .status.error-state .dot { background: #ef7f7f; } .grid { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(330px, .85fr); gap: 16px; } .card { border: 1px solid #202833; border-radius: 16px; background: #10151d; overflow: hidden; box-shadow: 0 14px 38px rgba(0, 0, 0, .2); } .card-head { min-height: 64px; padding: 15px 18px; border-bottom: 1px solid #1e2630; display: flex; align-items: center; justify-content: space-between; gap: 12px; } .card-body { padding: 18px; } .jobs-card { grid-column: 1 / -1; } .field-label, label { display: grid; gap: 7px; color: #a4afbd; font-size: 11px; font-weight: 600; } label.full { grid-column: 1 / -1; } input, select { width: 100%; border: 1px solid #2a3441; border-radius: 9px; background: #0b1016; color: #edf2f7; padding: 10px 11px; outline: none; } select option { background: #0b1016; color: #edf2f7; } input:focus, select:focus { border-color: #4ca77b; box-shadow: 0 0 0 3px rgba(76, 167, 123, .12); } .help { color: #667386; font-size: 10.5px; font-weight: 400; line-height: 1.45; } .route-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 9px; margin-top: 15px; } .route-tile { min-height: 62px; display: flex; align-items: center; gap: 10px; border: 1px solid #222c38; border-radius: 11px; padding: 10px; background: #0d131a; } .route-tile > div:last-child { display: grid; gap: 2px; } .route-tile strong { font-size: 11.5px; } .route-tile span { color: #667386; font-size: 10px; } .route-icon { width: 28px; height: 28px; border-radius: 8px; display: grid; place-items: center; flex: 0 0 auto; font-size: 10px; font-weight: 900; } .live-route { background: #143326; color: #8be4b4; } .test-route { background: #18273a; color: #9cc7f4; } .printer-state, .account-row, .update-box { margin-top: 12px; border: 1px solid #222c38; border-radius: 11px; background: #0d131a; } .printer-state { display: flex; align-items: flex-start; gap: 9px; padding: 11px; } .printer-state > div { display: grid; gap: 3px; } .printer-state strong, .account-row strong, .update-box strong { font-size: 11px; } #virtual-printer-state { color: #718094; font-size: 10.5px; line-height: 1.4; } #virtual-printer-state.ready { color: #82dca9; } .printer-state:has(#virtual-printer-state.ready) .state-dot { background: #65d69a; } .actions, .inline-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .printer-actions { margin-top: 12px; } .btn, .icon-btn { border: 1px solid #2b3643; border-radius: 9px; background: #151d27; color: #dce4ed; font-size: 11px; font-weight: 700; } .btn { padding: 9px 12px; } .icon-btn { width: 32px; height: 32px; padding: 0; } .btn:hover, .icon-btn:hover { background: #1a2430; } .btn.primary { background: #b9f3d5; border-color: #b9f3d5; color: #092016; } .btn.blue { background: #173552; border-color: #24577f; color: #d2e9ff; } .btn.ghost { background: transparent; } .btn.danger { color: #e99b9b; } .fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .advanced { margin-top: 14px; border-top: 1px solid #1e2630; padding-top: 12px; } .advanced summary { cursor: pointer; color: #7d8999; font-size: 10.5px; font-weight: 700; user-select: none; } .advanced-body { padding-top: 13px; } .compact-actions { margin-top: 12px; } .metrics { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; } .metric { border: 1px solid #222c38; border-radius: 11px; padding: 12px; background: #0d131a; } .metric b { display: block; margin-bottom: 3px; font-size: 21px; letter-spacing: -.04em; } .metric span { color: #667386; font-size: 9px; font-weight: 800; text-transform: uppercase; letter-spacing: .1em; } .account-row { min-height: 60px; padding: 11px; display: flex; align-items: center; justify-content: space-between; gap: 12px; } .account-row > div:first-child { display: grid; gap: 3px; } .login-code { color: #b9f3d5; font: 700 16px ui-monospace, SFMono-Regular, Menlo, monospace; letter-spacing: .08em; } .muted { color: #667386; font-size: 10.5px; } .small { font-size: 10px; } .update-box { padding: 11px; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 10px; } .update-box > div:first-child { display: grid; gap: 2px; } .update-box small { line-height: 1.35; } .update-progress { grid-column: 1 / -1; height: 4px; overflow: hidden; border-radius: 999px; background: #1a2430; } .update-progress span { display: block; width: 0; height: 100%; border-radius: inherit; background: #65d69a; transition: width .16s ease; } .jobs { display: grid; gap: 8px; max-height: 420px; overflow: auto; } .job { display: grid; grid-template-columns: minmax(0, 1fr) minmax(140px, 260px); gap: 14px; border: 1px solid #202a36; border-radius: 11px; padding: 12px; background: #0c1117; } .job-main { min-width: 0; } .job-title-row { display: flex; align-items: center; gap: 7px; } .job-title-row time { margin-left: auto; color: #596679; font-size: 10px; } .source-badge, .route-badge { display: inline-flex; align-items: center; min-height: 22px; border-radius: 999px; padding: 0 8px; font-size: 9px; font-weight: 800; } .source-badge { background: #17202b; color: #a9b5c5; } .route-badge.success { background: #123225; color: #8ce1b1; } .route-badge.test { background: #172c43; color: #9fcef5; } .route-badge.neutral { background: #2a2519; color: #e3c47d; } .job-result { display: block; margin: 9px 0 7px; font-size: 12px; font-weight: 700; } .codes { display: flex; flex-wrap: wrap; gap: 6px; } .code { display: grid; gap: 2px; font: 11px ui-monospace, SFMono-Regular, Menlo, monospace; background: #102b20; border: 1px solid #214b39; color: #bff0d3; border-radius: 7px; padding: 6px 8px; } .code small { color: #68a984; font-size: 8px; font-weight: 800; } .job-meta { min-width: 0; display: flex; align-items: flex-end; justify-content: flex-end; gap: 8px; color: #596679; font-size: 9.5px; text-align: right; } .job-meta span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 180px; } .job-error { margin-top: 7px; color: #f0a0a0; font-size: 10px; } .empty-state { min-height: 150px; display: grid; place-items: center; align-content: center; gap: 5px; color: #667386; text-align: center; } .empty-state strong { color: #a9b5c5; font-size: 12px; } .empty-state span { font-size: 10.5px; } .empty-icon { width: 32px; height: 32px; display: grid; place-items: center; border: 1px solid #26313e; border-radius: 50%; margin-bottom: 3px; } @media (max-width: 860px) { body { min-width: 0; } .shell { padding: 18px; } .topbar { align-items: flex-start; } .grid { grid-template-columns: 1fr; } .jobs-card { grid-column: auto; } .fields, .route-tiles { grid-template-columns: 1fr; } label.full { grid-column: auto; } .job { grid-template-columns: 1fr; } .job-meta { justify-content: flex-start; text-align: left; } } #self-test { color: #9fcef5; border-color: #294865; } .topbar-actions { display: flex; align-items: center; gap: 12px; } .view-tabs { display: inline-flex; gap: 4px; padding: 4px; border: 1px solid #202a36; border-radius: 10px; background: #0d131a; } .view-tab { border: 0; border-radius: 7px; padding: 7px 10px; background: transparent; color: #718094; font-size: 10.5px; font-weight: 800; } .view-tab:hover { color: #dce4ed; background: #151d27; } .view-tab.active { background: #1a2b24; color: #b9f3d5; } .app-view[hidden] { display: none; } .settings-card .settings-account { margin-top: 0; } .running-grid { display: grid; gap: 16px; } .running-summary-card .card-body { display: grid; gap: 14px; } .running-route { display: flex; align-items: center; justify-content: space-between; gap: 18px; border: 1px solid #222c38; border-radius: 11px; padding: 12px; background: #0d131a; } .running-route > div:first-child { min-width: 0; display: grid; gap: 4px; } .running-route strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; } .running-action-state { min-height: 14px; } @media (max-width: 860px) { .topbar-actions { width: 100%; justify-content: space-between; } .topbar { flex-wrap: wrap; } .running-route { align-items: flex-start; flex-direction: column; } } .debug-panel { margin-top: 12px; border: 1px solid #5b4720; border-radius: 11px; background: #151109; overflow: hidden; } .debug-panel[hidden] { display: none; } .debug-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 11px 12px; border-bottom: 1px solid #3a2d16; } .debug-head > div:first-child { display: grid; gap: 3px; } .debug-head .eyebrow { color: #e3ad4f; } .debug-output { margin: 0; padding: 12px; max-height: 340px; overflow: auto; white-space: pre-wrap; overflow-wrap: anywhere; color: #d8dee7; background: #0b0e12; font: 11px/1.55 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; } #debug-action-state { display: block; min-height: 14px; padding: 0 12px 10px; }