@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&family=Manrope:wght@400;500;600;700;800&display=swap'); * { box-sizing: border-box; } html, body, #root { min-height: 100%; } body { margin: 0; min-width: 320px; min-height: 100vh; background: var(--mesh-offwhite); color: var(--mesh-ink); font-family: 'DM Sans', Inter, ui-sans-serif, system-ui, sans-serif; font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; } button, input { font: inherit; } button { color: inherit; cursor: pointer; -webkit-tap-highlight-color: transparent; } :root { color-scheme: light; --mesh-purple: #7c3aed; --mesh-purple-hover: #6d28d9; --mesh-purple-deep: #5521b5; --mesh-lavender: #a78bfa; --mesh-pale: #ede9fe; --mesh-wash: #f5f3ff; --mesh-paper: #fff; --mesh-offwhite: #faf9ff; --mesh-ink: #181526; --mesh-muted: #706d80; --mesh-subtle: #9692a5; --mesh-border: #e8e5f0; --mesh-border-strong: #d8d2e8; --mesh-good: #15803d; --mesh-good-bg: #f0fdf4; --mesh-warn: #b45309; --mesh-warn-bg: #fffbeb; --mesh-error: #b91c1c; } body { min-width: 320px; min-height: 100vh; background: var(--mesh-offwhite); color: var(--mesh-ink); font-family: 'DM Sans', Inter, ui-sans-serif, system-ui, sans-serif; } button, input { font: inherit; } button { -webkit-tap-highlight-color: transparent; } .manage-app { min-height: 100vh; background: var(--mesh-offwhite); } .manage-top { height: 68px; padding: 0 max(24px, calc((100vw - 1400px) / 2)); gap: 18px; background: rgba(255, 255, 255, .94); border-bottom: 1px solid var(--mesh-border); box-shadow: 0 1px 2px #21184105; backdrop-filter: blur(12px); } .manage-brand { color: var(--mesh-ink); font-size: 21px; letter-spacing: -1.15px; } .brand-glyph { width: 30px; height: 30px; border-radius: 9px; background: var(--mesh-purple); color: #fff; } .brand-period { color: var(--mesh-purple); } .control-badge { color: var(--mesh-muted); font-size: 12px; gap: 8px; } .control-badge i { width: 8px; height: 8px; background: var(--mesh-good); box-shadow: 0 0 0 3px var(--mesh-good-bg); } .control-badge.offline i { background: var(--mesh-error); box-shadow: 0 0 0 3px #fef2f2; } .control-badge.checking i { background: var(--mesh-warn); box-shadow: 0 0 0 3px var(--mesh-warn-bg); } .refresh-button { width: 40px; height: 40px; color: var(--mesh-muted); border: 1px solid transparent; } .refresh-button:hover { color: var(--mesh-purple-deep); background: var(--mesh-wash); border-color: var(--mesh-border); } .manage-main { max-width: 1400px; padding: 38px 32px 28px; } .manage-heading { align-items: center; margin-bottom: 26px; gap: 22px; } .overline { color: var(--mesh-muted); font-size: 10px; letter-spacing: 1.1px; } .manage-heading h1 { color: var(--mesh-ink); font-size: clamp(29px, 3vw, 36px); letter-spacing: -1.3px; margin-top: 8px; } .manage-heading p { color: var(--mesh-muted); font-size: 14px; margin-top: 7px; } .heading-buttons, .summary-actions { gap: 9px; } .manage-button { min-height: 42px; height: 42px; padding: 0 15px; color: #413c52; border: 1px solid var(--mesh-border-strong); border-radius: 10px; background: var(--mesh-paper); font-size: 13px; font-weight: 600; box-shadow: 0 1px 2px #21184108; transition: background .16s ease, border-color .16s ease, color .16s ease, transform .16s ease; } .manage-button:hover { background: var(--mesh-wash); color: var(--mesh-purple-deep); border-color: #c4b5fd; transform: translateY(-1px); } .manage-button.primary { background: var(--mesh-purple); border-color: var(--mesh-purple); color: #fff; box-shadow: 0 2px 5px #7c3aed24; } .manage-button.primary:hover { background: var(--mesh-purple-hover); border-color: var(--mesh-purple-hover); color: #fff; } .manage-button.small { height: 36px; min-height: 36px; padding: 0 11px; border-radius: 8px; font-size: 12px; } .manage-button.icon-only { width: 42px; padding: 0; } .manage-button.danger { color: var(--mesh-error); background: #fff; border-color: #fecaca; } .manage-button.danger:hover { color: #991b1b; background: #fef2f2; border-color: #fca5a5; } .manage-button.primary.danger { color: #fff; background: var(--mesh-error); border-color: var(--mesh-error); } .manage-button:focus-visible, .refresh-button:focus-visible, .node-action:focus-visible, .rail-cluster:focus-visible, .dialog-close:focus-visible { outline: 3px solid #c4b5fd; outline-offset: 2px; } .manage-button:disabled { cursor: not-allowed; opacity: .48; transform: none; } .manage-layout { grid-template-columns: minmax(250px, .68fr) minmax(0, 2fr); gap: 20px; align-items: start; } .cluster-rail, .cluster-content { border: 1px solid var(--mesh-border); border-radius: 14px; background: var(--mesh-paper); box-shadow: 0 2px 8px #21184108; } .cluster-rail { min-height: 420px; padding: 17px 13px; } .rail-title { padding: 4px 9px 12px; color: var(--mesh-muted); font-size: 10px; letter-spacing: .9px; } .rail-title span, .count-chip { color: var(--mesh-purple-deep); background: var(--mesh-pale); border-radius: 999px; padding: 3px 8px; font-size: 11px; } .rail-cluster { min-height: 58px; gap: 11px; padding: 9px; border-radius: 10px; color: #4d485d; } .rail-cluster:hover, .rail-cluster.active { background: var(--mesh-wash); } .rail-cluster.active { box-shadow: inset 3px 0 var(--mesh-purple); } .rail-icon, .summary-icon { background: var(--mesh-pale); color: var(--mesh-purple-deep); } .rail-label b { color: var(--mesh-ink); font-size: 13px; } .rail-label small { color: var(--mesh-muted); font-size: 11px; } .rail-state, .node-dot { background: #c7c3d0; } .rail-state.online, .node-dot.online { background: var(--mesh-good); box-shadow: 0 0 0 3px var(--mesh-good-bg); } .rail-create { min-height: 42px; height: 42px; margin-top: 10px; border: 1px dashed var(--mesh-border-strong); border-radius: 9px; color: var(--mesh-purple-deep); font-size: 12px; } .rail-create:hover { color: var(--mesh-purple-hover); border-color: var(--mesh-lavender); background: var(--mesh-wash); } .identity-note { padding: 13px 9px 4px; color: var(--mesh-muted); font-size: 11px; line-height: 1.55; } .identity-note svg { color: var(--mesh-purple); } .rail-empty { color: var(--mesh-muted); font-size: 12px; padding: 12px 9px; } .cluster-content { padding: 22px; min-width: 0; } .cluster-summary { padding: 2px 0 19px; border-bottom-color: var(--mesh-border); gap: 15px; } .summary-icon { width: 48px; height: 48px; border-radius: 13px; font-size: 13px; } .cluster-summary h2 { color: var(--mesh-ink); font-size: 20px; margin-top: 5px; } .summary-sub { color: var(--mesh-muted); font-size: 12px; } .resource-grid { grid-template-columns: minmax(0, 1.25fr) minmax(270px, .85fr); gap: 14px; margin-top: 18px; } .resource-card { border: 1px solid var(--mesh-border); border-radius: 12px; background: #fff; padding: 17px; } .card-heading h3 { color: var(--mesh-ink); font-size: 15px; } .card-heading h3 svg { color: var(--mesh-purple); } .card-heading p { color: var(--mesh-muted); font-size: 12px; margin-top: 5px; } .table-empty { border-color: var(--mesh-border-strong); background: var(--mesh-offwhite); color: var(--mesh-muted); border-radius: 9px; padding: 25px 14px; margin-top: 16px; font-size: 12px; } .node-row, .member-row { min-height: 58px; border-top-color: var(--mesh-border); gap: 11px; padding: 8px 4px; } .node-name b { color: var(--mesh-ink); font-size: 12px; } .node-name small { color: var(--mesh-muted); font-size: 11px; } .node-action { min-width: 36px; min-height: 36px; width: 36px; height: 36px; border-radius: 8px; color: var(--mesh-muted); } .node-action:hover { border-color: var(--mesh-border); background: var(--mesh-wash); color: var(--mesh-purple-deep); } .node-action.danger:hover { color: var(--mesh-error); border-color: #fecaca; background: #fef2f2; } .member-avatar { width: 34px; height: 34px; background: var(--mesh-pale); color: var(--mesh-purple-deep); font-size: 11px; } .member-row:nth-child(2n) .member-avatar { background: var(--mesh-wash); color: var(--mesh-purple-deep); } .role-chip { border-color: var(--mesh-border-strong); color: var(--mesh-muted); font-size: 10px; padding: 4px 9px; } .role-chip.owner { color: var(--mesh-purple-deep); border-color: #ddd6fe; background: var(--mesh-wash); } .member-footnote { border-top-color: var(--mesh-border); color: var(--mesh-muted); font-size: 11px; } .invite-management { border-top-color: var(--mesh-border); } .invite-management-title { color: var(--mesh-muted); font-size: 9px; } .invite-management-title span { color: var(--mesh-purple-deep); background: var(--mesh-pale); } .invite-row { min-height: 39px; border-top-color: var(--mesh-border); } .invite-key { color: #4d485d; font-size: 10px; } .invite-key svg { color: var(--mesh-purple); } .invite-expiry, .no-invites { color: var(--mesh-muted); font-size: 10px; } .job-card { margin-top: 14px; } .job-row { min-height: 67px; border-top-color: var(--mesh-border); padding: 12px 4px; } .job-title b { color: var(--mesh-ink); font-size: 12px; } .job-title small { color: var(--mesh-muted); font-size: 11px; } .job-progress { height: 6px; background: var(--mesh-pale); } .job-progress span { background: var(--mesh-purple); } .coordinator-note { margin-top: 14px; border: 1px solid #ddd6fe; background: var(--mesh-wash); border-radius: 11px; padding: 14px; color: var(--mesh-purple-deep); } .coordinator-note b { color: var(--mesh-purple-deep); font-size: 12px; } .coordinator-note span { color: var(--mesh-muted); font-size: 11px; line-height: 1.6; } .empty-state { min-height: 280px; color: var(--mesh-muted); padding: 24px; } .empty-symbol, .dialog-icon { background: var(--mesh-pale); color: var(--mesh-purple); border-radius: 13px; } .empty-state h2 { color: var(--mesh-ink); font-size: 20px; } .empty-state p { max-width: 400px; color: var(--mesh-muted); font-size: 13px; line-height: 1.6; margin: 8px 0 18px; } .feedback { border-radius: 9px; padding: 12px 14px; margin: 0 0 16px; font-size: 13px; } .feedback.error { border: 1px solid #fecaca; background: #fef2f2; color: var(--mesh-error); } .feedback.success { border: 1px solid #bbf7d0; background: var(--mesh-good-bg); color: var(--mesh-good); } .feedback.success svg { color: var(--mesh-good); } .invite-banner { border: 1px solid #ddd6fe; background: var(--mesh-wash); border-radius: 12px; padding: 15px; gap: 12px; margin-bottom: 22px; } .invite-banner b { color: var(--mesh-ink); font-size: 13px; } .invite-banner span { color: var(--mesh-muted); font-size: 12px; } .dismiss-button, .dialog-close { color: var(--mesh-muted); } .dismiss-button:hover, .dialog-close:hover { background: var(--mesh-pale); color: var(--mesh-purple-deep); } .manage-footer { color: var(--mesh-subtle); font-size: 11px; margin-top: 25px; } .dialog-shade { background: #2118415c; backdrop-filter: blur(5px); } .credentials-dialog { border: 1px solid var(--mesh-border); border-radius: 16px; padding: 27px; background: var(--mesh-paper); box-shadow: 0 24px 80px #21184124; } .credentials-dialog h2 { color: var(--mesh-ink); font-size: 22px; } .credentials-dialog > p { color: var(--mesh-muted); font-size: 13px; line-height: 1.6; } .field-label { color: #49445a; font-size: 11px; letter-spacing: .5px; margin: 22px 0 8px; } .text-input { height: 46px; border: 1px solid var(--mesh-border-strong); border-radius: 9px; background: #fff; color: var(--mesh-ink); padding: 0 12px; font-size: 14px; } .text-input:focus { border-color: var(--mesh-purple); box-shadow: 0 0 0 3px #ede9fe; } .credential-value { background: var(--mesh-offwhite); border-color: var(--mesh-border); border-radius: 8px; color: #454052; font-size: 11px; } .credential-hint { color: var(--mesh-muted); font-size: 11px; line-height: 1.6; } .dialog-actions { margin-top: 23px; } .dialog-actions .manage-button { min-width: 110px; } .dialog-actions .manage-button.danger { color: #fff; background: var(--mesh-error); border-color: var(--mesh-error); } .manage-button.full-width { margin-top: 14px; } .invite-banner .manage-button { flex: none; } @media (max-width: 900px) { .manage-main { padding: 30px 22px 24px; } .manage-layout { grid-template-columns: minmax(0, .8fr) minmax(0, 1.8fr); gap: 14px; } .cluster-rail { min-height: 0; } .resource-grid { grid-template-columns: 1fr; } .cluster-summary { align-items: flex-start; } } @media (max-width: 680px) { .manage-top { height: 60px; padding: 0 16px; } .manage-main { padding: 24px 14px 22px; } .manage-heading { align-items: stretch; flex-direction: column; gap: 17px; } .heading-buttons { width: 100%; } .heading-buttons > .manage-button { flex: 1; } .manage-layout { grid-template-columns: 1fr; gap: 12px; } .cluster-rail { padding: 12px; } .cluster-rail .rail-cluster { display: flex; width: 100%; } .identity-note { margin-top: 12px; } .cluster-content { padding: 16px; } .cluster-summary { flex-direction: column; } .summary-actions { align-self: stretch; flex-wrap: wrap; } .summary-actions .manage-button { flex: 1; } .resource-grid { gap: 11px; } .card-heading { align-items: flex-start; flex-wrap: wrap; } .card-heading > .heading-buttons { width: auto; margin-left: auto; } .manage-button.small { min-height: 40px; height: 40px; } .job-row { align-items: flex-start; flex-direction: column; } .job-row .heading-buttons { width: 100%; } .invite-banner { align-items: flex-start; flex-wrap: wrap; } .invite-banner > div { flex: 1 1 calc(100% - 36px); } .invite-banner .manage-button { flex: 1; } .invite-banner .dismiss-button { position: absolute; right: 15px; } .control-badge { font-size: 0; gap: 0; } .control-badge i { width: 8px; height: 8px; } .empty-state { min-height: 235px; } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { scroll-behavior: auto !important; transition-duration: .01ms !important; animation-duration: .01ms !important; } } .availability-note { margin-top: 9px; padding: 9px 11px; border: 1px solid #ddd6fe; border-radius: 8px; background: var(--mesh-wash); color: var(--mesh-purple-deep); font-size: 11px; line-height: 1.5; } .card-heading .availability-note { color: var(--mesh-muted); font-size: 11px; } /* Shared layout rules now live in the single Mesh theme stylesheet. */ .manage-top { display: flex; align-items: center; position: sticky; top: 0; z-index: 3; } .manage-brand { display: flex; align-items: center; gap: 9px; } .brand-glyph { display: grid; } .brand-period { margin-left: -9px; } .control-badge { margin-left: auto; display: flex; align-items: center; } .refresh-button,.dismiss-button,.dialog-close { display: grid; padding: 6px; } .manage-main { margin: 0 auto; } .manage-heading { display: flex; justify-content: space-between; } .heading-buttons,.summary-actions { display: flex; } .manage-button { display: inline-flex; align-items: center; justify-content: center; gap: 7px; white-space: nowrap; } .manage-button.full-width { width: 100%; } .manage-layout { display: grid; } .cluster-rail { display: flex; flex-direction: column; } .rail-title { display: flex; justify-content: space-between; } .rail-cluster { display: flex; align-items: center; width: 100%; text-align: left; cursor: pointer; } .rail-icon,.summary-icon { width: 29px; height: 29px; display: grid; flex: none; } .rail-label { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; } .rail-label b { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .rail-state,.node-dot { height: 6px; width: 6px; flex: none; } .rail-create { display: flex; align-items: center; justify-content: center; gap: 6px; } .identity-note { margin-top: auto; display: flex; align-items: flex-start; gap: 7px; } .identity-note svg { flex: none; margin-top: 1px; } .cluster-summary { display: flex; align-items: center; justify-content: space-between; } .summary-ident { display: flex; align-items: center; gap: 11px; min-width: 0; } .cluster-summary h2 { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .summary-sub { display: block; margin-top: 4px; } .resource-grid { display: grid; } .resource-card { min-width: 0; } .card-heading { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .card-heading h3 { display: flex; align-items: center; gap: 7px; } .table-empty { text-align: center; } .node-list,.member-list { margin-top: 12px; } .node-row,.member-row { display: flex; align-items: center; } .node-name { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; } .node-name b { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .node-name small { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .node-action { display: grid; flex: none; } .member-avatar { display: grid; flex: none; } .member-footnote { padding-top: 10px; margin-top: 5px; } .coordinator-note { display: flex; gap: 9px; } .coordinator-note svg { flex: none; margin-top: 1px; } .coordinator-note div { display: flex; flex-direction: column; gap: 4px; } .empty-state { display: flex; flex-direction: column; align-items: center; justify-content: center; text-align: center; } .empty-symbol { height: 43px; width: 43px; display: grid; margin-bottom: 12px; } .feedback.success { display: flex; align-items: center; gap: 6px; } .invite-banner { display: flex; align-items: center; } .invite-banner>div { flex: 1; display: flex; flex-direction: column; gap: 4px; } .dismiss-button { margin-left: 0; } .manage-footer { display: flex; gap: 8px; justify-content: center; } .dialog-shade { position: fixed; inset: 0; z-index: 10; display: grid; padding: 20px; } .credentials-dialog { width: min(430px,100%); position: relative; } .dialog-close { position: absolute; right: 13px; top: 13px; } .dialog-icon { height: 36px; width: 36px; display: grid; margin-bottom: 14px; } .credentials-dialog h2 { margin-top: 5px; } .credentials-dialog>p { margin-top: 8px; } .credential-value { overflow-wrap: anywhere; padding: 9px; margin-top: 12px; } .credential-hint { margin-top: 11px; } .job-list { margin-top: 10px; } .job-row { display: flex; align-items: center; gap: 12px; justify-content: space-between; } .job-title { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 5px; } .job-progress { overflow: hidden; margin-top: 2px; } .job-progress span { height: 100%; display: block; transition: width .2s ease; } .invite-management { margin-top: 7px; padding-top: 9px; } .invite-management-title { display: flex; align-items: center; justify-content: space-between; margin: 0 2px 5px; } .invite-management-title span { padding: 2px 5px; } .invite-row { display: flex; align-items: center; gap: 6px; } .invite-key { display: flex; align-items: center; gap: 4px; } .invite-expiry { margin-left: auto; white-space: nowrap; } .no-invites { padding: 5px 2px; } .app-dialog .field-label { margin-top: 20px; } .dialog-actions { justify-content: flex-end; } @media (max-width: 900px) { .cluster-content { padding: 13px; } .cluster-summary { gap: 10px; flex-direction: column; } .summary-actions { align-self: flex-end; margin-top: -2px; } .manage-heading { align-items: flex-start; gap: 14px; flex-direction: column; } .heading-buttons { width: 100%; } .heading-buttons .manage-button { flex: 1; } .summary-actions { flex-wrap: wrap; } .summary-actions .manage-button { flex: 1; } } @media (max-width: 680px) { .cluster-rail { min-height: 0; } .cluster-rail .rail-cluster { vertical-align: top; } .rail-create { width: 100%; } .cluster-content { min-height: 300px; } .summary-actions .manage-button:first-child { flex: 1; } .invite-banner>div { flex-basis: calc(100% - 28px); } .invite-banner .manage-button { margin-left: 0; } .heading-buttons .manage-button { padding: 0 7px; } }