:root { --bg: #0f1115; --panel: #171a21; --border: #262b36; --text: #e6e9ef; --muted: #8b93a7; --accent: #4f7cff; --accent-hover: #6a90ff; --danger: #e5484d; --success: #3ecf8e; } * { box-sizing: border-box; } body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; background: var(--bg); color: var(--text); } .auth-wrapper { min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 24px; } .auth-card { width: 100%; max-width: 380px; background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 32px; } .auth-card h1 { margin: 0 0 4px; font-size: 22px; } .auth-card p.subtitle { margin: 0 0 24px; color: var(--muted); font-size: 14px; } label { display: block; font-size: 13px; margin-bottom: 6px; color: var(--muted); } input, select { width: 100%; padding: 10px 12px; margin-bottom: 16px; border-radius: 8px; border: 1px solid var(--border); background: #0f1115; color: var(--text); font-size: 14px; } select { appearance: none; -webkit-appearance: none; -moz-appearance: none; /* Chevron stroke color is #8b93a7, matching --muted (data URIs can't reference CSS variables). */ background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238b93a7' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right 10px center; background-size: 16px; padding-right: 32px; } select option { background: var(--panel); color: var(--text); } input:focus, select:focus { outline: none; border-color: var(--accent); } button { cursor: pointer; border: none; border-radius: 8px; font-size: 14px; font-weight: 600; padding: 10px 16px; } button.primary { width: 100%; background: var(--accent); color: #fff; } button.primary:hover { background: var(--accent-hover); } button.secondary { background: transparent; border: 1px solid var(--border); color: var(--text); } button.danger { background: var(--danger); color: #fff; } .error { background: rgba(229, 72, 77, 0.12); border: 1px solid rgba(229, 72, 77, 0.4); color: #ff9a9c; padding: 8px 12px; border-radius: 8px; font-size: 13px; margin-bottom: 16px; display: none; } .error.visible { display: block; } .switch-link { text-align: center; margin-top: 16px; font-size: 13px; color: var(--muted); } .switch-link a { color: var(--accent); text-decoration: none; } /* Dashboard */ .app-shell { display: flex; min-height: 100vh; } .sidebar { width: 260px; background: var(--panel); border-right: 1px solid var(--border); padding: 24px 16px; display: flex; flex-direction: column; } .sidebar h2 { font-size: 16px; margin: 0 0 24px; } .sidebar .user-info { color: var(--muted); font-size: 13px; margin-bottom: 8px; } .place-list { list-style: none; margin: 0; padding: 0; flex: 1; overflow-y: auto; } .place-list li { padding: 10px 12px; border-radius: 8px; cursor: pointer; font-size: 14px; margin-bottom: 4px; color: var(--muted); display: flex; flex-direction: column; gap: 2px; } .place-list-id { font-size: 14px; } .place-list-owner { font-size: 11px; color: var(--muted); opacity: 0.75; } .place-list li:hover { background: rgba(255, 255, 255, 0.04); } .place-list li.active { background: rgba(79, 124, 255, 0.15); color: var(--text); } .main { flex: 1; padding: 32px 40px; overflow-y: auto; } .main-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 24px; } .main-header h1 { margin: 0; font-size: 20px; } .card { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 16px; margin-bottom: 14px; } .card h3 { margin-top: 0; } .card-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; } .card-header h3 { margin: 0; } .card-header-form { flex-wrap: nowrap; } .card-header-form .field-group { flex: none; min-width: 180px; } .readers-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px; } .reader-card { background: #0f1115; border: 1px solid var(--border); border-radius: 10px; padding: 16px; min-width: 0; } .reader-card .reader-name { font-weight: 600; margin-bottom: 4px; } .reader-card .reader-id { color: var(--muted); font-size: 12px; margin-bottom: 12px; } .reader-card .field { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; font-size: 13px; } .reader-card .field input[type="number"], .reader-card .field select { width: 90px; margin: 0; padding: 6px 8px; } .reader-card .field select { /* Keep room for the chevron icon within the narrow 90px width. */ padding-right: 28px; } .reader-card .actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; } .reader-card .actions button { flex: 1 1 calc(50% - 4px); padding: 10px 8px; white-space: nowrap; } .badge { display: inline-block; padding: 2px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; } .badge.on { background: rgba(62, 207, 142, 0.15); color: var(--success); } .badge.off { background: rgba(229, 72, 77, 0.15); color: var(--danger); } .empty-state { color: var(--muted); font-size: 14px; text-align: center; padding: 40px 0; } .inline-form { display: flex; gap: 8px; flex-wrap: wrap; align-items: flex-end; } .inline-form .field-group { flex: 1; min-width: 140px; } .inline-form .field-group label { margin-bottom: 4px; } .inline-form input { margin-bottom: 0; } .inline-form button { width: auto; white-space: nowrap; } .hidden { display: none !important; } .modal-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.6); display: flex; align-items: center; justify-content: center; padding: 24px; z-index: 100; } .modal { width: 100%; max-width: 560px; max-height: 85vh; overflow-y: auto; background: var(--bg); border: 1px solid var(--border); border-radius: 12px; padding: 24px; } .modal-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 20px; } .modal-header h2 { margin: 0; font-size: 18px; } .acl-list { list-style: none; margin: 0; padding: 0; } .acl-entry { display: flex; align-items: center; gap: 12px; padding: 10px 0; border-bottom: 1px solid var(--border); font-size: 14px; } .acl-entry:last-child { border-bottom: none; } .acl-entry .acl-description { flex: 1; color: var(--text); } .badge.type-badge { background: rgba(79, 124, 255, 0.15); color: var(--accent); white-space: nowrap; }