mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-04 10:33:56 +08:00
577 lines
15 KiB
Plaintext
577 lines
15 KiB
Plaintext
/* ==========================================================================
|
|
Dark Mode — luci-theme-glass
|
|
Compiled separately and injected by header.ut when dark mode is active.
|
|
========================================================================== */
|
|
|
|
:root {
|
|
/* ---- Colors — Dark mode ---- */
|
|
--color-primary: #0A84FF;
|
|
--color-primary-hover: #409cff;
|
|
--color-primary-active: #0066d6;
|
|
--color-primary-rgb: 10, 132, 255;
|
|
|
|
--color-success: #30D158;
|
|
--color-warning: #FFD60A;
|
|
--color-danger: #FF453A;
|
|
--color-info: #64D2FF;
|
|
|
|
--color-text: #f5f5f7;
|
|
--color-text-secondary: #98989d;
|
|
--color-text-tertiary: #636366;
|
|
--color-text-inverse: #1d1d1f;
|
|
|
|
--color-bg: #1c1c1e;
|
|
--color-bg-elevated: #2c2c2e;
|
|
--color-bg-secondary: #3a3a3c;
|
|
|
|
--color-border: rgba(255, 255, 255, 0.08);
|
|
--color-border-strong: rgba(255, 255, 255, 0.16);
|
|
--color-separator: rgba(84, 84, 88, 0.36);
|
|
|
|
/* ---- Dark glassmorphism ---- */
|
|
--glass-blur: 25px;
|
|
--glass-saturate: 180%;
|
|
--glass-bg: rgba(38, 38, 42, 0.55);
|
|
--glass-bg-hover: rgba(52, 52, 56, 0.65);
|
|
--glass-bg-strong: rgba(38, 38, 42, 0.72);
|
|
--glass-border: rgba(255, 255, 255, 0.12);
|
|
--glass-shadow: 0 2px 16px rgba(0, 0, 0, 0.20),
|
|
0 0 1px rgba(0, 0, 0, 0.25);
|
|
--glass-shadow-lg: 0 8px 40px rgba(0, 0, 0, 0.30),
|
|
0 0 1px rgba(0, 0, 0, 0.15);
|
|
|
|
/* ---- Dark background ---- */
|
|
--bg-gradient: linear-gradient(135deg, #2c2e3a 0%, #353848 50%, #2a2d38 100%);
|
|
}
|
|
|
|
/* ---- Dark-mode-specific overrides ---- */
|
|
|
|
/* Inputs need darker backgrounds */
|
|
.cbi-input-text,
|
|
.cbi-input-password,
|
|
input[type="text"],
|
|
input[type="password"],
|
|
input[type="number"],
|
|
textarea,
|
|
select {
|
|
background: rgba(44, 44, 46, 0.55);
|
|
}
|
|
|
|
/* Login card */
|
|
.login-card {
|
|
background-image: linear-gradient(
|
|
160deg,
|
|
rgba(255, 255, 255, 0.10) 0%,
|
|
rgba(255, 255, 255, 0.07) 25%,
|
|
rgba(240, 248, 255, 0.08) 50%,
|
|
rgba(255, 255, 255, 0.06) 75%,
|
|
rgba(230, 240, 255, 0.07) 100%
|
|
);
|
|
background-color: rgba(38, 38, 42, 0.55);
|
|
border-color: rgba(255, 255, 255, 0.14);
|
|
box-shadow:
|
|
0 8px 40px rgba(0, 0, 0, 0.25),
|
|
0 2px 8px rgba(0, 0, 0, 0.12),
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.10),
|
|
inset 0 0 16px rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
.login-form .login-field input {
|
|
background: rgba(255, 255, 255, 0.06);
|
|
border-color: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.08),
|
|
inset 0 0 4px rgba(255, 255, 255, 0.04);
|
|
}
|
|
|
|
.login-btn {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.08) 0%,
|
|
rgba(255, 255, 255, 0.06) 25%,
|
|
rgba(240, 248, 255, 0.07) 50%,
|
|
rgba(255, 255, 255, 0.05) 75%,
|
|
rgba(230, 240, 255, 0.06) 100%
|
|
);
|
|
border-color: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
0 4px 16px rgba(0, 0, 0, 0.30),
|
|
0 1px 4px rgba(0, 0, 0, 0.15),
|
|
inset 0 0 0.5px rgba(255, 255, 255, 0.12),
|
|
inset 0 0 12px rgba(255, 255, 255, 0.15);
|
|
color: var(--color-text);
|
|
}
|
|
|
|
/* Buttons — glass-ui dark pattern */
|
|
.btn,
|
|
.cbi-button {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.08) 0%,
|
|
rgba(255, 255, 255, 0.06) 25%,
|
|
rgba(240, 248, 255, 0.07) 50%,
|
|
rgba(255, 255, 255, 0.05) 75%,
|
|
rgba(230, 240, 255, 0.06) 100%
|
|
);
|
|
background-color: transparent;
|
|
border-color: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
0 4px 16px rgba(0, 0, 0, 0.30),
|
|
0 1px 4px rgba(0, 0, 0, 0.15),
|
|
inset 0 0 0.5px rgba(255, 255, 255, 0.12),
|
|
inset 0 0 12px rgba(255, 255, 255, 0.15);
|
|
|
|
&:hover {
|
|
opacity: 0.90;
|
|
background-color: transparent;
|
|
}
|
|
|
|
&:active {
|
|
box-shadow:
|
|
inset 0 2px 4px rgba(0, 0, 0, 0.30),
|
|
inset 0 1px 2px rgba(0, 0, 0, 0.20);
|
|
}
|
|
}
|
|
|
|
.cbi-button-negative,
|
|
.cbi-button-remove,
|
|
.cbi-button-reset {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 69, 58, 0.12) 0%,
|
|
rgba(255, 69, 58, 0.08) 50%,
|
|
rgba(255, 69, 58, 0.10) 100%
|
|
);
|
|
background-color: transparent;
|
|
color: var(--color-danger);
|
|
border-color: rgba(255, 69, 58, 0.25);
|
|
box-shadow:
|
|
0 4px 16px rgba(0, 0, 0, 0.30),
|
|
0 1px 4px rgba(0, 0, 0, 0.15),
|
|
inset 0 0 0.5px rgba(255, 255, 255, 0.08),
|
|
inset 0 0 8px rgba(255, 255, 255, 0.06);
|
|
|
|
&:hover {
|
|
opacity: 0.90;
|
|
background-color: transparent;
|
|
}
|
|
|
|
&:active {
|
|
box-shadow:
|
|
inset 0 2px 4px rgba(0, 0, 0, 0.30),
|
|
inset 0 1px 2px rgba(0, 0, 0, 0.20);
|
|
}
|
|
}
|
|
|
|
/* Sidebar */
|
|
#sidebar {
|
|
background-image: linear-gradient(
|
|
160deg,
|
|
rgba(255, 255, 255, 0.10) 0%,
|
|
rgba(255, 255, 255, 0.07) 20%,
|
|
rgba(240, 248, 255, 0.08) 45%,
|
|
rgba(255, 255, 255, 0.06) 70%,
|
|
rgba(230, 240, 255, 0.07) 100%
|
|
);
|
|
background-color: rgba(38, 38, 42, 0.55);
|
|
border-color: rgba(255, 255, 255, 0.14);
|
|
box-shadow:
|
|
0 8px 40px rgba(0, 0, 0, 0.25),
|
|
0 2px 8px rgba(0, 0, 0, 0.12),
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.10),
|
|
inset 0 0 12px rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
/* Header bar */
|
|
#header {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.10) 0%,
|
|
rgba(255, 255, 255, 0.07) 25%,
|
|
rgba(240, 248, 255, 0.08) 50%,
|
|
rgba(255, 255, 255, 0.06) 75%,
|
|
rgba(230, 240, 255, 0.07) 100%
|
|
);
|
|
border-color: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
0 2px 16px rgba(0, 0, 0, 0.20),
|
|
0 1px 4px rgba(0, 0, 0, 0.10),
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.10),
|
|
inset 0 0 8px rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
/* Page actions bar */
|
|
.cbi-page-actions {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.10) 0%,
|
|
rgba(255, 255, 255, 0.07) 25%,
|
|
rgba(240, 248, 255, 0.08) 50%,
|
|
rgba(255, 255, 255, 0.06) 75%,
|
|
rgba(230, 240, 255, 0.07) 100%
|
|
);
|
|
border-color: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
0 2px 16px rgba(0, 0, 0, 0.20),
|
|
0 1px 4px rgba(0, 0, 0, 0.10),
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.10),
|
|
inset 0 0 8px rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
/* Nav hover & active */
|
|
.nav-item:hover {
|
|
background: rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
.nav-item.active {
|
|
background: rgba(255, 255, 255, 0.15);
|
|
color: var(--color-text);
|
|
backdrop-filter: blur(8px);
|
|
-webkit-backdrop-filter: blur(8px);
|
|
box-shadow:
|
|
0 2px 6px rgba(0, 0, 0, 0.30),
|
|
inset 0 1px 2px rgba(255, 255, 255, 0.12),
|
|
inset 0 0 8px rgba(255, 255, 255, 0.08);
|
|
}
|
|
|
|
/* Sub-item active — slider handles highlight */
|
|
.nav-sub .nav-item.active {
|
|
background: transparent;
|
|
box-shadow: none;
|
|
backdrop-filter: none;
|
|
-webkit-backdrop-filter: none;
|
|
}
|
|
|
|
/* Sliding selector — dark glass */
|
|
.nav-sub .nav-slider {
|
|
background: rgba(255, 255, 255, 0.08);
|
|
border: 0.5px solid rgba(255, 255, 255, 0.12);
|
|
backdrop-filter: blur(12px) saturate(150%);
|
|
-webkit-backdrop-filter: blur(12px) saturate(150%);
|
|
box-shadow:
|
|
0 1px 4px rgba(0, 0, 0, 0.20),
|
|
inset 0 1px 1px rgba(255, 255, 255, 0.08),
|
|
inset 0 0 4px rgba(255, 255, 255, 0.03);
|
|
}
|
|
|
|
/* Header tabs */
|
|
.header-tab {
|
|
&:hover {
|
|
background: rgba(255, 255, 255, 0.06);
|
|
color: var(--color-text);
|
|
}
|
|
&.active {
|
|
background: transparent;
|
|
box-shadow: none;
|
|
backdrop-filter: none;
|
|
-webkit-backdrop-filter: none;
|
|
}
|
|
}
|
|
|
|
/* Tab slider — dark glass */
|
|
.tab-slider {
|
|
background: rgba(255, 255, 255, 0.10);
|
|
border: 0.5px solid rgba(255, 255, 255, 0.12);
|
|
backdrop-filter: blur(8px);
|
|
-webkit-backdrop-filter: blur(8px);
|
|
box-shadow:
|
|
0 2px 6px rgba(0, 0, 0, 0.30),
|
|
inset 0 1px 2px rgba(255, 255, 255, 0.10),
|
|
inset 0 0 8px rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
/* Sub-nav bar */
|
|
#header-sub {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.10) 0%,
|
|
rgba(255, 255, 255, 0.07) 25%,
|
|
rgba(240, 248, 255, 0.08) 50%,
|
|
rgba(255, 255, 255, 0.06) 75%,
|
|
rgba(230, 240, 255, 0.07) 100%
|
|
);
|
|
border-color: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
0 4px 16px rgba(0, 0, 0, 0.20),
|
|
0 1px 4px rgba(0, 0, 0, 0.10),
|
|
0 0 0 0.5px rgba(255, 255, 255, 0.12) inset,
|
|
0 0 12px rgba(255, 255, 255, 0.15) inset;
|
|
}
|
|
|
|
.sub-tab {
|
|
&:hover {
|
|
background: rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
&.active {
|
|
background: transparent;
|
|
box-shadow: none;
|
|
backdrop-filter: none;
|
|
-webkit-backdrop-filter: none;
|
|
}
|
|
}
|
|
|
|
/* Header glass pills */
|
|
.header-title,
|
|
#status-indicators,
|
|
.header-actions {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.04) 0%,
|
|
rgba(255, 255, 255, 0.02) 50%,
|
|
rgba(255, 255, 255, 0.03) 100%
|
|
);
|
|
border-color: rgba(255, 255, 255, 0.10);
|
|
box-shadow:
|
|
0 2px 8px rgba(0, 0, 0, 0.25),
|
|
0 1px 2px rgba(0, 0, 0, 0.12),
|
|
inset 0 0.5px 0 rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
/* Theme toggle */
|
|
.theme-toggle:hover {
|
|
background: rgba(255, 255, 255, 0.08);
|
|
}
|
|
|
|
.theme-toggle-float {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.10) 0%,
|
|
rgba(255, 255, 255, 0.07) 25%,
|
|
rgba(240, 248, 255, 0.08) 50%,
|
|
rgba(255, 255, 255, 0.06) 75%,
|
|
rgba(230, 240, 255, 0.07) 100%
|
|
);
|
|
border-color: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
0 2px 8px rgba(0, 0, 0, 0.18),
|
|
0 1px 2px rgba(0, 0, 0, 0.08),
|
|
inset 0 0 0.5px rgba(255, 255, 255, 0.12),
|
|
inset 0 1px 6px rgba(255, 255, 255, 0.12);
|
|
}
|
|
|
|
/* Tabs */
|
|
.cbi-tabmenu {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.10) 0%,
|
|
rgba(255, 255, 255, 0.07) 25%,
|
|
rgba(240, 248, 255, 0.08) 50%,
|
|
rgba(255, 255, 255, 0.06) 75%,
|
|
rgba(230, 240, 255, 0.07) 100%
|
|
);
|
|
border-color: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
0 4px 16px rgba(0, 0, 0, 0.20),
|
|
0 1px 4px rgba(0, 0, 0, 0.10),
|
|
inset 0 0 0.5px rgba(255, 255, 255, 0.12),
|
|
inset 0 0 12px rgba(255, 255, 255, 0.15);
|
|
|
|
li {
|
|
a:hover {
|
|
background: rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
&.cbi-tab a {
|
|
background: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
0 2px 6px rgba(0, 0, 0, 0.30),
|
|
inset 0 1px 2px rgba(255, 255, 255, 0.12),
|
|
inset 0 0 8px rgba(255, 255, 255, 0.08);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Section fold button */
|
|
.cbi-section.fade-in .cbi-title > div:last-child span:hover {
|
|
background: rgba(255, 255, 255, 0.08);
|
|
}
|
|
|
|
/* Table row hover */
|
|
table tbody tr:hover td,
|
|
.table .tr:hover .td {
|
|
background: rgba(255, 255, 255, 0.03);
|
|
}
|
|
|
|
/* Pre / code */
|
|
pre,
|
|
#syslog {
|
|
background: rgba(255, 255, 255, 0.04);
|
|
}
|
|
|
|
/* Alert colors adjusted for dark */
|
|
.alert-message,
|
|
.cbi-section-error {
|
|
background: rgba(100, 210, 255, 0.08);
|
|
border-color: rgba(100, 210, 255, 0.18);
|
|
box-shadow:
|
|
0 2px 8px rgba(0, 0, 0, 0.20),
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.08),
|
|
inset 0 0 6px rgba(255, 255, 255, 0.04);
|
|
}
|
|
|
|
.alert-message.notice,
|
|
.alert-message.info {
|
|
background: rgba(100, 210, 255, 0.10);
|
|
border-color: rgba(100, 210, 255, 0.25);
|
|
}
|
|
|
|
.alert-message.warning {
|
|
background: rgba(255, 214, 10, 0.10);
|
|
border-color: rgba(255, 214, 10, 0.25);
|
|
}
|
|
|
|
.alert-message.error,
|
|
.cbi-section-error {
|
|
background: rgba(255, 69, 58, 0.10);
|
|
border-color: rgba(255, 69, 58, 0.25);
|
|
}
|
|
|
|
.alert-message.success {
|
|
background: rgba(48, 209, 88, 0.10);
|
|
border-color: rgba(48, 209, 88, 0.25);
|
|
}
|
|
|
|
/* Diagnostics & file browser in dark */
|
|
#diag-rc-output,
|
|
.cbi-filebrowser {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.10) 0%,
|
|
rgba(255, 255, 255, 0.07) 25%,
|
|
rgba(240, 248, 255, 0.08) 50%,
|
|
rgba(255, 255, 255, 0.06) 75%,
|
|
rgba(230, 240, 255, 0.07) 100%
|
|
);
|
|
border-color: rgba(255, 255, 255, 0.15);
|
|
box-shadow:
|
|
0 2px 8px rgba(0, 0, 0, 0.18),
|
|
0 1px 2px rgba(0, 0, 0, 0.08),
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.08),
|
|
inset 0 0 6px rgba(255, 255, 255, 0.04);
|
|
}
|
|
|
|
/* Ifacebox zone header in dark — slightly brighter tint */
|
|
.ifacebox-head[style*="background-color"] {
|
|
background-color: rgba(var(--zone-color-rgb), 0.20) !important;
|
|
border-bottom-color: rgba(var(--zone-color-rgb), 0.25) !important;
|
|
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.08);
|
|
}
|
|
|
|
/* Zone badges in dark — tint zone color instead of opaque background */
|
|
.zonebadge[style*="background-color"] {
|
|
background-color: rgba(var(--zone-color-rgb), 0.25) !important;
|
|
border-color: rgba(var(--zone-color-rgb), 0.30);
|
|
box-shadow:
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.06),
|
|
inset 0 0 4px rgba(255, 255, 255, 0.03);
|
|
}
|
|
|
|
.zonebadge {
|
|
border-color: rgba(255, 255, 255, 0.08);
|
|
box-shadow:
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.06),
|
|
inset 0 0 4px rgba(255, 255, 255, 0.03);
|
|
}
|
|
|
|
/* Ifacebox in dark */
|
|
.ifacebadge {
|
|
background: rgba(255, 255, 255, 0.08);
|
|
border-color: rgba(255, 255, 255, 0.10);
|
|
box-shadow:
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.06),
|
|
inset 0 0 4px rgba(255, 255, 255, 0.03);
|
|
}
|
|
|
|
/* Port grid boxes in dark — glass-ui dark card */
|
|
div[style*="display:grid;grid-template-columns:repeat"] > .ifacebox {
|
|
background-image: linear-gradient(
|
|
135deg,
|
|
rgba(255, 255, 255, 0.10) 0%,
|
|
rgba(255, 255, 255, 0.07) 25%,
|
|
rgba(240, 248, 255, 0.08) 50%,
|
|
rgba(255, 255, 255, 0.06) 75%,
|
|
rgba(230, 240, 255, 0.07) 100%
|
|
) !important;
|
|
border-color: rgba(255, 255, 255, 0.15) !important;
|
|
box-shadow:
|
|
0 4px 16px rgba(0, 0, 0, 0.20),
|
|
0 1px 4px rgba(0, 0, 0, 0.10),
|
|
0 0 0 0.5px rgba(255, 255, 255, 0.12) inset,
|
|
0 0 12px rgba(255, 255, 255, 0.15) inset !important;
|
|
}
|
|
|
|
/* Network status table badges in dark */
|
|
.network-status-table .ifacebox-body .ifacebadge {
|
|
background: rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
/* Dropdown open items hover */
|
|
.cbi-dropdown[open] > ul.dropdown > li:hover {
|
|
background: rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
/* Progressbar */
|
|
.cbi-progressbar {
|
|
background: rgba(255, 255, 255, 0.06);
|
|
border-color: rgba(255, 255, 255, 0.06);
|
|
|
|
> div {
|
|
background: linear-gradient(
|
|
135deg,
|
|
rgba(var(--color-primary-rgb), 0.65) 0%,
|
|
rgba(var(--color-primary-rgb), 0.50) 50%,
|
|
rgba(var(--color-primary-rgb), 0.60) 100%
|
|
);
|
|
box-shadow:
|
|
inset 0 1px 0 rgba(255, 255, 255, 0.15),
|
|
inset 0 0 6px rgba(255, 255, 255, 0.06);
|
|
}
|
|
|
|
&::after {
|
|
color: var(--color-text);
|
|
text-shadow: 0 0 4px rgba(0, 0, 0, 0.40);
|
|
}
|
|
}
|
|
|
|
/* Ifacebox-body itemlist labels */
|
|
.ifacebox-body > span > .nowrap > strong {
|
|
color: var(--color-text-tertiary);
|
|
}
|
|
|
|
/* UCI Changes dialog in dark */
|
|
.uci-change-legend-label {
|
|
> ins {
|
|
background-color: rgba(48, 209, 88, 0.30);
|
|
border-color: rgba(48, 209, 88, 0.50);
|
|
}
|
|
> del {
|
|
background-color: rgba(255, 69, 58, 0.30);
|
|
border-color: rgba(255, 69, 58, 0.50);
|
|
}
|
|
> var {
|
|
background-color: rgba(100, 210, 255, 0.25);
|
|
border-color: rgba(100, 210, 255, 0.40);
|
|
}
|
|
}
|
|
|
|
.uci-change-list {
|
|
ins {
|
|
background-color: rgba(48, 209, 88, 0.12);
|
|
border-color: rgba(48, 209, 88, 0.25);
|
|
}
|
|
del {
|
|
background-color: rgba(255, 69, 58, 0.12);
|
|
border-color: rgba(255, 69, 58, 0.25);
|
|
}
|
|
var {
|
|
background-color: rgba(100, 210, 255, 0.10);
|
|
border-color: rgba(100, 210, 255, 0.18);
|
|
}
|
|
}
|
|
|
|
/* Selection */
|
|
::selection {
|
|
background: rgba(var(--color-primary-rgb), 0.35);
|
|
}
|