/* -------------------------------------------------- */ /* Global Enhancements */ /* -------------------------------------------------- */ :root { /* Light Mode Colors */ --primary-color: #007bff; --primary-hover-color: #0056b3; --primary-light-color: #cce5ff; /* Lighter shade for backgrounds/borders */ --secondary-color: #6c757d; --success-color: #28a745; --info-color: #17a2b8; --warning-color: #ffc107; --danger-color: #dc3545; --light-bg: #f4f6f9; /* AdminLTE default light background */ --white-bg: #ffffff; --border-color-light: #dee2e6; --text-dark: #1f2d3d; /* Slightly softer black */ --text-muted-light: #6c757d; --link-light-color: var(--primary-color); --link-light-hover: var(--primary-hover-color); /* Dark Mode Colors (Navy Theme) */ --dark-navy-deep: #001a33; --dark-navy-base: #001f3f; --dark-navy-medium: #0a2f57; --dark-navy-light: #0d3c6e; --dark-navy-card: #1a3a5a; --dark-navy-table: #15304a; --dark-navy-accent: #1f4a75; --dark-navy-border: #2a5a8a; --dark-navy-hover: #3a6aa0; --dark-text-primary: #e9ecef; --dark-text-secondary: #ced4da; --dark-text-muted: #adb5bd; --dark-link-color: #58a6ff; --dark-link-hover: #88c0ff; } html { scroll-behavior: smooth; } body { font-family: 'Source Sans Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; font-weight: 400; line-height: 1.5; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* Transitions & Corners */ .btn, .form-control, .card, .modal-content, .alert, .small-box, .info-box, .nav-link, .brand-link { border-radius: 0.35rem; transition: all 0.2s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, background-color 0.15s ease-in-out, color 0.15s ease-in-out; } a { text-decoration: none; } /* -------------------------------------------------- */ /* Colorful Light Mode */ /* -------------------------------------------------- */ body:not(.dark-mode) { background-color: var(--light-bg); color: var(--text-dark); } /* --- Navbar (Light - Primary Accent) --- */ body:not(.dark-mode) .main-header.navbar { background-color: var(--white-bg); border-bottom: 1px solid var(--border-color-light); border-top: 3px solid var(--primary-color); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); } body:not(.dark-mode) .main-header .navbar-nav .nav-link { color: var(--text-muted-light); } body:not(.dark-mode) .main-header .navbar-nav .nav-link:hover, body:not(.dark-mode) .main-header .navbar-nav .nav-link:focus { color: var(--primary-hover-color); } body:not(.dark-mode) #darkModeIcon.fa-sun { color: var(--warning-color); } /* --- Sidebar (Using Default Dark AdminLTE Theme) --- */ body:not(.dark-mode) .main-sidebar { background-color: #343a40; } body:not(.dark-mode) .brand-link { border-bottom-color: rgba(255, 255, 255, 0.1); } body:not(.dark-mode) .brand-link:hover { background-color: rgba(255, 255, 255, 0.05); } body:not(.dark-mode) .sidebar .nav-pills .nav-link { color: #c2c7d0; } body:not(.dark-mode) .sidebar .nav-pills .nav-link:hover { background-color: rgba(255, 255, 255, 0.05); color: #fff; } body:not(.dark-mode) .sidebar .nav-pills .nav-link.active { background-color: var(--primary-color); color: #ffffff; box-shadow: 0 2px 5px rgba(0, 123, 255, 0.3); } body:not(.dark-mode) .sidebar .nav-treeview > .nav-item > .nav-link.active { background-color: rgba(0, 123, 255, 0.9); box-shadow: none; } /* --- Content & Cards (Light - Accent Borders) --- */ body:not(.dark-mode) .content-wrapper { background-color: var(--light-bg); } body:not(.dark-mode) .card { background-color: var(--white-bg); border: 1px solid var(--border-color-light); border-top: 3px solid var(--primary-color); /* Primary color top border */ box-shadow: 0 3px 8px rgba(0, 0, 0, 0.06); margin-bottom: 1.5rem; } /* Override top border for specific card types if needed */ body:not(.dark-mode) .card.card-outline-success { border-top-color: var(--success-color); } body:not(.dark-mode) .card.card-outline-info { border-top-color: var(--info-color); } body:not(.dark-mode) .card.card-outline-warning { border-top-color: var(--warning-color); } body:not(.dark-mode) .card.card-outline-danger { border-top-color: var(--danger-color); } body:not(.dark-mode) .card-header { background-color: transparent; border-bottom: 1px solid var(--border-color-light); padding: 0.75rem 1.25rem; color: var(--text-dark); /* Ensure header text is dark */ } body:not(.dark-mode) .card-title { font-weight: 600; color: inherit; /* Inherit from card-header */ } body:not(.dark-mode) .card-body { padding: 1.25rem; } /* --- Forms (Light - Standard) --- */ body:not(.dark-mode) .form-control { border: 1px solid #ced4da; background-color: var(--white-bg); color: var(--text-dark); } body:not(.dark-mode) .form-control:focus { border-color: #80bdff; box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); background-color: var(--white-bg); /* Keep bg white on focus */ } body:not(.dark-mode) .input-group-text { background-color: #e9ecef; border: 1px solid #ced4da; color: var(--text-muted-light); } /* --- Tables (Light - Clean & Clear) --- */ body:not(.dark-mode) .table { background-color: var(--white-bg); color: var(--text-dark); border: 1px solid var(--border-color-light); } body:not(.dark-mode) .table thead th { background-color: #f8f9fa; color: var(--text-muted-light); border-bottom: 2px solid var(--border-color-light); border-top: none; font-weight: 600; white-space: nowrap; padding: 0.8rem 1rem; /* Adjust padding */ } body:not(.dark-mode) .table tbody td { border-top: 1px solid var(--border-color-light); vertical-align: middle; padding: 0.7rem 1rem; /* Adjust padding */ } body:not(.dark-mode) .table-hover tbody tr:hover { background-color: var(--primary-light-color) !important; /* Use light primary for hover */ color: var(--primary-hover-color); /* Darker primary text on hover */ } /* Status Colors (More Vibrant) */ body:not(.dark-mode) .table .text-success { color: #1a7941 !important; } body:not(.dark-mode) .table .text-danger { color: #c82333 !important; } body:not(.dark-mode) .table .text-secondary { color: #5a6268 !important; } body:not(.dark-mode) .table .text-info { color: #117a8b !important; } body:not(.dark-mode) .table .text-warning { color: #e0a800 !important; } /* --- Modals (Light - Standard) --- */ body:not(.dark-mode) .modal-content { background-color: var(--white-bg); border: 1px solid rgba(0,0,0,.2); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.15); } body:not(.dark-mode) .modal-header { border-bottom-color: var(--border-color-light); } body:not(.dark-mode) .modal-title { font-weight: 500; color: var(--text-dark); } body:not(.dark-mode) .modal-footer { border-top-color: var(--border-color-light); } /* --- Small Boxes (Dashboard - Light & Colorful) --- */ /* Retain original colorful small boxes */ body:not(.dark-mode) .small-box { box-shadow: 0 3px 8px rgba(0, 0, 0, 0.1); color: #fff !important; border-radius: 0.35rem; /* Match global radius */ } body:not(.dark-mode) .small-box .inner { padding: 15px; /* Increase padding slightly */ } body:not(.dark-mode) .small-box .inner h3, body:not(.dark-mode) .small-box .inner p { color: #fff !important; text-shadow: 1px 1px 1px rgba(0,0,0,0.15); } body:not(.dark-mode) .small-box .icon { color: rgba(0,0,0,0.15); font-size: 60px; /* Standard icon size */ top: 15px; right: 15px; } body:not(.dark-mode) .small-box:hover { box-shadow: 0 5px 15px rgba(0, 0, 0, 0.15); transform: translateY(-2px); } body:not(.dark-mode) .small-box:hover .icon { font-size: 65px; /* Slightly larger on hover */ opacity: 0.7; } /* --- Footer (Light - Cleaner) --- */ body:not(.dark-mode) .main-footer { background-color: var(--white-bg); border-top: 1px solid var(--border-color-light); color: var(--text-muted-light); padding: 0.8rem 1rem; font-size: 0.9rem; } body:not(.dark-mode) .main-footer a { color: var(--link-light-color); font-weight: 600; } body:not(.dark-mode) .main-footer a:hover { color: var(--link-light-hover); } /* -------------------------------------------------- */ /* Modern Dark Mode */ /* (Minimal Changes from Previous) */ /* -------------------------------------------------- */ body.dark-mode { background: linear-gradient(180deg, var(--dark-navy-base) 0%, var(--dark-navy-medium) 100%) !important; color: var(--dark-text-secondary); } /* Dark Text Colors */ body.dark-mode h1, body.dark-mode h2, body.dark-mode h3, body.dark-mode h4, body.dark-mode h5, body.dark-mode h6, body.dark-mode .h1, body.dark-mode .h2, body.dark-mode .h3, body.dark-mode .h4, body.dark-mode .h5, body.dark-mode .h6, body.dark-mode .card-title, body.dark-mode .modal-title, body.dark-mode .brand-text, body.dark-mode label { color: var(--dark-text-primary) !important; } body.dark-mode .text-muted { color: var(--dark-text-muted) !important; } /* Dark Navbar */ body.dark-mode .main-header.navbar { background-color: var(--dark-navy-light) !important; border-bottom: 1px solid var(--dark-navy-border) !important; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3); } body.dark-mode .main-header .navbar-nav .nav-link { color: var(--dark-text-secondary); } body.dark-mode .main-header .navbar-nav .nav-link:hover { color: var(--dark-text-primary); } /* Style the active dark mode toggle icon */ body.dark-mode #darkModeIcon.fa-moon { color: var(--info-color); } /* Dark Sidebar */ body.dark-mode .main-sidebar { background-color: var(--dark-navy-deep) !important; } body.dark-mode .brand-link { border-bottom: 1px solid var(--dark-navy-accent) !important; } body.dark-mode .sidebar .nav-pills .nav-link { color: var(--dark-text-secondary); } body.dark-mode .sidebar .nav-pills .nav-link.active, body.dark-mode .sidebar .nav-pills .nav-link:hover, body.dark-mode .sidebar .nav-pills .nav-link:focus { background-color: var(--dark-navy-accent); color: var(--dark-text-primary); } /* Dark Content & Cards */ body.dark-mode .content-wrapper { background-color: transparent !important; } body.dark-mode .card { background-color: var(--dark-navy-card) !important; border: 1px solid var(--dark-navy-border); border-top: none; /* Remove colored top border in dark mode */ color: var(--dark-text-secondary); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.25); margin-bottom: 1.5rem; } body.dark-mode .card-header { background-color: rgba(255,255,255, 0.03); /* Subtle header background */ border-bottom: 1px solid var(--dark-navy-border) !important; color: var(--dark-text-primary); padding: 0.75rem 1.25rem; } body.dark-mode .card-body { padding: 1.25rem; } /* Dark Forms */ body.dark-mode .form-control { background-color: var(--dark-navy-light); border: 1px solid var(--dark-navy-hover); color: var(--dark-text-secondary); } body.dark-mode .form-control:focus { background-color: var(--dark-navy-accent); border-color: var(--dark-link-color); color: var(--dark-text-primary); box-shadow: 0 0 0 0.2rem rgba(88, 166, 255, 0.25); } body.dark-mode .input-group-text { background-color: var(--dark-navy-border); border: 1px solid var(--dark-navy-hover); color: var(--dark-text-secondary); } /* Dark Modals */ body.dark-mode .modal-content { background-color: var(--dark-navy-light); border: 1px solid var(--dark-navy-hover); color: var(--dark-text-secondary); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.4); } body.dark-mode .modal-header { border-bottom: 1px solid var(--dark-navy-hover); } body.dark-mode .modal-header .close { color: var(--dark-text-secondary); text-shadow: none; opacity: 0.8; } body.dark-mode .modal-header .close:hover { opacity: 1; } body.dark-mode .modal-footer { border-top: 1px solid var(--dark-navy-hover); } /* Dark Tables */ body.dark-mode .table { color: var(--dark-text-secondary); background-color: var(--dark-navy-table); border: 1px solid var(--dark-navy-border); } body.dark-mode .table thead th { background-color: var(--dark-navy-accent); color: var(--dark-text-primary); border-color: var(--dark-navy-border) !important; border-bottom-width: 2px; font-weight: 600; white-space: nowrap; padding: 0.8rem 1rem; } body.dark-mode .table tbody tr { border-color: var(--dark-navy-border) !important; } body.dark-mode .table tbody td { border-color: var(--dark-navy-border) !important; vertical-align: middle; padding: 0.7rem 1rem; } body.dark-mode .table-hover tbody tr:hover { background-color: var(--dark-navy-border) !important; color: var(--dark-text-primary); } /* Dark Status Colors */ body.dark-mode .table .text-success { color: #34d399 !important; } body.dark-mode .table .text-danger { color: #f87171 !important; } body.dark-mode .table .text-secondary { color: #9ca3af !important; } body.dark-mode .table .text-info { color: #60a5fa !important; } body.dark-mode .table .text-warning { color: #facc15 !important; } /* Dark Small Boxes */ body.dark-mode .small-box { background-color: var(--dark-navy-card); color: var(--dark-text-primary) !important; border: 1px solid var(--dark-navy-border); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.3); border-radius: 0.35rem; } body.dark-mode .small-box .inner { padding: 15px; } body.dark-mode .small-box .inner h3 { color: var(--dark-text-primary) !important; font-weight: 600; } body.dark-mode .small-box .inner p { color: var(--dark-text-secondary) !important; } body.dark-mode .small-box .icon { color: rgba(255, 255, 255, 0.1); transition: all .3s linear; font-size: 60px; top: 15px; right: 15px; } body.dark-mode .small-box:hover { background-color: var(--dark-navy-border); } body.dark-mode .small-box:hover .icon { color: rgba(255, 255, 255, 0.2); } /* Dark status box overrides */ body.dark-mode .small-box.bg-success { background-color: #1e6e3a !important; border-color: #28a745 !important; } body.dark-mode .small-box.bg-danger { background-color: #8b2a32 !important; border-color: #dc3545 !important; } body.dark-mode .small-box.bg-success .icon, body.dark-mode .small-box.bg-danger .icon { color: rgba(255,255,255,0.2) !important; } body.dark-mode .small-box.bg-success:hover { background-color: #28a745 !important; } body.dark-mode .small-box.bg-danger:hover { background-color: #dc3545 !important; } /* Dark Checkbox/Radio */ body.dark-mode .icheck-primary > input:first-child:checked + label::before, body.dark-mode .icheck-primary > input:first-child:checked + input[type=hidden] + label::before { background-color: var(--dark-navy-hover); border-color: var(--dark-navy-hover); } body.dark-mode .custom-control-input:checked ~ .custom-control-label::before { background-color: var(--dark-navy-hover); border-color: var(--dark-navy-hover); } /* Dark Footer */ body.dark-mode .main-footer { background-color: var(--dark-navy-deep) !important; border-top: 1px solid var(--dark-navy-accent) !important; color: var(--dark-text-muted); padding: 0.8rem 1rem; font-size: 0.9rem; } body.dark-mode .main-footer a { color: var(--dark-link-color); font-weight: 600;} body.dark-mode .main-footer a:hover { color: var(--dark-link-hover); } /* -------------------------------------------------- */ /* Enhanced Buttons (Both Modes) */ /* -------------------------------------------------- */ .btn { border-width: 1px; font-weight: 600; padding: 0.4rem 0.9rem; font-size: 0.875rem; box-shadow: 0 1px 2px rgba(0,0,0,0.05); letter-spacing: 0.5px; /* Add slight letter spacing */ } .btn:hover { transform: translateY(-1px); box-shadow: 0 3px 6px rgba(0,0,0,0.1); } .btn:active, .btn:focus { transform: translateY(0px); box-shadow: 0 1px 1px rgba(0,0,0,0.05) inset; /* Inset shadow on active */ outline: none !important; } .btn-sm { padding: 0.25rem 0.6rem; font-size: 0.75rem; } /* Light mode button colors use AdminLTE defaults via CSS vars where appropriate */ .btn-primary { background-color: var(--primary-color); border-color: var(--primary-color); color: #fff;} .btn-primary:hover { background-color: var(--primary-hover-color); border-color: var(--primary-hover-color); } /* Define others if overriding needed */ /* --- Dark Mode Button Overrides --- */ body.dark-mode .btn { border-width: 1px; box-shadow: 0 1px 2px rgba(0,0,0,0.15); } body.dark-mode .btn:hover { transform: translateY(-1px); box-shadow: 0 3px 6px rgba(0,0,0,0.25); } body.dark-mode .btn:active { transform: translateY(0px); box-shadow: 0 1px 1px rgba(0,0,0,0.15) inset; } /* Dark Mode specific button colors */ body.dark-mode .btn-primary { background: linear-gradient(180deg, #4a7ab0 0%, var(--dark-navy-hover) 100%); border-color: var(--dark-navy-hover); color: #ffffff; } body.dark-mode .btn-primary:hover { background: linear-gradient(180deg, #5a8ac0 0%, #4a7ab0 100%); border-color: #4a7ab0; } body.dark-mode .btn-secondary { background-color: #5a6268; border-color: #5a6268; color: var(--dark-text-primary); } body.dark-mode .btn-secondary:hover { background-color: #6c757d; border-color: #6c757d; } body.dark-mode .btn-success { background-color: #218838; border-color: #218838; color: #ffffff; } body.dark-mode .btn-success:hover { background-color: #28a745; border-color: #28a745; } body.dark-mode .btn-danger { background-color: #c82333; border-color: #c82333; color: #ffffff; } body.dark-mode .btn-danger:hover { background-color: #dc3545; border-color: #dc3545; } body.dark-mode .btn-warning { background-color: #e0a800; border-color: #e0a800; color: #212529; } body.dark-mode .btn-warning:hover { background-color: #ffc107; border-color: #ffc107; } body.dark-mode .btn-info { background-color: #138496; border-color: #138496; color: #ffffff; } body.dark-mode .btn-info:hover { background-color: #17a2b8; border-color: #17a2b8; } body.dark-mode .btn-default { background-color: var(--dark-navy-border); border-color: var(--dark-navy-hover); color: var(--dark-text-primary); } body.dark-mode .btn-default:hover { background-color: var(--dark-navy-hover); border-color: #4a7ab0; color: #ffffff; } /* -------------------------------------------------- */ /* QR Code Modal Styling */ /* -------------------------------------------------- */ #qrcodeModal .modal-dialog { max-width: fit-content; } #qrcodesContainer { display: flex; flex-wrap: wrap; justify-content: center; gap: 25px; padding: 20px; } /* QR Code Card styling (Light/Dark Base) */ #qrcodesContainer .card { background-color: var(--white-bg); /* Base light */ border: 1px solid var(--border-color-light); border-top: none; /* Remove colored border inherited */ color: var(--text-dark); margin-bottom: 0; box-shadow: 0 4px 10px rgba(0,0,0,0.1); transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; text-align: center; /* Center content */ } #qrcodesContainer .card:hover { transform: translateY(-4px) scale(1.02); box-shadow: 0 6px 15px rgba(0,0,0,0.15); } #qrcodesContainer .card-body { padding: 15px 20px; } #qrcodesContainer .config-type-text { font-weight: 600; margin-top: 12px; color: #495057; font-size: 0.9rem; } /* Ensure QR canvas is block to center within card */ #qrcodesContainer .mx-auto canvas { display: block !important; } /* QR Code Dark Mode Card Overrides */ body.dark-mode #qrcodesContainer .card { background-color: #fdfdfe; /* Keep light for scanning */ border: 1px solid #bbb; color: var(--text-dark); box-shadow: 0 4px 10px rgba(0,0,0,0.2); } body.dark-mode #qrcodesContainer .card:hover { box-shadow: 0 6px 15px rgba(0,0,0,0.3); } body.dark-mode #qrcodesContainer .config-type-text { color: #ffffff; } /* -------------------------------------------------- */ /* SweetAlert2 Styling (Both) */ /* -------------------------------------------------- */ .swal2-popup { border-radius: 0.4rem; box-shadow: 0 10px 30px rgba(0,0,0,0.1); } .swal2-title { font-weight: 600; } .swal2-confirm, .swal2-cancel, .swal2-deny { border-radius: 0.3rem !important; font-weight: 600 !important; padding: 0.5rem 1.2rem !important; box-shadow: 0 1px 2px rgba(0,0,0,0.05) !important; transition: all 0.2s ease-in-out !important; } .swal2-confirm:hover, .swal2-cancel:hover, .swal2-deny:hover { transform: translateY(-1px); box-shadow: 0 3px 6px rgba(0,0,0,0.1) !important; } /* Light Swal */ body:not(.dark-mode) .swal2-confirm { background-color: var(--primary-color) !important; } body:not(.dark-mode) .swal2-cancel { background-color: var(--danger-color) !important; } body:not(.dark-mode) .swal2-deny { background-color: var(--secondary-color) !important; } /* Dark Swal */ body.dark-mode .swal2-popup { background-color: var(--dark-navy-light) !important; color: var(--dark-text-secondary) !important; border: 1px solid var(--dark-navy-hover); box-shadow: 0 10px 30px rgba(0,0,0,0.4); } body.dark-mode .swal2-title { color: var(--dark-text-primary) !important; } body.dark-mode .swal2-html-container { color: var(--dark-text-secondary) !important; } /* Dark Swal Buttons */ body.dark-mode .swal2-confirm { background: linear-gradient(180deg, #4a7ab0 0%, var(--dark-navy-hover) 100%) !important; border-color: var(--dark-navy-hover) !important; color: #ffffff !important; } body.dark-mode .swal2-confirm:hover { background: linear-gradient(180deg, #5a8ac0 0%, #4a7ab0 100%) !important; border-color: #4a7ab0 !important; } body.dark-mode .swal2-cancel { background-color: #c82333 !important; border-color: #c82333 !important; color: #ffffff !important; } body.dark-mode .swal2-cancel:hover { background-color: #dc3545 !important; border-color: #dc3545 !important; } body.dark-mode .swal2-deny { background-color: #5a6268 !important; border-color: #5a6268 !important; color: var(--dark-text-primary) !important; } body.dark-mode .swal2-deny:hover { background-color: #6c757d !important; border-color: #6c757d !important; } /* Dark Swal Icons */ body.dark-mode .swal2-icon.swal2-success .swal2-success-line-tip, body.dark-mode .swal2-icon.swal2-success .swal2-success-line-long { background-color: #34d399 !important; } body.dark-mode .swal2-icon.swal2-success .swal2-success-ring { border-color: rgba(52, 211, 153, 0.3) !important; } body.dark-mode .swal2-icon.swal2-error { border-color: #f87171 !important; color: #f87171 !important; } body.dark-mode .swal2-icon.swal2-warning { border-color: #facc15 !important; color: #facc15 !important; } body.dark-mode .swal2-icon.swal2-info { border-color: #60a5fa !important; color: #60a5fa !important; } body.dark-mode .swal2-icon.swal2-question { border-color: #9ca3af !important; color: #9ca3af !important; } /* -------------------------------------------------- */ /* Misc Tweaks */ /* -------------------------------------------------- */ .content-header { padding-bottom: 0.5rem; } .content-header h1 { font-weight: 300; margin-bottom: 0.5rem; } .content-header h1 small { font-size: 60%; font-weight: 300; color: var(--text-muted-light); } body.dark-mode .content-header h1 small { color: var(--dark-text-muted); } .table-responsive { border: none; } .cursor-pointer { cursor: pointer; }