Files
Huntarr.io/frontend/static/css/style.css
2026-02-16 14:32:16 -05:00

1561 lines
34 KiB
CSS
Raw 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.
/* Design tokens are in variables.css — no duplicates here */
/* Base resets live in base.css — keep only layout & component styles here */
/* Layout Structure - COMPLETE OVERHAUL FOR GAP FIX */
.app-container {
display: flex;
height: 100vh;
width: 100%;
overflow: hidden; /* Prevent any overflow issues */
}
/* Sidebar styles moved to sidebar.css */
.main-content {
flex: 1;
display: flex;
flex-direction: column;
height: 100vh;
overflow: hidden;
min-width: 0;
position: relative;
}
/* Indigo edge line on right for design consistency */
.main-content::after {
content: '';
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 2px;
background: linear-gradient(180deg,
rgba(99, 102, 241, 0.15) 0%,
rgba(99, 102, 241, 0.5) 20%,
#6366f1 40%,
#818cf8 50%,
#6366f1 60%,
rgba(99, 102, 241, 0.5) 80%,
rgba(99, 102, 241, 0.15) 100%
);
background-size: 100% 100%;
z-index: 1000;
opacity: 0.85;
pointer-events: none;
}
/* Top Bar - base structure (main styling in topbar.html component) */
.top-bar {
flex-shrink: 0; /* Prevent top-bar from shrinking */
position: relative;
}
/* CRITICAL FIX: Content sections must fill remaining space exactly */
.content-section {
display: none;
flex: 1; /* Take all remaining space after top-bar */
overflow-y: auto;
padding: 15px var(--page-gap, 15px) 15px;
box-sizing: border-box;
height: 0; /* Force flex to calculate height */
background: linear-gradient(180deg, rgba(15, 23, 42, 0.95) 0%, rgba(15, 23, 42, 0.85) 100%) !important;
}
.content-section.active {
display: flex;
flex-direction: column;
}
/* Content boundary — see content-boundary.css (single source of truth) */
/* Blue slate background for main content area (Home, Media Hunt, etc.) */
body:has(.app-container) .main-content,
.app-container .main-content {
background-color: #0f172a !important;
}
body:has(.app-container) {
background-color: #0f172a !important;
}
/* REMOVED DUPLICATE - Using flex-based approach above */
/* Sidebar, logo, nav, theme switch all moved to sidebar.css */
/* Main Content - REMOVED DUPLICATE */
/* This section was causing conflicts - removed */
/* REMOVED DUPLICATE - Using flex-based approach above */
.page-title {
font-size: 1.3rem;
font-weight: 600;
color: var(--text-primary);
}
/* User info & logout - base styles (main styling in topbar.html component) */
/* Responsive adjustments for mobile view - FLEX BASED */
@media (max-width: 768px) {
.content-section {
/* Flex approach handles height automatically */
padding: 15px 15px 15px; /* Keep top gap on mobile */
}
.logs {
height: calc(100vh - 120px); /* Adjust logs container for mobile */
}
/* Title alignment with version info */
.page-title {
font-size: 1.3rem;
font-weight: 600;
display: flex;
align-items: center;
height: 100%;
margin: 0;
padding: 0;
}
}
/* Phone-specific height adjustments - FLEX BASED */
@media (max-width: 480px) {
.content-section {
/* Flex approach handles height automatically */
padding: 10px; /* Even less padding on phones */
}
.logs {
height: calc(100vh - 140px); /* Adjust logs container for phone */
}
.page-title {
font-size: 1.2rem; /* Slightly smaller font for phone */
}
}
/* Cards */
.dashboard-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
/* .card — glass surface defined in components.css.
Only keep hover/fallback here for specificity. */
.card {
background: var(--glass-bg, rgba(17, 24, 39, 0.65));
backdrop-filter: blur(var(--glass-blur, 12px));
-webkit-backdrop-filter: blur(var(--glass-blur, 12px));
border-radius: var(--radius-lg);
box-shadow: var(--glass-shadow);
padding: 20px;
border: 1px solid var(--glass-border, rgba(99, 102, 241, 0.08));
transition: border-color var(--transition-base), box-shadow var(--transition-base);
}
.card:hover {
border-color: rgba(99, 102, 241, 0.14);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.25), 0 0 0 1px rgba(99, 102, 241, 0.06);
}
.card h2, .card h3 {
margin-bottom: 15px;
font-weight: 600;
display: flex;
align-items: center;
}
.card h2 i, .card h3 i {
margin-right: 10px;
color: var(--accent-color);
}
.welcome-card {
grid-column: 1 / -1;
}
/* Status Card */
.status-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.status-item {
display: flex;
justify-content: space-between;
align-items: center;
}
.status-badge {
padding: 6px 12px;
border-radius: 20px;
font-size: 13px;
font-weight: 500;
display: flex;
align-items: center;
}
.status-badge i {
margin-right: 5px;
}
.status-badge.connected {
background-color: rgba(34, 197, 94, 0.12);
color: var(--status-connected);
}
.status-badge.not-connected {
background-color: rgba(239, 68, 68, 0.12);
color: var(--status-not-connected);
}
/* Stats Card */
.stats-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.stat-item {
display: flex;
flex-direction: column;
align-items: center;
padding: 12px;
border-radius: var(--radius-md);
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color-light);
transition: transform var(--transition-fast);
}
.stat-item:hover {
transform: translateY(-1px);
}
.stat-value {
font-size: 1.8rem;
font-weight: bold;
color: var(--accent-color);
}
.stat-label {
font-size: 0.9rem;
color: var(--text-secondary);
margin-top: 5px;
}
/* Action Card */
.action-buttons {
display: flex;
gap: 10px;
}
.action-button {
padding: 12px 20px;
border-radius: var(--radius-md);
border: none;
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
flex: 1;
transition: background-color var(--transition-base), transform var(--transition-fast), box-shadow var(--transition-base);
}
.action-button i {
margin-right: 8px;
}
.action-button.start {
background-color: var(--button-success-bg);
color: white;
}
.action-button.start:hover {
background-color: var(--button-success-hover);
transform: translateY(-2px);
}
.action-button.stop {
background-color: var(--button-danger-bg);
color: white;
}
.action-button.stop:hover {
background-color: var(--button-danger-hover);
transform: translateY(-2px);
}
/* Small action button */
.action-button-small {
padding: 8px 12px;
border-radius: var(--radius-sm);
border: none;
font-weight: 600;
background-color: var(--button-danger-bg);
color: white;
font-size: 0.9em;
cursor: pointer;
transition: background-color var(--transition-base), transform var(--transition-fast);
}
.action-button-small:hover {
background-color: var(--button-danger-hover);
transform: translateY(-1px);
}
/* Danger action button */
.action-button.danger {
background-color: var(--button-danger-bg);
color: #fff;
border: none;
border-radius: var(--radius-sm);
padding: 6px 12px;
font-size: 13px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 5px;
transition: background-color var(--transition-base), transform var(--transition-fast);
width: fit-content;
max-width: max-content;
white-space: nowrap;
}
.action-button.danger:hover {
background-color: var(--button-danger-hover);
}
.action-button.danger:active {
transform: translateY(0);
}
.action-button.danger i {
font-size: 12px;
margin-right: 1px;
}
/* Logs Section */
.section-header {
margin-bottom: 20px;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 15px;
}
.app-tabs, .log-controls {
display: flex;
gap: 10px;
align-items: center;
}
.app-tab, .settings-tab {
padding: 8px 20px;
background-color: var(--bg-tertiary);
border: 1px solid transparent;
border-radius: 20px;
color: var(--text-muted);
font-weight: 500;
transition: all var(--transition-base);
}
.app-tab.active, .settings-tab.active {
background-color: var(--accent-color);
color: white;
}
.app-tab:hover, .settings-tab:hover {
background-color: var(--accent-hover);
color: white;
}
.log-options {
display: flex;
align-items: center;
gap: 15px;
}
.auto-scroll {
display: flex;
align-items: center;
gap: 5px;
font-size: 14px;
}
.clear-button {
padding: 6px 12px;
background-color: var(--button-danger-bg);
color: white;
border: none;
border-radius: 8px;
display: flex;
align-items: center;
gap: 5px;
transition: background-color 0.3s;
}
.clear-button:hover {
background-color: var(--button-danger-hover);
}
.logs {
height: calc(100vh - 160px); /* Account for top-bar + section headers + padding */
background-color: var(--log-bg);
border: 1px solid var(--log-border);
border-radius: 8px;
padding: 15px;
overflow-y: auto;
font-family: monospace;
white-space: pre-wrap;
word-wrap: break-word;
line-height: 1.5;
font-size: 14px;
box-sizing: border-box;
}
.log-entry {
margin-bottom: 5px;
padding: 2px 0;
}
.log-info {
color: var(--info-color);
}
.log-warning {
color: var(--warning-color);
}
.log-error {
color: var(--error-color);
}
.log-debug {
color: var(--debug-color);
}
.status-connected {
color: var(--status-connected);
font-weight: 600;
}
.status-disconnected {
color: var(--status-not-connected);
font-weight: 600;
}
/* Settings Section */
.settings-actions {
display: flex;
gap: 10px;
}
.save-button, .reset-button {
padding: 8px 16px;
border: none;
border-radius: var(--radius-md);
font-weight: 500;
display: flex;
align-items: center;
gap: 6px;
transition: background-color var(--transition-base), transform var(--transition-fast), box-shadow var(--transition-base);
}
.save-button:hover, .reset-button:hover {
transform: translateY(-1px);
}
.save-button {
background-color: var(--button-success-bg);
color: white;
}
.save-button:hover {
background-color: var(--button-success-hover);
}
.reset-button {
background-color: var(--button-danger-bg);
color: white;
}
.reset-button:hover {
background-color: var(--button-danger-hover);
}
.settings-form {
padding: 0;
overflow-y: auto;
height: calc(100vh - 160px); /* Account for top-bar + section headers + padding */
box-sizing: border-box;
}
.app-settings-panel {
display: none;
}
.app-settings-panel.active {
display: block;
}
.settings-group {
background: var(--glass-bg, rgba(17, 24, 39, 0.65));
backdrop-filter: blur(var(--glass-blur, 12px));
-webkit-backdrop-filter: blur(var(--glass-blur, 12px));
border: 1px solid var(--glass-border, rgba(99, 102, 241, 0.08));
border-radius: 12px;
padding: 24px;
margin: 12px 0 20px 0;
position: relative;
}
.settings-group h3 {
margin: 0 0 18px 0;
padding: 0 0 12px 0;
border-bottom: 1px solid rgba(148, 163, 184, 0.12);
font-size: 1.1rem;
font-weight: 600;
color: #f1f5f9;
background: none;
box-shadow: none;
text-shadow: none;
}
.setting-item {
margin-bottom: 20px;
display: flex;
flex-wrap: wrap;
align-items: center;
}
.setting-item label {
width: 200px;
font-weight: 500;
margin-right: 15px;
}
/* Setting inputs — visual properties enforced by components.css.
Only layout overrides kept here. */
.setting-item input[type="text"],
.setting-item input[type="number"],
.setting-item input[type="password"] {
width: 300px;
padding: 10px 14px;
}
.setting-help {
width: 100%;
margin-top: 5px;
margin-left: 215px;
font-size: 13px;
color: var(--text-muted);
}
/* ==========================================================
Toggle Switch — SINGLE SOURCE OF TRUTH
All .toggle-switch / .toggle-slider definitions are HERE.
Do NOT redefine these in other CSS files or inline <style>
blocks. Override ONLY the checked background colour when
needed, scoped to a parent section ID.
Track : 44 × 24 px
Knob : 18 × 18 px, vertically centred (top: 3px)
Border: subtle gold / amber
========================================================== */
.toggle-switch {
position: relative;
display: block;
width: 44px;
min-width: 44px;
max-width: 44px;
height: 24px;
min-height: 24px;
max-height: 24px;
flex-shrink: 0;
flex-grow: 0;
margin: 0;
padding: 0;
border-radius: 12px;
cursor: pointer;
/* NO overflow:hidden — it clips the knob shadow asymmetrically
and makes the knob appear to droop. */
overflow: visible;
}
.toggle-switch input,
.toggle-switch input[type="checkbox"] {
opacity: 0;
width: 0;
height: 0;
position: absolute;
pointer-events: none;
}
.toggle-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
width: 44px;
height: 24px;
/* border-box so the 1px border is INSIDE the 24px height */
box-sizing: border-box;
background: var(--switch-bg, #334155);
border: 1px solid rgba(71, 85, 105, 0.3);
border-radius: 12px;
transition: background 0.25s ease, border-color 0.25s ease;
}
.toggle-slider:before {
position: absolute;
/* border-box on both the slider and the knob for consistency */
box-sizing: border-box;
content: "";
width: 18px;
height: 18px;
/* With border-box on the slider, the 1px border is inside the 24px.
The padding-box (where abs children are placed) is 22px tall.
Centre the 18px knob in 22px: (22 18) / 2 = 2px */
top: 2px;
left: 2px;
bottom: auto;
right: auto;
background: #e2e8f0;
border-radius: 50%;
transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
box-shadow: none;
}
input:checked + .toggle-slider {
background: #6366f1;
border-color: rgba(99, 102, 241, 0.5);
}
input:checked + .toggle-slider:before {
transform: translateX(20px);
background: #fff;
}
input:disabled + .toggle-slider {
opacity: 0.5;
cursor: not-allowed;
}
/* Stateful Management Styling */
.stateful-header-wrapper {
position: relative;
width: 100%;
margin-bottom: 25px;
padding-bottom: 15px;
border-bottom: 1px solid var(--border-color);
}
.stateful-header-wrapper h3 {
margin: 0;
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
padding-bottom: 15px;
}
.header-line {
display: none;
}
.stateful-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding-bottom: 10px;
border-bottom: 1px solid var(--border-color);
}
.stateful-title {
font-size: 16px;
font-weight: 600;
color: var(--text-primary);
}
.stateful-reset-btn {
padding: 8px 16px;
font-size: 13px;
font-weight: 500;
background-color: var(--button-danger-bg);
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
transition: background-color 0.2s ease;
white-space: nowrap;
}
.stateful-reset-btn:hover {
background-color: var(--button-danger-hover);
}
.info-container {
display: flex;
flex-direction: column;
gap: 12px;
padding: 12px;
background-color: var(--bg-tertiary);
border-radius: 6px;
margin-top: 10px;
}
.date-info-block {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 10px;
background-color: var(--bg-secondary);
border-radius: 8px;
border-left: 4px solid var(--accent-color);
}
.date-label {
font-weight: 500;
color: var(--text-secondary);
}
.date-value {
font-family: 'SF Mono', 'Fira Code', monospace;
font-size: 14px;
font-weight: 600;
color: var(--accent-color);
padding: 4px 8px;
background-color: rgba(99, 102, 241, 0.1);
border-radius: var(--radius-sm);
}
.reset-help {
margin-top: 8px;
font-style: italic;
color: var(--error-color);
font-size: 12px;
}
/* Settings Stateful Management */
.setting-info-block {
background-color: var(--bg-tertiary);
border: 1px solid var(--border-color);
border-radius: 8px;
padding: 15px;
margin: 10px 0;
}
.setting-info-block .info-row {
display: flex;
justify-content: space-between;
padding: 5px 0;
border-bottom: 1px solid var(--border-color);
}
.setting-info-block .info-row:last-child {
border-bottom: none;
}
.danger-button {
background-color: var(--button-danger-bg);
color: #fff;
border: none;
border-radius: 8px;
padding: 8px 15px;
cursor: pointer;
transition: background-color 0.3s;
}
.danger-button:hover {
background-color: var(--button-danger-hover);
}
/* Custom reset button that matches the screenshot exactly */
.danger-reset-button {
background-color: var(--button-danger-bg);
color: white;
border: none;
padding: 6px 12px;
border-radius: var(--radius-sm);
font-size: 13px;
font-weight: 500;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 4px;
transition: background-color 0.2s ease;
width: fit-content;
white-space: nowrap;
position: absolute;
top: 0;
right: 0;
}
.danger-reset-button:hover {
background-color: var(--button-danger-hover);
}
.danger-reset-button i {
font-size: 13px;
}
/* Make sure settings-group has the right positioning for absolute elements */
.settings-group {
position: relative;
}
/* Responsive Adjustments */
/* Mobile layout — sidebar hidden, full-width content (see mobile.css) */
@media (max-width: 768px) {
.main-content {
margin-left: 0 !important;
width: 100% !important;
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
}
@media (max-width: 480px) {
.community-links {
flex-direction: column;
}
.community-link-card {
width: 100%;
}
.app-stats-grid {
grid-template-columns: 1fr;
}
.sponsors-list {
grid-template-columns: repeat(2, 1fr);
}
/* Version info handled in topbar.html component */
}
/* Footer */
.footer {
text-align: center;
padding: 20px;
margin-top: 20px;
background-color: var(--bg-secondary);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
color: var(--text-muted);
font-size: 14px;
border: 1px solid var(--border-color-light);
}
.footer p {
margin: 5px 0;
}
.footer a {
color: var(--accent-color);
text-decoration: none;
font-weight: 500;
transition: color 0.3s;
}
.footer a:hover {
text-decoration: underline;
color: var(--accent-hover);
}
/* Notification styles for async operations */
.notification {
position: fixed;
top: 20px;
right: 20px;
padding: 15px 25px;
border-radius: var(--radius-lg);
color: white;
font-weight: 500;
box-shadow: var(--shadow-lg);
z-index: 1000;
transform: translateY(-20px);
opacity: 0;
transition: transform var(--transition-base), opacity var(--transition-base);
backdrop-filter: blur(8px);
}
.notification.show {
transform: translateY(0);
opacity: 1;
}
.notification.success {
background-color: var(--success-color);
}
.notification.error {
background-color: var(--error-color);
}
.notification.info {
background-color: var(--info-color);
}
/* Login Page Styles — now in dedicated login.css */
/* Section header with action button */
.section-header-with-action {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
position: relative;
border-bottom: 1px solid var(--border-color);
padding-bottom: 10px;
}
.section-header-with-action h3 {
margin: 0;
color: var(--text-primary);
font-size: 18px;
font-weight: 600;
}
.section-header-with-action .icon-button {
padding: 7px 12px;
font-size: 13px;
font-weight: 500;
background-color: var(--button-danger-bg);
color: white;
border: none;
border-radius: 8px;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
gap: 5px;
margin-left: auto; /* Push to the right edge */
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
}
.section-header-with-action .icon-button i {
font-size: 14px;
}
.section-header-with-action .icon-button:hover {
background-color: var(--button-danger-hover);
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.section-header-with-action .icon-button:active {
transform: translateY(0);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
}
/* Information Icon Styling */
.info-icon {
display: inline-flex !important;
align-items: center !important;
justify-content: center !important;
margin-right: 30px !important;
margin-left: 0 !important;
padding-right: 10px !important;
color: var(--accent-color) !important;
transition: all 0.2s ease !important;
text-decoration: none !important;
position: relative !important;
}
.info-icon:hover {
color: var(--accent-hover) !important;
transform: scale(1.1) !important;
}
.info-icon i {
font-size: 14px !important;
}
/* Add spacing on labels with info icons */
label .info-icon + span,
label .info-icon ~ text {
margin-left: 5px !important;
}
/* Fix for trash icon positioning */
.fa-trash-alt {
display: inline-block;
margin-right: 2px;
}
/* Reset button in top right corner */
.top-right-button {
position: absolute !important;
top: 0;
right: 0;
margin: 0 !important;
padding: 6px 10px !important;
font-size: 12px !important;
border-radius: 3px !important;
}
.top-right-button i {
margin-right: 3px;
}
/* Stateful management header row with reset button */
.stateful-header-row {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 12px;
margin-bottom: 20px;
border-bottom: 1px solid var(--border-color);
width: 100%;
}
.stateful-header-row h3 {
margin: 0;
font-size: 18px;
font-weight: 600;
color: var(--text-primary);
}
/* Reset button styling exactly matching the screenshot */
#reset_stateful_btn {
background-color: var(--button-danger-bg);
color: white;
border: none;
padding: 5px 12px;
border-radius: var(--radius-sm);
font-size: 13px;
font-weight: 500;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 5px;
transition: background-color 0.2s ease;
}
#reset_stateful_btn:hover {
background-color: var(--button-danger-hover);
}
#reset_stateful_btn i {
font-size: 13px;
}
/* Apps Section */
/* Use the existing log dropdown styles for app section. No custom CSS needed for the dropdown itself. */
/* App settings content styling */
.settings-content {
margin-top: 20px;
}
.app-apps-panel {
display: none;
width: 100%;
}
.app-apps-panel.active {
display: block;
}
.app-apps-panel.section-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 15px 0px;
margin-bottom: 20px;
background-color: transparent !important;
border: none !important;
}
.instance-panel, .instance-item {
background-color: var(--bg-secondary, #2c2c2c);
border: 1px solid var(--border-color, #3c3c3c);
border-radius: 8px;
padding: 15px;
margin-bottom: 15px;
}
/* Tag input system for malicious file detection */
.tag-input-container {
background: #1f2937;
border: 1px solid rgba(90, 109, 137, 0.3);
border-radius: 8px;
padding: 10px;
min-height: 100px;
max-height: 200px;
overflow-y: auto;
}
.tag-list {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 10px;
min-height: 32px;
}
.tag-item {
background: linear-gradient(135deg, #312e81 0%, #6366f1 100%);
border: 1px solid rgba(99, 102, 241, 0.3);
border-radius: var(--radius-sm);
padding: 6px 10px;
display: flex;
align-items: center;
gap: 8px;
color: #e5e7eb;
font-size: 13px;
font-weight: 500;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
transition: all 0.2s ease;
}
.tag-item:hover {
background: linear-gradient(135deg, #4338ca 0%, #818cf8 100%);
border-color: rgba(99, 102, 241, 0.5);
transform: translateY(-1px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
}
.tag-remove {
background: none;
border: none;
color: #ef4444;
cursor: pointer;
padding: 0;
width: 16px;
height: 16px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
font-size: 12px;
transition: all 0.2s ease;
}
.tag-remove:hover {
background: rgba(239, 68, 68, 0.2);
color: #fca5a5;
transform: scale(1.1);
}
.tag-input-wrapper {
display: flex;
gap: 8px;
align-items: center;
}
.tag-input {
flex: 1;
background: rgba(15, 23, 42, 0.6);
border: 1px solid var(--border-color);
border-radius: var(--radius-sm);
padding: 8px 12px;
color: var(--text-secondary);
font-size: 14px;
outline: none;
transition: all var(--transition-base);
}
.tag-input:focus {
border-color: var(--accent-color);
background: rgba(15, 23, 42, 0.8);
box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12);
}
.tag-input::placeholder {
color: #9ca3af;
}
.tag-add-btn {
background: linear-gradient(135deg, #065f46 0%, #059669 100%);
border: 1px solid rgba(90, 109, 137, 0.3);
border-radius: 6px;
padding: 8px 12px;
color: #d1fae5;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
min-width: 40px;
transition: all 0.2s ease;
}
.tag-add-btn:hover {
background: linear-gradient(135deg, #047857 0%, #10b981 100%);
border-color: rgba(90, 109, 137, 0.5);
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.tag-add-btn:active {
transform: translateY(0);
}
/* Empty state for tag lists */
.tag-list:empty::before {
content: "No items added yet";
color: #6b7280;
font-style: italic;
font-size: 13px;
padding: 8px 0;
display: block;
}
.instance-header {
display: flex;
align-items: center;
margin-bottom: 15px;
gap: 10px;
padding-bottom: 10px;
border-bottom: 1px solid var(--border-color, #3c3c3c);
}
/* .instance-name — visual properties enforced by components.css */
.instance-name {
flex: 1;
padding: 8px;
font-size: 14px;
}
.form-field {
margin-bottom: 15px;
}
.form-field label {
display: block;
margin-bottom: 5px;
font-weight: 400;
color: var(--text-primary, #f0f0f0);
font-size: 14px;
}
/* .form-field input — visual properties enforced by components.css */
.form-field input {
padding: 8px;
width: 100%;
max-width: 500px;
font-size: 14px;
}
/* Button styling */
.add-instance-btn {
background-color: var(--accent-color, #6366f1);
color: white;
border: none;
padding: 8px 16px;
border-radius: 8px;
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 14px;
margin-top: 15px;
}
.add-instance-btn:hover {
background-color: var(--accent-hover, #0069d9);
}
.remove-instance-btn {
background-color: var(--button-danger-bg);
color: white;
border: none;
padding: 6px 12px;
border-radius: var(--radius-sm);
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 13px;
margin-top: 5px;
transition: background-color var(--transition-base), transform var(--transition-fast);
}
.remove-instance-btn:hover {
background-color: var(--button-danger-hover);
transform: translateY(-1px);
}
.test-connection-btn {
background-color: var(--button-success-bg);
color: white;
border: none;
padding: 6px 12px;
border-radius: var(--radius-sm);
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 13px;
margin-top: 5px;
transition: background-color var(--transition-base), transform var(--transition-fast);
}
.test-connection-btn:hover {
background-color: var(--button-success-hover);
transform: translateY(-1px);
}
.test-connection-btn.test-success {
background-color: var(--button-success-bg);
}
.test-connection-btn.test-failed {
background-color: var(--button-danger-bg);
}
.test-connection-btn:disabled {
opacity: 0.7;
cursor: not-allowed;
}
/* Match styling with existing settings UI */
#appsSection .section-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
background: none !important;
background-color: transparent !important;
border: none !important;
padding: 0 !important;
}
#appsSection .settings-group {
margin-top: 16px;
margin-bottom: 24px;
background: rgba(15, 23, 42, 0.4);
border-radius: 12px;
padding: 24px;
box-shadow: 0 6px 15px rgba(0, 0, 0, 0.15);
position: relative;
border: 1px solid rgba(90, 109, 137, 0.1);
overflow: hidden;
}
#appsSection .settings-group::before {
display: none;
}
#appsSection .settings-group-header {
margin-bottom: 15px;
padding-bottom: 10px;
border-bottom: 1px solid var(--border-color, #363636);
font-size: 16px;
font-weight: 500;
color: var(--text-primary, #f0f0f0);
}
.loading-panel {
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
color: var(--text-primary, #f0f0f0);
gap: 10px;
}
.error-panel {
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
color: var(--error-color);
gap: 10px;
}
/* App content panel styling - eliminate box effect */
.app-content-panel {
border: none;
box-shadow: none;
background: transparent;
padding: 0;
}
/* Style the direct children of app panels that are creating nested boxes */
.app-apps-panel > .settings-group {
border: none;
box-shadow: none;
background: transparent;
padding: 0;
}
/* Instance panel styling */
.instance-panel {
background: var(--glass-bg, rgba(17, 24, 39, 0.65));
backdrop-filter: blur(var(--glass-blur, 12px));
-webkit-backdrop-filter: blur(var(--glass-blur, 12px));
border-radius: 8px;
padding: 15px;
margin-bottom: 15px;
border: 1px solid var(--glass-border, rgba(99, 102, 241, 0.08));
}/
* Prowlarr Statistics Styling */
.statistics-content {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 12px;
padding: 15px;
}
.stat-card {
background: var(--bg-tertiary);
border-radius: 8px;
padding: 12px;
text-align: center;
border: 1px solid var(--border-color);
transition: all 0.2s ease;
}
.stat-card:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-md);
}
.stat-label {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-muted);
margin-bottom: 6px;
line-height: 1.2;
}
.stat-value {
font-size: 18px;
font-weight: 700;
color: var(--text-primary);
line-height: 1.1;
}
.stat-value.success {
color: var(--success-color);
}
.stat-value.warning {
color: var(--warning-color);
}
.stat-value.error {
color: var(--error-color);
}
/* Responsive adjustments */
@media (max-width: 768px) {
.statistics-content {
grid-template-columns: repeat(2, 1fr);
gap: 8px;
padding: 10px;
}
.stat-card {
padding: 8px;
}
.stat-label {
font-size: 10px;
margin-bottom: 4px;
}
.stat-value {
font-size: 16px;
}
}
/* Disabled Field Styles */
.field-disabled {
opacity: 0.5 !important;
cursor: not-allowed !important;
pointer-events: none !important;
filter: grayscale(0.5);
}
.toggle-disabled {
opacity: 0.5 !important;
cursor: not-allowed !important;
pointer-events: none !important;
}
.toggle-disabled .toggle-slider {
cursor: not-allowed !important;
}
/* Daughter's Sponsor — moved to sidebar; banners hidden on all pages */
.app-banners-row {
display: none !important;
}
.app-sponsor-banner {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 14px;
background: linear-gradient(135deg, rgba(30, 41, 59, 0.6) 0%, rgba(15, 23, 42, 0.8) 100%);
border: 1px solid rgba(148, 163, 184, 0.12);
border-radius: 10px;
font-size: 12px;
text-decoration: none;
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
white-space: nowrap;
line-height: 1.3;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
position: relative;
overflow: hidden;
}
.app-sponsor-banner::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.08), transparent);
opacity: 0.6;
}
.app-sponsor-banner .sponsor-label {
color: rgba(148, 163, 184, 0.75);
font-weight: 500;
font-size: 11px;
letter-spacing: 0.3px;
}
.app-sponsor-banner .sponsor-name {
font-weight: 600;
color: #a5b4fc;
font-size: 12px;
}
.app-sponsor-banner:hover {
background: linear-gradient(135deg, rgba(30, 41, 59, 0.85) 0%, rgba(15, 23, 42, 0.95) 100%);
border-color: rgba(99, 102, 241, 0.25);
box-shadow: 0 4px 16px rgba(99, 102, 241, 0.12);
transform: translateY(-1px);
}
.app-sponsor-banner:hover .sponsor-name {
color: #c7d2fe;
}
/* Daughter's Sponsor — warm gold accent */
.app-sponsor-banner {
border-left: 3px solid rgba(251, 191, 36, 0.5);
}
.app-sponsor-banner:hover {
border-left-color: rgba(251, 191, 36, 0.8);
}
/* Hide on mobile */
@media (max-width: 768px) {
.app-sponsor-banner,
.app-banners-row { display: none !important; }
}