diff --git a/api/audit_log.php b/api/audit_log.php index 3bf4ae4..ed807c8 100644 --- a/api/audit_log.php +++ b/api/audit_log.php @@ -71,8 +71,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { // Normal JSON response for filtered logs try { // Get pagination parameters - $page = isset($_GET['page']) ? (int)$_GET['page'] : 1; - $limit = isset($_GET['limit']) ? (int)$_GET['limit'] : 50; + $page = max(1, (int)($_GET['page'] ?? 1)); + $limit = min(500, max(1, (int)($_GET['limit'] ?? 50))); $offset = ($page - 1) * $limit; // Build filters diff --git a/assets/css/base.css b/assets/css/base.css index b2184c4..c2385a4 100644 --- a/assets/css/base.css +++ b/assets/css/base.css @@ -85,6 +85,8 @@ --lt-cyan: var(--accent-cyan); --lt-success: var(--accent-green); --lt-text-primary: var(--accent-green); + --lt-border: var(--border-color); + --lt-surface: var(--bg-card); /* Legacy aliases — keeps all existing component HTML working */ --terminal-green: var(--accent-green); @@ -966,11 +968,26 @@ select option:checked { clip-path: none; } +/* Compact size variants for inline filter bars and tight layouts */ +.lt-select-sm { + font-size: 0.7rem; + padding: 0.25rem 1.6rem 0.25rem 0.5rem; + width: auto; +} +.lt-input-sm { + font-size: 0.7rem; + padding: 0.25rem 0.5rem; + width: auto; +} + .lt-form-hint { font-size: 0.63rem; color: var(--text-muted); letter-spacing: 0.04em; } +.lt-form-hint--warn { color: var(--accent-amber); } + +.lt-font-mono { font-family: var(--font-mono); } /* Search */ .lt-search { position: relative; } @@ -1586,12 +1603,14 @@ select option:checked { } .lt-msg::before { flex-shrink: 0; font-weight: 700; } -.lt-msg-error { color: var(--accent-red); background: var(--accent-red-dim); border-left-color: var(--accent-red); } +.lt-msg-error, +.lt-msg-danger { color: var(--accent-red); background: var(--accent-red-dim); border-left-color: var(--accent-red); } .lt-msg-success { color: var(--accent-green); background: var(--accent-green-dim); border-left-color: var(--accent-green); } .lt-msg-warning { color: var(--accent-amber); background: var(--accent-amber-dim); border-left-color: var(--accent-amber); } .lt-msg-info { color: var(--accent-cyan); background: var(--accent-cyan-dim); border-left-color: var(--accent-cyan); } -.lt-msg-error::before { content: '✗'; } +.lt-msg-error::before, +.lt-msg-danger::before { content: '✗'; } .lt-msg-success::before { content: '✓'; } .lt-msg-warning::before { content: '!'; } .lt-msg-info::before { content: 'i'; } diff --git a/views/admin/ApiKeysView.php b/views/admin/ApiKeysView.php index 06c10a7..ffc01c4 100644 --- a/views/admin/ApiKeysView.php +++ b/views/admin/ApiKeysView.php @@ -75,7 +75,7 @@ include __DIR__ . '/../../views/layout_header.php'; No API keys found. Generate one above. - + @@ -96,7 +96,7 @@ include __DIR__ . '/../../views/layout_header.php'; + data-action="revoke-key" data-id="">REVOKE @@ -173,10 +173,12 @@ document.getElementById('generateKeyForm').addEventListener('submit', function ( }); function copyApiKey() { - var input = document.getElementById('newKeyValue'); - input.select(); - document.execCommand('copy'); - lt.toast.success('Copied to clipboard!'); + var val = document.getElementById('newKeyValue').value; + lt.copy(val).then(function () { + lt.toast.success('Copied to clipboard!'); + }).catch(function () { + lt.toast.error('Copy failed — select the key manually'); + }); } function revokeKey(keyId) { diff --git a/views/admin/AuditLogView.php b/views/admin/AuditLogView.php index efef1c4..193c6be 100644 --- a/views/admin/AuditLogView.php +++ b/views/admin/AuditLogView.php @@ -38,7 +38,7 @@ include __DIR__ . '/../../views/layout_header.php';