webgputest / src /redesign.css
wuhp's picture
Deploy GitHub c2123d2
386fa75 verified
Raw History Blame Contribute Delete
20.9 kB
@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;
}
}