/* Loading overlay styling */ #loading-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 9999; align-items: center; justify-content: center; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); opacity: 0; transition: opacity 0.4s ease; } #loading-overlay.show { display: flex; opacity: 1; } /* Login Page Styling */ #loginPage { min-height: 100vh; display: flex; align-items: center; justify-content: center; background-color: #f3f4f6; padding: 3rem 1rem; position: relative; z-index: 1; } /* Both login page and main content are hidden by default */ #loginPage.hidden { display: none !important; } #mainContent.hidden { display: none !important; } nav.hidden { display: none !important; } #footer.hidden { display: none !important; } /* Hide login page when OIDC is not enabled (additional safety) */ body[data-oidc-enabled="false"] #loginPage { display: none !important; visibility: hidden !important; } /* Hide login page when skipLoginPage is enabled (additional safety) */ body[data-skip-login-page="true"] #loginPage { display: none !important; visibility: hidden !important; } /* Ensure login page is visible when shown */ body:has(#loginPage:not(.hidden)) { background-color: #f3f4f6; overflow: hidden; } #loginPage .max-w-md { max-width: 28rem; width: 100%; } #loginPage .bg-white { background-color: #ffffff; } #loginPage .rounded-lg { border-radius: 0.5rem; } #loginPage .shadow-lg { box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); } #loginPage .p-8 { padding: 2rem; } #loginPage .mb-8 { margin-bottom: 2rem; } #loginPage .mb-4 { margin-bottom: 1rem; } #loginPage .mb-6 { margin-bottom: 1.5rem; } #loginPage .mb-2 { margin-bottom: 0.5rem; } #loginPage .mr-2 { margin-right: 0.5rem; } #loginPage .mr-3 { margin-right: 0.75rem; } #loginPage .ml-3 { margin-left: 0.75rem; } #loginPage .pt-6 { padding-top: 1.5rem; } #loginPage .py-4 { padding-top: 1rem; padding-bottom: 1rem; } #loginPage .py-3 { padding-top: 0.75rem; padding-bottom: 0.75rem; } #loginPage .px-4 { padding-left: 1rem; padding-right: 1rem; } #loginPage .h-16 { height: 4rem; } #loginPage .w-16 { width: 4rem; } #loginPage .h-10 { height: 2.5rem; } #loginPage .w-10 { width: 2.5rem; } #loginPage .h-5 { height: 1.25rem; } #loginPage .w-5 { width: 1.25rem; } #loginPage .rounded-full { border-radius: 9999px; } #loginPage .bg-blue-600 { background-color: #2563eb; } #loginPage .text-white { color: #ffffff; } #loginPage .text-gray-900 { color: #111827; } #loginPage .text-gray-600 { color: #4b5563; } #loginPage .text-gray-500 { color: #6b7280; } #loginPage .text-red-700 { color: #b91c1c; } #loginPage .text-red-400 { color: #f87171; } #loginPage .text-3xl { font-size: 1.875rem; line-height: 2.25rem; } #loginPage .text-base { font-size: 1rem; line-height: 1.5rem; } #loginPage .text-sm { font-size: 0.875rem; line-height: 1.25rem; } #loginPage .text-xs { font-size: 0.75rem; line-height: 1rem; } #loginPage .font-bold { font-weight: 700; } #loginPage .font-medium { font-weight: 500; } #loginPage .border { border-width: 1px; } #loginPage .border-l-4 { border-left-width: 4px; } #loginPage .border-t { border-top-width: 1px; } #loginPage .border-gray-200 { border-color: #e5e7eb; } #loginPage .border-red-400 { border-color: #f87171; } #loginPage .border-transparent { border-color: transparent; } #loginPage .bg-red-50 { background-color: #fef2f2; } #loginPage .hover\:bg-blue-700:hover { background-color: #1d4ed8; } #loginPage .focus\:outline-none:focus { outline: 2px solid transparent; outline-offset: 2px; } #loginPage .focus\:ring-2:focus { box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.5); } #loginPage .focus\:ring-offset-2:focus { box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px rgba(59, 130, 246, 0.5); } #loginPage .focus\:ring-blue-500:focus { box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.5); } #loginPage .transition-colors { transition-property: background-color, border-color, color; transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-duration: 150ms; } #loginPage .animate-spin { animation: spin 1s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } #loginPage .flex { display: flex; } #loginPage .inline-flex { display: inline-flex; } #loginPage .items-center { align-items: center; } #loginPage .justify-center { justify-content: center; } #loginPage .text-center { text-align: center; } #loginPage .mx-auto { margin-left: auto; margin-right: auto; } #loginPage .w-full { width: 100%; } #loginPage .hidden { display: none; } /* Restart banner */ #restartBanner { display: none; } #serverManagerList { min-height: 480px; } /* Custom scrollbar */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: #f1f1f1; } ::-webkit-scrollbar-thumb { background: #888; border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: #555; } /* Custom select2 styling to match Tailwind */ .select2-container--default .select2-selection--multiple { border: 1px solid #d1d5db; border-radius: 0.375rem; padding: 0.25rem 0.5rem; min-height: 42px; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #3b82f6; border: 1px solid #3b82f6; color: white; border-radius: 0.25rem; padding: 0 0.5rem; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { color: white; margin-right: 0.25rem; } /* Custom modal styling */ .modal-content { box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } body.modal-open { overflow: hidden !important; } /* Custom tooltip styling */ .tooltip { position: relative; display: inline-block; } .tooltip .tooltip-text { visibility: hidden; width: 200px; background-color: #333; color: #fff; text-align: center; border-radius: 6px; padding: 5px; position: absolute; z-index: 1; bottom: 125%; left: 50%; margin-left: -100px; opacity: 0; transition: opacity 0.3s; } .tooltip:hover .tooltip-text { visibility: visible; opacity: 1; } /* Custom mark styling for search highlights */ mark { background-color: #fef08a; padding: 0.1em 0em 0.1em 0.2em; border-radius: 0.25em; } /* Toast notifications */ #toast-container { position: fixed; top: 1.5rem; right: 1.5rem; display: flex; flex-direction: column; gap: 0.5rem; z-index: 10000; pointer-events: none; } .toast { min-width: 240px; max-width: 360px; padding: 0.75rem 1rem; border-radius: 0.5rem; color: #fff; font-weight: 500; box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); opacity: 0; transform: translateY(-6px); transition: opacity 0.25s ease, transform 0.25s ease; } .toast.show { opacity: 1; transform: translateY(0); } .toast-success { background-color: #047857; } .toast-error { background-color: #b91c1c; } .toast-info { background-color: #1d4ed8; } .toast-warning { background-color: #d97706; } .toast-ban-event { background-color: #7f1d1d; pointer-events: auto; cursor: pointer; } .toast-ban-event:hover { background-color: #991b1b; transform: translateY(-2px); box-shadow: 0 15px 20px -3px rgba(0, 0, 0, 0.15); } .toast-unban-event { background-color: #14532d; pointer-events: auto; cursor: pointer; } .toast-unban-event:hover { background-color: #166534; transform: translateY(-2px); box-shadow: 0 15px 20px -3px rgba(0, 0, 0, 0.15); } /* Backend Status Indicator */ #backendStatus { display: flex; align-items: center; gap: 0.5rem; padding: 0.25rem 0.5rem; margin-left: 5px; border-radius: 0.25rem; /* background-color: rgba(255, 255, 255, 0.1); */ transition: background-color 0.2s ease; } /*#backendStatus:hover { background-color: rgba(255, 255, 255, 0.15); }*/ #statusDot { width: 0.5rem; height: 0.5rem; border-radius: 50%; display: inline-block; transition: background-color 0.3s ease, box-shadow 0.3s ease; box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.7); animation: pulse 2s infinite; } #statusDot.bg-green-500 { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.7); animation: pulseGreen 2s infinite; } #statusDot.bg-yellow-500 { box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.7); animation: pulseYellow 2s infinite; } #statusDot.bg-red-500 { box-shadow: 0 0 0 0 rgb(163 44 44); animation: pulseRed 2s infinite; } #statusDot.bg-gray-400 { animation: none; } #statusText { font-size: 0.75rem; font-weight: 500; color: rgba(255, 255, 255, 0.9); white-space: nowrap; } @keyframes pulseGreen { 0% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.7); } 70% { box-shadow: 0 0 0 4px rgba(34, 197, 94, 0); } 100% { box-shadow: 0 0 0 0 rgba(34, 197, 94, 0); } } @keyframes pulseYellow { 0% { box-shadow: 0 0 0 0 rgba(234, 179, 8, 0.7); } 70% { box-shadow: 0 0 0 4px rgba(234, 179, 8, 0); } 100% { box-shadow: 0 0 0 0 rgba(234, 179, 8, 0); } } @keyframes pulseRed { 0% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.7); } 70% { box-shadow: 0 0 0 4px rgba(239, 68, 68, 0); } 100% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0); } } /* Clock Display */ #clockDisplay { display: flex; align-items: center; padding: 0.25rem 0.75rem; border-radius: 0.25rem; background-color: rgba(255, 255, 255, 0.1); transition: background-color 0.2s ease; } #clockDisplay:hover { background-color: rgba(255, 255, 255, 0.15); } #clockTime { font-family: 'Courier New', Courier, monospace; font-size: 0.875rem; font-weight: 600; color: rgba(255, 255, 255, 0.95); letter-spacing: 0.05em; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } /* Mobile responsive adjustments */ /* Custom breakpoint at 830px for menu collapse */ /* This overrides Tailwind's default md: breakpoint (768px) to collapse at 830px instead */ @media (max-width: 830px) { /* Hide desktop menu navigation at 830px */ nav .hidden.md\:block { display: none !important; } /* Show burger menu button at 830px */ nav > div > div > div.md\:hidden:not(#mobileMenu) { display: block !important; } /* Allow mobile menu to be shown at 830px (override md:hidden) */ /* The menu visibility is controlled by JavaScript via the 'hidden' class */ /* When hidden class is NOT present, show the menu */ nav #mobileMenu:not(.hidden) { display: block !important; } /* When mobile menu has 'hidden' class, hide it (JavaScript control takes precedence) */ nav #mobileMenu.hidden { display: none !important; } } @media (max-width: 768px) { #backendStatus { padding: 0.125rem 0.375rem; } #statusText { font-size: 0.625rem; } #clockDisplay { padding: 0.125rem 0.5rem; } #clockTime { font-size: 0.75rem; } } #advancedMikrotikFields, #advancedPfSenseFields, #advancedOPNsenseFields { padding: 10px; } /* Additional Tailwind color classes for buttons */ .bg-red-500 { --tw-bg-opacity: 1; background-color: rgb(239 68 68 / var(--tw-bg-opacity, 1)); } .bg-red-600 { --tw-bg-opacity: 1; background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); } .hover\:bg-red-600:hover { --tw-bg-opacity: 1; background-color: rgb(220 38 38 / var(--tw-bg-opacity, 1)); } .bg-purple-600 { --tw-bg-opacity: 1; background-color: rgb(147 51 234 / var(--tw-bg-opacity, 1)); } .bg-purple-700 { --tw-bg-opacity: 1; background-color: rgb(126 34 206 / var(--tw-bg-opacity, 1)); } .hover\:bg-purple-700:hover { --tw-bg-opacity: 1; background-color: rgb(126 34 206 / var(--tw-bg-opacity, 1)); } /* Ensure Font Awesome icons are visible */ .fas, .far, .fab, .fal, .fad { font-family: "Font Awesome 6 Free", "Font Awesome 6 Brands", "Font Awesome 6 Pro"; font-weight: 900; display: inline-block; font-style: normal; font-variant: normal; text-rendering: auto; line-height: 1; } .fas::before { font-weight: 900; } /* Button icon spacing */ button .fas, button .far, button .fab { margin-right: 0.25rem; } button .fas:only-child, button .far:only-child, button .fab:only-child { margin-right: 0; } /* Additional utility classes that might be missing */ /* Support for top-1/2 and -translate-y-1/2 (with escaped slash) */ .top-1\/2 { top: 50%; } .-translate-y-1\/2 { --tw-translate-y: -50%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } /* Alternative class name without escape (for compatibility) */ .top-1-2 { top: 50%; } .-translate-y-1-2 { --tw-translate-y: -50%; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); } .gap-2 { gap: 0.5rem; } /* Ensure buttons with icons display properly */ button.inline-flex, .inline-flex { display: inline-flex; align-items: center; } button .fas, button .far, button .fab { display: inline-block; width: 1em; text-align: center; } /* Ensure delete button is visible */ button.bg-red-500, button.bg-red-600 { color: white; border: none; cursor: pointer; } button.bg-red-500:hover, button.bg-red-600:hover { background-color: rgb(220 38 38); } /* Green color classes */ .bg-green-100 { --tw-bg-opacity: 1; background-color: rgb(220 252 231 / var(--tw-bg-opacity, 1)); } .text-green-800 { --tw-text-opacity: 1; color: rgb(22 101 52 / var(--tw-text-opacity, 1)); } /* WebSocket Tooltip Styling */ #wsTooltip { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.5; } #wsTooltip .text-green-400 { color: rgb(74 222 128); } #wsTooltip .text-blue-400 { color: rgb(96 165 250); } #wsTooltip .text-yellow-400 { color: rgb(250 204 21); } #wsTooltip .text-orange-400 { color: rgb(251 146 60); } #wsTooltip .text-gray-400 { color: rgb(156 163 175); } #wsTooltip .text-gray-500 { color: rgb(107 114 128); } /* Console output text colors */ .text-gray-100 { color: #f3f4f6; } /* Ignore IPs container - ensure proper wrapping and prevent horizontal overflow */ #ignoreIPsContainer { overflow-x: hidden; word-wrap: break-word; overflow-wrap: break-word; } #ignoreIPsTags { max-width: 100%; overflow-wrap: anywhere; word-break: break-word; } .ignore-ip-tag { max-width: 100%; word-break: break-all; overflow-wrap: anywhere; } #wsTooltip .border-gray-700 { border-color: rgb(55 65 81); } #wsTooltip .border-b { border-bottom-width: 1px; } #wsTooltip .border-t { border-top-width: 1px; }