- M3 认证/权限/审计/限流 + 全部 REST 接口 - M4 管理面板(MIUIx + 成绩录入/积分榜下钻/大屏控制) - M5a 大屏页面(六页 + 明细覆盖层 + 缩放适配) - M6 WebSocket 实时同步中心 - M7 xlsx 导出 + 赛事包 zip + 备份 - 规则包 YAML 导入导出(差异预览) - 字体 vendor 子集化(4 套 x2 字重) - 集成:realtime/export/rules 接入 main+httpapi;backup 子命令 - 修复:中间件包装 ResponseWriter 丢失 Hijacker,导致 WS 握手 501
231 lines
8.8 KiB
CSS
231 lines
8.8 KiB
CSS
/* ═══════════════════════════════════════════
|
|
MIUIX CONSOLE — Liquid Glass Effect v2
|
|
液体玻璃效果系统(完整版)
|
|
通过 [data-glass="liquid"] 属性启用
|
|
═══════════════════════════════════════════ */
|
|
|
|
/* ── Glass Variables ── */
|
|
:root {
|
|
--mx-glass-blur: 12px;
|
|
--mx-glass-saturation: 180%;
|
|
--mx-glass-displacement: 25;
|
|
--mx-glass-aberration: 2;
|
|
--mx-glass-elasticity: 0.15;
|
|
--mx-glass-corner-radius: 16px;
|
|
--mx-glass-activation-zone: 200;
|
|
--mx-glass-bg-light: rgba(255, 255, 255, 0.25);
|
|
--mx-glass-bg-dark: rgba(0, 0, 0, 0.35);
|
|
--mx-glass-border-light: rgba(255, 255, 255, 0.2);
|
|
--mx-glass-border-dark: rgba(255, 255, 255, 0.08);
|
|
--mx-glass-mouse-x: 0;
|
|
--mx-glass-mouse-y: 0;
|
|
}
|
|
|
|
/* ═══════════════════════════════════════════
|
|
DARK MODE (default)
|
|
═══════════════════════════════════════════ */
|
|
|
|
/* ── TopBar ── */
|
|
[data-glass="liquid"] .mx-topbar {
|
|
background: rgba(22, 22, 22, 0.45);
|
|
backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
-webkit-backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
border-bottom: 1px solid var(--mx-glass-border-dark);
|
|
filter: url(#mx-glass-filter);
|
|
}
|
|
|
|
/* ── Sidebar ── */
|
|
[data-glass="liquid"] .mx-sidebar {
|
|
background: rgba(22, 22, 22, 0.45);
|
|
backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
-webkit-backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
border-right: 1px solid var(--mx-glass-border-dark);
|
|
filter: url(#mx-glass-filter);
|
|
}
|
|
|
|
/* ── Bottom Nav ── */
|
|
[data-glass="liquid"] .mx-bottom-nav {
|
|
background: rgba(22, 22, 22, 0.45);
|
|
backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
-webkit-backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
border-top: 1px solid var(--mx-glass-border-dark);
|
|
filter: url(#mx-glass-filter);
|
|
}
|
|
|
|
/* ── Modal ── */
|
|
[data-glass="liquid"] .mx-modal {
|
|
background: rgba(30, 30, 30, 0.5);
|
|
backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
-webkit-backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
border: 1px solid var(--mx-glass-border-dark);
|
|
filter: url(#mx-glass-filter);
|
|
}
|
|
|
|
/* ── Drawer ── */
|
|
[data-glass="liquid"] .mx-drawer {
|
|
background: rgba(22, 22, 22, 0.5);
|
|
backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
-webkit-backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
border-left: 1px solid var(--mx-glass-border-dark);
|
|
filter: url(#mx-glass-filter);
|
|
}
|
|
|
|
/* ── Popover ── */
|
|
[data-glass="liquid"] .mx-popover {
|
|
background: rgba(30, 30, 30, 0.5);
|
|
backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
-webkit-backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
border: 1px solid var(--mx-glass-border-dark);
|
|
filter: url(#mx-glass-filter);
|
|
}
|
|
|
|
/* ── Select Dropdown ── */
|
|
[data-glass="liquid"] .mx-select-dropdown {
|
|
background: rgba(30, 30, 30, 0.5);
|
|
backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
-webkit-backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
border: 1px solid var(--mx-glass-border-dark);
|
|
filter: url(#mx-glass-filter);
|
|
}
|
|
|
|
/* ── Card (opt-in via .mx-card-glass) ── */
|
|
[data-glass="liquid"] .mx-card-glass {
|
|
background: rgba(30, 30, 30, 0.4);
|
|
backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
-webkit-backdrop-filter: blur(var(--mx-glass-blur)) saturate(var(--mx-glass-saturation));
|
|
border: 1px solid var(--mx-glass-border-dark);
|
|
filter: url(#mx-glass-filter);
|
|
}
|
|
|
|
/* ═══════════════════════════════════════════
|
|
LIGHT MODE
|
|
═══════════════════════════════════════════ */
|
|
|
|
[data-theme="light"][data-glass="liquid"] .mx-topbar {
|
|
background: rgba(255, 255, 255, 0.45);
|
|
border-bottom: 1px solid var(--mx-glass-border-light);
|
|
}
|
|
|
|
[data-theme="light"][data-glass="liquid"] .mx-sidebar {
|
|
background: rgba(255, 255, 255, 0.45);
|
|
border-right: 1px solid var(--mx-glass-border-light);
|
|
}
|
|
|
|
[data-theme="light"][data-glass="liquid"] .mx-bottom-nav {
|
|
background: rgba(255, 255, 255, 0.45);
|
|
border-top: 1px solid var(--mx-glass-border-light);
|
|
}
|
|
|
|
[data-theme="light"][data-glass="liquid"] .mx-modal {
|
|
background: rgba(255, 255, 255, 0.5);
|
|
border: 1px solid var(--mx-glass-border-light);
|
|
}
|
|
|
|
[data-theme="light"][data-glass="liquid"] .mx-drawer {
|
|
background: rgba(255, 255, 255, 0.5);
|
|
border-left: 1px solid var(--mx-glass-border-light);
|
|
}
|
|
|
|
[data-theme="light"][data-glass="liquid"] .mx-popover {
|
|
background: rgba(255, 255, 255, 0.5);
|
|
border: 1px solid var(--mx-glass-border-light);
|
|
}
|
|
|
|
[data-theme="light"][data-glass="liquid"] .mx-select-dropdown {
|
|
background: rgba(255, 255, 255, 0.5);
|
|
border: 1px solid var(--mx-glass-border-light);
|
|
}
|
|
|
|
[data-theme="light"][data-glass="liquid"] .mx-card-glass {
|
|
background: rgba(255, 255, 255, 0.4);
|
|
border: 1px solid var(--mx-glass-border-light);
|
|
}
|
|
|
|
/* ═══════════════════════════════════════════
|
|
OVER-LIGHT 模式
|
|
亮色背景上使用的深色玻璃
|
|
═══════════════════════════════════════════ */
|
|
|
|
[data-glass="liquid"][data-glass-over-light="true"] .mx-topbar,
|
|
[data-glass="liquid"][data-glass-over-light="true"] .mx-sidebar,
|
|
[data-glass="liquid"][data-glass-over-light="true"] .mx-bottom-nav,
|
|
[data-glass="liquid"][data-glass-over-light="true"] .mx-modal,
|
|
[data-glass="liquid"][data-glass-over-light="true"] .mx-drawer,
|
|
[data-glass="liquid"][data-glass-over-light="true"] .mx-popover,
|
|
[data-glass="liquid"][data-glass-over-light="true"] .mx-select-dropdown,
|
|
[data-glass="liquid"][data-glass-over-light="true"] .mx-card-glass {
|
|
background: rgba(0, 0, 0, 0.45);
|
|
border-color: rgba(255, 255, 255, 0.1);
|
|
}
|
|
|
|
/* ═══════════════════════════════════════════
|
|
GLASS 可追踪元素
|
|
鼠标跟踪 + 弹性变换 + 双层边框
|
|
═══════════════════════════════════════════ */
|
|
|
|
.mx-glass-trackable {
|
|
position: relative;
|
|
transition: transform 0.2s ease-out;
|
|
will-change: transform;
|
|
}
|
|
|
|
.mx-glass-trackable .mx-glass-border-layer {
|
|
position: absolute;
|
|
inset: 0;
|
|
pointer-events: none;
|
|
border-radius: inherit;
|
|
z-index: 2;
|
|
}
|
|
|
|
/* Hover 高光层 */
|
|
.mx-glass-trackable::after {
|
|
content: '';
|
|
position: absolute;
|
|
inset: 0;
|
|
border-radius: inherit;
|
|
pointer-events: none;
|
|
opacity: 0;
|
|
transition: opacity 0.2s ease-out;
|
|
background-image: radial-gradient(circle at 50% 0%, rgba(255,255,255,0.5) 0%, rgba(255,255,255,0) 50%);
|
|
mix-blend-mode: overlay;
|
|
z-index: 3;
|
|
}
|
|
|
|
.mx-glass-trackable:hover::after {
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.mx-glass-trackable:active::after {
|
|
opacity: 0.8;
|
|
background-image: radial-gradient(circle at 50% 0%, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 80%);
|
|
}
|
|
|
|
/* ═══════════════════════════════════════════
|
|
FALLBACK — browsers without SVG filter support
|
|
═══════════════════════════════════════════ */
|
|
@supports not (filter: url(#mx-glass-filter)) {
|
|
[data-glass="liquid"] .mx-topbar,
|
|
[data-glass="liquid"] .mx-sidebar,
|
|
[data-glass="liquid"] .mx-bottom-nav,
|
|
[data-glass="liquid"] .mx-modal,
|
|
[data-glass="liquid"] .mx-drawer,
|
|
[data-glass="liquid"] .mx-popover,
|
|
[data-glass="liquid"] .mx-select-dropdown,
|
|
[data-glass="liquid"] .mx-card-glass {
|
|
filter: none;
|
|
}
|
|
}
|
|
|
|
/* ═══════════════════════════════════════════
|
|
REDUCED MOTION
|
|
═══════════════════════════════════════════ */
|
|
@media (prefers-reduced-motion: reduce) {
|
|
.mx-glass-trackable {
|
|
transition: none !important;
|
|
transform: none !important;
|
|
}
|
|
.mx-glass-trackable::after {
|
|
transition: none !important;
|
|
}
|
|
}
|