- Go module: github.com/netcell-it/deklarix - cmd/server/main.go: HTTP entry point with /health endpoint - scripts/build.sh: cross-compile amd64 + arm64 - scripts/test.sh: go vet + race tests + build-check - scripts/release.sh: full release flow (test → build → tag → push) - packaging/DEBIAN: .deb control template - design/enterprise.css: enterprise design system from enconf - CLAUDE.md: complete build/test/release documentation - .claude/settings.local.json: Claude Code permissions
4399 lines
110 KiB
CSS
4399 lines
110 KiB
CSS
/* enconf — Enterprise Light Theme v2 (shadcn-inspired) */
|
|
|
|
@import url('/fonts/inter.css');
|
|
|
|
/* ── Design tokens ──────────────────────────────────────────────────────────── */
|
|
:root {
|
|
--branding-primary: #1677ff;
|
|
--branding-accent: #1677ff;
|
|
--radius: 6px;
|
|
--radius-md: 8px;
|
|
--radius-lg: 10px;
|
|
--shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
|
|
--shadow: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
|
|
--shadow-md: 0 4px 12px rgba(0,0,0,0.08);
|
|
--shadow-lg: 0 8px 32px rgba(0,0,0,0.10), 0 2px 8px rgba(0,0,0,0.05);
|
|
}
|
|
|
|
* {
|
|
box-sizing: border-box;
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
body {
|
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
font-weight: 400;
|
|
background: #F8FAFC;
|
|
color: #334155;
|
|
font-size: 13px;
|
|
-webkit-font-smoothing: antialiased;
|
|
-moz-osx-font-smoothing: grayscale;
|
|
letter-spacing: -0.01em;
|
|
}
|
|
|
|
/* Global typography */
|
|
h1, h2, h3, h4, h5, h6 {
|
|
font-weight: 600 !important;
|
|
color: #0F172A !important;
|
|
letter-spacing: -0.02em;
|
|
}
|
|
|
|
.ant-typography { color: #334155; }
|
|
/* font-weight for modal/card titles and buttons comes from the theme tokens
|
|
(fontWeightStrong: 600, Button.fontWeight: 500) — no CSS override needed. */
|
|
.ant-tabs-tab { font-weight: 500 !important; }
|
|
.ant-btn { letter-spacing: -0.01em; }
|
|
|
|
/* === LAYOUT === */
|
|
.app-layout {
|
|
display: flex;
|
|
min-height: 100vh;
|
|
}
|
|
|
|
/* === SIDEBAR === */
|
|
.sidebar {
|
|
width: 240px;
|
|
min-height: 100vh;
|
|
background: linear-gradient(180deg, #0B1426 0%, #101D33 50%, #0D1829 100%);
|
|
display: flex;
|
|
flex-direction: column;
|
|
position: fixed;
|
|
left: 0;
|
|
top: 0;
|
|
bottom: 0;
|
|
overflow-y: auto;
|
|
scrollbar-width: thin;
|
|
scrollbar-color: rgba(255,255,255,0.1) transparent;
|
|
z-index: 100;
|
|
}
|
|
|
|
.sidebar::-webkit-scrollbar { width: 4px; }
|
|
.sidebar::-webkit-scrollbar-track { background: transparent; }
|
|
.sidebar::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 2px; }
|
|
|
|
.sidebar-overlay {
|
|
display: none;
|
|
position: fixed;
|
|
inset: 0;
|
|
background: rgba(0,0,0,0.4);
|
|
z-index: 99;
|
|
}
|
|
|
|
.sidebar-logo {
|
|
padding: 20px 16px;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
border-bottom: 1px solid rgba(255,255,255,0.06);
|
|
}
|
|
|
|
.sidebar-logo-icon {
|
|
width: 32px;
|
|
height: 32px;
|
|
background: linear-gradient(135deg, #1677ff, #1677ff);
|
|
border-radius: 8px;
|
|
box-shadow: 0 0 12px rgba(0, 212, 170, 0.4);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 16px;
|
|
font-weight: 700;
|
|
color: white;
|
|
}
|
|
|
|
.sidebar-logo-text {
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
color: #ffffff;
|
|
}
|
|
|
|
.sidebar-section {
|
|
padding: 16px 16px 4px;
|
|
}
|
|
|
|
.sidebar-section-label {
|
|
font-size: 10px;
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 1.5px;
|
|
color: #475569;
|
|
margin-bottom: 4px;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
|
|
.sidebar-logo-img {
|
|
height: 36px;
|
|
width: auto;
|
|
max-width: 160px;
|
|
flex-shrink: 0;
|
|
object-fit: contain;
|
|
}
|
|
|
|
.sidebar-server-badge {
|
|
font-size: 9px;
|
|
background: rgba(0,212,170,0.2);
|
|
color: #1677ff;
|
|
padding: 1px 6px;
|
|
border-radius: 10px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.sidebar-menu {
|
|
list-style: none;
|
|
padding: 4px 8px;
|
|
}
|
|
|
|
.sidebar-menu-item {
|
|
position: relative;
|
|
border-radius: 6px;
|
|
margin-bottom: 1px;
|
|
}
|
|
|
|
.sidebar-menu-item a,
|
|
.sidebar-menu-item button {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
padding: 8px 10px;
|
|
font-size: 14px;
|
|
color: #94A3B8;
|
|
text-decoration: none;
|
|
border-radius: 6px;
|
|
transition: all 0.15s ease;
|
|
background: none;
|
|
border: none;
|
|
cursor: pointer;
|
|
width: 100%;
|
|
}
|
|
|
|
.sidebar-menu-item a:hover,
|
|
.sidebar-menu-item button:hover {
|
|
background: rgba(255,255,255,0.05);
|
|
color: #CBD5E1;
|
|
}
|
|
|
|
.sidebar-menu-item.active::before {
|
|
content: '';
|
|
position: absolute;
|
|
left: 0;
|
|
top: 50%;
|
|
transform: translateY(-50%);
|
|
width: 3px;
|
|
height: 20px;
|
|
background: var(--branding-accent, #1677ff);
|
|
border-radius: 0 2px 2px 0;
|
|
box-shadow: 0 0 8px color-mix(in srgb, var(--branding-accent, #1677ff) 40%, transparent);
|
|
}
|
|
|
|
.sidebar-menu-item.active a,
|
|
.sidebar-menu-item.active button {
|
|
background: color-mix(in srgb, var(--branding-accent, #1677ff) 10%, transparent);
|
|
color: var(--branding-accent, #1677ff);
|
|
}
|
|
|
|
.sidebar-version {
|
|
margin-top: auto;
|
|
padding: 16px;
|
|
font-size: 11px;
|
|
color: #475569;
|
|
text-align: center;
|
|
border-top: 1px solid rgba(255,255,255,0.06);
|
|
}
|
|
|
|
/* === MAIN CONTENT === */
|
|
.main-content {
|
|
margin-left: 240px;
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-height: 100vh;
|
|
overflow-x: hidden;
|
|
min-width: 0;
|
|
}
|
|
|
|
/* === HEADER === */
|
|
.header {
|
|
height: 56px;
|
|
background: #ffffff;
|
|
border-bottom: 1px solid #E5E7EB;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
padding: 0 20px;
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 50;
|
|
backdrop-filter: blur(8px);
|
|
background: rgba(255,255,255,0.95);
|
|
}
|
|
|
|
.header-title {
|
|
font-size: 15px;
|
|
font-weight: 500;
|
|
color: #1E293B;
|
|
}
|
|
|
|
.header-left {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
}
|
|
|
|
.header-actions {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
|
|
.header-menu-toggle {
|
|
display: none;
|
|
background: none;
|
|
border: none;
|
|
cursor: pointer;
|
|
padding: 4px;
|
|
color: #64748B;
|
|
font-size: 18px;
|
|
line-height: 1;
|
|
}
|
|
|
|
.header-support-link {
|
|
font-size: 12px;
|
|
color: #64748B;
|
|
margin-left: 12px;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.header-subscription-select { min-width: 180px; max-width: 280px; }
|
|
.header-subscription-text {
|
|
font-size: 12px;
|
|
color: #64748B;
|
|
max-width: 200px;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.header-lang-select { width: 110px; }
|
|
|
|
.header-help-btn {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 32px;
|
|
height: 32px;
|
|
border-radius: 8px;
|
|
border: 1px solid #E5E7EB;
|
|
color: #64748B;
|
|
font-size: 16px;
|
|
transition: border-color 0.15s, color 0.15s;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.header-help-btn:hover { border-color: #CBD5E1; color: #374151; }
|
|
|
|
.header-user-btn {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
background: none;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
padding: 5px 10px;
|
|
cursor: pointer;
|
|
transition: border-color 0.15s;
|
|
}
|
|
|
|
.header-user-btn:hover { border-color: #CBD5E1; }
|
|
|
|
.header-avatar {
|
|
width: 28px;
|
|
height: 28px;
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 11px;
|
|
font-weight: 700;
|
|
color: #ffffff;
|
|
flex-shrink: 0;
|
|
background: linear-gradient(135deg, #1677ff, #1677ff);
|
|
}
|
|
|
|
.header-avatar--impersonating {
|
|
background: linear-gradient(135deg, #F59E0B, #EF4444);
|
|
}
|
|
|
|
.header-user-email {
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
color: #374151;
|
|
max-width: 140px;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
/* ── Impersonation banner ──────────────────────────────────────────────────── */
|
|
|
|
.impersonation-banner {
|
|
background: #FEF3C7;
|
|
border-bottom: 1px solid #FCD34D;
|
|
padding: 6px 20px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
font-size: 13px;
|
|
color: #92400E;
|
|
}
|
|
|
|
.impersonation-banner__icon { margin-right: 8px; }
|
|
|
|
.impersonation-banner__btn {
|
|
background: #F59E0B;
|
|
color: #fff;
|
|
border: none;
|
|
border-radius: 6px;
|
|
padding: 4px 12px;
|
|
font-size: 12px;
|
|
font-weight: 600;
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* === CONTENT AREA === */
|
|
.content-area {
|
|
padding: 16px;
|
|
flex: 1;
|
|
overflow-x: hidden;
|
|
min-width: 0;
|
|
}
|
|
|
|
.content-card {
|
|
background: #ffffff;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 12px;
|
|
padding: 24px;
|
|
box-shadow: 0 1px 3px rgba(0,0,0,0.02), 0 1px 2px rgba(0,0,0,0.03);
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
/* === TABS (Pill-Style) === */
|
|
.tab-bar {
|
|
display: flex;
|
|
gap: 8px;
|
|
margin-bottom: 20px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.tab-item {
|
|
padding: 6px 14px;
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
border: 1.5px solid #E2E8F0;
|
|
border-radius: 8px;
|
|
color: #64748B;
|
|
background: #ffffff;
|
|
cursor: pointer;
|
|
transition: all 0.15s ease;
|
|
}
|
|
|
|
.tab-item:hover {
|
|
border-color: #CBD5E1;
|
|
color: #475569;
|
|
}
|
|
|
|
.tab-item.active {
|
|
border-color: #1677ff;
|
|
background: #F0F9FF;
|
|
color: #1d4ed8;
|
|
}
|
|
|
|
/* === STATUS DOTS === */
|
|
.status-dot {
|
|
width: 7px;
|
|
height: 7px;
|
|
border-radius: 50%;
|
|
display: inline-block;
|
|
}
|
|
|
|
.status-dot.online {
|
|
background: #1677ff;
|
|
box-shadow: 0 0 8px rgba(0, 212, 170, 0.5);
|
|
}
|
|
|
|
.status-dot.offline {
|
|
background: #EF4444;
|
|
box-shadow: 0 0 8px rgba(239, 68, 68, 0.5);
|
|
}
|
|
|
|
/* === BADGES === */
|
|
.badge {
|
|
padding: 2px 8px;
|
|
border-radius: 20px;
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.badge-success { background: rgba(0, 212, 170, 0.1); color: #1677ff; }
|
|
.badge-danger { background: rgba(239, 68, 68, 0.1); color: #EF4444; }
|
|
.badge-info { background: rgba(14, 165, 233, 0.1); color: #1677ff; }
|
|
.badge-warning { background: rgba(245, 158, 11, 0.1); color: #D97706; }
|
|
|
|
/* ═══════════════════════════════════════════════════════════════════════════════
|
|
PREMIUM ANT DESIGN OVERRIDES — High-End Enterprise Look
|
|
═══════════════════════════════════════════════════════════════════════════════ */
|
|
|
|
/* ── Tables — shadcn-clean ───────────────────────────────────────────────────── */
|
|
.ant-table {
|
|
border-radius: 8px !important;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.ant-table table {
|
|
table-layout: auto !important;
|
|
}
|
|
|
|
.ant-table-thead > tr > th {
|
|
white-space: nowrap !important;
|
|
}
|
|
|
|
.ant-table-tbody > tr > td {
|
|
word-break: break-word;
|
|
}
|
|
|
|
.ant-table-thead > tr > th,
|
|
.ant-table-thead > tr > td {
|
|
background: #F8FAFC !important;
|
|
color: #64748B !important;
|
|
font-weight: 500 !important;
|
|
font-size: 12px !important;
|
|
text-transform: uppercase !important;
|
|
letter-spacing: 0.4px !important;
|
|
border-bottom: 1px solid #E2E8F0 !important;
|
|
padding: 10px 16px !important;
|
|
}
|
|
|
|
.ant-table-tbody > tr > td {
|
|
padding: 12px 16px !important;
|
|
border-bottom: 1px solid #F1F5F9 !important;
|
|
font-size: 13px !important;
|
|
color: #334155 !important;
|
|
transition: background 0.1s ease !important;
|
|
}
|
|
|
|
/* row hover background comes from Table.rowHoverBg token */
|
|
|
|
.ant-table-tbody > tr:last-child > td {
|
|
border-bottom: none !important;
|
|
}
|
|
|
|
/* Scrollable tables on small screens */
|
|
.ant-table-wrapper {
|
|
border-radius: 8px !important;
|
|
border: 1px solid #E2E8F0 !important;
|
|
overflow: hidden !important;
|
|
}
|
|
|
|
/* ── Modals ──────────────────────────────────────────────────────────────────── */
|
|
.ant-modal {
|
|
max-width: calc(100vw - 32px) !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-content {
|
|
border-radius: 10px !important;
|
|
box-shadow: 0 8px 32px rgba(0,0,0,0.10), 0 2px 8px rgba(0,0,0,0.05) !important;
|
|
overflow: hidden !important;
|
|
border: 1px solid #E2E8F0 !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-header {
|
|
background: #FFFFFF !important;
|
|
border-bottom: 1px solid #E2E8F0 !important;
|
|
padding: 16px 24px !important;
|
|
margin: 0 !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-title {
|
|
color: #0F172A !important;
|
|
font-weight: 600 !important;
|
|
font-size: 15px !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-close {
|
|
color: #64748B !important;
|
|
top: 12px !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-close:hover {
|
|
color: #0F172A !important;
|
|
background: #F1F5F9 !important;
|
|
border-radius: 6px !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-body {
|
|
padding: 20px 24px !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-footer {
|
|
border-top: 1px solid #F1F5F9 !important;
|
|
padding: 12px 24px !important;
|
|
background: #FAFAFA !important;
|
|
}
|
|
|
|
/* ── Drawers ─────────────────────────────────────────────────────────────────── */
|
|
.ant-drawer .ant-drawer-header {
|
|
background: #FFFFFF !important;
|
|
border-bottom: 1px solid #E2E8F0 !important;
|
|
padding: 16px 24px !important;
|
|
}
|
|
|
|
.ant-drawer .ant-drawer-title {
|
|
color: #0F172A !important;
|
|
font-weight: 600 !important;
|
|
font-size: 15px !important;
|
|
}
|
|
|
|
.ant-drawer .ant-drawer-close {
|
|
color: #64748B !important;
|
|
}
|
|
|
|
.ant-drawer .ant-drawer-close:hover {
|
|
color: #0F172A !important;
|
|
background: #F1F5F9 !important;
|
|
border-radius: 6px !important;
|
|
}
|
|
|
|
.ant-drawer .ant-drawer-body {
|
|
padding: 20px 24px !important;
|
|
background: #FFFFFF !important;
|
|
}
|
|
|
|
.ant-drawer .ant-drawer-extra .ant-btn-primary {
|
|
background: var(--branding-primary, #1677ff) !important;
|
|
border: none !important;
|
|
}
|
|
|
|
/* ── Buttons — flat, clean, shadcn-style ─────────────────────────────────────── */
|
|
.ant-btn-primary {
|
|
/* border-radius / font-weight / box-shadow come from Button tokens.
|
|
background + darken-on-hover (below) are the design decisions tokens
|
|
can't express, so they stay. */
|
|
background: var(--branding-primary, #1677ff) !important;
|
|
border: none !important;
|
|
color: #fff !important;
|
|
transition: opacity 0.15s ease, background 0.15s ease !important;
|
|
}
|
|
|
|
.ant-btn-primary:hover {
|
|
background: color-mix(in srgb, var(--branding-primary, #1677ff) 85%, #000) !important;
|
|
color: #fff !important;
|
|
}
|
|
|
|
.ant-btn-primary:active {
|
|
background: color-mix(in srgb, var(--branding-primary, #1677ff) 75%, #000) !important;
|
|
}
|
|
|
|
/* Ghost buttons */
|
|
.ant-btn-primary.ant-btn-background-ghost,
|
|
.ant-btn.ant-btn-primary[class*="ghost"] {
|
|
background: transparent !important;
|
|
color: var(--branding-primary, #1677ff) !important;
|
|
border: 1px solid var(--branding-primary, #1677ff) !important;
|
|
box-shadow: none !important;
|
|
}
|
|
|
|
.ant-btn-primary.ant-btn-background-ghost:hover,
|
|
.ant-btn.ant-btn-primary[class*="ghost"]:hover {
|
|
background: rgba(14,165,233,0.05) !important;
|
|
color: var(--branding-primary, #1677ff) !important;
|
|
}
|
|
|
|
/* Danger buttons */
|
|
.ant-btn-primary.ant-btn-dangerous {
|
|
background: #EF4444 !important;
|
|
color: #fff !important;
|
|
}
|
|
|
|
.ant-btn-primary.ant-btn-dangerous:hover {
|
|
background: #DC2626 !important;
|
|
color: #fff !important;
|
|
}
|
|
|
|
/* Default / secondary buttons */
|
|
.ant-btn-default {
|
|
border-radius: 6px !important;
|
|
border-color: #E2E8F0 !important;
|
|
color: #334155 !important;
|
|
font-weight: 500 !important;
|
|
background: #FFFFFF !important;
|
|
box-shadow: none !important;
|
|
transition: background 0.15s ease, border-color 0.15s ease !important;
|
|
}
|
|
|
|
.ant-btn-default:hover {
|
|
border-color: #CBD5E1 !important;
|
|
background: #F8FAFC !important;
|
|
color: #0F172A !important;
|
|
box-shadow: none !important;
|
|
}
|
|
|
|
.ant-btn-default.ant-btn-dangerous {
|
|
color: #EF4444 !important;
|
|
border-color: #FCA5A5 !important;
|
|
}
|
|
|
|
.ant-btn-default.ant-btn-dangerous:hover {
|
|
border-color: #EF4444 !important;
|
|
background: #FFF5F5 !important;
|
|
}
|
|
|
|
/* Link buttons */
|
|
.ant-btn-link {
|
|
color: var(--branding-primary, #1677ff) !important;
|
|
font-weight: 500 !important;
|
|
}
|
|
|
|
.ant-btn-link:hover {
|
|
color: color-mix(in srgb, var(--branding-primary, #1677ff) 75%, #000) !important;
|
|
background: rgba(14,165,233,0.05) !important;
|
|
}
|
|
|
|
/* Text buttons */
|
|
.ant-btn-text {
|
|
color: #64748B !important;
|
|
}
|
|
|
|
.ant-btn-text:hover {
|
|
background: #F1F5F9 !important;
|
|
color: #334155 !important;
|
|
}
|
|
|
|
/* Ensure button content color */
|
|
.ant-btn-primary span,
|
|
.ant-btn-primary .anticon {
|
|
color: inherit !important;
|
|
}
|
|
|
|
/* ── Tags ────────────────────────────────────────────────────────────────────── */
|
|
.ant-tag {
|
|
border-radius: 4px !important;
|
|
font-weight: 500 !important;
|
|
font-size: 11px !important;
|
|
padding: 2px 8px !important;
|
|
line-height: 18px !important;
|
|
margin-inline-end: 4px !important;
|
|
}
|
|
|
|
/* ── Cards (Ant Design) ──────────────────────────────────────────────────────── */
|
|
.ant-card {
|
|
border-radius: 10px !important;
|
|
border-color: #E2E8F0 !important;
|
|
box-shadow: 0 1px 2px rgba(0,0,0,0.04) !important;
|
|
transition: border-color 0.15s ease, box-shadow 0.15s ease !important;
|
|
}
|
|
|
|
.ant-card:hover {
|
|
border-color: #CBD5E1 !important;
|
|
box-shadow: 0 2px 8px rgba(0,0,0,0.06) !important;
|
|
}
|
|
|
|
.ant-card .ant-card-head {
|
|
border-bottom: 1px solid #F1F5F9 !important;
|
|
padding: 14px 20px !important;
|
|
min-height: auto !important;
|
|
background: #FFFFFF !important;
|
|
}
|
|
|
|
.ant-card .ant-card-head-title {
|
|
font-size: 14px !important;
|
|
font-weight: 600 !important;
|
|
color: #0F172A !important;
|
|
padding: 0 !important;
|
|
}
|
|
|
|
.ant-card .ant-card-body {
|
|
padding: 16px 20px !important;
|
|
}
|
|
|
|
/* ── Form Inputs — shadcn style ──────────────────────────────────────────────── */
|
|
.ant-input,
|
|
.ant-input-affix-wrapper,
|
|
.ant-input-number,
|
|
.ant-input-number-affix-wrapper,
|
|
.ant-select-selector,
|
|
.ant-picker {
|
|
border-radius: 6px !important;
|
|
border-color: #E2E8F0 !important;
|
|
background: #FFFFFF !important;
|
|
transition: border-color 0.15s ease, box-shadow 0.15s ease !important;
|
|
}
|
|
|
|
.ant-input::placeholder,
|
|
.ant-input-number-input::placeholder {
|
|
color: #94A3B8 !important;
|
|
}
|
|
|
|
.ant-input:hover,
|
|
.ant-input-affix-wrapper:hover,
|
|
.ant-input-number:hover,
|
|
.ant-select:not(.ant-select-disabled):hover .ant-select-selector,
|
|
.ant-picker:hover {
|
|
border-color: #CBD5E1 !important;
|
|
}
|
|
|
|
.ant-input:focus,
|
|
.ant-input-focused,
|
|
.ant-input-affix-wrapper-focused,
|
|
.ant-input-number-focused,
|
|
.ant-select-focused .ant-select-selector,
|
|
.ant-picker-focused {
|
|
border-color: var(--branding-primary, #1677ff) !important;
|
|
box-shadow: 0 0 0 2px rgba(14,165,233,0.12) !important;
|
|
}
|
|
|
|
.ant-form-item-label > label {
|
|
font-weight: 500 !important;
|
|
font-size: 13px !important;
|
|
color: #374151 !important;
|
|
}
|
|
|
|
.ant-form-item-explain-error {
|
|
font-size: 12px !important;
|
|
margin-top: 4px !important;
|
|
}
|
|
|
|
/* ── Tabs (Ant Design) ───────────────────────────────────────────────────────── */
|
|
.ant-tabs .ant-tabs-tab {
|
|
font-weight: 500 !important;
|
|
color: #64748B !important;
|
|
transition: color 0.15s ease !important;
|
|
padding: 10px 16px !important;
|
|
}
|
|
|
|
.ant-tabs .ant-tabs-tab:hover {
|
|
color: #334155 !important;
|
|
}
|
|
|
|
.ant-tabs .ant-tabs-tab-active .ant-tabs-tab-btn {
|
|
color: var(--branding-primary, #1677ff) !important;
|
|
font-weight: 600 !important;
|
|
}
|
|
|
|
.ant-tabs .ant-tabs-ink-bar {
|
|
background: var(--branding-primary, #1677ff) !important;
|
|
height: 2px !important;
|
|
border-radius: 2px !important;
|
|
}
|
|
|
|
.ant-tabs-content-holder {
|
|
padding-top: 16px !important;
|
|
}
|
|
|
|
/* ── Pagination ──────────────────────────────────────────────────────────────── */
|
|
.ant-pagination .ant-pagination-item {
|
|
border-radius: 6px !important;
|
|
border-color: #E2E8F0 !important;
|
|
transition: border-color 0.15s, background 0.15s !important;
|
|
}
|
|
|
|
.ant-pagination .ant-pagination-item:hover {
|
|
border-color: var(--branding-primary, #1677ff) !important;
|
|
background: #F0F9FF !important;
|
|
}
|
|
|
|
.ant-pagination .ant-pagination-item-active {
|
|
background: var(--branding-primary, #1677ff) !important;
|
|
border-color: var(--branding-primary, #1677ff) !important;
|
|
}
|
|
|
|
.ant-pagination .ant-pagination-item-active a {
|
|
color: #fff !important;
|
|
}
|
|
|
|
/* ── Switch ──────────────────────────────────────────────────────────────────── */
|
|
.ant-switch-checked {
|
|
background: #10B981 !important;
|
|
}
|
|
|
|
.ant-switch-checked:hover {
|
|
background: #059669 !important;
|
|
}
|
|
|
|
/* ── Progress Bars ───────────────────────────────────────────────────────────── */
|
|
.ant-progress-bg {
|
|
border-radius: 4px !important;
|
|
}
|
|
|
|
.ant-progress-inner {
|
|
border-radius: 4px !important;
|
|
}
|
|
|
|
/* ── Popconfirm ──────────────────────────────────────────────────────────────── */
|
|
.ant-popconfirm .ant-btn-primary {
|
|
border-radius: 6px !important;
|
|
}
|
|
|
|
/* ── Select Dropdown ─────────────────────────────────────────────────────────── */
|
|
.ant-select-dropdown {
|
|
border-radius: 10px !important;
|
|
box-shadow: 0 8px 32px rgba(0,0,0,0.12) !important;
|
|
border: 1px solid #E2E8F0 !important;
|
|
padding: 4px !important;
|
|
}
|
|
|
|
.ant-select-item-option {
|
|
border-radius: 6px !important;
|
|
margin: 1px 0 !important;
|
|
}
|
|
|
|
.ant-select-item-option-active {
|
|
background: #F0F9FF !important;
|
|
}
|
|
|
|
.ant-select-item-option-selected {
|
|
background: #F0F9FF !important;
|
|
font-weight: 600 !important;
|
|
}
|
|
|
|
/* ── Tooltip ─────────────────────────────────────────────────────────────────── */
|
|
.ant-tooltip-inner {
|
|
border-radius: 8px !important;
|
|
font-size: 12px !important;
|
|
font-weight: 500 !important;
|
|
}
|
|
|
|
/* ── Message ─────────────────────────────────────────────────────────────────── */
|
|
.ant-message-notice-content {
|
|
border-radius: 10px !important;
|
|
box-shadow: 0 8px 24px rgba(0,0,0,0.1) !important;
|
|
padding: 10px 16px !important;
|
|
font-weight: 500 !important;
|
|
}
|
|
|
|
/* ── Divider ─────────────────────────────────────────────────────────────────── */
|
|
.ant-divider-inner-text {
|
|
font-size: 12px !important;
|
|
font-weight: 600 !important;
|
|
color: #64748B !important;
|
|
text-transform: uppercase !important;
|
|
letter-spacing: 0.5px !important;
|
|
}
|
|
|
|
/* ── Badge ───────────────────────────────────────────────────────────────────── */
|
|
.ant-badge-status-dot {
|
|
width: 8px !important;
|
|
height: 8px !important;
|
|
}
|
|
|
|
/* ── Alert ───────────────────────────────────────────────────────────────────── */
|
|
.ant-alert {
|
|
border-radius: 10px !important;
|
|
}
|
|
|
|
/* ═══════════════════════════════════════════════════════════════════════════════
|
|
LAYOUT UTILITIES — replace inline styles in page components
|
|
═══════════════════════════════════════════════════════════════════════════════ */
|
|
|
|
/* Flex helpers */
|
|
.flex { display: flex; }
|
|
.flex-center { display: flex; align-items: center; }
|
|
.flex-between { display: flex; align-items: center; justify-content: space-between; }
|
|
.flex-col { display: flex; flex-direction: column; }
|
|
.flex-wrap { flex-wrap: wrap; }
|
|
.gap-4 { gap: 4px; }
|
|
.gap-8 { gap: 8px; }
|
|
.gap-12 { gap: 12px; }
|
|
.gap-16 { gap: 16px; }
|
|
|
|
/* Spacing */
|
|
.mb-0 { margin-bottom: 0; }
|
|
.mb-4 { margin-bottom: 4px; }
|
|
.mb-8 { margin-bottom: 8px; }
|
|
.mb-12 { margin-bottom: 12px; }
|
|
.mb-16 { margin-bottom: 16px; }
|
|
.mb-20 { margin-bottom: 20px; }
|
|
.mt-0 { margin-top: 0; }
|
|
.mt-8 { margin-top: 8px; }
|
|
.mt-12 { margin-top: 12px; }
|
|
.mt-16 { margin-top: 16px; }
|
|
.flex-end { display: flex; justify-content: flex-end; }
|
|
.justify-end { justify-content: flex-end; }
|
|
.text-15 { font-size: 15px; }
|
|
.word-break-all { word-break: break-all; }
|
|
|
|
/* Text utilities */
|
|
.text-muted { color: #64748B; }
|
|
.text-subtle { color: #94A3B8; }
|
|
.text-dark { color: #0F172A; }
|
|
.text-xs { font-size: 11px; }
|
|
.text-sm { font-size: 12px; }
|
|
.text-base { font-size: 13px; }
|
|
.font-medium { font-weight: 500; }
|
|
.font-semibold { font-weight: 600; }
|
|
.font-mono { font-variant-numeric: tabular-nums; font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace; }
|
|
.text-upper { text-transform: uppercase; letter-spacing: 0.4px; font-size: 11px; font-weight: 600; color: #64748B; }
|
|
.truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
|
|
/* Additional utilities for Settings + global use */
|
|
.mb-24 { margin-bottom: 24px; }
|
|
.mt-4 { margin-top: 4px; }
|
|
.mr-6 { margin-right: 6px; }
|
|
.p-24 { padding: 24px; }
|
|
.p-40 { padding: 40px; }
|
|
.d-block { display: block; }
|
|
.w-full { width: 100%; }
|
|
.w-200 { width: 200px; }
|
|
.max-w-400 { max-width: 400px; }
|
|
.max-w-480 { max-width: 480px; }
|
|
.max-w-520 { max-width: 520px; }
|
|
.max-w-560 { max-width: 560px; }
|
|
.p-0 { padding: 0 !important; }
|
|
.text-center { text-align: center; }
|
|
.text-left { text-align: left; }
|
|
.text-primary { color: #1677ff; }
|
|
.text-label { font-size: 13px; font-weight: 600; color: #1E293B; display: block; }
|
|
.mono-sm { font-family: monospace; font-size: 12px; }
|
|
.mono-xs { font-family: monospace; font-size: 11px; }
|
|
.mono-base { font-family: monospace; font-size: 13px; }
|
|
.card-bordered { border: 1px solid #E5E7EB; border-radius: 8px; }
|
|
.card-bordered--lg { border: 1px solid #E5E7EB; border-radius: 10px; }
|
|
.btn-primary-blue { background: #1677ff; border-color: #1677ff; }
|
|
.spinner-center { text-align: center; padding: 24px; }
|
|
|
|
/* Inline icon+text combos */
|
|
.icon-label {
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
font-size: 13px;
|
|
}
|
|
|
|
/* Muted icon box (used in section headers, stat cards) */
|
|
.icon-box {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 28px;
|
|
height: 28px;
|
|
background: #F0F9FF;
|
|
border-radius: 6px;
|
|
font-size: 14px;
|
|
color: var(--branding-primary, #1677ff);
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.icon-box--sm {
|
|
width: 22px;
|
|
height: 22px;
|
|
font-size: 12px;
|
|
border-radius: 5px;
|
|
}
|
|
|
|
.icon-box--lg {
|
|
width: 36px;
|
|
height: 36px;
|
|
font-size: 17px;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
/* Color variants */
|
|
.icon-box--green { background: #F0FDF4; color: #10B981; }
|
|
.icon-box--red { background: #FFF5F5; color: #EF4444; }
|
|
.icon-box--orange { background: #FFFBEB; color: #F59E0B; }
|
|
.icon-box--purple { background: #F1F5F9; color: #475569; }
|
|
.icon-box--teal { background: #EFF6FF; color: #1677ff; }
|
|
.icon-box--slate { background: #F8FAFC; color: #64748B; }
|
|
|
|
/* Mobile card items (for ProTable mobile views) */
|
|
.mobile-card {
|
|
background: #FFFFFF;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 10px;
|
|
padding: 14px 16px;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.mobile-card:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.mobile-card__header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
.mobile-card__title {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: #0F172A;
|
|
}
|
|
|
|
.mobile-card__meta {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
font-size: 12px;
|
|
color: #64748B;
|
|
}
|
|
|
|
.mobile-card__row {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 8px;
|
|
}
|
|
|
|
.mobile-card__actions {
|
|
border-top: 1px solid #F1F5F9;
|
|
padding-top: 8px;
|
|
}
|
|
|
|
/* Inline status dot */
|
|
.dot {
|
|
display: inline-block;
|
|
width: 7px;
|
|
height: 7px;
|
|
border-radius: 50%;
|
|
flex-shrink: 0;
|
|
background: var(--dot-bg, #94A3B8);
|
|
}
|
|
|
|
.dot--green { background: #10B981; }
|
|
.dot--red { background: #EF4444; }
|
|
.dot--orange { background: #F59E0B; }
|
|
.dot--blue { background: #3B82F6; }
|
|
.dot--gray { background: #94A3B8; }
|
|
|
|
/* Empty state */
|
|
.empty-state {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 48px 24px;
|
|
text-align: center;
|
|
gap: 8px;
|
|
color: #94A3B8;
|
|
}
|
|
|
|
.empty-state__icon {
|
|
font-size: 36px;
|
|
margin-bottom: 8px;
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.empty-state__title {
|
|
font-size: 14px;
|
|
font-weight: 600;
|
|
color: #64748B;
|
|
}
|
|
|
|
.empty-state__desc {
|
|
font-size: 13px;
|
|
color: #94A3B8;
|
|
max-width: 300px;
|
|
}
|
|
|
|
/* ── AntD Table inside DataCard (flush/no-padding) ───────────────────────────── */
|
|
/* Remove double borders when table is inside data-card */
|
|
.data-card .ant-table-wrapper {
|
|
border: none !important;
|
|
border-radius: 0 !important;
|
|
}
|
|
|
|
.data-card .ant-table {
|
|
border-radius: 0 !important;
|
|
}
|
|
|
|
/* ─── AIDashboardWidget ───────────────────────────────────────────────────── */
|
|
|
|
.ai-widget__icon { color: #00D4AA; }
|
|
|
|
.ai-widget__setup {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 10px;
|
|
}
|
|
|
|
.ai-widget__desc {
|
|
font-size: 13px;
|
|
color: #64748B;
|
|
margin: 0;
|
|
line-height: 1.6;
|
|
}
|
|
|
|
.ai-widget__desc--mb { margin: 0 0 12px; }
|
|
|
|
.ai-widget__actions {
|
|
display: grid;
|
|
grid-template-columns: repeat(2, 1fr);
|
|
gap: 8px;
|
|
}
|
|
|
|
/* ─── LicenseBanner ──────────────────────────────────────────────────────── */
|
|
|
|
.license-modal-desc {
|
|
display: block;
|
|
margin-bottom: 12px;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.license-banner-text { color: #fff; }
|
|
|
|
.license-banner-link {
|
|
font-weight: 600;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.license-banner-link--white {
|
|
color: #fff;
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.license-banner-link--urgent { color: #92400E; }
|
|
.license-banner-link--normal { color: #1d4ed8; }
|
|
|
|
.license-alert--flat { border-radius: 0 !important; }
|
|
.license-alert--error { border-radius: 0 !important; background: #DC2626 !important; }
|
|
|
|
/* ─── RecoveryPhaseBBanner ───────────────────────────────────────────────── */
|
|
|
|
.recovery-alert { border-radius: 0 !important; border: none !important; border-bottom: 1px solid #FBBF24 !important; }
|
|
|
|
/* ─── ServerSelector ─────────────────────────────────────────────────────── */
|
|
|
|
.server-selector-select { min-width: 220px; }
|
|
|
|
/* ─── QuotaBar ───────────────────────────────────────────────────────────── */
|
|
|
|
.quota-bar__row { display: flex; justify-content: space-between; margin-bottom: 4px; }
|
|
.quota-bar__label { font-size: 13px; color: #64748B; }
|
|
.quota-bar__value { font-size: 13px; font-weight: 500; color: #1A1A1A; }
|
|
.quota-bar__unlimited-symbol { color: #94A3B8; margin-left: 4px; }
|
|
.quota-bar__unlimited-track { height: 6px; border-radius: 3px; background: #E2E8F0; }
|
|
|
|
/* ─── SectionNav ─────────────────────────────────────────────────────────── */
|
|
|
|
.section-nav {
|
|
display: flex;
|
|
gap: 8px;
|
|
margin-bottom: 20px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.section-nav__btn {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
padding: 7px 14px;
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
border: 1.5px solid #E2E8F0;
|
|
border-radius: 8px;
|
|
color: #64748B;
|
|
background: #ffffff;
|
|
cursor: pointer;
|
|
transition: all 0.15s ease;
|
|
}
|
|
|
|
.section-nav__btn:hover { border-color: #CBD5E1; color: #475569; }
|
|
|
|
.section-nav__btn--active {
|
|
font-weight: 600;
|
|
border-color: #1677ff;
|
|
color: #1d4ed8;
|
|
background: #F0F9FF;
|
|
}
|
|
|
|
.section-nav__btn--active:hover { border-color: #1677ff; color: #1d4ed8; }
|
|
|
|
/* ─── TwoFABanner ─────────────────────────────────────────────────────────── */
|
|
|
|
.twofabanner-link { font-weight: 600; cursor: pointer; }
|
|
.twofabanner-alert { border-radius: 0 !important; }
|
|
|
|
/* ─── LogoUpload ──────────────────────────────────────────────────────────── */
|
|
|
|
.logo-upload__wrapper { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
|
|
|
|
.logo-upload__preview {
|
|
max-width: 140px;
|
|
max-height: 40px;
|
|
object-fit: contain;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 6px;
|
|
padding: 4px;
|
|
background: #fff;
|
|
}
|
|
|
|
/* ─── PermissionGuard ─────────────────────────────────────────────────────── */
|
|
|
|
.permission-guard-loading { display: flex; justify-content: center; align-items: center; min-height: 240px; }
|
|
|
|
/* ═══════════════════════════════════════════════════════════════════════════════
|
|
RESPONSIVE — Mobile Optimization
|
|
═══════════════════════════════════════════════════════════════════════════════ */
|
|
|
|
@media (max-width: 768px) {
|
|
.ant-drawer-content-wrapper {
|
|
width: 100% !important;
|
|
max-width: 100vw !important;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 992px) {
|
|
.sidebar {
|
|
transform: translateX(-100%);
|
|
transition: transform 0.3s ease;
|
|
}
|
|
|
|
.sidebar.open {
|
|
transform: translateX(0);
|
|
}
|
|
|
|
.main-content {
|
|
margin-left: 0;
|
|
}
|
|
|
|
.header {
|
|
height: 52px;
|
|
padding: 0 12px;
|
|
}
|
|
|
|
.header-menu-toggle {
|
|
display: flex !important;
|
|
}
|
|
|
|
.sidebar-overlay {
|
|
display: block !important;
|
|
}
|
|
|
|
.content-area {
|
|
padding: 8px;
|
|
}
|
|
|
|
.content-card {
|
|
padding: 14px;
|
|
border-radius: 10px;
|
|
}
|
|
|
|
.impersonation-banner {
|
|
flex-wrap: wrap;
|
|
gap: 8px;
|
|
padding: 8px 12px !important;
|
|
font-size: 12px !important;
|
|
}
|
|
|
|
.ant-table-wrapper {
|
|
overflow-x: auto;
|
|
-webkit-overflow-scrolling: touch;
|
|
}
|
|
|
|
.ant-modal .ant-modal-body {
|
|
padding: 16px !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-header {
|
|
padding: 14px 16px !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-footer {
|
|
padding: 12px 16px !important;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.header-title {
|
|
font-size: 13px;
|
|
max-width: 120px;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.header-actions {
|
|
gap: 6px;
|
|
}
|
|
|
|
.header-user-email {
|
|
display: none !important;
|
|
}
|
|
|
|
.header-lang-text {
|
|
display: none !important;
|
|
}
|
|
|
|
.content-area {
|
|
padding: 6px;
|
|
}
|
|
|
|
.content-card {
|
|
padding: 12px;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
.page-header-icon {
|
|
width: 32px !important;
|
|
height: 32px !important;
|
|
font-size: 15px !important;
|
|
}
|
|
|
|
.tab-bar {
|
|
gap: 4px;
|
|
}
|
|
|
|
.tab-item {
|
|
padding: 5px 10px;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.stat-card {
|
|
padding: 12px !important;
|
|
}
|
|
|
|
.ant-modal {
|
|
top: 16px !important;
|
|
padding-bottom: 16px !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-header {
|
|
padding: 12px 16px !important;
|
|
}
|
|
|
|
.ant-modal .ant-modal-title {
|
|
font-size: 14px !important;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 480px) {
|
|
.header {
|
|
height: 48px;
|
|
padding: 0 8px;
|
|
}
|
|
|
|
.header-title {
|
|
max-width: 100px;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.content-area {
|
|
padding: 4px;
|
|
}
|
|
|
|
.content-card {
|
|
padding: 8px;
|
|
border-radius: 6px;
|
|
margin-bottom: 8px;
|
|
}
|
|
}
|
|
|
|
/* ── Auth pages (Login, ForgotPassword, ResetPassword) ───────────────────────── */
|
|
.auth-page {
|
|
min-height: 100vh;
|
|
background: #F8FAFC;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 16px;
|
|
}
|
|
|
|
.auth-card {
|
|
background: #ffffff;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 10px;
|
|
padding: 32px;
|
|
width: 100%;
|
|
max-width: 400px;
|
|
box-shadow: 0 1px 3px rgba(0,0,0,0.03);
|
|
}
|
|
|
|
.auth-logo-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
margin-bottom: 28px;
|
|
}
|
|
|
|
.auth-logo-title {
|
|
font-size: 16px;
|
|
font-weight: 700;
|
|
color: #1E293B;
|
|
line-height: 1.2;
|
|
}
|
|
|
|
.auth-logo-subtitle {
|
|
font-size: 12px;
|
|
color: #94A3B8;
|
|
margin-top: 2px;
|
|
}
|
|
|
|
.auth-back-link {
|
|
margin-top: 20px;
|
|
text-align: center;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.auth-hint {
|
|
font-size: 13px;
|
|
color: #64748B;
|
|
margin-bottom: 20px;
|
|
line-height: 1.6;
|
|
}
|
|
|
|
/* ─── Update Changelog ──────────────────────────────────────────────────────── */
|
|
|
|
.changelog-collapse {
|
|
margin-top: 8px;
|
|
border: 1px solid #FED7AA !important;
|
|
border-radius: 8px !important;
|
|
background: #FFFBEB !important;
|
|
}
|
|
|
|
.changelog-collapse-label {
|
|
font-weight: 500;
|
|
color: #1677ff;
|
|
}
|
|
|
|
.changelog-body {
|
|
margin: 0;
|
|
font-family: var(--font-mono, 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace);
|
|
font-size: 13px;
|
|
line-height: 1.7;
|
|
white-space: pre-wrap;
|
|
word-break: break-word;
|
|
color: #1E293B;
|
|
}
|
|
|
|
.changelog-table .ant-table {
|
|
background: transparent;
|
|
}
|
|
|
|
.changelog-table .ant-table-cell {
|
|
padding: 4px 8px !important;
|
|
border-bottom: 1px solid #FDE68A !important;
|
|
vertical-align: top;
|
|
}
|
|
|
|
.changelog-version-tag {
|
|
font-family: var(--font-mono, 'SFMono-Regular', Consolas, monospace);
|
|
font-size: 11px;
|
|
color: #64748B;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.changelog-type-tag {
|
|
font-family: var(--font-mono, 'SFMono-Regular', Consolas, monospace);
|
|
font-size: 11px;
|
|
}
|
|
.flex-1 { flex: 1; }
|
|
.text-red { color: #EF4444; }
|
|
.text-green { color: #10B981; }
|
|
.text-success { color: #00D4AA; }
|
|
.text-orange { color: #F97316; }
|
|
.cursor-pointer { cursor: pointer; }
|
|
.min-h-120 { min-height: 120px; }
|
|
.ml-6 { margin-left: 6px; }
|
|
|
|
/* ═══════════════════════════════════════════════════════════════════════════════
|
|
SHARED ENTERPRISE COMPONENTS — Reusable across all pages
|
|
═══════════════════════════════════════════════════════════════════════════════ */
|
|
|
|
/* ── Settings Panel (light gray section with title) ────────────────────────── */
|
|
.ent-settings-panel {
|
|
background: #F8FAFC;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
padding: 16px;
|
|
}
|
|
|
|
.ent-settings-panel__title {
|
|
display: block;
|
|
margin-bottom: 12px;
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: #1E293B;
|
|
}
|
|
|
|
.ent-settings-panel__title .anticon {
|
|
margin-right: 6px;
|
|
}
|
|
|
|
/* ── Info Field (monospace value box with label) ───────────────────────────── */
|
|
.ent-field-label {
|
|
display: block;
|
|
margin-bottom: 4px;
|
|
font-size: 12px;
|
|
color: #64748B;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.ent-field-value {
|
|
display: block;
|
|
font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
|
|
font-size: 13px;
|
|
background: #F8FAFC;
|
|
padding: 6px 10px;
|
|
border-radius: 6px;
|
|
border: 1px solid #E2E8F0;
|
|
color: #1E293B;
|
|
word-break: break-all;
|
|
}
|
|
|
|
.ent-field-value--success {
|
|
background: #F0FDF4;
|
|
border-color: #BBF7D0;
|
|
color: #15803D;
|
|
}
|
|
|
|
/* ── Warning / Info Alert Box ──────────────────────────────────────────────── */
|
|
.ent-alert-box {
|
|
border-radius: 8px;
|
|
padding: 12px 16px;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.ent-alert-box--warning {
|
|
background: #FFF7ED;
|
|
border: 1px solid #FED7AA;
|
|
color: #92400E;
|
|
}
|
|
|
|
.ent-alert-box--info {
|
|
background: #F0F9FF;
|
|
border: 1px solid #BAE6FD;
|
|
color: #1d4ed8;
|
|
}
|
|
|
|
.ent-alert-box--success {
|
|
background: #F0FDF4;
|
|
border: 1px solid #BBF7D0;
|
|
color: #15803D;
|
|
}
|
|
|
|
.ent-alert-box--danger {
|
|
background: #FEF2F2;
|
|
border: 1px solid #FECACA;
|
|
color: #991B1B;
|
|
}
|
|
|
|
/* ── Inline Card (white bordered card used outside DataCard) ───────────────── */
|
|
.ent-card {
|
|
background: #fff;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 10px;
|
|
padding: 20px;
|
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
|
|
}
|
|
|
|
.ent-card--compact {
|
|
padding: 16px;
|
|
}
|
|
|
|
.ent-card--flush {
|
|
padding: 0;
|
|
}
|
|
|
|
/* ── Selectable Card (for type selectors, e.g. restore type) ───────────────── */
|
|
.ent-select-card {
|
|
flex: 1 1 calc(50% - 4px);
|
|
min-width: 120px;
|
|
border: 2px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
padding: 10px 14px;
|
|
cursor: pointer;
|
|
background: #FAFAFA;
|
|
transition: all 0.15s ease;
|
|
display: flex;
|
|
align-items: flex-start;
|
|
gap: 10px;
|
|
}
|
|
|
|
.ent-select-card:hover {
|
|
border-color: #CBD5E1;
|
|
}
|
|
|
|
.ent-select-card--active {
|
|
border-color: var(--branding-primary, #1677ff);
|
|
background: rgba(22, 119, 255, 0.06);
|
|
}
|
|
|
|
.ent-select-card__icon {
|
|
font-size: 20px;
|
|
margin-top: 1px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.ent-select-card__title {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: #1E293B;
|
|
line-height: 1.3;
|
|
}
|
|
|
|
/* ── Code Block (dark terminal-style output) ───────────────────────────────── */
|
|
.ent-code-block {
|
|
background: #0B1426;
|
|
color: #E2E8F0;
|
|
padding: 14px 16px;
|
|
border-radius: 8px;
|
|
font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
|
|
font-size: 12px;
|
|
line-height: 1.7;
|
|
max-height: 400px;
|
|
overflow-y: auto;
|
|
white-space: pre-wrap;
|
|
word-break: break-all;
|
|
}
|
|
|
|
/* ── DS Record / Code Snippet Row ──────────────────────────────────────────── */
|
|
.ent-code-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.ent-code-row:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.ent-code-row__code {
|
|
flex: 1;
|
|
font-size: 11px;
|
|
font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
|
|
background: #E5E7EB;
|
|
padding: 2px 6px;
|
|
border-radius: 4px;
|
|
word-break: break-all;
|
|
}
|
|
|
|
/* ── Mini Stat Chip (inline stat badge used in active tasks, etc.) ─────────── */
|
|
.ent-stat-chip {
|
|
background: #F0F9FF;
|
|
border: 1px solid #BAE6FD;
|
|
border-radius: 8px;
|
|
padding: 8px 14px;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
|
|
.ent-stat-chip--green {
|
|
background: #F0FDF4;
|
|
border-color: #BBF7D0;
|
|
}
|
|
|
|
.ent-stat-chip--orange {
|
|
background: #FFF7ED;
|
|
border-color: #FED7AA;
|
|
}
|
|
|
|
.ent-stat-chip__icon {
|
|
font-size: 16px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.ent-stat-chip__icon--blue { color: #1677ff; }
|
|
.ent-stat-chip__icon--green { color: #22C55E; }
|
|
.ent-stat-chip__icon--orange { color: #F59E0B; }
|
|
|
|
/* ── Divider thin ──────────────────────────────────────────────────────────── */
|
|
.ent-divider-sm { margin: 12px 0; }
|
|
|
|
/* ── Additional layout utilities ───────────────────────────────────────────── */
|
|
.flex-justify-center { display: flex; justify-content: center; }
|
|
.flex-start { display: flex; align-items: flex-start; }
|
|
.mt-2 { margin-top: 2px; }
|
|
.ml-8 { margin-left: 8px; }
|
|
.ml-12 { margin-left: 12px; }
|
|
.pt-16 { padding-top: 16px; }
|
|
.text-warning { color: #F59E0B; }
|
|
.text-purple { color: #475569; }
|
|
.text-slate { color: #475569; }
|
|
.line-height-relaxed { line-height: 1.8; }
|
|
.m-0 { margin: 0; }
|
|
|
|
/* ── Settings — secrets / mono display boxes ───────────────────────────────── */
|
|
/* Read-only mono box (API key, webhook secret) */
|
|
.settings-mono-box {
|
|
background: #F8FAFC;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 6px;
|
|
padding: 12px 16px;
|
|
font-family: monospace;
|
|
font-size: 13px;
|
|
word-break: break-all;
|
|
}
|
|
|
|
/* Same as above but content is centered (QR backup code) */
|
|
.settings-mono-box--center {
|
|
background: #F8FAFC;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 6px;
|
|
padding: 8px 12px;
|
|
font-family: monospace;
|
|
font-size: 13px;
|
|
text-align: center;
|
|
word-break: break-all;
|
|
}
|
|
|
|
/* Webhook delivery response pre block */
|
|
.settings-response-pre {
|
|
background: #F8FAFC;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 4px;
|
|
padding: 8px;
|
|
max-height: 200px;
|
|
overflow: auto;
|
|
font-size: 11px;
|
|
white-space: pre-wrap;
|
|
word-break: break-all;
|
|
}
|
|
|
|
/* ── Settings — reboot confirm content ─────────────────────────────────────── */
|
|
.settings-reboot-warning {
|
|
display: flex;
|
|
gap: 8px;
|
|
align-items: flex-start;
|
|
margin-top: 8px;
|
|
}
|
|
|
|
.settings-reboot-icon {
|
|
color: #F59E0B;
|
|
font-size: 18px;
|
|
flex-shrink: 0;
|
|
margin-top: 2px;
|
|
}
|
|
|
|
/* ── Settings — server provision one-liner ─────────────────────────────────── */
|
|
.settings-provision-cmd {
|
|
background: #0B1426;
|
|
color: #1677ff;
|
|
padding: 12px 16px;
|
|
border-radius: 8px;
|
|
font-family: monospace;
|
|
font-size: 13px;
|
|
word-break: break-all;
|
|
position: relative;
|
|
}
|
|
|
|
/* ── Settings — RBL grid ───────────────────────────────────────────────────── */
|
|
.settings-rbl-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
|
gap: 8px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.settings-rbl-item {
|
|
padding: 8px 12px;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
.settings-rbl-custom-item {
|
|
padding: 6px 12px;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
/* ── Settings — mail pill tab bar ──────────────────────────────────────────── */
|
|
/* Reuses global .tab-item / .tab-item.active — no extra class needed */
|
|
|
|
/* ── Settings — section divider row ────────────────────────────────────────── */
|
|
.settings-section-divider {
|
|
border-top: 1px solid #E5E7EB;
|
|
padding-top: 16px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.settings-section-divider--no-mb {
|
|
border-top: 1px solid #E5E7EB;
|
|
padding-top: 16px;
|
|
}
|
|
|
|
/* ── Settings — license product box ────────────────────────────────────────── */
|
|
.settings-license-box {
|
|
margin-bottom: 16px;
|
|
padding: 12px 16px;
|
|
background: #F0F9FF;
|
|
border-radius: 8px;
|
|
border: 1px solid #BAE6FD;
|
|
}
|
|
|
|
.settings-license-title {
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
color: #1d4ed8;
|
|
}
|
|
|
|
/* ── Settings — PHP install progress ───────────────────────────────────────── */
|
|
.settings-install-progress {
|
|
background: #F0F9FF;
|
|
border: 1px solid #BAE6FD;
|
|
border-radius: 8px;
|
|
padding: 16px;
|
|
}
|
|
|
|
.settings-install-text {
|
|
color: #1d4ed8;
|
|
}
|
|
|
|
.settings-progress-track {
|
|
background: #E0F2FE;
|
|
border-radius: 4px;
|
|
height: 6px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.settings-progress-fill {
|
|
background: linear-gradient(90deg, #1677ff, #2563EB);
|
|
height: 100%;
|
|
border-radius: 4px;
|
|
transition: width 0.5s ease;
|
|
width: var(--fill-width, 0%);
|
|
}
|
|
|
|
/* ── Settings — section overview grid ─────────────────────────────────────── */
|
|
/* ── Settings — enterprise master-detail layout ────────────────────────────── */
|
|
.settings-layout {
|
|
display: grid;
|
|
grid-template-columns: 240px 1fr;
|
|
gap: 24px;
|
|
align-items: start;
|
|
}
|
|
|
|
.settings-nav {
|
|
position: sticky;
|
|
top: 16px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 2px;
|
|
padding-right: 8px;
|
|
border-right: 1px solid #E5E7EB;
|
|
}
|
|
|
|
.settings-nav-group { margin-bottom: 10px; }
|
|
|
|
.settings-nav-group-label {
|
|
font-size: 11px;
|
|
font-weight: 600;
|
|
letter-spacing: 0.06em;
|
|
text-transform: uppercase;
|
|
color: #94A3B8;
|
|
padding: 6px 10px 4px;
|
|
}
|
|
|
|
.settings-nav-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
width: 100%;
|
|
padding: 8px 10px;
|
|
border: none;
|
|
background: transparent;
|
|
border-radius: 8px;
|
|
cursor: pointer;
|
|
color: #475569;
|
|
font-size: 13.5px;
|
|
text-align: left;
|
|
transition: background 0.12s, color 0.12s;
|
|
}
|
|
|
|
.settings-nav-item:hover { background: #F1F5F9; color: #1E293B; }
|
|
|
|
.settings-nav-item.active {
|
|
background: #F0F9FF;
|
|
color: #0369A1;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.settings-nav-icon { display: inline-flex; font-size: 15px; color: inherit; opacity: 0.9; }
|
|
.settings-nav-text { flex: 1; }
|
|
.settings-nav-ext { color: #94A3B8; font-size: 12px; }
|
|
|
|
.settings-content { min-width: 0; }
|
|
.settings-nav-mobile { display: none; }
|
|
|
|
@media (max-width: 991px) {
|
|
.settings-layout { grid-template-columns: 1fr; gap: 0; }
|
|
.settings-nav { display: none; }
|
|
.settings-nav-mobile { display: block; }
|
|
}
|
|
|
|
/* ── Settings — password policy hints ──────────────────────────────────────── */
|
|
.settings-policy-hints {
|
|
margin-top: -8px;
|
|
line-height: 1.8;
|
|
}
|
|
|
|
/* ── Settings — Ant Checkbox reset (override AntD left margin) ─────────────── */
|
|
.settings-checkbox-reset { margin-left: 0 !important; font-size: 13px; }
|
|
|
|
/* ── Settings — ACME section title spacing ──────────────────────────────────── */
|
|
.settings-acme-title { display: block; margin: 16px 0 8px; }
|
|
|
|
/* ── Settings — license key entry section ───────────────────────────────────── */
|
|
.settings-license-key-row {
|
|
border-top: 1px solid #F1F5F9;
|
|
padding-top: 16px;
|
|
}
|
|
|
|
/* ── Email page ──────────────────────────────────────────────────────────────── */
|
|
|
|
/* Modal header strip (icon + title row) */
|
|
.email-modal-header {
|
|
padding: 20px 24px 16px;
|
|
border-bottom: 1px solid #F1F5F9;
|
|
}
|
|
|
|
/* Modal body padding */
|
|
.email-modal-body {
|
|
padding: 16px 24px 8px;
|
|
}
|
|
|
|
/* Icon inside the colored icon-box in the modal header */
|
|
.email-icon-box-icon {
|
|
color: #fff;
|
|
font-size: 18px;
|
|
}
|
|
|
|
/* Title text inside modal header */
|
|
.email-modal-title-text {
|
|
font-weight: 600;
|
|
font-size: 16px;
|
|
color: #1E293B;
|
|
}
|
|
|
|
/* Quota max-hint "(max. X MB)" next to label */
|
|
.email-quota-hint {
|
|
font-size: 11px;
|
|
color: #94A3B8;
|
|
font-weight: 400;
|
|
margin-left: 8px;
|
|
}
|
|
|
|
/* Row containing the quota bar + usage text + webmail link */
|
|
.email-quota-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
margin-top: 6px;
|
|
}
|
|
|
|
/* Quota bar track */
|
|
.email-quota-track {
|
|
flex: 1;
|
|
max-width: 140px;
|
|
height: 4px;
|
|
background: #E5E7EB;
|
|
border-radius: 2px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* Quota bar track without max-width (mobile card) */
|
|
.email-quota-track--full {
|
|
flex: 1;
|
|
height: 4px;
|
|
background: #E5E7EB;
|
|
border-radius: 2px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* Quota bar fill — width and background are always dynamic (inline style) */
|
|
.email-quota-fill {
|
|
height: 100%;
|
|
border-radius: 2px;
|
|
transition: width 0.3s ease;
|
|
}
|
|
|
|
/* "Auto" tag on autoresponder-enabled mailboxes */
|
|
.email-tag-auto.ant-tag {
|
|
font-size: 10px;
|
|
line-height: 16px;
|
|
margin: 0;
|
|
padding: 0 5px;
|
|
}
|
|
|
|
/* Mobile-only: "Auto" tag row spacing */
|
|
.email-tag-auto--mb.ant-tag {
|
|
font-size: 10px;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
/* Webmail inline link-button */
|
|
.email-webmail-btn {
|
|
font-size: 11px;
|
|
color: #1677ff;
|
|
background: none;
|
|
border: none;
|
|
padding: 0;
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* Secondary cell text (#374151, one step lighter than text-dark) */
|
|
.email-cell-secondary {
|
|
font-size: 13px;
|
|
color: #374151;
|
|
}
|
|
|
|
/* Mobile card cell: min-width:0 + flex:1 for proper ellipsis */
|
|
.email-mobile-cell {
|
|
min-width: 0;
|
|
flex: 1;
|
|
}
|
|
|
|
/* Mobile quota row (with bottom margin) */
|
|
.email-quota-row-mb {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
/* IMAP migration: target mailbox info banner */
|
|
.email-migrate-banner {
|
|
margin-bottom: 16px;
|
|
padding: 10px 14px;
|
|
background: #F0F9FF;
|
|
border-radius: 8px;
|
|
border: 1px solid #BAE6FD;
|
|
}
|
|
|
|
/* Highlighted email address inside the migrate banner */
|
|
.email-migrate-email {
|
|
font-weight: 600;
|
|
color: #0369A1;
|
|
}
|
|
|
|
/* Import counter (large number + "E-Mails found") */
|
|
.email-migrate-count {
|
|
margin-top: 16px;
|
|
font-weight: 600;
|
|
color: #0369A1;
|
|
font-size: 22px;
|
|
}
|
|
|
|
/* "Connecting…" status line */
|
|
.email-migrate-connecting {
|
|
margin-top: 16px;
|
|
font-weight: 500;
|
|
color: #0369A1;
|
|
}
|
|
|
|
/* Done state: success count */
|
|
.email-migrate-count--done {
|
|
margin-top: 12px;
|
|
font-weight: 600;
|
|
color: #1E293B;
|
|
font-size: 22px;
|
|
}
|
|
|
|
/* Active-import status row (pulsing dot + text) */
|
|
.email-migrate-status-row {
|
|
margin-top: 12px;
|
|
font-size: 12px;
|
|
color: #94A3B8;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
gap: 6px;
|
|
}
|
|
|
|
/* Animated green pulse dot */
|
|
.email-pulse-dot {
|
|
display: inline-block;
|
|
width: 6px;
|
|
height: 6px;
|
|
border-radius: 50%;
|
|
background: #10B981;
|
|
animation: pulse 1.5s infinite;
|
|
}
|
|
|
|
/* Success checkmark icon */
|
|
.email-migrate-success-icon {
|
|
font-size: 48px;
|
|
color: #10B981;
|
|
}
|
|
|
|
/* Migrate form input grid */
|
|
.email-migrate-grid {
|
|
display: grid;
|
|
gap: 12px;
|
|
}
|
|
|
|
/* Additional spacing */
|
|
.mb-32 { margin-bottom: 32px; }
|
|
.mr-8 { margin-right: 8px; }
|
|
|
|
/* Spam settings — section label (block, colored) */
|
|
.email-section-label {
|
|
display: block;
|
|
color: #374151;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
/* Spam settings — slider wrapper with horizontal padding */
|
|
.email-slider-wrap {
|
|
padding: 0 8px;
|
|
}
|
|
|
|
/* Spam settings — switch description indented under toggle */
|
|
.email-switch-desc {
|
|
margin: 4px 0 0 48px;
|
|
}
|
|
|
|
/* Utility: #374151 text color (between slate and dark) */
|
|
.text-gray-700 { color: #374151; }
|
|
|
|
/* ── WordPress page utilities ────────────────────────────────────── */
|
|
|
|
/* Spacing */
|
|
.mr-4 { margin-right: 4px; }
|
|
.mt-10 { margin-top: 10px; }
|
|
|
|
/* Layout */
|
|
.min-w-0 { min-width: 0; }
|
|
.min-w-220 { min-width: 220px; }
|
|
.items-end { align-items: flex-end; }
|
|
|
|
/* Staging badge tag (tiny purple, compact padding) */
|
|
.wp-tag--staging {
|
|
font-size: 10px;
|
|
padding: 0 5px;
|
|
margin: 0;
|
|
}
|
|
|
|
/* Stat-card icon circle */
|
|
.wp-stat-icon {
|
|
width: 36px;
|
|
height: 36px;
|
|
border-radius: 8px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 16px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
/* Action cards (DB / Security tab centered cards with border) */
|
|
.wp-action-card {
|
|
text-align: center;
|
|
border-color: #E5E7EB !important;
|
|
}
|
|
|
|
/* Action-card icon (large icon above label) */
|
|
.wp-action-icon {
|
|
font-size: 28px;
|
|
margin-bottom: 8px;
|
|
display: block;
|
|
}
|
|
.wp-action-icon--blue { color: #1677ff; }
|
|
.wp-action-icon--amber { color: #F59E0B; }
|
|
.wp-action-icon--red { color: #EF4444; }
|
|
|
|
/* Staging section divider with tight margin */
|
|
.wp-staging-divider.ant-divider { margin: 12px 0 8px 0; }
|
|
|
|
/* Staging empty state */
|
|
.wp-staging-empty {
|
|
text-align: center;
|
|
padding: 8px 0;
|
|
}
|
|
|
|
/* Staging env list */
|
|
.wp-staging-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
/* Individual staging env row */
|
|
.wp-staging-env {
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
padding: 10px 12px;
|
|
background: #F9FAFB;
|
|
}
|
|
|
|
/* Staging env link */
|
|
.wp-staging-link {
|
|
font-size: 13px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
/* Staging env date */
|
|
.wp-staging-date {
|
|
font-size: 11px;
|
|
display: block;
|
|
margin-top: 2px;
|
|
}
|
|
|
|
/* Plugin install form: slug label */
|
|
.wp-slug-label {
|
|
display: block;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
/* Password input in reset-password modal */
|
|
.wp-mono-input {
|
|
font-family: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
|
|
margin-top: 8px;
|
|
}
|
|
|
|
/* Staging-banner link */
|
|
.wp-staging-banner-link {
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Badge with custom red background (CVE count in tab label) */
|
|
.wp-badge--red.ant-badge .ant-badge-count { background-color: #EF4444; }
|
|
|
|
/* Badge with custom amber background (update count in list) */
|
|
.wp-badge--amber.ant-badge .ant-badge-count { background-color: #F59E0B; }
|
|
|
|
/* Search bar in list header */
|
|
.wp-search-input {
|
|
max-width: 340px;
|
|
flex: 1;
|
|
}
|
|
|
|
/* List view: clickable domain link */
|
|
.wp-list-domain-link {
|
|
font-weight: 600;
|
|
color: #1677ff;
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* List view: site title subtitle */
|
|
.wp-list-site-title {
|
|
font-size: 12px;
|
|
color: #64748B;
|
|
}
|
|
|
|
/* Spinner center wrapper in cache tab */
|
|
.wp-cache-spinner {
|
|
text-align: center;
|
|
padding: 24px;
|
|
}
|
|
|
|
/* Detail header: site title line */
|
|
.wp-detail-site-title {
|
|
margin-top: 2px;
|
|
display: block;
|
|
}
|
|
|
|
/* ─── Joomla page BEM classes ─────────────────────────────────────────────── */
|
|
|
|
/* Status dot — geometry only; background/boxShadow remain inline (dynamic color) */
|
|
.joomla-status-dot {
|
|
display: inline-block;
|
|
width: 7px;
|
|
height: 7px;
|
|
border-radius: 50%;
|
|
}
|
|
|
|
/* Stat-card icon wrapper — background/color remain inline (dynamic per card) */
|
|
.joomla-stat-icon {
|
|
width: 36px;
|
|
height: 36px;
|
|
border-radius: 8px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 16px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
/* Staging badge tag (small pill on <Tag color="purple">) */
|
|
.joomla-tag--staging { font-size: 10px; padding: 0 5px; margin: 0; }
|
|
|
|
/* Password input in reset-password modal */
|
|
.joomla-modal-pw { font-family: monospace; margin-top: 8px; }
|
|
|
|
/* Staging banner "back to live" link */
|
|
.joomla-staging-banner-link { font-weight: 600; }
|
|
|
|
/* Core-up-to-date tag — left margin */
|
|
.joomla-tag-ml { margin-left: 8px; }
|
|
|
|
/* Staging section Divider with tight spacing */
|
|
.joomla-staging-divider.ant-divider { margin: 12px 0 8px 0; }
|
|
|
|
/* Staging empty state */
|
|
.joomla-staging-empty { text-align: center; padding: 8px 0; }
|
|
|
|
/* Staging env list */
|
|
.joomla-staging-list { display: flex; flex-direction: column; gap: 8px; }
|
|
|
|
/* Individual staging env card */
|
|
.joomla-staging-item {
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
padding: 10px 12px;
|
|
background: #F9FAFB;
|
|
}
|
|
|
|
/* Staging item flex row (wrap support) */
|
|
.joomla-staging-item__row { flex-wrap: wrap; gap: 6px; }
|
|
|
|
/* Staging item meta column (overflow guard) */
|
|
.joomla-staging-item__meta { min-width: 0; }
|
|
|
|
/* Staging env URL anchor */
|
|
.joomla-staging-link { font-size: 13px; font-weight: 500; }
|
|
|
|
/* Staging env date text */
|
|
.joomla-staging-date { font-size: 11px; display: block; margin-top: 2px; }
|
|
|
|
/* Staging "Create Staging" button (full-width + top margin) */
|
|
.joomla-staging-create-btn { width: 100%; margin-top: 10px; }
|
|
|
|
/* Extension install form row (aligns bottom) */
|
|
.joomla-ext-install-row { align-items: flex-end; }
|
|
|
|
/* Extension install URL field */
|
|
.joomla-ext-url-col { flex: 1; min-width: 220px; }
|
|
|
|
/* Extension install type selector */
|
|
.joomla-ext-type-col { min-width: 140px; }
|
|
|
|
/* Label above install fields */
|
|
.joomla-ext-field-label { display: block; margin-bottom: 4px; }
|
|
|
|
/* DB/security action-card icon (blue) */
|
|
.joomla-card-icon { font-size: 28px; color: #1677ff; margin-bottom: 8px; }
|
|
|
|
/* DB/security action-card icon — amber variant */
|
|
.joomla-card-icon--amber { font-size: 28px; color: #F59E0B; margin-bottom: 8px; display: block; }
|
|
|
|
/* Action card — centered text + standard border */
|
|
.joomla-action-card { text-align: center; border-color: #E5E7EB !important; }
|
|
|
|
/* Detail header: site title secondary line */
|
|
.joomla-detail-site-title { margin-top: 2px; display: block; }
|
|
|
|
/* Search bar row */
|
|
.joomla-search-bar { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
|
|
|
|
/* Search input */
|
|
.joomla-search-input { max-width: 340px; flex: 1; }
|
|
|
|
/* List view: domain link */
|
|
.joomla-list-link { font-weight: 600; color: #1677ff; cursor: pointer; }
|
|
|
|
/* List view: site title subtitle */
|
|
.joomla-list-subtitle { font-size: 12px; color: #64748B; }
|
|
|
|
/* Badge amber background (extension updates in list view) */
|
|
.joomla-badge--amber.ant-badge .ant-badge-count { background-color: #F59E0B; }
|
|
|
|
/* ── Backup page ─────────────────────────────────────────────────────────────── */
|
|
|
|
/* Job table: timestamp primary line */
|
|
.backup-job-time { font-size: 13px; line-height: 1.4; }
|
|
|
|
/* Job table: schedule name (truncated) */
|
|
.backup-job-name { font-size: 13px; line-height: 1.4; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 220px; }
|
|
|
|
/* Job table: compact xs tag (scope / restore-type) */
|
|
.backup-tag-xs { font-size: 10px !important; padding: 0 5px !important; margin: 0 !important; line-height: 16px !important; border: none !important; }
|
|
|
|
/* Job table: inline error text */
|
|
.backup-error-text { font-size: 10px; margin-left: 2px; }
|
|
|
|
/* Job table: size column value */
|
|
.backup-size-text { font-size: 12px; font-weight: 500; color: #334155; }
|
|
|
|
/* Job table: snapshot id (monospace, muted) */
|
|
.backup-snapshot-id { font-family: monospace; font-size: 11px; color: #64748B; }
|
|
|
|
/* Job table detail button: muted icon */
|
|
.backup-icon-muted { color: #CBD5E1; }
|
|
|
|
/* Icon colours (folder / file) shared across Backup and Browse */
|
|
.icon-folder { color: #FAAD14; }
|
|
.icon-file { color: #8C8C8C; }
|
|
.icon-folder-lg { color: #FAAD14; font-size: 16px; }
|
|
.icon-key { color: #F59E0B; }
|
|
|
|
/* Active job card: info border */
|
|
.backup-active-job-card { border: 1px solid #E0F2FE; }
|
|
|
|
/* Mobile jobs list: timestamp */
|
|
.backup-job-time-mobile { font-size: 13px; color: #1E293B; }
|
|
|
|
/* Mobile jobs list: schedule name secondary line */
|
|
.backup-sched-name { font-size: 12px; color: #475569; }
|
|
|
|
/* Mobile jobs list: scope tag with left margin */
|
|
.backup-scope-inline { font-size: 11px; margin-left: 6px; }
|
|
|
|
/* File-restore: browse button (info style) */
|
|
.backup-browse-btn { background: #F0F9FF !important; border-color: #BAE6FD !important; color: #1d4ed8 !important; }
|
|
|
|
/* File-restore: scroll-box with unlimited height override */
|
|
.backup-scroll-box--full { max-height: none; }
|
|
|
|
/* File-restore: filepath tag (monospace, truncated) */
|
|
.backup-filepath-tag { font-family: monospace; font-size: 11px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }
|
|
|
|
/* File browser mobile: checkbox indicator */
|
|
.backup-check-icon { color: #fff; font-size: 10px; }
|
|
|
|
/* Restore modal: select-schedule label */
|
|
.backup-select-label { display: block; margin-bottom: 8px; }
|
|
|
|
/* Restore modal: schedule select width */
|
|
.backup-schedule-select { width: 360px; }
|
|
|
|
/* Job table: restore-type tag (orange accent, no border) */
|
|
.backup-tag-xs--restore { background: #FFF7ED !important; color: #F97316 !important; }
|
|
|
|
/* Mobile browse list: row with separator */
|
|
.backup-browse-row { padding: 10px 0; border-bottom: 1px solid #F1F5F9; }
|
|
|
|
/* ─── FileManager page BEM classes ───────────────────────────────────────── */
|
|
|
|
/* Breadcrumb clickable segments */
|
|
.fm-crumb-link { cursor: pointer; }
|
|
|
|
/* Main file list container (border + radius; padding is dynamic via inline style) */
|
|
.fm-list-container {
|
|
background: #fff;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 10px;
|
|
}
|
|
|
|
/* File-type icon colors */
|
|
.fm-icon--folder { color: #F59E0B; }
|
|
.fm-icon--file { color: #6B7280; }
|
|
.flex-shrink-0 { flex-shrink: 0; }
|
|
|
|
/* Folder link in table name column */
|
|
.fm-link--folder { color: #1d4ed8; }
|
|
|
|
/* Selection info bar (blue tint, appears when rows are selected) */
|
|
.fm-selection-bar {
|
|
padding: 8px 12px;
|
|
background: #F0F9FF;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
/* Clipboard banner (amber tint, shows cut/copy state) */
|
|
.fm-clipboard-bar {
|
|
padding: 8px 12px;
|
|
background: #FFFBEB;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
/* Mobile card header bottom margin override (6 px instead of 8 px) */
|
|
.fm-mb-6 { margin-bottom: 6px; }
|
|
|
|
/* Mobile permission tag (monospace + no-shrink + left gap) */
|
|
.fm-perm-tag {
|
|
font-family: monospace;
|
|
flex-shrink: 0;
|
|
margin-left: 8px;
|
|
}
|
|
|
|
/* chmod modal: octal input (monospace, fixed narrow width) */
|
|
.fm-chmod-input {
|
|
font-family: monospace;
|
|
width: 120px;
|
|
}
|
|
|
|
/* Editor modal title row */
|
|
.fm-editor-title {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
}
|
|
|
|
/* Extension tag in editor modal title (compact, no margin) */
|
|
.fm-editor-title-tag {
|
|
font-size: 10px;
|
|
margin: 0;
|
|
}
|
|
|
|
/* Editor modal positioning + max-width */
|
|
.fm-editor-modal {
|
|
top: 20px;
|
|
max-width: 1100px;
|
|
}
|
|
|
|
/* Editor loading placeholder (centred, fixed height, muted) */
|
|
.fm-editor-loading {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
height: 400px;
|
|
color: #64748B;
|
|
}
|
|
|
|
/* CodeMirror wrapper inside editor modal */
|
|
.fm-codemirror {
|
|
font-size: 13px;
|
|
border-radius: 0 0 8px 8px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* Upload dragger icon */
|
|
.fm-upload-icon {
|
|
font-size: 32px;
|
|
color: #1677ff;
|
|
}
|
|
|
|
/* DNS EmailSecurityTab */
|
|
.dns-preview-box {
|
|
background: #F8FAFC;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 8px;
|
|
padding: 10px 14px;
|
|
font-family: monospace;
|
|
font-size: 13px;
|
|
word-break: break-all;
|
|
color: #1E293B;
|
|
}
|
|
|
|
/* ── Import page — static style replacements ──────────────────────────────── */
|
|
|
|
/* Spin: block + top margin (session list empty state) */
|
|
.import-spin-mt {
|
|
display: block;
|
|
margin-top: 40px;
|
|
}
|
|
|
|
/* Spin: block + centred with top/bottom margin (detail loading state) */
|
|
.import-spin-center {
|
|
display: block;
|
|
margin: 60px auto;
|
|
}
|
|
|
|
/* Session status tag in banner (rounded, bold, compact) */
|
|
.import-session-status-tag {
|
|
border-radius: 6px;
|
|
font-weight: 600;
|
|
font-size: 12px;
|
|
}
|
|
|
|
/* Banner chip row: flex + wrap + gap */
|
|
.import-banner-chip-row {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 10px;
|
|
}
|
|
|
|
/* Progress card header row bottom margin */
|
|
.mb-14 { margin-bottom: 14px; }
|
|
|
|
/* Align items to text baseline */
|
|
.align-baseline { align-items: baseline; }
|
|
|
|
/* Gap-10 utility (complement to existing gap-8/gap-12) */
|
|
.gap-10 { gap: 10px; }
|
|
|
|
/* Error count icon (red, small) */
|
|
.import-error-icon {
|
|
color: #EF4444;
|
|
font-size: 13px;
|
|
}
|
|
|
|
/* Error count text (red, bold, tabular nums) */
|
|
.import-error-count {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: #EF4444;
|
|
font-feature-settings: "tnum";
|
|
}
|
|
|
|
/* Customer header left cell: flex-1 + no overflow collapse */
|
|
.import-customer-header-left {
|
|
display: flex;
|
|
align-items: center;
|
|
flex: 1;
|
|
min-width: 0;
|
|
gap: 10px;
|
|
}
|
|
|
|
/* Customer name/detail inner block */
|
|
.import-customer-info {
|
|
min-width: 0;
|
|
flex: 1;
|
|
}
|
|
|
|
/* Customer login text */
|
|
.import-customer-login {
|
|
font-size: 14px;
|
|
font-weight: 700;
|
|
color: #0F172A;
|
|
}
|
|
|
|
/* Item count tag inside customer header */
|
|
.import-item-count-tag {
|
|
font-size: 11px;
|
|
margin: 0;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
/* Server/package select min-widths in customer header */
|
|
.import-select-server { min-width: 130px; }
|
|
.import-select-package { min-width: 120px; }
|
|
|
|
/* Item row source name text (static parts; fontFamily kept inline for dynamic) */
|
|
.import-item-name {
|
|
flex: 1;
|
|
min-width: 120px;
|
|
font-weight: 600;
|
|
font-size: 13px;
|
|
color: #1E293B;
|
|
}
|
|
|
|
.import-item-name--mono {
|
|
font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace;
|
|
}
|
|
|
|
/* Item status tag (compact) */
|
|
.import-item-status-tag {
|
|
border-radius: 5px;
|
|
font-size: 11px;
|
|
margin: 0;
|
|
}
|
|
|
|
/* Error action icon (red, pointer) */
|
|
.import-error-action {
|
|
color: #EF4444;
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* Traffic page */
|
|
.traffic-stat-value { font-size: 24px; font-weight: 600; }
|
|
.traffic-table-wrap { overflow-x: auto; }
|
|
.traffic-table { width: 100%; border-collapse: collapse; }
|
|
.traffic-table thead tr { border-bottom: 1px solid #E5E7EB; }
|
|
.traffic-table__th--left { padding: 8px 12px; text-align: left; }
|
|
.traffic-table__th--right { padding: 8px 12px; text-align: right; }
|
|
.traffic-table__td { padding: 6px 12px; }
|
|
.traffic-table__td--right { padding: 6px 12px; text-align: right; }
|
|
.traffic-table tbody tr { border-bottom: 1px solid #F1F5F9; }
|
|
|
|
/* ── SecurityAdvisor ──────────────────────────────────────────────────────── */
|
|
|
|
/* Score label block next to the progress circle */
|
|
.secsadv-score-label {
|
|
text-align: left;
|
|
}
|
|
|
|
/* Score title line: 16px displayed as block */
|
|
.secsadv-score-title {
|
|
font-size: 16px;
|
|
display: block;
|
|
}
|
|
|
|
/* AppArmor summary stat box — base (neutral border) */
|
|
.secsadv-stat-box {
|
|
padding: 10px 14px;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
/* AppArmor stat box — warn variant (amber border) */
|
|
.secsadv-stat-box--warn {
|
|
padding: 10px 14px;
|
|
border: 1px solid #F59E0B40;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
/* AppArmor stat box — teal/enforced variant */
|
|
.secsadv-stat-box--teal {
|
|
padding: 10px 14px;
|
|
border: 1px solid #00D4AA40;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
/* Warn variant value color */
|
|
.secsadv-stat-value--warn {
|
|
color: #D97706;
|
|
}
|
|
|
|
/* Teal variant value color */
|
|
.secsadv-stat-value--teal {
|
|
color: #00D4AA;
|
|
}
|
|
|
|
/* Per-server AppArmor row */
|
|
.secsadv-server-row {
|
|
padding: 8px 12px;
|
|
background: #F8FAFC;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
/* Check card header row — align items to top */
|
|
.secsadv-check-header {
|
|
align-items: flex-start;
|
|
}
|
|
|
|
/* Fix action link button — remove default Ant padding */
|
|
.secsadv-link-btn {
|
|
padding: 0;
|
|
}
|
|
|
|
/* ── Status icons (pass/warn/fail) ────────────────────────────────────── */
|
|
.secsadv-icon {
|
|
font-size: 20px;
|
|
}
|
|
|
|
.secsadv-icon--pass { color: #1677ff; }
|
|
.secsadv-icon--warn { color: #F59E0B; }
|
|
.secsadv-icon--fail { color: #EF4444; }
|
|
|
|
/* ── Score label (responsive font size) ───────────────────────────────── */
|
|
.secsadv-score-value {
|
|
font-size: 28px;
|
|
font-weight: 700;
|
|
color: var(--score-color, #1677ff);
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.secsadv-score-value {
|
|
font-size: 22px;
|
|
}
|
|
}
|
|
|
|
/* ── Check card with status accent border ─────────────────────────────── */
|
|
.secsadv-check-card--pass { border-left: 3px solid #1677ff !important; height: 100%; }
|
|
.secsadv-check-card--warn { border-left: 3px solid #F59E0B !important; height: 100%; }
|
|
.secsadv-check-card--fail { border-left: 3px solid #EF4444 !important; height: 100%; }
|
|
/* ── Provider Selection ──────────────────────────────────────────────────── */
|
|
|
|
.import-provider-card {
|
|
background: #fff;
|
|
border: 2px solid #E2E8F0;
|
|
border-radius: 14px;
|
|
padding: 32px 24px;
|
|
text-align: center;
|
|
cursor: pointer;
|
|
transition: all 0.2s;
|
|
}
|
|
|
|
.import-provider-card:hover {
|
|
border-color: #1677ff;
|
|
box-shadow: 0 4px 16px rgba(14, 165, 233, 0.15);
|
|
transform: translateY(-2px);
|
|
}
|
|
|
|
.import-provider-card--disabled {
|
|
background: #F8FAFC;
|
|
border: 2px dashed #E2E8F0;
|
|
border-radius: 14px;
|
|
padding: 32px 24px;
|
|
text-align: center;
|
|
opacity: 0.6;
|
|
}
|
|
|
|
.import-provider-logo {
|
|
width: 64px;
|
|
height: 64px;
|
|
border-radius: 16px;
|
|
margin: 0 auto 16px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.import-provider-logo--plesk {
|
|
background: linear-gradient(135deg, #0080FF 0%, #0050CC 100%);
|
|
box-shadow: 0 4px 12px rgba(0, 80, 204, 0.2);
|
|
}
|
|
|
|
.import-provider-logo--enhance {
|
|
background: linear-gradient(135deg, #475569 0%, #334155 100%);
|
|
box-shadow: 0 4px 12px rgba(99, 102, 241, 0.2);
|
|
}
|
|
|
|
.import-provider-logo--cpanel {
|
|
background: linear-gradient(135deg, #FF6C2C 0%, #D44A12 100%);
|
|
box-shadow: 0 4px 12px rgba(255, 108, 44, 0.2);
|
|
}
|
|
|
|
.import-provider-logo--disabled {
|
|
background: #E2E8F0;
|
|
}
|
|
|
|
.import-provider-logo span {
|
|
color: #fff;
|
|
font-size: 24px;
|
|
font-weight: 700;
|
|
}
|
|
|
|
.import-provider-logo--disabled span {
|
|
color: #94A3B8;
|
|
}
|
|
|
|
.import-provider-name {
|
|
font-size: 18px;
|
|
font-weight: 700;
|
|
color: #0F172A;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.import-provider-name--disabled {
|
|
font-size: 18px;
|
|
font-weight: 700;
|
|
color: #94A3B8;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.import-provider-desc {
|
|
font-size: 13px;
|
|
color: #64748B;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
.import-provider-desc--disabled {
|
|
font-size: 13px;
|
|
color: #94A3B8;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
/* ── Info/Mode Box ────────────────────────────────────────────────────────── */
|
|
|
|
.import-info-box {
|
|
background: #F0F9FF;
|
|
border: 1px solid #BAE6FD;
|
|
border-radius: 8px;
|
|
padding: 12px;
|
|
margin-bottom: 16px;
|
|
font-size: 12px;
|
|
color: #1d4ed8;
|
|
}
|
|
|
|
.import-mode-box {
|
|
background: #F0F9FF;
|
|
border: 1px solid #BAE6FD;
|
|
border-radius: 10px;
|
|
padding: 16px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.import-mode-box__title {
|
|
font-size: 14px;
|
|
font-weight: 700;
|
|
color: #1d4ed8;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
.import-mode-item {
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
.import-mode-item__title {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: #1E293B;
|
|
}
|
|
|
|
.import-mode-item__desc {
|
|
font-size: 12px;
|
|
color: #64748B;
|
|
margin-top: 2px;
|
|
}
|
|
|
|
.import-mode-item__warn {
|
|
margin-top: 8px;
|
|
}
|
|
|
|
/* ── Feature Overview Box ────────────────────────────────────────────────── */
|
|
|
|
.import-feature-box {
|
|
background: #F8FAFC;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 12px;
|
|
padding: 20px;
|
|
margin-bottom: 20px;
|
|
}
|
|
|
|
.import-feature-box__title {
|
|
font-size: 15px;
|
|
font-weight: 700;
|
|
color: #0F172A;
|
|
margin-bottom: 4px;
|
|
}
|
|
|
|
.import-feature-box__subtitle {
|
|
font-size: 13px;
|
|
color: #64748B;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.import-feature-item {
|
|
display: flex;
|
|
gap: 8px;
|
|
align-items: flex-start;
|
|
}
|
|
|
|
.import-feature-item__icon {
|
|
font-size: 16px;
|
|
line-height: 20px;
|
|
}
|
|
|
|
.import-feature-item__name {
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
color: #1E293B;
|
|
}
|
|
|
|
.import-feature-item__desc {
|
|
font-size: 11px;
|
|
color: #94A3B8;
|
|
}
|
|
|
|
/* ── Session Detail Banner ───────────────────────────────────────────────── */
|
|
|
|
.import-banner {
|
|
background: linear-gradient(135deg, #0B1426 0%, #1E3A5F 50%, #0D1829 100%);
|
|
border-radius: 10px 10px 0 0;
|
|
position: relative;
|
|
overflow: hidden;
|
|
padding: 16px;
|
|
}
|
|
|
|
@media (min-width: 768px) {
|
|
.import-banner { padding: 24px 28px; }
|
|
}
|
|
|
|
.import-banner__orb1 {
|
|
position: absolute;
|
|
top: -20px;
|
|
right: -20px;
|
|
width: 140px;
|
|
height: 140px;
|
|
border-radius: 50%;
|
|
background: rgba(0, 212, 170, 0.08);
|
|
}
|
|
|
|
.import-banner__orb2 {
|
|
position: absolute;
|
|
bottom: -30px;
|
|
right: 80px;
|
|
width: 80px;
|
|
height: 80px;
|
|
border-radius: 50%;
|
|
background: rgba(14, 165, 233, 0.06);
|
|
}
|
|
|
|
.import-banner__back-btn {
|
|
color: #94A3B8 !important;
|
|
padding: 4px 8px !important;
|
|
margin-bottom: 12px;
|
|
font-size: 13px !important;
|
|
}
|
|
|
|
.import-banner__host {
|
|
color: #64748B;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.import-banner__type-tag {
|
|
background: rgba(255, 255, 255, 0.08) !important;
|
|
border: none !important;
|
|
color: #94A3B8 !important;
|
|
font-size: 11px !important;
|
|
}
|
|
|
|
.import-banner__date {
|
|
color: #475569;
|
|
font-size: 12px;
|
|
}
|
|
|
|
.import-banner__chip {
|
|
background: rgba(255, 255, 255, 0.06);
|
|
border-radius: 8px;
|
|
padding: 8px 14px;
|
|
backdrop-filter: blur(4px);
|
|
min-width: 80px;
|
|
text-align: center;
|
|
}
|
|
|
|
.import-banner__chip-label {
|
|
font-size: 10px;
|
|
color: #64748B;
|
|
display: block;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
.import-banner__chip-value {
|
|
font-size: 16px;
|
|
font-weight: 700;
|
|
color: #F8FAFC;
|
|
font-feature-settings: "tnum";
|
|
}
|
|
|
|
/* ── Content area ────────────────────────────────────────────────────────── */
|
|
|
|
.import-content-area {
|
|
padding: 16px;
|
|
}
|
|
|
|
@media (min-width: 768px) {
|
|
.import-content-area { padding: 24px 28px; }
|
|
}
|
|
|
|
/* ── Progress Card ───────────────────────────────────────────────────────── */
|
|
|
|
.import-progress-card {
|
|
background: #fff;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 12px;
|
|
margin-bottom: 24px;
|
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
|
|
padding: 16px;
|
|
}
|
|
|
|
/* Import log drawer */
|
|
.import-log-view {
|
|
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
font-size: 12.5px;
|
|
line-height: 1.5;
|
|
}
|
|
.import-log-line {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
gap: 8px;
|
|
padding: 4px 6px;
|
|
border-bottom: 1px solid #F1F5F9;
|
|
word-break: break-word;
|
|
}
|
|
.import-log-line--warn { background: #FFFBEB; }
|
|
.import-log-line--error { background: #FEF2F2; }
|
|
.import-log-time {
|
|
color: #94A3B8;
|
|
white-space: nowrap;
|
|
flex-shrink: 0;
|
|
}
|
|
.import-log-level {
|
|
flex-shrink: 0;
|
|
margin: 0;
|
|
font-size: 10px;
|
|
line-height: 18px;
|
|
}
|
|
.import-log-msg { color: #1E293B; flex: 1; }
|
|
|
|
@media (min-width: 768px) {
|
|
.import-progress-card { padding: 20px 24px; }
|
|
}
|
|
|
|
.import-progress-pct {
|
|
font-size: 36px;
|
|
font-weight: 800;
|
|
color: #0F172A;
|
|
font-feature-settings: "tnum";
|
|
line-height: 1;
|
|
}
|
|
|
|
.import-progress-label {
|
|
font-size: 13px;
|
|
color: #64748B;
|
|
}
|
|
|
|
.import-progress-count {
|
|
font-size: 13px;
|
|
color: #64748B;
|
|
font-feature-settings: "tnum";
|
|
}
|
|
|
|
.import-progress-errors {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
}
|
|
|
|
.import-progress-bar-track {
|
|
height: 8px;
|
|
border-radius: 4px;
|
|
background: #F1F5F9;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.import-progress-bar-fill {
|
|
height: 100%;
|
|
border-radius: 4px;
|
|
transition: width 0.6s ease;
|
|
width: var(--fill-width, 0%);
|
|
background: linear-gradient(90deg, #1677ff 0%, #1677ff 100%);
|
|
}
|
|
|
|
.import-progress-bar-fill--error {
|
|
background: linear-gradient(90deg, #EF4444 0%, #F87171 100%);
|
|
}
|
|
|
|
/* ── Customer Cards ──────────────────────────────────────────────────────── */
|
|
|
|
.import-customer-card {
|
|
background: #fff;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 12px;
|
|
overflow: hidden;
|
|
transition: box-shadow 0.2s, border-color 0.2s;
|
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
|
|
}
|
|
|
|
.import-customer-card--expanded {
|
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);
|
|
border-color: #CBD5E1;
|
|
}
|
|
|
|
.import-customer-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 12px;
|
|
flex-wrap: wrap;
|
|
cursor: pointer;
|
|
padding: 12px 14px;
|
|
}
|
|
|
|
@media (min-width: 768px) {
|
|
.import-customer-header { padding: 16px 20px; }
|
|
}
|
|
|
|
.import-customer-header--expanded {
|
|
border-bottom: 1px solid #F1F5F9;
|
|
}
|
|
|
|
.import-customer-avatar {
|
|
width: 36px;
|
|
height: 36px;
|
|
border-radius: 10px;
|
|
flex-shrink: 0;
|
|
background: linear-gradient(135deg, #475569 0%, #334155 100%);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
color: #fff;
|
|
font-size: 16px;
|
|
box-shadow: 0 2px 6px rgba(109, 40, 217, 0.25);
|
|
}
|
|
|
|
.import-customer-status-dot {
|
|
width: 7px;
|
|
height: 7px;
|
|
border-radius: 50%;
|
|
flex-shrink: 0;
|
|
background: var(--dot-bg, #94A3B8);
|
|
box-shadow: var(--dot-shadow, none);
|
|
}
|
|
|
|
.import-customer-mobile-selectors {
|
|
padding: 10px 14px;
|
|
background: #F8FAFC;
|
|
display: flex;
|
|
gap: 8px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.import-migrate-btn {
|
|
background: linear-gradient(135deg, #1677ff 0%, #1677ff 100%) !important;
|
|
border: none !important;
|
|
border-radius: 6px !important;
|
|
font-weight: 600 !important;
|
|
font-size: 12px !important;
|
|
box-shadow: 0 2px 6px rgba(0, 212, 170, 0.3) !important;
|
|
}
|
|
|
|
.import-chevron {
|
|
font-size: 11px;
|
|
color: #94A3B8;
|
|
transition: transform 0.2s;
|
|
}
|
|
|
|
.import-chevron--open { transform: rotate(180deg); }
|
|
|
|
/* ── Item Rows ───────────────────────────────────────────────────────────── */
|
|
|
|
.import-item-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
padding: 10px 14px;
|
|
flex-wrap: wrap;
|
|
background: #fff;
|
|
border-bottom: 1px solid #F1F5F9;
|
|
}
|
|
|
|
.import-item-row:nth-child(even) { background: #F8FAFC; }
|
|
.import-item-row:last-child { border-bottom: none; border-radius: 0 0 12px 12px; }
|
|
|
|
.import-item-type-badge {
|
|
width: 24px;
|
|
height: 24px;
|
|
border-radius: 6px;
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
color: #fff;
|
|
font-size: 12px;
|
|
background: var(--badge-gradient, linear-gradient(135deg, #64748B 0%, #475569 100%));
|
|
}
|
|
|
|
.import-item-type-label {
|
|
font-size: 12px;
|
|
color: #64748B;
|
|
min-width: 60px;
|
|
}
|
|
|
|
.import-item-migrate-btn {
|
|
color: #1677ff !important;
|
|
font-size: 12px !important;
|
|
}
|
|
|
|
.import-item-sync-btn {
|
|
color: #64748B !important;
|
|
font-size: 12px !important;
|
|
}
|
|
|
|
/* ── Bottom Action Bar ───────────────────────────────────────────────────── */
|
|
|
|
.import-action-bar {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
flex-wrap: wrap;
|
|
gap: 12px;
|
|
padding-top: 20px;
|
|
border-top: 2px solid #E2E8F0;
|
|
}
|
|
|
|
.import-action-bar__left {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.import-action-btn--primary {
|
|
background: linear-gradient(135deg, #1677ff 0%, #1677ff 100%) !important;
|
|
border: none !important;
|
|
border-radius: 8px !important;
|
|
font-weight: 700 !important;
|
|
font-size: 14px !important;
|
|
height: 42px !important;
|
|
box-shadow: 0 4px 12px rgba(0, 212, 170, 0.3) !important;
|
|
}
|
|
|
|
.import-action-btn--secondary {
|
|
border-radius: 8px !important;
|
|
font-weight: 600 !important;
|
|
font-size: 14px !important;
|
|
height: 42px !important;
|
|
}
|
|
|
|
.import-notifications-toggle {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
margin-left: 4px;
|
|
}
|
|
|
|
/* Banner session title text (static parts; font-size kept inline for responsive) */
|
|
.import-banner__title-text {
|
|
font-weight: 700;
|
|
color: #F8FAFC;
|
|
font-size: 18px;
|
|
}
|
|
|
|
@media (min-width: 768px) {
|
|
.import-banner__title-text { font-size: 22px; }
|
|
}
|
|
|
|
/* ── Utility: display inline-block ──────────────────────────────────────── */
|
|
.d-inline-block { display: inline-block; }
|
|
|
|
/* ── Sites page — migrated inline styles ────────────────────────────────── */
|
|
|
|
/* Fixed-width filter inputs in log modal */
|
|
.sites-log-filter-input { width: 200px; }
|
|
.sites-log-status-select { width: 110px; }
|
|
|
|
/* Alert with negative top margin (pulls up toward form item) */
|
|
.sites-alert-mt-neg8 { margin-top: -8px; }
|
|
|
|
/* Thumbnail in domain column */
|
|
.sites-thumb-table {
|
|
width: 48px;
|
|
height: 27px;
|
|
border-radius: 4px;
|
|
border: 1px solid #E5E7EB;
|
|
flex-shrink: 0;
|
|
object-fit: cover;
|
|
}
|
|
|
|
/* Thumbnail filling its container (mobile card) */
|
|
.sites-thumb-fill {
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
}
|
|
|
|
/* Delete-confirm modal paragraphs */
|
|
.sites-delete-text {
|
|
color: #374151;
|
|
font-size: 14px;
|
|
line-height: 1.7;
|
|
}
|
|
|
|
.sites-delete-text--mt {
|
|
color: #374151;
|
|
font-size: 14px;
|
|
margin-top: 12px;
|
|
}
|
|
|
|
/* Danger highlight box (delete confirmation) */
|
|
.sites-danger-box {
|
|
padding: 12px 16px;
|
|
background: #FEF2F2;
|
|
border-radius: 8px;
|
|
border: 1px solid #FECACA;
|
|
margin-top: 8px;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
/* Domain code label inside danger box */
|
|
.sites-danger-box__code {
|
|
font-weight: 600;
|
|
color: #DC2626;
|
|
}
|
|
|
|
/* Info strip (slice metrics / unavailable state) */
|
|
.sites-info-strip {
|
|
padding: 8px 12px;
|
|
background: #F8FAFC;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
/* Wider info strip (slice metrics active state) */
|
|
.sites-info-strip--lg {
|
|
padding: 10px 14px;
|
|
background: #F8FAFC;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
/* Minimum-width column inside info strip */
|
|
.sites-info-col-min200 { min-width: 200px; }
|
|
|
|
/* ── Setup / Wizard ─────────────────────────────────────────────────────── */
|
|
|
|
.setup-page {
|
|
min-height: 100vh;
|
|
background: #F8FAFC;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 16px;
|
|
}
|
|
|
|
.setup-card {
|
|
background: #fff;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: var(--radius-lg);
|
|
padding: 32px;
|
|
width: 100%;
|
|
max-width: 580px;
|
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.03);
|
|
}
|
|
|
|
.setup-header {
|
|
margin-bottom: 28px;
|
|
}
|
|
|
|
.setup-brand-name {
|
|
font-size: 16px;
|
|
}
|
|
|
|
.setup-hint {
|
|
font-size: 12px;
|
|
display: block;
|
|
margin-top: -8px;
|
|
margin-bottom: 12px;
|
|
color: #94A3B8;
|
|
}
|
|
|
|
.setup-mode-card {
|
|
border-color: #1677ff !important;
|
|
border-width: 2px !important;
|
|
height: 100%;
|
|
}
|
|
|
|
.setup-mode-icon {
|
|
font-size: 48px;
|
|
color: #1677ff;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
.setup-tos-box {
|
|
margin-bottom: 16px;
|
|
padding: 12px 16px;
|
|
background: #F8FAFC;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: var(--radius-md);
|
|
}
|
|
|
|
.mb-28 { margin-bottom: 28px; }
|
|
|
|
/* ── PrestaShop shared utilities ─────────────────────────────────────────── */
|
|
|
|
/* Badge with blue background (replaces style={{ backgroundColor: '#1677ff' }}) */
|
|
.badge-blue .ant-badge-count { background-color: #1677ff; }
|
|
|
|
/* Mini stat cell used in detail overview (replaces inline textAlign/border/padding) */
|
|
.ps-mini-stat {
|
|
text-align: center;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
padding: 12px 8px;
|
|
}
|
|
|
|
/* Completed-install domain hint in success modal */
|
|
.ps-install-done-domain {
|
|
color: #64748b;
|
|
font-size: 12px;
|
|
margin-top: 12px;
|
|
}
|
|
|
|
/* Domain link in list-view table (replaces color:#1677ff + cursor:pointer) */
|
|
.ps-domain-link {
|
|
color: #1677ff;
|
|
cursor: pointer;
|
|
}
|
|
|
|
/* Shop name sub-line in list-view table */
|
|
.ps-shop-name-cell {
|
|
font-size: 12px;
|
|
color: #64748B;
|
|
}
|
|
|
|
/* Search bar in list header toolbar */
|
|
.ps-search-input {
|
|
max-width: 340px;
|
|
flex: 1;
|
|
}
|
|
|
|
/* Language selector in setup header */
|
|
.setup-lang-select { width: 120px; }
|
|
|
|
/* ── Subscriptions page ─────────────────────────────────────────────────── */
|
|
|
|
/* Activate button (green outline, replaces style={{ color/borderColor #10B981 }}) */
|
|
.sub-btn--activate {
|
|
color: #10B981 !important;
|
|
border-color: #10B981 !important;
|
|
}
|
|
|
|
/* Mobile card title wrapper (replaces style={{ minWidth: 0, flex: 1 }}) */
|
|
.sub-mobile-card__title-wrap {
|
|
min-width: 0;
|
|
flex: 1;
|
|
}
|
|
|
|
/* Push element to the far right in a flex row (replaces style={{ marginLeft: 'auto' }}) */
|
|
.ml-auto { margin-left: auto; }
|
|
|
|
/* Mobile card action row separator (replaces style={{ borderTop/paddingTop }}) */
|
|
.sub-mobile-card__actions {
|
|
border-top: 1px solid #F1F5F9;
|
|
padding-top: 8px;
|
|
}
|
|
|
|
/* Filter dropdown widths */
|
|
.sub-filter--w140 { width: 140px; }
|
|
.sub-filter--w160 { width: 160px; }
|
|
|
|
/* Hint text below domain/server fields in create modal */
|
|
.sub-domain-hint {
|
|
display: block;
|
|
margin-top: -12px;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
/* Section heading inside detail drawer */
|
|
.sub-section-title {
|
|
font-size: 14px;
|
|
margin-bottom: 16px;
|
|
display: block;
|
|
}
|
|
|
|
/* Section heading with tighter bottom margin */
|
|
.sub-section-title--tight {
|
|
font-size: 14px;
|
|
margin-bottom: 8px;
|
|
display: block;
|
|
}
|
|
|
|
/* "Not yet provisioned" text in master-FTP section */
|
|
.sub-ftp-not-provisioned {
|
|
display: block;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
/* ── Customers page ──────────────────────────────────────────────────────── */
|
|
|
|
/* Generated password code block in PasswordModal */
|
|
.cust-password-code {
|
|
background: #F1F5F9;
|
|
padding: 2px 8px;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
/* "Copy before closing" warning line in PasswordModal */
|
|
.cust-password-warning {
|
|
margin-top: 12px;
|
|
font-size: 12px;
|
|
color: #EF4444;
|
|
}
|
|
|
|
/* Unsuspend button (green outline) — table + mobile card */
|
|
.cust-btn-unsuspend {
|
|
color: #10B981 !important;
|
|
border-color: #10B981 !important;
|
|
}
|
|
|
|
/* Impersonate button (warm-orange) in mobile card */
|
|
.cust-btn-impersonate {
|
|
background: #FFF7ED !important;
|
|
border-color: #FB923C !important;
|
|
color: #C2410C !important;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Flex container that fills remaining width (mobile card info column) */
|
|
.cust-card-inner {
|
|
min-width: 0;
|
|
flex: 1;
|
|
}
|
|
|
|
/* Delete-progress step list (grid layout) */
|
|
.cust-delete-steps {
|
|
display: grid;
|
|
gap: 8px;
|
|
margin-top: 12px;
|
|
}
|
|
|
|
/* Step row */
|
|
.cust-delete-step {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
padding: 10px 14px;
|
|
background: #F8FAFC;
|
|
border-radius: 8px;
|
|
border: 1px solid #E2E8F0;
|
|
transition: all 0.3s ease;
|
|
}
|
|
|
|
.cust-delete-step--running {
|
|
background: #F0F9FF;
|
|
border-color: #BAE6FD;
|
|
}
|
|
|
|
.cust-delete-step__label {
|
|
flex: 1;
|
|
font-weight: 500;
|
|
color: #94A3B8;
|
|
}
|
|
|
|
.cust-delete-step__label--running { color: #0369A1; }
|
|
.cust-delete-step__label--done { color: #1E293B; }
|
|
|
|
/* Step status icon cell */
|
|
.cust-step-icon {
|
|
font-size: 18px;
|
|
width: 24px;
|
|
text-align: center;
|
|
}
|
|
|
|
/* Running-spinner span inside step icon cell */
|
|
.cust-step-running {
|
|
color: #0EA5E9;
|
|
animation: spin 1s linear infinite;
|
|
display: inline-block;
|
|
}
|
|
|
|
/* Pending circle span inside step icon cell */
|
|
.cust-step-pending {
|
|
color: #CBD5E1;
|
|
}
|
|
|
|
/* Step count badge (shown when step.count > 0) */
|
|
.cust-step-count {
|
|
font-weight: 700;
|
|
color: #1677ff;
|
|
font-size: 13px;
|
|
}
|
|
|
|
/* Error message at the bottom of the delete-progress modal */
|
|
.cust-delete-error {
|
|
color: #EF4444;
|
|
margin-top: 8px;
|
|
font-size: 13px;
|
|
}
|
|
|
|
/* ── System page (sys-) ───────────────────────────────────────────────────── */
|
|
|
|
/* Jail config table row separator */
|
|
.sys-jail-row { border-bottom: 1px solid #F1F5F9; }
|
|
|
|
/* Jail name code element */
|
|
.sys-jail-name {
|
|
font-size: 12px;
|
|
color: #1E293B;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Reboot confirm dialog warning icon */
|
|
.sys-reboot-warn-icon {
|
|
color: #F59E0B;
|
|
font-size: 18px;
|
|
flex-shrink: 0;
|
|
margin-top: 2px;
|
|
}
|
|
|
|
/* OPcache PHP version selector */
|
|
.sys-opcache-version-select { width: 110px; }
|
|
|
|
/* OPcache section bottom divider — tight top margin */
|
|
.sys-opcache-divider { margin: 12px 0 0; }
|
|
|
|
/* Scrollable wrapper for jail config table */
|
|
.overflow-x-auto { overflow-x: auto; }
|
|
|
|
/* Jail config <table> */
|
|
.sys-jail-table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
font-size: 13px;
|
|
}
|
|
|
|
/* Jail config <thead> row */
|
|
.sys-jail-thead-row { border-bottom: 2px solid #E5E7EB; }
|
|
|
|
/* Jail config label <th> (first column) */
|
|
.sys-jail-th--label {
|
|
text-align: left;
|
|
padding: 8px 12px;
|
|
color: #64748B;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Jail config action <th> (last column, spacer) */
|
|
.sys-jail-th--actions { padding: 8px 12px; }
|
|
|
|
/* ── Reseller Dashboard (rdash-) ─────────────────────────────────────────── */
|
|
|
|
/* Impersonate button — amber accent */
|
|
.rdash-btn--impersonate {
|
|
color: #F59E0B !important;
|
|
border-color: #F59E0B !important;
|
|
}
|
|
|
|
/* Unsuspend button — primary blue accent */
|
|
.rdash-btn--unsuspend {
|
|
color: #1677ff !important;
|
|
border-color: #1677ff !important;
|
|
}
|
|
|
|
/* Quota overview card — subtle border + rounded corners */
|
|
.rdash-quota-card {
|
|
border: 1px solid #E2E8F0 !important;
|
|
border-radius: 10px !important;
|
|
}
|
|
|
|
/* ── Onboarding page (onboard-) ──────────────────────────────────────────── */
|
|
|
|
/* Path-card icon — 28px, blue accent */
|
|
.onboard-path-icon--blue {
|
|
font-size: 28px !important;
|
|
color: #1677ff !important;
|
|
}
|
|
|
|
/* Path-card icon — 28px, purple accent */
|
|
.onboard-path-icon--purple {
|
|
font-size: 28px !important;
|
|
color: #475569 !important;
|
|
}
|
|
|
|
/* Path card — bordered, full height */
|
|
.onboard-path-card {
|
|
border: 1px solid #E5E7EB !important;
|
|
border-radius: 10px !important;
|
|
height: 100%;
|
|
}
|
|
|
|
/* Arrow indicator at the end of an incomplete check-item row */
|
|
.onboard-check-arrow {
|
|
margin-left: auto;
|
|
color: #94A3B8;
|
|
font-size: 12px !important;
|
|
}
|
|
|
|
/* Quota section title — zero out Ant Design's default top margin */
|
|
.rdash-quota-title { margin: 0 0 12px !important; }
|
|
|
|
/* Table header row — space-between flex with 10px gap */
|
|
.rdash-table-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
flex-wrap: wrap;
|
|
gap: 10px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
/* Search + action button row */
|
|
.rdash-table-actions {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 8px;
|
|
}
|
|
|
|
/* Search input — fixed width */
|
|
.rdash-search-input { width: 220px; }
|
|
.res-search-input { width: 260px; }
|
|
|
|
/* Mobile action buttons row — display:flex so flex-wrap + gap-4 take effect */
|
|
.rdash-mobile-actions { display: flex; }
|
|
|
|
/* ── Malware Scanner page (malware-) ─────────────────────────────────────── */
|
|
|
|
/* Mobile card wrapper */
|
|
.malware-mobile-card {
|
|
padding: 12px;
|
|
background: #fff;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 10px;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
/* Mobile card header row: domain left, status right */
|
|
.malware-mobile-card__header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
/* Domain label inside mobile card */
|
|
.malware-mobile-card__title { font-size: 14px; }
|
|
|
|
/* Last-scan / files-scanned meta line */
|
|
.malware-mobile-card__meta {
|
|
font-size: 12px;
|
|
color: #6B7280;
|
|
margin-bottom: 10px;
|
|
}
|
|
|
|
/* Scan-metadata grid at top of Findings Drawer */
|
|
.malware-meta-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
|
|
gap: 12px;
|
|
padding: 12px;
|
|
background: #F9FAFB;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
}
|
|
|
|
/* MetricTile label */
|
|
.malware-metric__label {
|
|
font-size: 11px;
|
|
color: #6B7280;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
/* MetricTile value */
|
|
.malware-metric__value {
|
|
font-size: 16px;
|
|
font-weight: 600;
|
|
color: var(--metric-value-color, #1E293B);
|
|
}
|
|
|
|
/* Clickable filter tag */
|
|
.malware-filter-tag {
|
|
cursor: pointer;
|
|
}
|
|
|
|
.malware-filter-tag--empty {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
/* Tag-row beneath a section heading (severity / status breakdown) */
|
|
.malware-tag-row {
|
|
margin-top: 6px;
|
|
display: flex;
|
|
gap: 8px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
/* Individual finding card in the drawer list */
|
|
.malware-finding-card {
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
padding: 12px;
|
|
}
|
|
|
|
/* Spacer above finding action buttons */
|
|
.malware-finding-actions { margin-top: 6px; }
|
|
|
|
/* mt-6 utility (completes the mt-* set) */
|
|
.mt-6 { margin-top: 6px; }
|
|
|
|
/* ── WAF page ─────────────────────────────────────────────────────────────── */
|
|
|
|
/* Expanded-row Descriptions background */
|
|
.waf-descriptions-bg { background: #FAFBFC; }
|
|
|
|
/* Filter dropdowns in log toolbar */
|
|
.waf-select-site-filter { width: 200px; }
|
|
.waf-select-severity-filter { width: 160px; }
|
|
|
|
/* Exclusions form max-width container */
|
|
.waf-exclusions-form { max-width: 720px; }
|
|
|
|
/* Paranoia-level select */
|
|
.waf-select-paranoia { width: 240px; }
|
|
|
|
/* Excluded-rule tag (clickable, custom padding) */
|
|
.waf-rule-tag {
|
|
cursor: pointer;
|
|
font-size: 13px;
|
|
padding: 2px 8px;
|
|
}
|
|
|
|
/* ── Utility additions ────────────────────────────────────────────────────── */
|
|
.text-amber { color: #D97706; }
|
|
.w-260 { width: 260px; }
|
|
|
|
/* Outline button in Ant Design primary blue (replaces style={{ color/borderColor }}) */
|
|
.btn-blue-outline { color: #1677ff !important; border-color: #1677ff !important; }
|
|
|
|
/* ── Domains page ─────────────────────────────────────────────────────────── */
|
|
|
|
/* DNS record card (DNSRecordRow outer wrapper) */
|
|
.dom-dns-record {
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 8px;
|
|
padding: 12px 14px;
|
|
background: #F8FAFC;
|
|
}
|
|
|
|
/* Value + copy-button row inside a DNS record card */
|
|
.dom-dns-value-row {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
margin-top: 6px;
|
|
}
|
|
|
|
/* Monospace value box inside a DNS record card (color kept inline — dynamic) */
|
|
.dom-dns-value-box {
|
|
flex: 1;
|
|
background: #F1F5F9;
|
|
border: 1px solid #E2E8F0;
|
|
border-radius: 6px;
|
|
padding: 6px 8px;
|
|
word-break: break-all;
|
|
min-height: 28px;
|
|
}
|
|
|
|
/* ── RecoveryWizard ─────────────────────────────────────────────────────── */
|
|
|
|
/* Primary-blue button override (Ant Design default primary) */
|
|
.recov-btn-primary {
|
|
background: #1677ff;
|
|
border-color: #1677ff;
|
|
}
|
|
|
|
/* Snapshot selection radio item */
|
|
.recov-snapshot-radio {
|
|
padding: 8px 12px;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
width: 100%;
|
|
}
|
|
|
|
/* Dark terminal log box */
|
|
.recov-log-box {
|
|
margin-top: 16px;
|
|
background: #0F172A;
|
|
color: #E2E8F0;
|
|
padding: 12px;
|
|
border-radius: 8px;
|
|
font-family: monospace;
|
|
font-size: 12px;
|
|
max-height: 280px;
|
|
overflow: auto;
|
|
}
|
|
|
|
/* ── ResellerBranding page ────────────────────────────────────────────────── */
|
|
|
|
/* Mini sidebar preview shell */
|
|
.rbrand-preview-sidebar {
|
|
background: linear-gradient(180deg, #0B1426 0%, #101D33 50%, #0D1829 100%);
|
|
border-radius: 8px;
|
|
padding: 16px;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
/* Logo + title row inside the mini sidebar */
|
|
.rbrand-preview-logo-row {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
/* Actual logo img inside the logo row */
|
|
.rbrand-preview-logo-img {
|
|
border-radius: 4px;
|
|
object-fit: contain;
|
|
background: #fff;
|
|
}
|
|
|
|
/* Fallback letter-avatar when no logo is uploaded */
|
|
.rbrand-preview-avatar {
|
|
width: 28px;
|
|
height: 28px;
|
|
border-radius: 6px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 12px;
|
|
font-weight: 700;
|
|
color: #fff;
|
|
background: var(--preview-gradient, linear-gradient(135deg, #1677ff, #1677ff));
|
|
}
|
|
|
|
/* Panel title label in the sidebar preview */
|
|
.rbrand-preview-title {
|
|
color: #E2E8F0;
|
|
font-size: 13px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.rbrand-preview-menu-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
padding: 6px 10px;
|
|
border-radius: 6px;
|
|
font-size: 12px;
|
|
margin-bottom: 2px;
|
|
color: var(--item-color, #94A3B8);
|
|
background: var(--item-bg, transparent);
|
|
border-left: var(--item-border, 3px solid transparent);
|
|
}
|
|
|
|
/* Preview header bar (white bar below the sidebar) */
|
|
.rbrand-preview-header {
|
|
background: #fff;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
padding: 8px 12px;
|
|
font-size: 13px;
|
|
}
|
|
|
|
.rbrand-preview-header-avatar {
|
|
width: 24px;
|
|
height: 24px;
|
|
border-radius: 50%;
|
|
background: var(--preview-gradient, linear-gradient(135deg, #1677ff, #1677ff));
|
|
}
|
|
|
|
/* ── Dashboard utilities ────────────────────────────────────────────────── */
|
|
|
|
/* Extra-small tag text (replaces style={{ fontSize: 10 }}) */
|
|
.tag-xs { font-size: 10px; }
|
|
|
|
/* Padding-12 utility */
|
|
.p-12 { padding: 12px; }
|
|
|
|
/* Agent-update tag in ServerCard footer (replaces style={{ fontSize:10, cursor:'pointer', margin:0 }}) */
|
|
.dash-tag--update {
|
|
font-size: 10px;
|
|
cursor: pointer;
|
|
margin: 0;
|
|
}
|
|
|
|
/* ── Utility: cursor ────────────────────────────────────────────────────── */
|
|
.cursor-pointer { cursor: pointer; }
|
|
|
|
/* ── Utility: width ─────────────────────────────────────────────────────── */
|
|
.w-150 { width: 150px; }
|
|
.w-160 { width: 160px; }
|
|
.w-180 { width: 180px; }
|
|
.w-240 { width: 240px; }
|
|
|
|
/* ── AuditLog ───────────────────────────────────────────────────────────── */
|
|
|
|
/* Expanded row Descriptions background */
|
|
.audit-descriptions--expanded {
|
|
background: #FAFBFC;
|
|
}
|
|
|
|
/* Details value: small text with word-break for long JSON values */
|
|
.audit-details__value {
|
|
font-size: 12px;
|
|
word-break: break-all;
|
|
}
|
|
|
|
/* ── SSL page ───────────────────────────────────────────────────────────── */
|
|
|
|
/* System-SSL card: slightly tinted background to distinguish from main content */
|
|
.ssl-system__card {
|
|
background: #F8FAFC;
|
|
}
|
|
|
|
/* System-SSL section title: block-level so it stacks above the server list */
|
|
.ssl-system__title {
|
|
display: block;
|
|
margin-bottom: 12px;
|
|
}
|
|
|
|
/* ── GitDeploy extras ───────────────────────────────────────────────────────── */
|
|
|
|
/* Centred spinner block inside the deploy modal */
|
|
.gitdeploy__deploy-loading {
|
|
width: 100%;
|
|
align-items: center;
|
|
padding: 32px;
|
|
}
|
|
|
|
/* Webhook providers list (GitHub / GitLab / Gitea instructions) */
|
|
.gitdeploy__providers-list {
|
|
font-size: 13px;
|
|
color: #475569;
|
|
}
|
|
|
|
/* ── Additional utilities ───────────────────────────────────────────────────── */
|
|
|
|
.max-w-280 { max-width: 280px; }
|
|
.mt-20 { margin-top: 20px; }
|
|
.mt-48 { margin-top: 48px; }
|
|
|
|
/* Individual server chip inside SystemSSLSection */
|
|
.ssl-server-item {
|
|
padding: 10px 14px;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
background: #fff;
|
|
min-width: 200px;
|
|
}
|
|
|
|
/* Summary strip pill (the colored-dot + count card) */
|
|
.ssl-summary__item {
|
|
background: #fff;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 8px;
|
|
padding: 8px 16px;
|
|
}
|
|
|
|
/* Mobile card action row: separated from content by a hairline rule */
|
|
.ssl-mobile-actions {
|
|
border-top: 1px solid #F1F5F9;
|
|
padding-top: 8px;
|
|
}
|
|
|
|
/* ── WebStats ─────────────────────────────────────────────── */
|
|
.min-w-200 { min-width: 200px; }
|
|
|
|
.wstats__report-frame {
|
|
width: 100%;
|
|
height: 600px;
|
|
border: none;
|
|
}
|
|
|
|
.wstats__empty-icon {
|
|
font-size: 48px;
|
|
}
|
|
|
|
/* ScanProgressModal */
|
|
.scan-progress__body {
|
|
width: 100%;
|
|
align-items: center;
|
|
}
|
|
|
|
.scan-progress__file-count {
|
|
margin-top: 4px;
|
|
font-size: 12px;
|
|
color: #6B7280;
|
|
text-align: center;
|
|
}
|
|
|
|
.scan-progress__metrics {
|
|
display: flex;
|
|
gap: 24px;
|
|
justify-content: center;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.scan-progress__metric-tile {
|
|
text-align: center;
|
|
min-width: 90px;
|
|
}
|
|
|
|
.scan-progress__metric-label {
|
|
font-size: 11px;
|
|
color: #6B7280;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
.scan-progress__metric-value {
|
|
font-size: 18px;
|
|
font-weight: 600;
|
|
color: var(--value-color, #1E293B);
|
|
margin-top: 2px;
|
|
}
|
|
|
|
.scan-progress__metric-value--mono {
|
|
font-family: monospace;
|
|
}
|
|
|
|
/* ── Databases ────────────────────────────────────────────── */
|
|
.db__grant-tag {
|
|
font-size: 11px;
|
|
margin: 0;
|
|
}
|
|
|
|
.db__grant-checkbox {
|
|
font-size: 13px;
|
|
}
|
|
|
|
.db__search-input {
|
|
width: 280px;
|
|
}
|
|
|
|
/* Extensions page utilities */
|
|
.text-body-dark { color: #1E293B; }
|
|
|
|
.ext-model-load-bar {
|
|
padding: 8px;
|
|
border-top: 1px solid #E5E7EB;
|
|
}
|
|
|
|
.ext-card__config-note {
|
|
font-size: 12px;
|
|
color: #64748B;
|
|
margin: 6px 0 0;
|
|
font-style: italic;
|
|
}
|
|
|
|
.ext-progress__message {
|
|
margin-top: 12px;
|
|
font-size: 13px;
|
|
color: #64748B;
|
|
min-height: 20px;
|
|
}
|
|
|
|
/* ── Logs ─────────────────────────────────────────────────── */
|
|
.w-140 { width: 140px; }
|
|
.w-220 { width: 220px; }
|
|
|
|
.logs__badge--count {
|
|
background-color: #64748B !important;
|
|
font-size: 11px;
|
|
}
|
|
|
|
.logs__live-text {
|
|
font-size: 12px;
|
|
color: #1677ff;
|
|
}
|
|
|
|
/* ── MailConfig ─────────────────────────────────────────────────────────────── */
|
|
|
|
.mailcfg__section-card {
|
|
border: 1px solid #E5E7EB !important;
|
|
border-radius: 10px !important;
|
|
margin-bottom: 16px;
|
|
}
|
|
|
|
.mailcfg__queue-panel {
|
|
background: #fff;
|
|
border: 1px solid #E5E7EB;
|
|
border-radius: 10px;
|
|
padding: 20px;
|
|
}
|
|
|
|
.mailcfg__mono-bold {
|
|
font-family: monospace;
|
|
font-weight: 600;
|
|
}
|
|
.mailcfg__threshold-tag {
|
|
margin: 0;
|
|
line-height: 1;
|
|
}
|
|
|
|
/* ── ResellerPlans (rplan-) ──────────────────────────────────────────────── */
|
|
|
|
/* Section divider — top of tab, no top margin */
|
|
.rplan__divider--top.ant-divider { font-size: 12px; margin: 0 0 8px; }
|
|
|
|
/* Section divider — between sections */
|
|
.rplan__divider--mid.ant-divider { font-size: 12px; margin: 8px 0; }
|
|
|
|
/* Section divider — top of policies tab, no top margin, larger bottom */
|
|
.rplan__divider--top-lg.ant-divider { font-size: 12px; margin: 0 0 12px; }
|
|
|
|
/* Section divider — between sections, larger bottom */
|
|
.rplan__divider--mid-lg.ant-divider { font-size: 12px; margin: 8px 0 12px; }
|
|
|
|
/* Text-align utility */
|
|
.text-right { text-align: right; }
|
|
|
|
/* ── AIAssistant ─────────────────────────────────────────────────────────────── */
|
|
|
|
.min-w-140 { min-width: 140px; }
|
|
|
|
.ai-header__badge--provider {
|
|
background: #F0FDF4;
|
|
border: 1px solid #BBF7D0;
|
|
color: #166534;
|
|
padding: 4px 10px;
|
|
border-radius: 6px;
|
|
font-size: 12px;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.ai-header__badge--model {
|
|
background: #EFF6FF;
|
|
border: 1px solid #BFDBFE;
|
|
color: #1D4ED8;
|
|
padding: 4px 10px;
|
|
border-radius: 6px;
|
|
font-size: 12px;
|
|
font-weight: 500;
|
|
font-family: ui-monospace, Consolas, monospace;
|
|
}
|
|
|
|
/* TLS Health — inline style migrations */
|
|
.text-blue-700 { color: #1D4ED8; }
|
|
.max-w-260 { max-width: 260px; }
|
|
.tls-expanded-row { padding: 8px 16px; background: #F8FAFC; font-size: 13px; }
|
|
|
|
/* Notifications — inline style migrations */
|
|
.notif__smtp-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 16px; }
|
|
.notif__filter-status { width: 140px; min-width: 120px; }
|
|
.notif__filter-event { width: 200px; min-width: 150px; }
|
|
.notif__template-body { font-size: 12px; }
|
|
.notif__html-preview { border: 1px solid #E5E7EB; border-radius: 6px; padding: 16px; background: #fff; max-height: 500px; overflow-y: auto; }
|
|
.mobile-card__header--compact { margin-bottom: 6px; }
|
|
|
|
/* Firewall — inline style migrations */
|
|
.bg-white { background: #fff; }
|
|
.fw-handle-text { font-family: monospace; font-size: 12px; color: #64748B; }
|
|
|
|
/* Cronjobs — inline style migrations */
|
|
.cron-card__actions { border-top: 1px solid #F1F5F9; padding-top: 8px; }
|
|
|
|
/* DNS — inline style migrations */
|
|
.dns-table--dimmed { opacity: 0.7; }
|
|
|
|
/* ProtectedDirs / Packages / FTP — inline style migrations */
|
|
.word-break-all { word-break: break-all; }
|
|
.mb-6 { margin-bottom: 6px; }
|
|
.w-280 { width: 280px; }
|
|
|
|
/* ─── ErrorBoundary ──────────────────────────────────────────────────────── */
|
|
.offline-banner {
|
|
border-radius: 0 !important;
|
|
border-left: none !important;
|
|
border-right: none !important;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.error-boundary__stack {
|
|
margin-top: 24px;
|
|
padding: 16px;
|
|
background: #FEF2F2;
|
|
border: 1px solid #FECACA;
|
|
border-radius: 8px;
|
|
font-size: 12px;
|
|
color: #B91C1C;
|
|
overflow: auto;
|
|
white-space: pre-wrap;
|
|
}
|
|
|
|
/* ─── Page lazy-load fallback ───────────────────────────────────────────── */
|
|
.page-loader {
|
|
position: fixed;
|
|
inset: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: #F8FAFC;
|
|
}
|
|
|
|
.page-loader::after {
|
|
content: '';
|
|
width: 32px;
|
|
height: 32px;
|
|
border: 3px solid #E2E8F0;
|
|
border-top-color: #00D4AA;
|
|
border-radius: 50%;
|
|
animation: page-loader-spin 0.6s linear infinite;
|
|
}
|
|
|
|
@keyframes page-loader-spin {
|
|
to { transform: rotate(360deg); }
|
|
}
|
|
|
|
/* ── Form layout utilities ───────────────────────────────────────────────────── */
|
|
.form-grid-2col {
|
|
display: grid;
|
|
grid-template-columns: 1fr;
|
|
gap: 0 16px;
|
|
}
|
|
@media (min-width: 768px) {
|
|
.form-grid-2col { grid-template-columns: 1fr 1fr; }
|
|
}
|
|
|
|
.card-content-responsive {
|
|
padding: 20px;
|
|
}
|
|
@media (max-width: 767px) {
|
|
.card-content-responsive { padding: 12px; }
|
|
}
|
|
|
|
/* ── Width utilities ─────────────────────────────────────────────────────────── */
|
|
.w-full-mobile {
|
|
width: 320px;
|
|
}
|
|
@media (max-width: 767px) {
|
|
.w-full-mobile { width: 100%; }
|
|
}
|
|
|
|
.mt-16-mobile { margin-top: 0; }
|
|
@media (max-width: 991px) {
|
|
.mt-16-mobile { margin-top: 16px; }
|
|
}
|
|
|
|
/* Bulk SSL modal */
|
|
.ssl-bulk-hint { color: #64748B; font-size: 13px; margin-bottom: 12px; }
|
|
.ssl-bulk-counts { margin: 12px 0; }
|
|
.ssl-bulk-progress-text { color: #64748B; font-variant-numeric: tabular-nums; }
|
|
.ssl-bulk-list { max-height: 320px; overflow-y: auto; margin-top: 8px; }
|
|
.ssl-bulk-list .ant-list-item { display: flex; gap: 8px; align-items: baseline; }
|
|
.ssl-bulk-domain { font-weight: 600; }
|
|
.ssl-bulk-msg { color: #94A3B8; font-size: 12px; margin-left: auto; text-align: right; }
|
|
|
|
/* Uptime monitor — status strip (status-page look) */
|
|
.uptime-strip { display: flex; gap: 2px; align-items: stretch; height: 34px; margin: 4px 0 14px; border-radius: 6px; overflow: hidden; }
|
|
.uptime-strip__seg { flex: 1 1 0; min-width: 2px; border-radius: 2px; transition: opacity .15s; }
|
|
.uptime-strip__seg:hover { opacity: .7; }
|