:root { color: #1c2533; background: #f3f6fa; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-synthesis: none; text-rendering: optimizeLegibility; } * { box-sizing: border-box; } body { min-width: 320px; min-height: 100vh; margin: 0; background: #f3f6fa; } button, input { font: inherit; } button { cursor: pointer; } button:disabled { cursor: not-allowed; opacity: 0.6; } a { color: inherit; } .session-screen { display: grid; min-height: 100dvh; place-content: center; justify-items: center; gap: 11px; color: #778397; padding: 20px; } .session-login-screen { background: radial-gradient( circle at 50% 20%, rgba(37, 99, 235, 0.12), transparent 34% ), #f3f6fa; } .login-card { display: grid; width: min(100vw - 32px, 400px); gap: 19px; border: 1px solid #dbe2eb; border-radius: 16px; background: #fff; padding: 28px; box-shadow: 0 24px 70px rgba(28, 37, 51, 0.13); } .login-card h1 { margin: 5px 0 0; color: #1c2533; font-size: 25px; letter-spacing: -0.025em; } .login-card label { display: grid; gap: 8px; color: #39465a; font-size: 13px; font-weight: 700; } .login-brand-mark { width: 44px; height: 44px; } .login-error { display: flex; align-items: center; gap: 7px; color: #b42318; font-size: 12px; } .app-shell { min-height: 100vh; } .topbar { position: sticky; top: 0; z-index: 10; display: flex; min-height: 64px; align-items: center; justify-content: space-between; border-bottom: 1px solid #dde3eb; background: rgba(255, 255, 255, 0.92); padding: 0 max(20px, calc((100vw - 1120px) / 2)); backdrop-filter: blur(12px); } .brand { display: flex; align-items: center; gap: 11px; } .brand-mark { display: grid; width: 38px; height: 38px; place-items: center; border-radius: 10px; color: #fff; background: #2563eb; box-shadow: 0 6px 16px rgba(37, 99, 235, 0.24); } .brand div { display: grid; gap: 1px; } .brand strong { font-size: 15px; } .brand div span { color: #778397; font-size: 11px; } .topbar-actions { display: flex; gap: 8px; } .content { width: min(1120px, calc(100% - 40px)); margin: 0 auto; padding: 42px 0 64px; } .hero { display: flex; align-items: end; justify-content: space-between; gap: 24px; margin-bottom: 24px; } .eyebrow { margin: 0 0 7px; color: #2563eb; font-size: 11px; font-weight: 800; letter-spacing: 0.12em; } .hero h1 { margin: 0; font-size: clamp(27px, 4vw, 36px); letter-spacing: -0.035em; } .summary-row { display: flex; gap: 9px; } .summary-chip { display: flex; min-height: 38px; align-items: center; gap: 7px; border: 1px solid #dde3eb; border-radius: 10px; color: #657188; background: #fff; padding: 0 12px; font-size: 12px; } .summary-chip strong { color: #1c2533; font-size: 15px; } .deploy-form { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(260px, 1.2fr) auto; align-items: end; gap: 16px; border: 1px solid #dbe2eb; border-radius: 14px; background: #fff; padding: 22px; box-shadow: 0 12px 32px rgba(28, 37, 51, 0.055); } .deploy-form label, .search-field { display: grid; gap: 8px; color: #39465a; font-size: 13px; font-weight: 700; } .search-field { position: relative; min-width: 0; } .search-results { position: absolute; z-index: 20; top: calc(100% - 1px); right: 0; left: 0; display: grid; max-height: 230px; overflow-y: auto; border: 1px solid #cfd7e3; border-radius: 0 0 9px 9px; background: #fff; box-shadow: 0 10px 25px rgba(28, 37, 51, 0.13); } .search-option { display: flex; min-height: 39px; align-items: center; gap: 8px; border: 0; color: #344054; background: #fff; padding: 7px 11px; text-align: left; } .search-option:hover, .search-option.active { background: #eff6ff; } .search-option > span { display: grid; min-width: 0; gap: 1px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .search-option small { overflow: hidden; color: #8792a2; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; } .search-state { display: flex; min-height: 39px; align-items: center; gap: 7px; color: #8792a2; padding: 0 11px; font-size: 12px; } .search-state-error { color: #b42318; } .deploy-form label small, .search-field label small { color: #8994a5; font-weight: 500; } .input-shell { display: flex; height: 44px; align-items: center; gap: 8px; border: 1px solid #cfd7e3; border-radius: 9px; color: #8994a5; padding: 0 12px; transition: border-color 0.15s, box-shadow 0.15s; } .input-shell:focus-within { border-color: #4b7bec; box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.11); } .input-shell input { width: 100%; min-width: 0; border: 0; outline: 0; color: #202b3b; background: transparent; } .input-shell input::placeholder { color: #a4adba; } .primary-button, .secondary-button, .danger-button, .icon-danger-button { display: inline-flex; align-items: center; justify-content: center; gap: 7px; border-radius: 9px; font-weight: 700; } .primary-button { height: 44px; border: 1px solid #2563eb; color: #fff; background: #2563eb; padding: 0 18px; box-shadow: 0 6px 15px rgba(37, 99, 235, 0.2); } .primary-button:hover { background: #1d55ca; } .secondary-button { min-height: 38px; border: 1px solid #d5dce6; color: #455266; background: #fff; padding: 0 13px; } .secondary-button:hover { background: #f7f9fc; } .flash { display: flex; align-items: center; gap: 9px; margin-top: 14px; border-radius: 9px; padding: 11px 13px; font-size: 13px; } .flash-error { border: 1px solid #fecaca; color: #b42318; background: #fff3f2; } .flash-success { border: 1px solid #bbf7d0; color: #167044; background: #f0fdf4; } .deployments-section { margin-top: 38px; } .section-heading { display: flex; align-items: end; justify-content: space-between; margin-bottom: 14px; } .section-heading h2 { margin: 0 0 4px; font-size: 19px; } .section-heading p { margin: 0; color: #8490a2; font-size: 12px; } .deployment-list { display: grid; gap: 11px; } .deployment-card { border: 1px solid #dce3ec; border-radius: 12px; background: #fff; padding: 17px 18px 14px; box-shadow: 0 4px 14px rgba(28, 37, 51, 0.035); } .card-main { display: flex; align-items: center; justify-content: space-between; gap: 20px; } .deployment-title-row { display: flex; min-width: 0; align-items: center; gap: 11px; } .status-icon { display: grid; width: 36px; height: 36px; flex: 0 0 auto; place-items: center; border-radius: 9px; color: #64748b; background: #f0f3f7; } .status-running { color: #168052; background: #eafaf1; } .status-failed, .status-cancelled { color: #c43b32; background: #fff0ef; } .status-building, .status-deploying, .status-queued, .status-uninstalling { color: #2563eb; background: #edf4ff; } .deployment-title { display: grid; min-width: 0; gap: 4px; } .deployment-title strong { display: flex; align-items: center; gap: 6px; overflow: hidden; font-size: 15px; text-overflow: ellipsis; white-space: nowrap; } .deployment-title span { color: #7c8798; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; } .badges { display: flex; flex: 0 0 auto; gap: 7px; } .badge { display: inline-flex; min-height: 25px; align-items: center; gap: 6px; border-radius: 999px; padding: 0 9px; font-size: 11px; font-weight: 700; } .port-badge { color: #475569; background: #f1f5f9; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; } .record-badge { color: #475569; background: #f8fafc; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; } .badge-running { color: #14734a; background: #e9f9f0; } .badge-failed, .badge-cancelled { color: #b83129; background: #fff0ef; } .badge-building, .badge-deploying, .badge-queued, .badge-uninstalling { color: #275db9; background: #edf4ff; } .badge-stopped { color: #667085; background: #f0f2f5; } .health-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; } .health-healthy { color: #14734a; background: #e9f9f0; } .health-unhealthy { color: #b83129; background: #fff0ef; } .health-pending, .health-unknown { color: #7b6650; background: #f8f3eb; } .deployment-meta { display: flex; align-items: center; gap: 12px; margin: 13px 0 0 47px; color: #8792a2; font-size: 11px; } .deployment-meta > span { display: inline-flex; align-items: center; gap: 5px; } .deployment-message { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .card-actions { display: flex; align-items: center; justify-content: space-between; gap: 14px; margin-top: 14px; border-top: 1px solid #edf0f4; padding-top: 12px; } .primary-link, .text-link { display: inline-flex; align-items: center; gap: 5px; color: #2563eb; font-size: 12px; font-weight: 700; text-decoration: none; } .primary-link:hover, .text-link:hover { text-decoration: underline; } .url-placeholder { color: #98a2b2; font-size: 12px; } .right-actions { display: flex; align-items: center; gap: 15px; } .icon-danger-button { min-height: 32px; border: 1px solid transparent; color: #b93a31; background: transparent; padding: 0 8px; font-size: 12px; } .icon-danger-button:hover { border-color: #ffd4d1; background: #fff4f3; } .empty-state { display: flex; min-height: 170px; align-items: center; justify-content: center; gap: 10px; border: 1px dashed #cfd7e2; border-radius: 12px; color: #8490a2; background: rgba(255, 255, 255, 0.55); font-size: 13px; } .modal-backdrop { position: fixed; inset: 0; z-index: 30; display: grid; place-items: center; background: rgba(21, 29, 42, 0.42); padding: 20px; backdrop-filter: blur(3px); } .confirm-dialog { width: min(100%, 410px); border: 1px solid #e2e7ee; border-radius: 14px; background: #fff; padding: 24px; box-shadow: 0 24px 70px rgba(15, 23, 42, 0.24); } .danger-icon { display: grid; width: 42px; height: 42px; place-items: center; border-radius: 11px; color: #bd382f; background: #fff0ef; } .confirm-dialog h2 { margin: 17px 0 8px; font-size: 20px; } .confirm-dialog p { margin: 0; color: #667085; font-size: 14px; line-height: 1.65; } .dialog-actions { display: flex; justify-content: flex-end; gap: 9px; margin-top: 24px; } .danger-button { min-height: 38px; border: 1px solid #c33b32; color: #fff; background: #c33b32; padding: 0 13px; } .spin { animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } @media (max-width: 760px) { .topbar { padding: 0 16px; } .content { width: min(100% - 28px, 1120px); padding-top: 28px; } .hero { align-items: flex-start; flex-direction: column; } .deploy-form { grid-template-columns: 1fr; padding: 17px; } .card-main { align-items: flex-start; flex-direction: column; gap: 12px; } .badges { margin-left: 47px; } .card-actions { align-items: flex-start; flex-direction: column; } .right-actions { width: 100%; justify-content: space-between; } } @media (max-width: 430px) { .brand div span, .secondary-button { font-size: 0; } .secondary-button { width: 38px; padding: 0; } .summary-row { width: 100%; } .summary-chip { flex: 1; } .badges { margin-left: 0; } .deployment-meta { align-items: flex-start; flex-direction: column; margin-left: 0; } }