qbit_manage/web-ui/css/themes.css
bobokun ca4819bc0b
4.5.1 (#874)
# 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>
2025-07-19 08:59:41 -04:00

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;
}