Files
Malin a8d7972ad7 feat: add Central API clients, bot rate limiting, and admin API UI
- Add ITK_HP_API and ITK_Bot_API static classes with queue/flush/cron
- Add WP-Cron (5 min) + shutdown flush for both API queues
- Bot Blocker and Honeypot now queue events to their respective APIs
- Admin: Bot Blocker tab gains Central Bot API settings panel
  (enable, URL, token, test connection, flush queue, historical sync)
- Admin: Honeypot tab gains Central Honeypot API settings panel
- Admin JS: AJAX handlers for Test Connection and Flush Now buttons
- Admin CSS: API card styles (status badge, notices, footer controls)
- Add .gitignore (excludes bot-api/ which lives in CloudHost/bot-api)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-09 18:32:27 +02:00

368 lines
12 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ============================================================
InformatiQ Toolkit Admin CSS
============================================================ */
/* ── Page wrapper ─────────────────────────────────────────── */
.itk-wrap { max-width: 1400px; }
.itk-page-title {
display: flex;
align-items: center;
gap: 10px;
font-size: 22px;
margin: 20px 0 16px;
}
.itk-logo {
display: inline-flex;
align-items: center;
justify-content: center;
width: 36px; height: 36px;
background: #1a4a8a;
color: #fff;
font-weight: 900;
font-size: 14px;
border-radius: 6px;
letter-spacing: -1px;
}
/* ── Tab navigation ───────────────────────────────────────── */
.itk-tabs {
display: flex;
flex-wrap: wrap;
gap: 2px;
border-bottom: 2px solid #c3c4c7;
margin-bottom: 20px;
}
.itk-tab {
padding: 8px 16px;
text-decoration: none;
color: #2c3338;
font-size: 13px;
border-radius: 4px 4px 0 0;
border: 1px solid transparent;
border-bottom: none;
background: #f0f0f1;
margin-bottom: -2px;
}
.itk-tab:hover { background: #fff; color: #1a4a8a; }
.itk-tab-active {
background: #fff;
border-color: #c3c4c7;
color: #1a4a8a;
font-weight: 600;
}
/* ── Settings grid ────────────────────────────────────────── */
.itk-settings-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
gap: 20px;
align-items: start;
}
.itk-card {
background: #fff;
border: 1px solid #c3c4c7;
border-radius: 6px;
padding: 20px 24px;
}
.itk-card h2 {
margin: 0 0 16px;
font-size: 15px;
color: #1a4a8a;
border-bottom: 1px solid #e5e5e5;
padding-bottom: 8px;
}
/* ── Toggle rows ──────────────────────────────────────────── */
.itk-toggle-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 0;
border-bottom: 1px solid #f0f0f1;
gap: 12px;
}
.itk-toggle-row:last-child { border-bottom: none; }
.itk-toggle-info { flex: 1; }
.itk-toggle-label { display: block; font-weight: 600; font-size: 13px; color: #2c3338; }
.itk-toggle-desc { display: block; font-size: 11px; color: #646970; margin-top: 2px; }
/* ── Toggle switch ────────────────────────────────────────── */
.itk-switch {
position: relative;
display: inline-block;
width: 44px;
height: 24px;
flex-shrink: 0;
}
.itk-switch input { opacity: 0; width: 0; height: 0; }
.itk-slider {
position: absolute;
cursor: pointer;
inset: 0;
background: #ccc;
border-radius: 24px;
transition: .25s;
}
.itk-slider:before {
content: '';
position: absolute;
width: 18px; height: 18px;
left: 3px; bottom: 3px;
background: #fff;
border-radius: 50%;
transition: .25s;
}
input:checked + .itk-slider { background: #2271b1; }
input:checked + .itk-slider:before { transform: translateX(20px); }
/* ── Dashboard ────────────────────────────────────────────── */
.itk-dashboard {
display: grid;
grid-template-columns: 1fr 280px;
gap: 20px;
align-items: start;
}
@media (max-width: 960px) { .itk-dashboard { grid-template-columns: 1fr; } }
/* Monitor panel terminal style */
.itk-monitor-panel {
background: #0d1117;
color: #58a6ff;
border-radius: 8px;
padding: 20px 24px;
font-family: 'Courier New', Courier, monospace;
}
.itk-monitor-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #21262d;
padding-bottom: 12px;
margin-bottom: 16px;
}
.itk-monitor-title { font-weight: 700; font-size: 13px; letter-spacing: 1px; color: #79c0ff; }
.itk-monitor-blink {
background: #238636;
color: #fff;
padding: 2px 8px;
border-radius: 3px;
font-size: 11px;
font-weight: 700;
letter-spacing: 1px;
animation: itk-pulse 2s infinite;
}
@keyframes itk-pulse { 0%,100%{opacity:1} 50%{opacity:.5} }
/* Stat cards (inside monitor) */
.itk-stat-row {
display: flex;
flex-wrap: wrap;
gap: 12px;
margin-bottom: 20px;
}
.itk-stat-card {
background: #161b22;
border: 1px solid #21262d;
border-radius: 6px;
padding: 12px 18px;
min-width: 110px;
text-align: center;
flex: 1;
}
.itk-stat-num { font-size: 2em; font-weight: 700; color: #58a6ff; line-height: 1.2; }
.itk-stat-lbl { font-size: 10px; color: #8b949e; letter-spacing: .5px; text-transform: uppercase; }
.itk-green { color: #3fb950; }
.itk-yellow { color: #d29922; }
/* Chart sections */
.itk-chart-section { margin-bottom: 20px; }
.itk-chart-title {
font-size: 10px;
letter-spacing: 1px;
color: #8b949e;
text-transform: uppercase;
margin-bottom: 8px;
}
.itk-bar-chart { display: flex; flex-direction: column; gap: 6px; }
.itk-bar-row { display: flex; align-items: center; gap: 8px; font-size: 12px; }
.itk-bar-label { width: 130px; color: #c9d1d9; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.itk-bar-track { flex: 1; background: #21262d; border-radius: 3px; height: 14px; overflow: hidden; }
.itk-bar-fill { height: 100%; background: linear-gradient(90deg, #1f6feb, #58a6ff); border-radius: 3px; transition: width .4s; }
.itk-bar-hp { background: linear-gradient(90deg, #6e40c9, #a371f7) !important; }
.itk-bar-count { width: 40px; text-align: right; color: #8b949e; font-size: 11px; }
/* Mini table (top IPs) */
.itk-mini-table { width: 100%; border-collapse: collapse; font-size: 12px; }
.itk-mini-table th { color: #8b949e; font-weight: normal; padding: 4px 8px; border-bottom: 1px solid #21262d; }
.itk-mini-table td { color: #c9d1d9; padding: 4px 8px; border-bottom: 1px solid #161b22; }
.itk-mini-table a { color: #58a6ff; }
.itk-lookup { color: #8b949e; font-size: 10px; }
/* Quick status sidebar */
.itk-quick-status {
background: #fff;
border: 1px solid #c3c4c7;
border-radius: 6px;
padding: 16px 20px;
}
.itk-quick-status .itk-chart-title { color: #1a4a8a; }
.itk-module-row {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 0;
border-bottom: 1px solid #f0f0f1;
font-size: 12px;
}
.itk-module-dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
.itk-dot-on { background: #00a32a; }
.itk-dot-off { background: #c3c4c7; }
.itk-module-label { flex: 1; color: #2c3338; }
.itk-module-status { font-size: 10px; font-weight: 700; letter-spacing: .5px; }
.itk-dot-on ~ .itk-module-status { color: #00a32a; }
.itk-dot-off ~ .itk-module-status { color: #c3c4c7; }
/* ── Log tables ───────────────────────────────────────────── */
.itk-log-page {}
.itk-filters {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
margin-bottom: 12px;
}
.itk-filters input[type=text],
.itk-filters select { height: 32px; padding: 0 8px; }
.itk-count { color: #646970; font-size: 13px; margin: 0 0 8px; }
.itk-log-table { font-size: 12px; }
.itk-log-table th { white-space: nowrap; }
.itk-nowrap { white-space: nowrap; }
.itk-ua { color: #646970; font-size: 11px; max-width: 220px; word-break: break-all; }
.itk-uri { font-size: 11px; color: #646970; max-width: 200px; word-break: break-all; }
.itk-no-results { text-align: center; padding: 20px; color: #646970; }
.itk-filter-link { font-size: 10px; color: #2271b1; text-decoration: none; }
.itk-filter-link:hover { text-decoration: underline; }
/* Badges */
.itk-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 3px;
font-size: 10px;
font-weight: 700;
letter-spacing: .5px;
text-transform: uppercase;
}
.itk-badge-block { background: #ffecec; color: #b32d2e; border: 1px solid #f7c5c5; }
.itk-badge-warn { background: #fef3cd; color: #856404; border: 1px solid #fde68a; }
.itk-badge-hp { background: #f3e8ff; color: #6e40c9; border: 1px solid #d4a9ff; }
/* Pager */
.itk-pager {
display: flex;
align-items: center;
gap: 8px;
margin: 12px 0;
font-size: 13px;
}
.itk-pager span { color: #646970; }
/* Danger button */
.itk-btn-danger { color: #b32d2e !important; border-color: #b32d2e !important; }
.itk-btn-danger:hover { background: #b32d2e !important; color: #fff !important; }
/* ── Config editor ────────────────────────────────────────── */
.itk-config-editor {}
.itk-config-tabs {
display: flex;
gap: 4px;
margin-bottom: 16px;
flex-wrap: wrap;
}
.itk-config-tab {
padding: 6px 14px;
background: #f0f0f1;
border: 1px solid #c3c4c7;
border-radius: 4px;
text-decoration: none;
color: #2c3338;
font-size: 12px;
}
.itk-config-tab.active { background: #2271b1; color: #fff; border-color: #2271b1; }
.itk-config-editor-area { background: #fff; border: 1px solid #c3c4c7; border-radius: 6px; padding: 20px; }
.itk-config-textarea {
width: 100%;
font-family: 'Courier New', Courier, monospace;
font-size: 12px;
background: #0d1117;
color: #c9d1d9;
border: 1px solid #30363d;
border-radius: 4px;
padding: 12px;
resize: vertical;
box-sizing: border-box;
}
/* ── Toggle feedback ──────────────────────────────────────── */
.itk-toggle-saving { opacity: .6; pointer-events: none; }
.itk-toggle-saved { color: #00a32a; font-size: 11px; }
.itk-toggle-error { color: #b32d2e; font-size: 11px; }
/* ── Central API card ─────────────────────────────────────── */
.itk-api-card { grid-column: 1 / -1; }
.itk-api-desc { margin: -8px 0 14px; color: #646970; }
.itk-api-status-bar {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 10px;
margin-bottom: 14px;
padding: 8px 12px;
background: #f6f7f7;
border: 1px solid #e5e5e5;
border-radius: 4px;
}
.itk-api-badge {
display: inline-block;
padding: 3px 10px;
border-radius: 12px;
font-size: 11px;
font-weight: 700;
letter-spacing: .5px;
text-transform: uppercase;
}
.itk-api-ok { background: #d7f7e0; color: #1a7a3a; border: 1px solid #9de0b4; }
.itk-api-err { background: #ffecec; color: #b32d2e; border: 1px solid #f7c5c5; }
.itk-api-unknown { background: #f0f0f1; color: #646970; border: 1px solid #c3c4c7; }
.itk-api-time { font-size: 11px; color: #646970; }
.itk-api-err-msg { font-size: 11px; color: #b32d2e; font-style: italic; }
.itk-api-notice {
padding: 8px 12px;
border-radius: 4px;
font-size: 13px;
margin-bottom: 12px;
}
.itk-api-notice-ok { background: #d7f7e0; border: 1px solid #9de0b4; color: #1a7a3a; }
.itk-api-notice-err { background: #ffecec; border: 1px solid #f7c5c5; color: #b32d2e; }
.itk-api-table { margin-top: 0 !important; }
.itk-api-table th { width: 130px; }
.itk-api-form-actions { margin-top: 4px; display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.itk-api-footer {
margin-top: 16px;
padding-top: 14px;
border-top: 1px solid #e5e5e5;
display: flex;
flex-wrap: wrap;
gap: 12px 30px;
align-items: flex-start;
}
.itk-api-queue-row,
.itk-api-history-row { font-size: 13px; display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.itk-api-rem { color: #646970; font-size: 12px; }