:root { --bg: #f4f8fa; --card: #ffffff; --text: #183747; --muted: #627987; --border: #d8e5eb; --primary: #c83676; --primary-dark: #a92a62; --secondary: #1e516b; --secondary-dark: #173d51; --danger: #b8223e; --danger-dark: #941a31; --danger-bg: #fdecef; --warning: #9a5b00; --warning-bg: #fff4d8; --success: #188654; --success-bg: #e7f5ee; } .hidden { display: none !important; } * { box-sizing: border-box; } body { margin: 0; font-family: Arial, sans-serif; background: linear-gradient(180deg, #eef6f9 0, var(--bg) 220px); color: var(--text); } header { background: var(--secondary); color: white; padding: 14px 32px; display: flex; align-items: center; justify-content: space-between; gap: 18px; border-bottom: 5px solid var(--primary); box-shadow: 0 10px 26px rgba(30, 81, 107, 0.16); } nav { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .brand { display: inline-flex; align-items: center; gap: 14px; color: white; text-decoration: none; font-weight: 800; font-size: 19px; } .brand:hover { text-decoration: none; } .brand img { display: block; width: 148px; height: auto; background: white; border-radius: 6px; padding: 6px 8px; } nav a { color: white; text-decoration: none; font-weight: 600; padding: 9px 12px; border-radius: 8px; } nav a:hover, .nav-menu-button:hover, .nav-menu:focus-within .nav-menu-button, .nav-menu:hover .nav-menu-button { background: rgba(255, 255, 255, 0.12); text-decoration: none; } .nav-menu { position: relative; } .nav-menu-button { background: transparent; color: white; padding: 9px 12px; min-height: 0; } .nav-menu-panel { display: none; position: absolute; top: calc(100% + 6px); left: 0; z-index: 20; min-width: 180px; background: var(--secondary-dark); border: 1px solid rgba(255, 255, 255, 0.14); border-radius: 8px; padding: 6px; box-shadow: 0 12px 28px rgba(10, 31, 42, 0.28); } .nav-menu:hover .nav-menu-panel, .nav-menu:focus-within .nav-menu-panel { display: block; } .nav-menu-panel a { display: block; margin: 0; white-space: nowrap; } .user-menu { display: flex; align-items: center; gap: 10px; color: white; font-size: 13px; font-weight: 700; } .user-menu .muted { color: rgba(255, 255, 255, 0.72); } .user-menu form { margin: 0; } .auth-card { max-width: 420px; margin: 48px auto 24px; } .auth-card input { width: 100%; } .alert { border-radius: 8px; padding: 10px 12px; font-weight: 700; } .alert-danger { background: var(--danger-bg); color: var(--danger); } main { padding: 32px; max-width: 1500px; margin: 0 auto; } .card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 22px; box-shadow: 0 8px 24px rgba(30, 81, 107, 0.07); margin-bottom: 24px; overflow-x: auto; } .card h2 { color: var(--secondary); } .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 16px; } .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; margin-bottom: 24px; } .stat-card { background: var(--card); border: 1px solid var(--border); border-left: 5px solid var(--secondary); border-radius: 8px; padding: 18px; box-shadow: 0 8px 24px rgba(30, 81, 107, 0.07); } .stat-card span { display: block; color: var(--muted); font-size: 13px; font-weight: 700; text-transform: uppercase; } .stat-card strong { display: block; margin-top: 8px; font-size: 28px; color: var(--secondary); } .stat-success { border-left-color: var(--success); background: linear-gradient(90deg, var(--success-bg), var(--card) 46%); } .stat-success strong { color: var(--success); } .stat-warning { border-left-color: var(--warning); background: linear-gradient(90deg, var(--warning-bg), var(--card) 46%); } .stat-warning strong { color: var(--warning); } .stat-danger { border-left-color: var(--danger); background: linear-gradient(90deg, var(--danger-bg), var(--card) 46%); } .stat-danger strong { color: var(--danger); } .stat-total { border-left-color: var(--secondary); } table { border-collapse: collapse; width: 100%; min-width: 760px; margin-top: 12px; } th, td { padding: 12px; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; } th { color: var(--muted); font-size: 13px; text-transform: uppercase; letter-spacing: .04em; background: #eef6f9; border-top: 1px solid var(--border); } a { color: var(--primary); text-decoration: none; font-weight: 600; } a:hover { text-decoration: underline; } button, .btn { border: 0; border-radius: 8px; padding: 8px 12px; min-height: 34px; background: var(--primary); color: white; font-weight: 700; cursor: pointer; display: inline-block; } button:hover, .btn:hover { background: var(--primary-dark); text-decoration: none; } .nav-menu-button, .nav-menu-button:hover { background: transparent; color: white; width: auto; } .nav-menu:hover .nav-menu-button, .nav-menu:focus-within .nav-menu-button { background: rgba(255, 255, 255, 0.12); } .btn + .btn { margin-left: 8px; } .btn-secondary { background: var(--secondary); } .btn-secondary:hover { background: var(--secondary-dark); } .btn.disabled, .btn.disabled:hover { background: #b8c8d0; color: #f8fbfc; cursor: not-allowed; pointer-events: none; } .danger { background: var(--danger); } .danger:hover { background: var(--danger-dark); } .muted { color: var(--muted); font-size: 13px; } .pill { display: inline-block; border-radius: 999px; padding: 4px 10px; font-size: 12px; background: #eef6f9; color: var(--secondary); font-weight: 700; } .pill-success { background: var(--success-bg); color: var(--success); } .pill-warning { background: var(--warning-bg); color: var(--warning); } .pill-danger { background: var(--danger-bg); color: var(--danger); } .pill-muted { background: #eef6f9; color: var(--muted); } input, select { padding: 8px; border: 1px solid var(--border); border-radius: 8px; background: white; } input[readonly] { width: 100%; font-family: monospace; background: #f8fbfc; color: var(--secondary-dark); } .cmd-row { display: grid; grid-template-columns: 1fr auto; gap: 8px; margin: 8px 0 14px; } .copy-row { display: grid; grid-template-columns: minmax(260px, 1fr) 82px; gap: 8px; align-items: start; margin: 0 0 10px; } .copy-row input { min-height: 34px; } .copy-button, .actions-cell button { width: 82px; text-align: center; } .actions-cell { width: 150px; white-space: nowrap; } .actions-cell form, .actions-cell p { margin: 0 0 8px; } .running-row td { background: var(--warning-bg); } .backup-row td { vertical-align: middle; } details summary { cursor: pointer; font-weight: 700; } pre { background: var(--secondary-dark); color: #e5e7eb; padding: 18px; border-radius: 12px; white-space: pre-wrap; overflow: auto; } .log-viewer { max-height: 520px; min-height: 220px; white-space: pre-wrap; overflow: auto; font-family: Consolas, "Liberation Mono", Menlo, monospace; font-size: 13px; line-height: 1.45; } .log-stdout { background: #102a3a; color: #edf6f9; } .log-stderr { background: #3a111b; color: #ffe5ea; border: 1px solid #f3a8b7; } .log-system { background: #263846; color: #f2f7fa; border: 1px solid #8aa4b4; } #live-log-panel .log-viewer { min-height: 0; max-height: none; margin: 8px 0 12px; padding: 12px; } .failed-log { border-color: #f3a8b7; } .resource-help { font-size: 12px; color: var(--muted); line-height: 1.4; margin-top: 8px; } .inline-form { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; } .filter-form { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; } .pagination { display: flex; align-items: center; justify-content: space-between; gap: 12px; color: var(--muted); font-size: 13px; font-weight: 700; margin: 12px 0; } .pagination-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .page-indicator { color: var(--secondary); white-space: nowrap; } @media (max-width: 980px) { header { align-items: flex-start; flex-direction: column; padding: 14px 18px; } .brand img { width: 120px; } nav { width: 100%; } .nav-menu-panel { position: static; width: 100%; margin-top: 4px; box-shadow: none; } .user-menu { width: 100%; justify-content: flex-start; flex-wrap: wrap; } main { padding: 18px; } } @media (max-width: 640px) { .brand { align-items: flex-start; flex-direction: column; gap: 8px; font-size: 16px; } nav a, .nav-menu, .nav-menu-button { width: 100%; } .nav-menu-button, nav a { text-align: left; } .stats-grid, .grid { grid-template-columns: 1fr; } .card { padding: 16px; } .filter-form, .inline-form { align-items: stretch; flex-direction: column; } input, select, button, .btn { width: 100%; } .btn + .btn { margin-left: 0; margin-top: 8px; } .cmd-row, .copy-row { grid-template-columns: 1fr; } .copy-button, .actions-cell button { width: 100%; } .pagination { align-items: flex-start; flex-direction: column; } .pagination-actions { width: 100%; } }