ocd-website/frontend/src/styles/admin.css
TheMaddax d474032fc4 Fix theme switcher visibility and remove duplicate admin theme selector
- Fix navigation theme switcher visibility across all four themes
- Add comprehensive CSS rules for theme selector in main navigation
- Remove duplicate theme switcher from admin layout header
- Fix AxiosError in events page with mock data implementation
- Update memory bank with completed task status
- Maintain single theme control for entire site UX
2025-06-02 21:27:42 -06:00

935 lines
21 KiB
CSS

/* ============================== */
/* SECURE ADMIN DASHBOARD STYLES */
/* ============================== */
/* Only loaded after authentication for security */
/* Admin-specific CSS variables with security validation */
:root {
/* Admin color palette - validated hex values only */
--admin-primary: #1a56db;
--admin-primary-light: #3b82f6;
--admin-primary-dark: #1e40af;
--admin-success: #059669;
--admin-warning: #d97706;
--admin-error: #dc2626;
/* Admin backgrounds */
--admin-bg: var(--color-bg);
--admin-bg-secondary: var(--color-bg-secondary);
--admin-bg-soft: var(--color-bg-soft);
/* Admin text colors */
--admin-text: var(--color-text);
--admin-text-light: var(--color-text-light);
--admin-text-muted: var(--color-text-muted);
/* Admin borders */
--admin-border: var(--color-border);
--admin-border-light: var(--color-border-light);
}
/* Secure Admin Container - CSS containment for isolation */
.admin-container {
background-color: var(--admin-bg);
color: var(--admin-text);
contain: layout style paint;
min-height: 100vh;
}
/* Admin Header */
.admin-header {
background-color: var(--admin-bg-soft);
border-bottom: 1px solid var(--admin-border);
color: var(--admin-text);
}
.admin-header-title {
color: var(--admin-text);
font-weight: 600;
}
.admin-header-user {
color: var(--admin-text-light);
}
/* Admin Sidebar */
.admin-sidebar {
background-color: var(--admin-bg-soft);
border-right: 1px solid var(--admin-border);
contain: layout style;
}
.admin-sidebar-header {
border-bottom: 1px solid var(--admin-border);
padding: 1.5rem;
}
.admin-sidebar-logo {
color: var(--admin-text);
font-weight: 600;
text-decoration: none;
transition: color 0.2s ease;
}
.admin-sidebar-logo:hover {
color: var(--admin-primary);
}
/* Admin Navigation */
.admin-nav {
padding: 1rem 0;
}
.admin-nav-item {
display: flex;
align-items: center;
padding: 0.75rem 1rem;
margin: 0.125rem 0.5rem;
color: var(--admin-text-light);
text-decoration: none;
border-radius: 0.5rem;
font-weight: 500;
transition: all 0.2s ease;
/* Prevent CSS injection via content */
background-image: none !important;
content: none !important;
}
.admin-nav-item:hover {
background-color: var(--admin-bg-secondary);
color: var(--admin-primary);
}
.admin-nav-item-active {
background-color: var(--admin-primary);
color: white;
font-weight: 600;
border-left: 3px solid transparent;
transition: all 0.2s ease;
}
.admin-nav-icon {
margin-right: 0.75rem;
width: 1.25rem;
height: 1.25rem;
flex-shrink: 0;
}
.admin-nav-item-active .admin-nav-icon {
color: white;
}
.admin-nav-item:hover .admin-nav-icon {
color: var(--admin-primary);
}
.admin-nav-item-active:hover .admin-nav-icon {
color: white;
}
/* Admin Logout Button */
.admin-logout {
padding: 1rem;
border-top: 1px solid var(--admin-border);
}
.admin-logout-btn {
display: flex;
align-items: center;
width: 100%;
padding: 0.75rem 1rem;
color: var(--admin-text-light);
background: none;
border: none;
border-radius: 0.5rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.admin-logout-btn:hover {
background-color: var(--admin-bg-secondary);
color: var(--admin-error);
}
/* Admin Content Area */
.admin-content {
background-color: var(--admin-bg);
color: var(--admin-text);
flex: 1;
overflow-y: auto;
}
.admin-main {
padding: 1rem 1.5rem 2rem;
}
/* Admin Page Titles */
.admin-page-title {
color: var(--admin-text);
font-weight: 600;
margin-bottom: 1.5rem;
}
.admin-page-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 1.5rem;
}
.admin-page-header-title {
color: var(--admin-text);
font-size: 1.5rem;
font-weight: 700;
}
.admin-page-header-subtitle {
color: var(--admin-text-light);
font-size: 0.875rem;
margin-top: 0.25rem;
}
/* Admin Stat Cards */
.admin-stat-card {
background-color: var(--admin-bg-soft);
border: 1px solid var(--admin-border-light);
border-radius: var(--border-radius-lg);
padding: 1.5rem;
transition: all 0.3s ease;
contain: layout style;
}
.admin-stat-card:hover {
box-shadow: var(--shadow-lg);
transform: translateY(-2px);
}
.admin-stat-icon {
background-color: rgba(26, 86, 219, 0.1);
color: var(--admin-primary);
padding: 0.75rem;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
width: 3rem;
height: 3rem;
}
.admin-stat-title {
color: var(--admin-text-muted);
font-weight: 500;
font-size: 0.875rem;
margin-bottom: 0.25rem;
}
.admin-stat-value {
color: var(--admin-text);
font-weight: 600;
font-size: 1.5rem;
}
/* Admin Cards */
.admin-card {
background-color: var(--admin-bg-soft);
border: 1px solid var(--admin-border-light);
border-radius: var(--border-radius-lg);
padding: 1.5rem;
box-shadow: var(--shadow-md);
contain: layout style;
margin-bottom: 1.5rem;
}
.admin-card-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 1rem;
}
.admin-card-title {
color: var(--admin-text);
font-weight: 600;
font-size: 1.125rem;
}
.admin-card-link {
color: var(--admin-primary);
font-weight: 500;
font-size: 0.875rem;
text-decoration: none;
transition: color 0.2s ease;
}
.admin-card-link:hover {
color: var(--admin-primary-dark);
}
/* Admin List Items */
.admin-list {
border-top: 1px solid var(--admin-border);
}
.admin-list-item {
padding: 0.75rem 0;
border-bottom: 1px solid var(--admin-border);
}
.admin-list-item:last-child {
border-bottom: none;
}
.admin-list-title {
color: var(--admin-text);
font-weight: 500;
font-size: 0.875rem;
}
.admin-list-subtitle {
color: var(--admin-text-muted);
font-size: 0.75rem;
margin-top: 0.125rem;
}
/* Admin Status Badges - Secure with validation */
.admin-badge {
padding: 0.25rem 0.625rem;
border-radius: 9999px;
font-size: 0.75rem;
font-weight: 500;
/* Security: prevent content injection */
content: none !important;
}
.admin-badge-success {
background-color: #dcfce7;
color: #166534;
}
.admin-badge-warning {
background-color: #fef3c7;
color: #92400e;
}
.admin-badge-error {
background-color: #fee2e2;
color: #991b1b;
}
.admin-badge-default {
background-color: var(--admin-bg-secondary);
color: var(--admin-text-muted);
}
.admin-badge-social {
background-color: #dbeafe;
color: #1d4ed8;
}
.admin-badge-educational {
background-color: #e9d5ff;
color: #7c3aed;
}
.admin-badge-board {
background-color: #fef3c7;
color: #d97706;
}
.admin-badge-athletic {
background-color: #e0e7ff;
color: #4338ca;
}
/* Dark theme admin badge overrides */
.dark .admin-badge-success {
background-color: #14532d;
color: #bbf7d0;
}
.dark .admin-badge-warning {
background-color: #92400e;
color: #fde68a;
}
.dark .admin-badge-error {
background-color: #991b1b;
color: #fca5a5;
}
.dark .admin-badge-social {
background-color: #1e3a8a;
color: #93c5fd;
}
.dark .admin-badge-educational {
background-color: #581c87;
color: #c4b5fd;
}
.dark .admin-badge-board {
background-color: #92400e;
color: #fde68a;
}
.dark .admin-badge-athletic {
background-color: #3730a3;
color: #a5b4fc;
}
/* Admin Form Elements */
.admin-form-label {
display: block;
font-size: 0.875rem;
font-weight: 500;
color: var(--admin-text);
margin-bottom: 0.25rem;
}
.admin-form-select,
.admin-form-input {
display: block;
width: 100%;
padding: 0.75rem;
background-color: var(--admin-bg);
border: 1px solid var(--admin-border);
border-radius: 0.375rem;
color: var(--admin-text);
font-size: 0.875rem;
transition: all 0.2s ease;
}
.admin-form-select:focus,
.admin-form-input:focus {
outline: none;
border-color: var(--admin-primary);
box-shadow: 0 0 0 3px rgba(26, 86, 219, 0.1);
}
.admin-form-select:focus-visible,
.admin-form-input:focus-visible {
outline: 2px solid var(--admin-primary);
outline-offset: 2px;
}
/* Admin Button Styles */
.admin-btn-primary {
display: inline-flex;
align-items: center;
padding: 0.5rem 1rem;
background-color: var(--admin-primary);
color: white;
border: none;
border-radius: 0.375rem;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
text-decoration: none;
}
.admin-btn-primary:hover {
background-color: var(--admin-primary-dark);
color: white;
}
.admin-btn-secondary {
display: inline-flex;
align-items: center;
padding: 0.5rem 1rem;
background-color: var(--admin-bg);
color: var(--admin-text);
border: 1px solid var(--admin-border);
border-radius: 0.375rem;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.admin-btn-secondary:hover {
background-color: var(--admin-bg-secondary);
}
/* Admin Table Styles */
.admin-table {
min-width: 100%;
border-collapse: separate;
border-spacing: 0;
}
.admin-table-header {
background-color: var(--admin-bg-secondary);
}
.admin-table-header-cell {
padding: 0.75rem 1.5rem;
text-align: left;
font-size: 0.75rem;
font-weight: 500;
color: var(--admin-text-muted);
text-transform: uppercase;
letter-spacing: 0.05em;
border-bottom: 1px solid var(--admin-border);
}
.admin-table-body {
background-color: var(--admin-bg);
}
.admin-table-row {
border-bottom: 1px solid var(--admin-border);
transition: background-color 0.2s ease;
}
.admin-table-row:hover {
background-color: var(--admin-bg-secondary);
}
.admin-table-cell {
padding: 1rem 1.5rem;
white-space: nowrap;
color: var(--admin-text);
font-size: 0.875rem;
}
.admin-table-cell-title {
font-weight: 500;
color: var(--admin-text);
margin-bottom: 0.25rem;
}
.admin-table-cell-subtitle {
color: var(--admin-text-light);
font-size: 0.75rem;
}
/* Admin Action Links */
.admin-action-link {
color: var(--admin-primary);
text-decoration: none;
font-weight: 500;
transition: color 0.2s ease;
margin-right: 0.5rem;
}
.admin-action-link:hover {
color: var(--admin-primary-dark);
}
.admin-action-link-danger {
color: var(--admin-error);
text-decoration: none;
font-weight: 500;
transition: color 0.2s ease;
}
.admin-action-link-danger:hover {
color: #b91c1c;
}
/* Loading and Error States */
.admin-loading {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 3rem;
}
.admin-loading-spinner {
width: 2rem;
height: 2rem;
border: 2px solid var(--admin-border);
border-top: 2px solid var(--admin-primary);
border-radius: 50%;
animation: admin-spin 1s linear infinite;
}
.admin-loading-text {
margin-top: 0.5rem;
color: var(--admin-text-muted);
}
.admin-error-text {
color: var(--admin-error);
}
.admin-empty-text {
color: var(--admin-text-muted);
}
@keyframes admin-spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Admin Quick Actions */
.admin-quick-actions {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1rem;
}
.admin-quick-action {
background-color: var(--admin-bg-soft);
border: 1px solid var(--admin-border-light);
border-radius: var(--border-radius-lg);
padding: 1rem;
display: flex;
align-items: center;
text-decoration: none;
color: var(--admin-text);
transition: all 0.3s ease;
contain: layout style;
}
.admin-quick-action:hover {
box-shadow: var(--shadow-md);
transform: translateY(-1px);
border-color: var(--admin-primary);
}
.admin-quick-action-icon {
color: var(--admin-primary);
margin-right: 0.75rem;
width: 1.5rem;
height: 1.5rem;
}
.admin-quick-action-text {
font-weight: 500;
font-size: 0.875rem;
}
/* Gold Accent System for Admin (Dark Theme Only) */
.admin-card.admin-gold-accent {
border-left: 3px solid transparent;
transition: all 0.3s ease;
}
.dark .admin-card.admin-gold-accent:hover {
border-left-color: var(--color-accent-gold);
}
.admin-card-title.admin-gold-title {
transition: color 0.3s ease;
}
.dark .admin-card.admin-gold-accent:hover .admin-gold-title {
color: var(--color-accent-gold);
}
.admin-stat-card.admin-gold-accent {
border-left: 3px solid transparent;
transition: all 0.3s ease;
}
.dark .admin-stat-card.admin-gold-accent:hover {
border-left-color: var(--color-accent-gold);
}
/* High Contrast Admin Themes */
.high-contrast-light .admin-card,
.high-contrast-dark .admin-card {
border: 3px solid var(--admin-border);
font-weight: 600;
}
.high-contrast-light .admin-nav-item-active,
.high-contrast-dark .admin-nav-item-active {
border: 3px solid var(--color-border);
font-weight: 700;
}
.high-contrast-light .admin-badge,
.high-contrast-dark .admin-badge {
border: 2px solid var(--color-border);
font-weight: 600;
}
/* High Contrast Form Elements */
.high-contrast-light .admin-form-select,
.high-contrast-light .admin-form-input {
border: 3px solid var(--color-border);
font-weight: 600;
}
.high-contrast-dark .admin-form-select,
.high-contrast-dark .admin-form-input {
border: 3px solid var(--color-border);
font-weight: 600;
}
.high-contrast-light .admin-btn-primary,
.high-contrast-dark .admin-btn-primary {
border: 3px solid transparent;
font-weight: 700;
}
.high-contrast-light .admin-btn-secondary,
.high-contrast-dark .admin-btn-secondary {
border: 3px solid var(--color-border);
font-weight: 700;
}
.high-contrast-light .admin-table-header-cell,
.high-contrast-dark .admin-table-header-cell {
font-weight: 700;
border-bottom: 3px solid var(--color-border);
}
.high-contrast-light .admin-table-cell,
.high-contrast-dark .admin-table-cell {
font-weight: 600;
border-bottom: 2px solid var(--color-border);
}
/* High Contrast Focus Indicators for Admin */
.high-contrast-light .admin-nav-item:focus-visible,
.high-contrast-dark .admin-nav-item:focus-visible {
outline: 4px solid var(--color-accent-gold);
outline-offset: 2px;
}
.high-contrast-light .admin-quick-action:focus-visible,
.high-contrast-dark .admin-quick-action:focus-visible {
outline: 4px solid var(--color-accent-gold);
outline-offset: 2px;
}
/* ========================================== */
/* HIGH CONTRAST ADMIN THEME IMPLEMENTATION */
/* Following CSS Variable Strategy Guidelines */
/* ========================================== */
/* High Contrast Admin Navigation - CSS Variable Based */
.high-contrast-light .admin-nav-item-active {
background-color: var(--color-text);
color: var(--color-bg);
border: 3px solid var(--color-border);
border-left: 6px solid var(--color-accent-gold);
font-weight: 700;
}
.high-contrast-light .admin-nav-item {
background-color: var(--color-bg);
color: var(--color-text);
border: 2px solid var(--color-border);
margin: 0.25rem 0.5rem;
}
.high-contrast-light .admin-nav-item:hover {
background-color: var(--color-text-light);
color: var(--color-bg);
border-left: 4px solid var(--color-accent-gold);
}
/* High Contrast Dark Mode Admin Navigation */
.high-contrast-dark .admin-nav-item-active {
background-color: var(--color-text);
color: var(--color-bg);
border: 3px solid var(--color-border);
border-left: 6px solid var(--color-accent-gold);
font-weight: 700;
}
.high-contrast-dark .admin-nav-item {
background-color: var(--color-bg);
color: var(--color-text);
border: 2px solid var(--color-border);
margin: 0.25rem 0.5rem;
}
.high-contrast-dark .admin-nav-item:hover {
background-color: var(--color-text-light);
color: var(--color-bg);
border-left: 4px solid var(--color-accent-gold);
}
/* High Contrast Admin Sidebar Base */
.high-contrast-light .admin-sidebar {
background-color: var(--color-bg);
border-right: 3px solid var(--color-border);
}
.high-contrast-dark .admin-sidebar {
background-color: var(--color-bg);
border-right: 3px solid var(--color-border);
}
/* High Contrast Admin Navigation Icons */
.high-contrast-light .admin-nav-icon,
.high-contrast-dark .admin-nav-icon {
filter: none !important;
}
/* ========================================== */
/* HIGH CONTRAST ADMIN NAVIGATION FIX */
/* Force proper highlighting with !important */
/* ========================================== */
/* High Contrast Light - Active Menu Item - Maximum Specificity */
html.high-contrast-light .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active {
background-color: #000000 !important;
color: #FFFFFF !important;
border: 3px solid #000000 !important;
border-left: 6px solid #FFD700 !important;
font-weight: 700 !important;
border-radius: 0.5rem !important;
}
html.high-contrast-light .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active .admin-nav-icon {
color: #FFFFFF !important;
}
html.high-contrast-light .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active:hover {
background-color: #000000 !important;
color: #FFFFFF !important;
}
/* High Contrast Dark - Active Menu Item - Maximum Specificity */
html.high-contrast-dark .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active {
background-color: #FFFFFF !important;
color: #000000 !important;
border: 3px solid #FFFFFF !important;
border-left: 6px solid #FFD700 !important;
font-weight: 700 !important;
border-radius: 0.5rem !important;
}
html.high-contrast-dark .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active .admin-nav-icon {
color: #000000 !important;
}
html.high-contrast-dark .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active:hover {
background-color: #FFFFFF !important;
color: #000000 !important;
}
/* High Contrast Navigation Items */
.high-contrast-light .admin-nav-item {
background-color: #FFFFFF !important;
color: #000000 !important;
border: 2px solid #000000 !important;
margin: 0.25rem 0.5rem !important;
}
.high-contrast-dark .admin-nav-item {
background-color: #000000 !important;
color: #FFFFFF !important;
border: 2px solid #FFFFFF !important;
margin: 0.25rem 0.5rem !important;
}
/* High Contrast Hover States */
.high-contrast-light .admin-nav-item:hover {
background-color: #333333 !important;
color: #FFFFFF !important;
border-left: 4px solid #FFD700 !important;
}
.high-contrast-light .admin-nav-item:hover .admin-nav-icon {
color: #FFFFFF !important;
}
.high-contrast-dark .admin-nav-item:hover {
background-color: #CCCCCC !important;
color: #000000 !important;
border-left: 4px solid #FFD700 !important;
}
.high-contrast-dark .admin-nav-item:hover .admin-nav-icon {
color: #000000 !important;
}
/* ========================================== */
/* DEBUG: ULTRA HIGH SPECIFICITY TEST */
/* These should be impossible to override */
/* ========================================== */
/* Ultra-specific selectors for debugging */
body.high-contrast-light .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active,
html.high-contrast-light body .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active,
.high-contrast-light .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active {
background-color: #000000 !important; /* Black background for high contrast light */
color: #FFFFFF !important;
border: 5px solid #000000 !important;
border-left: 10px solid #FFD700 !important;
font-weight: 900 !important;
}
body.high-contrast-dark .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active,
html.high-contrast-dark body .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active,
.high-contrast-dark .admin-sidebar .admin-nav .admin-nav-item.admin-nav-item-active {
background-color: #FFFFFF !important; /* White background for high contrast dark */
color: #000000 !important;
border: 5px solid #FFFFFF !important;
border-left: 10px solid #FFD700 !important;
font-weight: 900 !important;
}
/* Admin Header Theme Selector - Ensure visibility in all themes */
.admin-header .relative button,
.admin-header #theme-selector-button {
color: var(--admin-text) !important;
background-color: rgba(0, 0, 0, 0.05) !important;
border: 1px solid var(--admin-border) !important;
}
.admin-header .relative button:hover,
.admin-header #theme-selector-button:hover {
background-color: var(--admin-bg-secondary) !important;
color: var(--admin-text) !important;
}
/* Dark theme header theme selector */
.dark .admin-header .relative button,
.dark .admin-header #theme-selector-button {
background-color: rgba(255, 255, 255, 0.1) !important;
color: var(--admin-text) !important;
}
.dark .admin-header .relative button:hover,
.dark .admin-header #theme-selector-button:hover {
background-color: var(--admin-bg-secondary) !important;
}
/* High contrast theme selector visibility */
.high-contrast-light .admin-header .relative button,
.high-contrast-light .admin-header #theme-selector-button {
background-color: #000000 !important;
color: #FFFFFF !important;
border: 3px solid #000000 !important;
}
.high-contrast-dark .admin-header .relative button,
.high-contrast-dark .admin-header #theme-selector-button {
background-color: #FFFFFF !important;
color: #000000 !important;
border: 3px solid #FFFFFF !important;
}
/* Admin Responsive Design */
@media (max-width: 768px) {
.admin-stat-card {
padding: 1rem;
}
.admin-main {
padding: 1rem;
}
.admin-card {
padding: 1rem;
}
.admin-table-cell {
padding: 0.75rem;
}
.admin-table-header-cell {
padding: 0.75rem;
}
}