Files
Virtnet.bond/public/css/proxmox.css

593 lines
28 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Proxmox Extension Styles
* Consolidated from inline <style> blocks for browser caching.
*/
/* ==========================================================================
Page Transitions
========================================================================== */
.proxmox-page-wrapper {
opacity: 1;
}
.proxmox-page-wrapper.slide-in {
animation: slideIn 0.2s cubic-bezier(0.22, 1, 0.36, 1);
}
@keyframes slideIn {
from { opacity: 0; transform: translateX(20px); }
to { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
.proxmox-page-wrapper.slide-in { animation: none; opacity: 1; }
}
/* ==========================================================================
Navigation (Desktop)
========================================================================== */
.proxmox-nav-container {
background: color-mix(in srgb, var(--color-background-secondary) 60%, transparent);
backdrop-filter: blur(12px);
border: 1px solid color-mix(in srgb, var(--color-neutral) 30%, transparent);
border-radius: 14px;
padding: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.05), 0 0 0 1px rgba(0,0,0,0.02);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
z-index: 10;
}
.dark .proxmox-nav-container {
background: color-mix(in srgb, var(--color-background-secondary) 80%, transparent);
border-color: color-mix(in srgb, var(--color-neutral) 40%, transparent);
box-shadow: 0 1px 3px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.05);
}
.proxmox-nav-tabs { display: flex; gap: 4px; flex-wrap: wrap; flex: 1; }
.proxmox-tab-link {
position: relative; font-size: 0.8125rem; font-weight: 600;
padding: 10px 16px; border-radius: 10px; letter-spacing: -0.01em;
white-space: nowrap; transition: all 0.25s cubic-bezier(0.4,0,0.2,1);
border: 1px solid transparent; overflow: hidden;
}
.proxmox-tab-link::before {
content: ''; position: absolute; inset: 0;
background: linear-gradient(135deg, rgba(37,99,235,0.08), rgba(59,130,246,0.05));
opacity: 0; transition: opacity 0.25s cubic-bezier(0.4,0,0.2,1); z-index: 0;
}
.proxmox-tab-link:hover::before { opacity: 1; }
.proxmox-tab-link span { position: relative; z-index: 1; }
.proxmox-tab-link:hover { transform: translateY(-1px); border-color: rgba(37,99,235,0.15); }
.proxmox-tab-link.active {
background: linear-gradient(135deg, rgba(37,99,235,0.12), rgba(59,130,246,0.08));
border-color: rgba(37,99,235,0.25);
box-shadow: 0 2px 8px rgba(37,99,235,0.15), inset 0 1px 0 rgba(255,255,255,0.1);
color: rgb(37,99,235);
}
.dark .proxmox-tab-link.active {
background: linear-gradient(135deg, rgba(59,130,246,0.18), rgba(37,99,235,0.12));
border-color: rgba(59,130,246,0.35); color: rgb(96,165,250);
}
.proxmox-tab-link:not(.active) {
display: flex; align-items: center; justify-content: center;
color: color-mix(in srgb, var(--color-base) 65%, transparent);
}
.dark .proxmox-tab-link:not(.active) {
color: color-mix(in srgb, var(--color-base) 65%, transparent);
}
/* ==========================================================================
Toggle Switch
========================================================================== */
.modern-toggle-container {
display: inline-flex; align-items: center; gap: 12px; padding: 6px 12px;
background: color-mix(in srgb, var(--color-background) 50%, transparent);
border: 1px solid color-mix(in srgb, var(--color-neutral) 40%, transparent);
border-radius: 12px; box-shadow: 0 1px 2px rgba(0,0,0,0.03);
transition: all 0.25s cubic-bezier(0.4,0,0.2,1);
}
.dark .modern-toggle-container {
background: color-mix(in srgb, var(--color-background) 60%, transparent);
border-color: color-mix(in srgb, var(--color-neutral) 50%, transparent);
}
.modern-toggle-label {
font-size: 0.75rem; font-weight: 600; letter-spacing: 0.02em;
text-transform: uppercase; transition: all 0.2s ease; user-select: none;
}
.modern-toggle-label.inactive { color: color-mix(in srgb, var(--color-base) 40%, transparent); }
.modern-toggle-label.active { color: rgb(37,99,235); }
.dark .modern-toggle-label.active { color: rgb(96,165,250); }
.dark .modern-toggle-label.inactive { color: color-mix(in srgb, var(--color-base) 40%, transparent); }
.modern-toggle-switch {
position: relative; width: 48px; height: 26px;
background: linear-gradient(135deg, rgba(156,163,175,0.4), rgba(209,213,219,0.4));
border-radius: 13px; cursor: pointer; transition: all 0.3s cubic-bezier(0.4,0,0.2,1);
border: 1px solid rgba(var(--neutral-rgb, 156,163,175), 0.2);
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.05);
}
.dark .modern-toggle-switch {
background: linear-gradient(135deg, rgba(55,65,81,0.6), rgba(75,85,99,0.6));
border-color: rgba(var(--neutral-rgb, 75,85,99), 0.4);
}
.modern-toggle-switch.active {
background: linear-gradient(135deg, rgb(37,99,235), rgb(59,130,246));
border-color: rgba(37,99,235,0.3);
box-shadow: 0 0 0 3px rgba(37,99,235,0.1), inset 0 1px 3px rgba(0,0,0,0.15), 0 2px 6px rgba(37,99,235,0.25);
}
.dark .modern-toggle-switch.active {
background: linear-gradient(135deg, rgb(59,130,246), rgb(96,165,250));
box-shadow: 0 0 0 3px rgba(59,130,246,0.15), inset 0 1px 3px rgba(0,0,0,0.2), 0 2px 8px rgba(59,130,246,0.3);
}
.modern-toggle-handle {
position: absolute; top: 2px; left: 2px; width: 20px; height: 20px;
background: linear-gradient(135deg, rgb(255,255,255), rgb(249,250,251));
border-radius: 50%; transition: all 0.3s cubic-bezier(0.34,1.56,0.64,1);
box-shadow: 0 2px 4px rgba(0,0,0,0.15), 0 0 0 1px rgba(0,0,0,0.05);
}
.modern-toggle-switch.active .modern-toggle-handle {
transform: translateX(22px);
box-shadow: 0 3px 8px rgba(0,0,0,0.2), 0 0 0 1px rgba(255,255,255,0.1);
}
.modern-toggle-switch.disabled { opacity: 0.4; cursor: not-allowed; }
/* Tab animations */
@keyframes tabSlideIn {
from { opacity: 0; transform: translateY(-8px); }
to { opacity: 1; transform: translateY(0); }
}
.proxmox-tab-wrapper {
animation: tabSlideIn 0.3s cubic-bezier(0.4,0,0.2,1);
display: flex; align-items: center;
}
/* ==========================================================================
Dropdown Styles
========================================================================== */
.dropdown-wrapper { position: relative; display: flex; align-items: center; }
.dropdown-trigger { display: flex; align-items: center; gap: 4px; }
.dropdown-icon { transition: transform 0.2s ease; width: 14px; height: 14px; }
.dropdown-wrapper.open .dropdown-icon { transform: rotate(180deg); }
.dropdown-menu {
position: absolute; top: calc(100% + 8px); left: 50%; transform: translateX(-50%);
min-width: 180px; background: rgba(255,255,255,0.705); backdrop-filter: blur(10px);
border: 1px solid rgba(209,213,219,0.3); border-radius: 12px;
box-shadow: 0 4px 16px rgba(0,0,0,0.15), 0 0 0 1px rgba(0,0,0,0.05);
z-index: 100; overflow: hidden;
}
.dark .dropdown-menu {
background: rgba(30,30,35,0.98); border-color: rgba(75,85,99,0.4);
box-shadow: 0 4px 20px rgba(0,0,0,0.5), 0 0 0 1px rgba(255,255,255,0.1);
}
.dropdown-item {
display: block; padding: 10px 16px; font-size: 0.8125rem; font-weight: 600;
transition: all 0.2s ease; border-left: 3px solid transparent; color: var(--color-base);
}
.dropdown-item:hover {
background: linear-gradient(135deg, rgba(37,99,235,0.15), rgba(59,130,246,0.1));
border-left-color: rgba(37,99,235,0.6); color: var(--color-base);
}
.dropdown-item.active {
background: linear-gradient(135deg, rgba(37,99,235,0.15), rgba(59,130,246,0.1));
border-left-color: rgb(37,99,235); color: rgb(37,99,235);
}
.dark .dropdown-item.active {
background: linear-gradient(135deg, rgba(59,130,246,0.2), rgba(37,99,235,0.15));
border-left-color: rgb(96,165,250); color: rgb(96,165,250);
}
.dropdown-divider {
height: 1px; background: color-mix(in srgb, var(--color-neutral) 30%, transparent); margin: 4px 0;
}
/* ==========================================================================
Sidebar Hide (768px – 1023px)
========================================================================== */
@media screen and (min-width: 768px) and (max-width: 1023px) {
html body > div.w-full.flex.flex-grow > aside.w-64.h-screen,
html body > div.w-full.flex > aside.w-64.h-screen,
html body aside.w-64.h-screen.mt-14,
html body aside.w-64.h-screen.mt-24,
body aside.w-64[class*="md:flex"] {
display: none !important; visibility: hidden !important; opacity: 0 !important;
pointer-events: none !important; width: 0 !important; max-width: 0 !important;
overflow: hidden !important; position: absolute !important; left: -9999px !important;
}
html body > div.w-full.flex.flex-grow > div[class*="md:ml-64"],
html body > div.w-full.flex > div[class*="md:ml-64"],
body > div > div[class*="md:ml-64"],
div[class*="md:ml-64"] { margin-left: 0 !important; }
html body > div.w-full.flex.flex-grow > div[class*="rtl:md:mr-64"],
html body > div.w-full.flex > div[class*="rtl:md:mr-64"],
body > div > div[class*="rtl:md:mr-64"],
div[class*="rtl:md:mr-64"] { margin-right: 0 !important; }
}
/* ==========================================================================
Skeleton Loading
========================================================================== */
@keyframes shimmer {
0% { background-position: -200% 0; }
100% { background-position: 200% 0; }
}
.skeleton-loading {
background: linear-gradient(90deg, transparent 25%,
color-mix(in srgb, var(--color-base) 8%, transparent) 50%, transparent 75%);
background-size: 200% 100%;
animation: shimmer 1.5s ease-in-out infinite;
}
/* ==========================================================================
Mobile Navigation
========================================================================== */
.mobile-nav-button {
background: color-mix(in srgb, var(--color-background-secondary) 60%, transparent);
backdrop-filter: blur(12px);
border: 1px solid color-mix(in srgb, var(--color-neutral) 30%, transparent);
border-radius: 12px; padding: 12px 16px;
box-shadow: 0 1px 3px rgba(0,0,0,0.05), 0 0 0 1px rgba(0,0,0,0.02);
transition: all 0.2s ease;
}
.dark .mobile-nav-button {
background: color-mix(in srgb, var(--color-background-secondary) 80%, transparent);
border-color: color-mix(in srgb, var(--color-neutral) 40%, transparent);
}
.mobile-nav-button:active { transform: scale(0.98); }
.mobile-dropdown {
background: rgba(var(--background-secondary-rgb, 255,255,255), 0.95);
backdrop-filter: blur(16px);
border: 1px solid rgba(var(--neutral-rgb, 229,231,235), 0.3);
border-radius: 14px;
box-shadow: 0 4px 16px rgba(0,0,0,0.1), 0 0 0 1px rgba(0,0,0,0.03);
}
.dark .mobile-dropdown {
background: rgba(var(--background-secondary-rgb, 31,41,55), 0.95);
border-color: rgba(var(--neutral-rgb, 75,85,99), 0.4);
box-shadow: 0 4px 16px rgba(0,0,0,0.3), 0 0 0 1px rgba(255,255,255,0.05);
}
.mobile-tab-item {
padding: 12px 16px; transition: all 0.2s ease; border-left: 3px solid transparent;
}
.mobile-tab-item:hover {
background: rgba(37,99,235,0.08); border-left-color: rgba(37,99,235,0.3);
}
.mobile-tab-item.active {
background: rgba(37,99,235,0.12); border-left-color: rgb(37,99,235); font-weight: 600;
}
.dark .mobile-tab-item.active {
background: rgba(59,130,246,0.15); border-left-color: rgb(96,165,250);
}
.mobile-toggle-compact {
display: inline-flex; align-items: center; gap: 8px; padding: 8px 12px;
background: rgba(var(--background-rgb, 255,255,255), 0.5);
border: 1px solid rgba(var(--neutral-rgb, 229,231,235), 0.4); border-radius: 10px;
}
.dark .mobile-toggle-compact {
background: rgba(var(--background-rgb, 17,24,39), 0.6);
border-color: rgba(var(--neutral-rgb, 75,85,99), 0.5);
}
.mobile-toggle-label-compact {
font-size: 0.7rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em;
}
.mobile-toggle-switch-compact {
width: 40px; height: 22px;
background: linear-gradient(135deg, rgba(156,163,175,0.4), rgba(209,213,219,0.4));
border-radius: 11px; position: relative; transition: all 0.3s ease;
border: 1px solid rgba(var(--neutral-rgb, 156,163,175), 0.2);
}
.mobile-toggle-switch-compact.active {
background: linear-gradient(135deg, rgb(37,99,235), rgb(59,130,246));
}
.dark .mobile-toggle-switch-compact.active {
background: linear-gradient(135deg, rgb(59,130,246), rgb(96,165,250));
}
.mobile-toggle-handle-compact {
position: absolute; top: 1px; left: 1px; width: 18px; height: 18px;
background: white; border-radius: 50%;
transition: all 0.3s cubic-bezier(0.34,1.56,0.64,1);
box-shadow: 0 2px 4px rgba(0,0,0,0.15);
}
.mobile-toggle-switch-compact.active .mobile-toggle-handle-compact { transform: translateX(18px); }
.mobile-section-header {
background: linear-gradient(135deg, rgba(37,99,235,0.05), rgba(59,130,246,0.03));
border-bottom: 1px solid color-mix(in srgb, var(--color-neutral) 20%, transparent);
}
.dark .mobile-section-header {
background: linear-gradient(135deg, rgba(59,130,246,0.08), rgba(37,99,235,0.05));
}
/* ==========================================================================
Installing / Loading Card
========================================================================== */
@keyframes pulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}
.installing-container {
min-height: calc(100vh - 30rem); height: calc(100vh - 30rem);
display: flex; flex-direction: column; justify-content: center; align-items: center;
}
.installing-body {
display: flex; align-items: center; justify-content: center;
font-family: "Inter", system-ui, sans-serif; color: #1d2c3f; width: 100%;
}
.loading-card {
width: min(460px, 92vw); background: #ffffff; border-radius: 20px;
padding: 34px 30px 38px;
box-shadow: 0 25px 50px rgba(86,121,168,0.22), 0 0 0 1px rgba(109,178,255,0.15);
position: relative; overflow: hidden;
}
.dark .loading-card { background: var(--background-secondary); color: var(--base); }
.loading-card::after {
content: ""; position: absolute; inset: -2px; border-radius: 22px;
background: linear-gradient(90deg, rgba(44,185,149,0.15), rgba(0,163,255,0.15),
rgba(0,84,255,0.15), rgba(85,0,255,0.15));
background-size: 200% 200%; animation: border-glow 8s ease infinite;
z-index: -1; pointer-events: none; opacity: 0.3;
}
@keyframes border-glow { 0%,100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } }
.loading-card .header { display: flex; align-items: center; gap: 16px; margin-bottom: 28px; }
.logo-shell { width: 58px; height: 58px; display: grid; place-items: center; }
.logo-shell img { width: 42px; height: auto; display: block; animation: pulse 2s infinite; }
.loading-card .header span { text-transform: uppercase; letter-spacing: 0.26em; font-size: 0.75rem; color: rgba(32,56,84,0.6); }
.dark .loading-card .header span { color: rgba(255,255,255,0.6); }
.loading-card .header h1 { margin: 4px 0 0; font-size: clamp(1.4rem, 1vw, 1.65rem); }
.line {
position: relative; height: 6px; border-radius: 999px;
background: rgba(37,74,179,0.596); overflow: hidden; margin-bottom: 32px;
box-shadow: inset 0 0 12px rgba(0,0,0,0.05), 0 16px 32px rgba(109,178,255,0.2);
}
.line::before {
content: ""; position: absolute; inset: 0;
background: linear-gradient(89deg, #2cb995, #00a3ff, #0054ff, #001cff, #5500ff);
background-size: 800% 800%; animation: line-gradient 13s ease infinite;
}
.line::after {
content: ""; position: absolute; top: 50%; left: 0%; width: 36px; height: 12px;
border-radius: 999px; border: 1px solid rgba(0,20,60,0.25);
background: linear-gradient(90deg, rgba(255,255,255,0.25), rgba(255,255,255,0));
box-shadow: 0 4px 20px rgba(0,90,255,0.25), inset 0 0 8px rgba(255,255,255,0.4);
transform: translate(-50%, -50%) skewX(-8deg);
animation: line-marker 2.8s cubic-bezier(0.55,0.03,0.35,0.95) infinite;
}
.status-cycle { margin-top: 24px; height: 20px; font-size: 0.7rem; letter-spacing: 0.18em;
text-transform: uppercase; color: rgba(32,56,84,0.65); position: relative; }
.dark .status-cycle { color: rgba(255,255,255,0.65); }
.status-cycle ul { list-style: none; margin: 0; padding: 0; position: relative; height: 20px; }
.status-cycle li { position: absolute; inset: 0; display: flex; align-items: center; gap: 10px;
opacity: 0; animation: status-step 30s linear infinite; }
.status-cycle li::before { content: ""; width: 12px; height: 2px;
background: linear-gradient(90deg, #18d4ff, transparent); }
.status-cycle li:nth-child(2) { animation-delay: 3s; }
.status-cycle li:nth-child(3) { animation-delay: 6s; }
.status-cycle li:nth-child(4) { animation-delay: 9s; }
.status-cycle li:nth-child(5) { animation-delay: 12s; }
.status-cycle li:nth-child(6) { animation-delay: 15s; }
.status-cycle li:nth-child(7) { animation-delay: 18s; }
.status-cycle li:nth-child(8) { animation-delay: 21s; }
.status-cycle li:nth-child(9) { animation-delay: 24s; }
.status-cycle li:nth-child(10) { animation-delay: 27s; }
@keyframes line-gradient {
0% { background-position: 0% 79%; }
50% { background-position: 100% 22%; }
100% { background-position: 0% 79%; }
}
@keyframes line-marker {
0% { left: 0%; opacity: 0.15; transform: translate(-50%,-50%) skewX(-8deg) scaleX(0.85); }
10% { opacity: 0.85; }
50% { opacity: 1; transform: translate(-50%,-50%) skewX(-6deg) scaleX(1); }
85% { opacity: 0.4; }
100% { left: 100%; opacity: 0.15; transform: translate(-50%,-50%) skewX(-10deg) scaleX(0.75); }
}
@keyframes status-step { 0%,8% { opacity: 1; } 10%,100% { opacity: 0; } }
.watermark { position: absolute; bottom: 14px; right: 24px; font-size: 0.55rem;
letter-spacing: 0.22em; color: rgba(32,56,84,0.35); cursor: default; text-decoration: none; }
.dark .watermark { color: rgba(255,255,255,0.35); }
/* ==========================================================================
Audio / Easter Egg Modal
========================================================================== */
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes slideUp {
from { transform: translateY(30px); opacity: 0; }
to { transform: translateY(0); opacity: 1; }
}
.audio-modal { display: none; position: fixed; z-index: 10000; left: 0; top: 0;
width: 100%; height: 100%; background-color: rgba(0,0,0,0.5);
backdrop-filter: blur(4px); animation: fadeIn 0.3s ease; }
.audio-modal.active { display: flex; align-items: center; justify-content: center; }
.audio-modal-content {
background: transparent; border-radius: 20px; padding: 0; width: min(400px, 90vw);
max-width: 90vw;
box-shadow: 0 25px 50px rgba(86,121,168,0.3), 0 0 0 1px rgba(109,178,255,0.2);
animation: slideUp 0.3s ease; overflow: hidden; position: relative;
}
.audio-modal-content::before {
content: ""; position: absolute; inset: 0;
background-image: url('/assets/images/glados.jpg');
background-size: cover; background-position: center; opacity: .95;
border-radius: 20px; z-index: -1;
}
.audio-modal-header {
display: flex; align-items: center; justify-content: space-between;
padding: 24px 28px 10px; position: relative; background: rgba(255,255,255,0.9);
}
.dark .audio-modal-header { background: rgba(0,0,0,0.9); }
.audio-modal-header h2 { margin: 0; position: relative; }
.audio-modal-header h2 .data-corruption {
display: inline-block; font-family: 'Fira Mono', monospace; font-size: 1.1rem;
font-weight: 400; color: #1d2c3f; letter-spacing: 0.1em; position: relative;
}
.dark .audio-modal-header h2 .data-corruption { color: var(--base); }
.audio-modal-header h2 .data-corruption::before,
.audio-modal-header h2 .data-corruption::after {
content: attr(title); position: absolute; left: 0; color: #1d2c3f;
}
.dark .audio-modal-header h2 .data-corruption::before,
.dark .audio-modal-header h2 .data-corruption::after { color: var(--base); }
.audio-modal-close {
background: none; border: none; font-size: 2rem; color: rgba(32,56,84,0.4);
cursor: pointer; line-height: 1; padding: 0; width: 32px; height: 32px;
display: flex; align-items: center; justify-content: center;
border-radius: 50%; transition: all 0.2s ease;
}
.audio-modal-close:hover { background: rgba(32,56,84,0.1); color: rgba(32,56,84,0.7); }
.dark .audio-modal-close { color: rgba(255,255,255,0.4); }
.dark .audio-modal-close:hover { background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.7); }
.audio-modal-body {
padding-left: 28px; padding-right: 28px; padding-bottom: 28px;
display: flex; font-size: small; flex-direction: column;
justify-content: center; align-items: left; gap: 16px;
position: relative; background: rgba(255,255,255,0.9);
}
.dark .audio-modal-body { background: rgba(0,0,0,0.9); }
.audio-modal-body audio { width: 100%; outline: none; }
.audio-modal-body a { color: inherit; text-decoration: none; }
.audio-modal-body a:hover, .audio-modal-body a:visited, .audio-modal-body a:active {
color: inherit; text-decoration: none;
}
.easter-egg-message {
display: flex; align-items: flex-start; gap: 16px; padding: 20px;
background: linear-gradient(135deg, rgba(118,124,128,0.08), rgba(136,136,136,0.445));
border-radius: 12px; border-left: 3px solid rgba(54,62,66,0.4); margin-bottom: 8px;
}
.easter-egg-text { margin: 0; font-size: 0.75rem; line-height: 1.6;
color: rgba(32,56,84,0.85); letter-spacing: 0.02em; }
.dark .easter-egg-text { color: rgba(255,255,255,0.85); }
.easter-egg-highlight {
font-weight: 700; font-size: 1.1em;
background: linear-gradient(135deg, #00000070, #4e4d69);
-webkit-background-clip: text; -webkit-text-fill-color: transparent;
background-clip: text; letter-spacing: 0.05em;
}
/* ==========================================================================
Progress Bars (Memory / CPU)
========================================================================== */
progress {
border-radius: var(--radius-lg);
background-color: hsl(var(--color-background));
border: 1px solid hsl(var(--color-neutral));
width: 100%; overflow: hidden;
}
progress[value]::-webkit-progress-bar { background-color: hsl(var(--color-background)); }
progress[value]#memory::-webkit-progress-value {
background-color: color-mix(in oklab, hsl(var(--color-success)) 60%, transparent);
border: 1px solid hsl(var(--color-success)); border-radius: var(--radius-lg);
}
progress[value]#memory::-moz-progress-bar {
background-color: color-mix(in oklab, hsl(var(--color-success)) 60%, transparent);
border: 1px solid hsl(var(--color-success)); border-radius: var(--radius-lg);
}
progress[value]#cpu::-webkit-progress-value {
background-color: color-mix(in oklab, hsl(var(--color-info)) 60%, transparent);
border: 1px solid hsl(var(--color-info)); border-radius: var(--radius-lg);
}
progress[value]#cpu::-moz-progress-bar {
background-color: color-mix(in oklab, hsl(var(--color-info)) 60%, transparent);
border: 1px solid hsl(var(--color-info)); border-radius: var(--radius-lg);
}
/* ==========================================================================
Form Selects
========================================================================== */
.formRight select {
background-color: hsl(var(--color-background));
border: 1px solid hsl(var(--color-neutral));
border-radius: 0.375rem; padding: 0.5rem 0.75rem;
font-size: 0.875rem; line-height: 1.25rem; outline: none;
}
.formRight select:focus {
outline: none; box-shadow: 0 0 0 2px hsl(var(--color-secondary));
}
/* ==========================================================================
Network Traffic Bars
========================================================================== */
.network-flow-bar {
position: relative; height: 8px; background: rgba(128,128,128,0.1);
border-radius: 9999px; overflow: hidden;
}
.network-flow-fill {
position: absolute; top: 0; left: 0; height: 100%; border-radius: 9999px;
transition: width 0.5s cubic-bezier(0.4,0,0.2,1);
}
.network-flow-fill.download {
background: linear-gradient(90deg, rgba(34,197,94,0.3), rgba(34,197,94,0.8), rgba(34,197,94,0.3));
}
.network-flow-fill.upload {
background: linear-gradient(90deg, rgba(59,130,246,0.3), rgba(59,130,246,0.8), rgba(59,130,246,0.3));
}
/* Sparkline chart styles */
.sparkline-chart { width: 100%; height: 40px; }
.chart-dropdown { max-height: 0; overflow: hidden; transition: max-height 0.3s ease-out; }
.chart-dropdown.open { max-height: 400px; transition: max-height 0.5s ease-in; }
#network-traffic-container { min-height: 100px; }
/* ==========================================================================
Firewall Loaders
========================================================================== */
.fw-loader {
width: 24px; aspect-ratio: 1; border-radius: 50%; padding: 3px;
background:
conic-gradient(from 135deg at top, currentColor 90deg, #0000 0) 0 calc(50% - 2px)/10px 5px,
radial-gradient(farthest-side at bottom left, #0000 calc(100% - 3px), currentColor calc(100% - 2px) 99%, #0000) top right/50% 50% content-box content-box,
radial-gradient(farthest-side at top, #0000 calc(100% - 3px), currentColor calc(100% - 2px) 99%, #0000) bottom/100% 50% content-box content-box;
background-repeat: no-repeat;
animation: fw-loader-spin 1s infinite linear;
}
.fw-loader-sm {
width: 16px; aspect-ratio: 1; border-radius: 50%; padding: 2px;
background:
conic-gradient(from 135deg at top, currentColor 90deg, #0000 0) 0 calc(50% - 1.5px)/6px 3px,
radial-gradient(farthest-side at bottom left, #0000 calc(100% - 2px), currentColor calc(100% - 1.5px) 99%, #0000) top right/50% 50% content-box content-box,
radial-gradient(farthest-side at top, #0000 calc(100% - 2px), currentColor calc(100% - 1.5px) 99%, #0000) bottom/100% 50% content-box content-box;
background-repeat: no-repeat;
animation: fw-loader-spin 1s infinite linear;
}
.fw-loader-lg {
width: 32px; aspect-ratio: 1; border-radius: 50%; padding: 4px;
background:
conic-gradient(from 135deg at top, currentColor 90deg, #0000 0) 0 calc(50% - 3px)/12px 6px,
radial-gradient(farthest-side at bottom left, #0000 calc(100% - 4px), currentColor calc(100% - 3px) 99%, #0000) top right/50% 50% content-box content-box,
radial-gradient(farthest-side at top, #0000 calc(100% - 4px), currentColor calc(100% - 3px) 99%, #0000) bottom/100% 50% content-box content-box;
background-repeat: no-repeat;
animation: fw-loader-spin 1s infinite linear;
}
.fw-loader-xl {
width: 50px; aspect-ratio: 1; border-radius: 50%; padding: 6px;
background:
conic-gradient(from 135deg at top, currentColor 90deg, #0000 0) 0 calc(50% - 4px)/17px 8.5px,
radial-gradient(farthest-side at bottom left, #0000 calc(100% - 6px), currentColor calc(100% - 5px) 99%, #0000) top right/50% 50% content-box content-box,
radial-gradient(farthest-side at top, #0000 calc(100% - 6px), currentColor calc(100% - 5px) 99%, #0000) bottom/100% 50% content-box content-box;
background-repeat: no-repeat;
animation: fw-loader-spin 1s infinite linear;
}
@keyframes fw-loader-spin { 100% { transform: rotate(1turn); } }
/* ==========================================================================
Telemetry Spinner
========================================================================== */
.telemetry-spinner {
width: 40px; height: 40px;
border: 3px solid rgba(0,143,251,0.2);
border-top-color: #008FFB;
border-radius: 50%;
animation: telemetrySpin 0.8s linear infinite;
}
@keyframes telemetrySpin { to { transform: rotate(360deg); } }