mirror of
https://github.com/StuffAnThings/qbit_manage.git
synced 2025-10-11 06:16:35 +08:00
# Requirements Updated - qbittorrent-api==2025.7.0 - fastapi==0.116.1 # New Features - **Uncategorized Category**: Allow multiple paths for Uncategorized category and add error handling (Thanks to @cat-of-wisdom #849) - **Config Auto Backup and Cleanup**: implement automatic backup rotation (30 most recent backups per config) and cleanup - **Web UI**: add base URL support for reverse proxy deployments (Fixes #871) - **Share Limits**: add option to preserve upload speed limits when minimums unmet (New config option `reset_upload_speed_on_unmet_minimums`) (Fixes #835, #791) # Improvements - Optimize webUI form rendering - Better centralized error handling for qbitorrent API operations - **Web UI**: add editable group names to share limit modal # Bug Fixes - Fix bug in remove orphaned to notify when there are 0 orphaned files - Fixes [Bug]: Cannot run on Python 3.9.18 #864 - fix(qbit): add error handling for qBittorrent API operations **Full Changelog**: https://github.com/StuffAnThings/qbit_manage/compare/v4.5.0...v4.5.1 --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: cat-of-wisdom <217637421+cat-of-wisdom@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
330 lines
8.2 KiB
CSS
Executable file
330 lines
8.2 KiB
CSS
Executable file
/* Theme System - Dark and Light Mode Support */
|
|
|
|
/* Light Theme (Default) */
|
|
:root {
|
|
/* Primary Colors */
|
|
--primary-color: #3b82f6;
|
|
--primary-hover: #2563eb;
|
|
--primary-light: #dbeafe;
|
|
--primary-dark: #1d4ed8;
|
|
|
|
/* Secondary Colors */
|
|
--secondary-color: #64748b;
|
|
--secondary-hover: #475569;
|
|
--secondary-light: #f1f5f9;
|
|
--secondary-dark: #334155;
|
|
|
|
/* Status Colors */
|
|
--success-color: #10b981;
|
|
--success-hover: #059669;
|
|
--success-light: #d1fae5;
|
|
--warning-color: #f59e0b;
|
|
--warning-hover: #d97706;
|
|
--warning-light: #fef3c7;
|
|
--error-color: #ef4444;
|
|
--error-hover: #dc2626;
|
|
--error-light: #fee2e2;
|
|
--info-color: #06b6d4;
|
|
--info-hover: #0891b2;
|
|
--info-light: #cffafe;
|
|
|
|
/* Background Colors */
|
|
--bg-primary: #ffffff;
|
|
--bg-secondary: #f8fafc;
|
|
--bg-tertiary: #f1f5f9;
|
|
--bg-accent: #e2e8f0;
|
|
--bg-hover: #f1f5f9;
|
|
--bg-active: #e2e8f0;
|
|
--bg-overlay: rgba(0, 0, 0, 0.5);
|
|
|
|
/* Text Colors */
|
|
--text-primary: #1e293b;
|
|
--text-secondary: #64748b;
|
|
--text-muted: #94a3b8;
|
|
--text-inverse: #ffffff;
|
|
--text-accent: #3b82f6;
|
|
|
|
/* Border Colors */
|
|
--border-color: #e2e8f0;
|
|
--border-hover: #cbd5e1;
|
|
--border-focus: #3b82f6;
|
|
--border-error: #ef4444;
|
|
--border-success: #10b981;
|
|
|
|
/* Card Colors */
|
|
--card-bg: #ffffff;
|
|
--card-border: #e2e8f0;
|
|
--card-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
|
|
--card-hover-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
|
|
|
|
/* Input Colors */
|
|
--input-bg: #ffffff;
|
|
--input-border: #d1d5db;
|
|
--input-focus-border: #3b82f6;
|
|
--input-focus-ring: rgba(59, 130, 246, 0.1);
|
|
--input-placeholder: #9ca3af;
|
|
|
|
/* Button Colors */
|
|
--btn-primary-bg: #3b82f6;
|
|
--btn-primary-hover: #2563eb;
|
|
--btn-primary-text: #ffffff;
|
|
--btn-secondary-bg: #f8fafc;
|
|
--btn-secondary-hover: #f1f5f9;
|
|
--btn-secondary-text: #374151;
|
|
--btn-secondary-border: #d1d5db;
|
|
|
|
/* Sidebar Colors */
|
|
--sidebar-bg: #f8fafc;
|
|
--sidebar-border: #e5e7eb;
|
|
--sidebar-item-hover: #f3f4f6;
|
|
--sidebar-item-active: #3b82f6;
|
|
--sidebar-item-active-text: #ffffff;
|
|
|
|
/* Header Colors */
|
|
--header-bg: #ffffff;
|
|
--header-border: #e5e7eb;
|
|
--header-text: #1f2937;
|
|
|
|
/* Toast Colors */
|
|
--toast-bg: #ffffff;
|
|
--toast-border: #e5e7eb;
|
|
--toast-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
}
|
|
|
|
/* Dark Theme */
|
|
[data-theme="dark"] {
|
|
/* Primary Colors - Blue accent theme */
|
|
--primary-color: #3b82f6;
|
|
--primary-hover: #2563eb;
|
|
--primary-light: #1e3a8a;
|
|
--primary-dark: #1d4ed8;
|
|
|
|
/* Secondary Colors */
|
|
--secondary-color: #6b7280;
|
|
--secondary-hover: #9ca3af;
|
|
--secondary-light: #374151;
|
|
--secondary-dark: #4b5563;
|
|
|
|
/* Status Colors */
|
|
--success-color: #10b981;
|
|
--success-hover: #34d399;
|
|
--success-light: #064e3b;
|
|
--warning-color: #f59e0b;
|
|
--warning-hover: #fbbf24;
|
|
--warning-light: #451a03;
|
|
--error-color: #ef4444;
|
|
--error-hover: #f87171;
|
|
--error-light: #7f1d1d;
|
|
--info-color: #06b6d4;
|
|
--info-hover: #22d3ee;
|
|
--info-light: #164e63;
|
|
|
|
/* Background Colors - Dark theme */
|
|
--bg-primary: #0f172a;
|
|
--bg-secondary: #1e293b;
|
|
--bg-tertiary: #334155;
|
|
--bg-accent: #475569;
|
|
--bg-hover: #2d3748;
|
|
--bg-active: #4a5568;
|
|
--bg-overlay: rgba(0, 0, 0, 0.8);
|
|
|
|
/* Text Colors */
|
|
--text-primary: #f9fafb;
|
|
--text-secondary: #d1d5db;
|
|
--text-muted: #9ca3af;
|
|
--text-inverse: #1f2937;
|
|
--text-accent: #3b82f6;
|
|
|
|
/* Border Colors */
|
|
--border-color: #374151;
|
|
--border-hover: #4b5563;
|
|
--border-focus: #3b82f6;
|
|
--border-error: #ef4444;
|
|
--border-success: #10b981;
|
|
|
|
/* Card Colors */
|
|
--card-bg: #1f2937;
|
|
--card-border: #374151;
|
|
--card-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.3), 0 1px 2px -1px rgb(0 0 0 / 0.3);
|
|
--card-hover-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.3), 0 2px 4px -2px rgb(0 0 0 / 0.3);
|
|
|
|
/* Input Colors */
|
|
--input-bg: #374151;
|
|
--input-border: #4b5563;
|
|
--input-focus-border: #3b82f6;
|
|
--input-focus-ring: rgba(59, 130, 246, 0.2);
|
|
--input-placeholder: #6b7280;
|
|
|
|
/* Button Colors */
|
|
--btn-primary-bg: #3b82f6;
|
|
--btn-primary-hover: #2563eb;
|
|
--btn-primary-text: #1f2937;
|
|
--btn-secondary-bg: #374151;
|
|
--btn-secondary-hover: #4b5563;
|
|
--btn-secondary-text: #d1d5db;
|
|
--btn-secondary-border: #4b5563;
|
|
|
|
/* Sidebar Colors */
|
|
--sidebar-bg: #1e293b;
|
|
--sidebar-border: #374151;
|
|
--sidebar-item-hover: #1f2937;
|
|
--sidebar-item-active: #3b82f6;
|
|
--sidebar-item-active-text: #1f2937;
|
|
|
|
/* Header Colors */
|
|
--header-bg: #111827;
|
|
--header-border: #374151;
|
|
--header-text: #f9fafb;
|
|
|
|
/* Toast Colors */
|
|
--toast-bg: #1f2937;
|
|
--toast-border: #374151;
|
|
--toast-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.4);
|
|
}
|
|
|
|
/* Auto theme based on system preference */
|
|
@media (prefers-color-scheme: dark) {
|
|
:root:not([data-theme]) {
|
|
/* Apply dark theme variables when system prefers dark and no explicit theme is set */
|
|
--primary-color: #3b82f6;
|
|
--primary-hover: #2563eb;
|
|
--primary-light: #1e3a8a;
|
|
--primary-dark: #1d4ed8;
|
|
|
|
--secondary-color: #6b7280;
|
|
--secondary-hover: #9ca3af;
|
|
--secondary-light: #374151;
|
|
--secondary-dark: #4b5563;
|
|
|
|
--success-color: #10b981;
|
|
--success-hover: #34d399;
|
|
--success-light: #064e3b;
|
|
--warning-color: #f59e0b;
|
|
--warning-hover: #fbbf24;
|
|
--warning-light: #451a03;
|
|
--error-color: #ef4444;
|
|
--error-hover: #f87171;
|
|
--error-light: #7f1d1d;
|
|
--info-color: #06b6d4;
|
|
--info-hover: #22d3ee;
|
|
--info-light: #164e63;
|
|
|
|
--bg-primary: #1f2937;
|
|
--bg-secondary: #111827;
|
|
--bg-tertiary: #0f172a;
|
|
--bg-accent: #374151;
|
|
--bg-hover: #2d3748;
|
|
--bg-active: #4a5568;
|
|
--bg-overlay: rgba(0, 0, 0, 0.8);
|
|
|
|
--text-primary: #f9fafb;
|
|
--text-secondary: #d1d5db;
|
|
--text-muted: #9ca3af;
|
|
--text-inverse: #1f2937;
|
|
--text-accent: #3b82f6;
|
|
|
|
--border-color: #374151;
|
|
--border-hover: #4b5563;
|
|
--border-focus: #3b82f6;
|
|
--border-error: #ef4444;
|
|
--border-success: #10b981;
|
|
|
|
--card-bg: #1f2937;
|
|
--card-border: #374151;
|
|
--card-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.3), 0 1px 2px -1px rgb(0 0 0 / 0.3);
|
|
--card-hover-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.3), 0 2px 4px -2px rgb(0 0 0 / 0.3);
|
|
|
|
--input-bg: #374151;
|
|
--input-border: #4b5563;
|
|
--input-focus-border: #3b82f6;
|
|
--input-focus-ring: rgba(59, 130, 246, 0.2);
|
|
--input-placeholder: #6b7280;
|
|
|
|
--btn-primary-bg: #3b82f6;
|
|
--btn-primary-hover: #2563eb;
|
|
--btn-primary-text: #1f2937;
|
|
--btn-secondary-bg: #374151;
|
|
--btn-secondary-hover: #4b5563;
|
|
--btn-secondary-text: #d1d5db;
|
|
--btn-secondary-border: #4b5563;
|
|
|
|
--sidebar-bg: #111827;
|
|
--sidebar-border: #374151;
|
|
--sidebar-item-hover: #1f2937;
|
|
--sidebar-item-active: #3b82f6;
|
|
--sidebar-item-active-text: #1f2937;
|
|
|
|
--header-bg: #111827;
|
|
--header-border: #374151;
|
|
--header-text: #f9fafb;
|
|
|
|
--toast-bg: #1f2937;
|
|
--toast-border: #374151;
|
|
--toast-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.4), 0 4px 6px -4px rgb(0 0 0 / 0.4);
|
|
}
|
|
}
|
|
|
|
/* Theme transition for smooth switching */
|
|
* {
|
|
transition: background-color var(--transition-fast),
|
|
border-color var(--transition-fast),
|
|
color var(--transition-fast);
|
|
}
|
|
|
|
/* Theme toggle button styles */
|
|
.theme-toggle {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 2.5rem;
|
|
height: 2.5rem;
|
|
border: 1px solid var(--border-color);
|
|
border-radius: var(--border-radius);
|
|
background-color: var(--btn-secondary-bg);
|
|
color: var(--btn-secondary-text);
|
|
cursor: pointer;
|
|
transition: all var(--transition-fast);
|
|
}
|
|
|
|
.theme-toggle:hover {
|
|
background-color: var(--btn-secondary-hover);
|
|
border-color: var(--border-hover);
|
|
}
|
|
|
|
.theme-toggle:focus {
|
|
outline: none;
|
|
border-color: var(--border-focus);
|
|
box-shadow: 0 0 0 3px var(--input-focus-ring);
|
|
}
|
|
|
|
.theme-toggle .icon {
|
|
width: 1.25rem;
|
|
height: 1.25rem;
|
|
fill: currentColor;
|
|
}
|
|
|
|
/* Hide/show theme icons based on current theme */
|
|
[data-theme="dark"] .theme-toggle .icon-sun {
|
|
display: block;
|
|
}
|
|
|
|
[data-theme="dark"] .theme-toggle .icon-moon {
|
|
display: none;
|
|
}
|
|
|
|
[data-theme="light"] .theme-toggle .icon-sun {
|
|
display: none;
|
|
}
|
|
|
|
[data-theme="light"] .theme-toggle .icon-moon {
|
|
display: block;
|
|
}
|
|
|
|
/* Default state (light theme) */
|
|
:root:not([data-theme]) .theme-toggle .icon-sun {
|
|
display: none;
|
|
}
|
|
|
|
:root:not([data-theme]) .theme-toggle .icon-moon {
|
|
display: block;
|
|
}
|