/* Unified admin panel — terminal theme helpers */ .admin-tabs { display: flex; flex-wrap: wrap; gap: var(--space-xs); margin: 0 0 var(--space-lg); border-bottom: 1px solid var(--border); } .admin-tabs a { padding: var(--space-sm) var(--space-md); border: 1px solid var(--border); border-bottom: none; border-radius: var(--r) var(--r) 0 0; color: var(--muted); font-weight: 700; } .admin-tabs a.active { color: var(--ink); border-color: var(--accent); background: #0a0000; } .admin-flash { padding: var(--space-sm) var(--space-md); border-radius: var(--r); margin-bottom: var(--space-md); border: 1px solid var(--border); } .admin-flash.ok { border-color: #2e7d32; } .admin-flash.err { border-color: var(--accent); } .admin-cols { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-lg); align-items: start; } @media (max-width: 800px) { .admin-cols { grid-template-columns: 1fr; } } .panel { border: 1px solid var(--border); border-radius: var(--r); margin-bottom: var(--space-md); } .panel-head { padding: var(--space-sm) var(--space-md); border-bottom: 1px solid var(--border); font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: .07em; color: var(--muted); } .panel-body { padding: var(--space-md); } .admin-field { margin-bottom: var(--space-md); } .admin-field label { display: block; margin-bottom: 4px; font-size: var(--fs-sm); } .admin-field input, .admin-field textarea, .admin-field select { width: 100%; box-sizing: border-box; background: #050000; border: 1px solid var(--border); color: #d00000; padding: 10px; border-radius: var(--r); font: inherit; } .md-toolbar { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 6px; } .md-toolbar button { padding: 6px 10px; font-size: var(--fs-xs); } #md-preview { background: #050000; border: 1px solid var(--border); border-radius: var(--r); padding: 12px; min-height: 200px; overflow: auto; line-height: 1.6; } .admin-list { list-style: none; padding: 0; margin: 0; } .admin-item { border: 1px solid var(--border); border-radius: var(--r); padding: var(--space-sm) var(--space-md); margin-bottom: var(--space-sm); } .admin-item small { color: var(--muted); font-family: monospace; } .inline-form { display: inline; } .admin-checks { display: flex; flex-direction: column; gap: 6px; margin: 0 0 var(--space-md); } .admin-checks label { font-size: var(--fs-sm); } .admin-motd-actions { display: flex; flex-wrap: wrap; gap: var(--space-sm); margin: 0 0 var(--space-md); } .motd-xmpp-preview { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; font-family: var(--font-mono, ui-monospace, monospace); font-size: var(--fs-sm); line-height: 1.55; color: var(--ink); } .type-badge { font-family: monospace; padding: 1px 7px; border: 1px solid var(--border); border-radius: var(--r); color: var(--muted); } table.admin-table { width: 100%; border-collapse: collapse; } table.admin-table th, table.admin-table td { border: 1px solid var(--border); padding: 6px 8px; text-align: left; vertical-align: top; font-size: var(--fs-sm); } .ratio-wrap { position: relative; padding-top: 56.25%; } .ratio-wrap iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; border-radius: var(--r); } .preview-panel img, .preview-panel video, .preview-panel audio { max-width: 100%; border-radius: var(--r); display: block; } /* Utility replacements for residual inline styles */ .admin-section-title { font-size: var(--fs-lg); margin: var(--space-2xl) 0 var(--space-md); } .admin-section-label { font-size: var(--fs-sm); text-transform: uppercase; letter-spacing: .07em; color: var(--muted); margin: var(--space-xl) 0 var(--space-sm); } .admin-stack-gap { margin-bottom: var(--space-2xl); } .admin-inline-note { font-size: var(--fs-sm); color: var(--accent); } .admin-search-input { padding: 8px; background: #050000; border: 1px solid var(--border); color: #d00000; border-radius: var(--r); } body.light-mode .admin-tabs a.active { background: #fff4f4; } body.light-mode .admin-field input, body.light-mode .admin-field textarea, body.light-mode .admin-field select, body.light-mode #md-preview, body.light-mode .admin-search-input { background: #fff; color: #2a1212; } /* ---- Traffic analytics ---- */ .traffic-live-bar { display: flex; align-items: center; gap: 0.4rem; margin: 0 0 var(--space-md); font-family: var(--font-mono, ui-monospace, monospace); font-size: var(--fs-xs); letter-spacing: 0.04em; text-transform: uppercase; color: var(--muted); } .traffic-live-dot { width: 8px; height: 8px; border-radius: 50%; background: #39ff14; box-shadow: 0 0 8px rgba(57, 255, 20, 0.7); animation: traffic-live-pulse 1.6s ease-in-out infinite; } .traffic-live-bar--ok .traffic-live-dot { background: #39ff14; } .traffic-live-bar--err .traffic-live-dot { background: #ff4d4d; box-shadow: 0 0 8px rgba(255, 77, 77, 0.55); animation: none; } .traffic-live-bar--err #traffic-live-status { color: #ff6b6b; } @keyframes traffic-live-pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.45; transform: scale(0.85); } } body.light-mode .traffic-live-dot { background: #1a7a12; box-shadow: none; } body.light-mode .traffic-live-bar--err .traffic-live-dot { background: #c0392b; } .traffic-kpi-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: var(--space-sm); margin: 0 0 var(--space-lg); } .traffic-kpi-val.traffic-kpi-flash { animation: traffic-kpi-pop 0.55s ease; } @keyframes traffic-kpi-pop { 0% { transform: scale(1); } 35% { transform: scale(1.12); filter: brightness(1.35); } 100% { transform: scale(1); } } .traffic-kpi { border: 1px solid var(--border); border-radius: var(--r); padding: var(--space-md); background: #0a0000; text-align: center; } .traffic-kpi-val { display: block; font-family: var(--font-mono, ui-monospace, monospace); font-size: 1.6rem; font-weight: 700; color: #39ff14; text-shadow: 0 0 8px rgba(57, 255, 20, .25); line-height: 1.2; } .traffic-kpi-label { display: block; margin-top: 4px; font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: .06em; color: var(--muted); } .traffic-kpi--bots { border-color: rgba(255, 159, 26, 0.45); } .traffic-kpi--bots .traffic-kpi-val { color: #ff9f1a; text-shadow: 0 0 8px rgba(255, 159, 26, .3); } .traffic-row--bot { opacity: 0.78; } .traffic-badge--bot { background: rgba(255, 159, 26, 0.18); color: #ff9f1a; border: 1px solid rgba(255, 159, 26, 0.4); } body.light-mode .traffic-kpi--bots .traffic-kpi-val { color: #a65c00; text-shadow: none; } body.light-mode .traffic-badge--bot { background: rgba(166, 92, 0, 0.1); color: #a65c00; border-color: rgba(166, 92, 0, 0.35); } .traffic-chart-panel .panel-body { padding-bottom: var(--space-sm); } .traffic-chart { display: block; width: 100%; max-width: 100%; height: auto; background: #050000; border: 1px solid var(--border); border-radius: var(--r); } .traffic-chart-legend { display: flex; flex-wrap: wrap; gap: 1rem; margin-top: var(--space-sm); font-size: var(--fs-xs); color: var(--muted); font-family: var(--font-mono, ui-monospace, monospace); } .traffic-swatch { display: inline-block; width: 12px; height: 12px; border-radius: 2px; margin-right: 4px; vertical-align: -1px; } .traffic-swatch--hits { background: #39ff14; box-shadow: 0 0 6px rgba(57,255,20,.4); } .traffic-swatch--uniq { background: #5b9dff; box-shadow: 0 0 6px rgba(91,157,255,.35); } .traffic-swatch--bots { background: #ff9f1a; box-shadow: 0 0 6px rgba(255,159,26,.4); } .traffic-chart-row { margin-bottom: var(--space-md); } body.light-mode .traffic-swatch--bots { background: #a65c00; box-shadow: none; } body.light-mode .traffic-kpi { background: #f8fbfd; } body.light-mode .traffic-kpi-val { color: #1a7a12; text-shadow: none; } body.light-mode .traffic-chart { background: #f4f7fa; }