feat: M3-M7 全模块落地 + 集成接线

- M3 认证/权限/审计/限流 + 全部 REST 接口
- M4 管理面板(MIUIx + 成绩录入/积分榜下钻/大屏控制)
- M5a 大屏页面(六页 + 明细覆盖层 + 缩放适配)
- M6 WebSocket 实时同步中心
- M7 xlsx 导出 + 赛事包 zip + 备份
- 规则包 YAML 导入导出(差异预览)
- 字体 vendor 子集化(4 套 x2 字重)
- 集成:realtime/export/rules 接入 main+httpapi;backup 子命令
- 修复:中间件包装 ResponseWriter 丢失 Hijacker,导致 WS 握手 501
This commit is contained in:
AskaEth committed 2026-09-09 19:02:24 +08:00
1 parent d0e3b93e76
commit bc8b1ee6c0
145 files changed
+25159 -321

No files matched your search

+81
View File
@@ -0,0 +1,81 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Accordion / Collapse Component
═══════════════════════════════════════════ */
.mx-accordion{
display:flex;flex-direction:column;
border:1px solid var(--mx-divider);
border-radius:var(--mx-r);
overflow:hidden;
}
/* Item */
.mx-accordion-item{
border-bottom:1px solid var(--mx-divider);
}
.mx-accordion-item:last-child{border-bottom:none}
/* Header / Trigger */
.mx-accordion-header{
display:flex;align-items:center;gap:10px;
padding:14px 16px;
cursor:pointer;
font-size:14px;font-weight:600;
color:var(--mx-text);
transition:all var(--mx-d1) var(--mx-ease);
-webkit-tap-highlight-color:transparent;
}
.mx-accordion-header:hover{background:var(--mx-s-hover)}
.mx-accordion-header:active{background:var(--mx-s-active)}
/* Icon slot */
.mx-accordion-header svg{flex-shrink:0;color:var(--mx-t2)}
.mx-accordion-header .mx-accordion-title{flex:1}
/* Arrow */
.mx-accordion-arrow{
color:var(--mx-t3);flex-shrink:0;
transition:transform var(--mx-d2) var(--mx-ease);
}
.mx-accordion-item.open .mx-accordion-arrow{transform:rotate(180deg)}
/* Content */
.mx-accordion-content{
max-height:0;overflow:hidden;
transition:max-height var(--mx-d3) var(--mx-ease);
}
.mx-accordion-item.open .mx-accordion-content{
max-height:500px;
}
.mx-accordion-body{
padding:0 16px 16px;
font-size:13px;line-height:1.6;
color:var(--mx-text-on-surface);
}
/* Card variant — separate cards */
.mx-accordion-card{border:none;gap:8px;background:none}
.mx-accordion-card .mx-accordion-item{
background:var(--mx-s2);
border:1px solid var(--mx-divider);
border-radius:var(--mx-r);
overflow:hidden;
}
.mx-accordion-card .mx-accordion-item:last-child{border-bottom:1px solid var(--mx-divider)}
/* Flush variant — no borders */
.mx-accordion-flush{border:none;border-radius:0}
.mx-accordion-flush .mx-accordion-item{border:none}
.mx-accordion-flush .mx-accordion-header{padding:12px 0}
/* Disabled */
.mx-accordion-header.disabled{
opacity:0.4;cursor:not-allowed;pointer-events:none;
}
/* Mobile */
@media(max-width:767px){
.mx-accordion-header{padding:14px 14px;min-height:48px}
.mx-accordion-body{font-size:14px}
.mx-accordion-card .mx-accordion-item{border-radius:var(--mx-r-sm)}
}
+53
View File
@@ -0,0 +1,53 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Activity List Component
═══════════════════════════════════════════ */
.mx-activity-item{
display:flex;align-items:flex-start;gap:12px;
padding:13px 0;
border-bottom:1px solid var(--mx-divider);
transition:all var(--mx-d1);
}
.mx-activity-item:last-child{border-bottom:none}
.mx-activity-item:active{
background:var(--mx-s-active);
margin:0 -16px;padding:13px 16px;border-radius:var(--mx-r-sm);
}
.mx-activity-dot{
width:8px;height:8px;border-radius:50%;
margin-top:6px;flex-shrink:0;
transition:transform var(--mx-d2) var(--mx-spring);
}
.mx-activity-item:hover .mx-activity-dot{transform:scale(1.5)}
.mx-activity-text{font-size:13px;line-height:1.5}
.mx-activity-text b{font-weight:600;color:var(--mx-text)}
.mx-activity-time{font-size:11px;color:var(--mx-t3);margin-top:3px}
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Chart Bar Component
═══════════════════════════════════════════ */
.mx-chart{display:flex;align-items:flex-end;gap:5px;height:160px}
.mx-chart-bar-col{
flex:1;display:flex;flex-direction:column;
align-items:center;gap:6px;min-width:0;
}
.mx-chart-bar{
width:100%;border-radius:7px 7px 3px 3px;
background:var(--mx-primary);
transform-origin:bottom;
transition:filter var(--mx-d1),transform var(--mx-d1);
}
.mx-chart-bar.alt{background:var(--mx-s4)}
.mx-chart-bar:active{filter:brightness(1.2);transform:scaleY(1.04)}
.mx-chart-label{
font-size:10px;color:var(--mx-t3);
font-variant-numeric:tabular-nums;
}
/* Responsive chart height */
@media(min-width:768px){.mx-chart{height:180px}}
@media(min-width:1024px){.mx-chart{height:200px}}
+70
View File
@@ -0,0 +1,70 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Avatar Component
═══════════════════════════════════════════ */
/* Base avatar (extend existing .mx-avatar) */
.mx-avatar-img{
width:32px;height:32px;border-radius:50%;
object-fit:cover;flex-shrink:0;
border:2px solid var(--mx-s2);
}
/* Sizes */
.mx-avatar-xs{width:24px;height:24px;font-size:10px}
.mx-avatar-sm{width:28px;height:28px;font-size:11px}
.mx-avatar-md{width:36px;height:36px;font-size:14px}
.mx-avatar-lg{width:44px;height:44px;font-size:16px}
.mx-avatar-xl{width:56px;height:56px;font-size:20px}
/* Avatar Group */
.mx-avatar-group{
display:flex;
}
.mx-avatar-group .mx-avatar,
.mx-avatar-group .mx-avatar-img{
margin-left:-8px;
border:2px solid var(--mx-s2);
transition:transform var(--mx-d2) var(--mx-spring);
}
.mx-avatar-group .mx-avatar:first-child,
.mx-avatar-group .mx-avatar-img:first-child{margin-left:0}
.mx-avatar-group .mx-avatar:hover,
.mx-avatar-group .mx-avatar-img:hover{
transform:translateY(-2px);
z-index:1;
}
/* Overflow counter */
.mx-avatar-overflow{
width:32px;height:32px;
border-radius:50%;
background:var(--mx-s3);
border:2px solid var(--mx-s2);
display:flex;align-items:center;justify-content:center;
font-size:11px;font-weight:700;
color:var(--mx-t2);
margin-left:-8px;
}
/* Status dot */
.mx-avatar-status{
position:relative;
}
.mx-avatar-status::after{
content:'';position:absolute;
bottom:0;right:0;
width:10px;height:10px;
border-radius:50%;
border:2px solid var(--mx-s2);
}
.mx-avatar-status.online::after{background:var(--mx-green)}
.mx-avatar-status.busy::after{background:var(--mx-red)}
.mx-avatar-status.away::after{background:var(--mx-amber)}
.mx-avatar-status.offline::after{background:var(--mx-t3)}
/* Mobile */
@media(max-width:767px){
.mx-avatar-group .mx-avatar,
.mx-avatar-group .mx-avatar-img{margin-left:-10px}
.mx-avatar-overflow{width:28px;height:28px;font-size:10px}
}
+61
View File
@@ -0,0 +1,61 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Badge & Tag Component
Miuix capsule shape badges
═══════════════════════════════════════════ */
.mx-badge{
display:inline-flex;align-items:center;gap:5px;
padding:3px 10px;
border-radius:var(--mx-r-pill);
font-size:12px;font-weight:600;
transition:filter var(--mx-d1);
}
.mx-badge:hover{filter:brightness(1.15)}
.mx-badge::before{
content:'';width:6px;height:6px;
border-radius:50%;flex-shrink:0;
}
/* Variants */
.mx-badge-success{background:rgba(52,211,153,0.1);color:var(--mx-green)}
.mx-badge-success::before{background:var(--mx-green);animation:mx-pulse 2s infinite}
.mx-badge-warning{background:rgba(251,191,36,0.1);color:var(--mx-amber)}
.mx-badge-warning::before{background:var(--mx-amber)}
.mx-badge-error{background:rgba(248,113,113,0.1);color:var(--mx-red)}
.mx-badge-error::before{background:var(--mx-red);animation:mx-pulse 1.5s infinite}
.mx-badge-info{background:rgba(96,165,250,0.1);color:var(--mx-blue)}
.mx-badge-info::before{background:var(--mx-blue)}
.mx-badge-neutral{background:rgba(139,149,165,0.1);color:var(--mx-t2)}
.mx-badge-neutral::before{background:var(--mx-t2)}
/* Dot-only badge */
.mx-dot{
width:8px;height:8px;
border-radius:50%;
flex-shrink:0;
}
/* Count badge */
.mx-count{
display:inline-flex;align-items:center;justify-content:center;
min-width:18px;height:18px;padding:0 5px;
border-radius:var(--mx-r-pill);
font-size:10px;font-weight:700;
background:var(--mx-primary);color:#fff;
}
@keyframes mx-pulse{
0%,100%{opacity:1;transform:scale(1)}
50%{opacity:0.5;transform:scale(1.3)}
}
/* Mobile */
@media(max-width:767px){
.mx-badge{padding:4px 12px;font-size:13px}
.mx-count{min-width:20px;height:20px;font-size:11px}
}
+89
View File
@@ -0,0 +1,89 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Button Component
═══════════════════════════════════════════ */
.mx-btn{
display:inline-flex;align-items:center;justify-content:center;gap:6px;
height:36px;padding:0 18px;
border-radius:var(--mx-r-sm);
font-size:13px;font-weight:600;
cursor:pointer;
transition:all var(--mx-d1) var(--mx-ease);
-webkit-tap-highlight-color:transparent;
position:relative;overflow:hidden;
white-space:nowrap;
}
.mx-btn:active{transform:scale(0.95);box-shadow:inset 0 2px 4px rgba(0,0,0,0.2)}
/* Primary */
.mx-btn-primary{
background:var(--mx-primary);color:#fff;
box-shadow:0 2px 8px rgba(76,139,245,0.2);
}
.mx-btn-primary:hover{
background:var(--mx-primary-hover);
box-shadow:0 4px 14px rgba(76,139,245,0.3);
transform:translateY(-1px);
}
.mx-btn-primary:active{transform:scale(0.95) translateY(0)}
/* Secondary */
.mx-btn-secondary{
background:var(--mx-s3);color:var(--mx-text);
border:1px solid var(--mx-border);
}
.mx-btn-secondary:hover{
background:var(--mx-s4);
border-color:var(--mx-t3);
}
/* Ghost */
.mx-btn-ghost{
background:transparent;color:var(--mx-t2);
}
.mx-btn-ghost:hover{
background:var(--mx-s-hover);color:var(--mx-text);
}
/* Danger */
.mx-btn-danger{
background:var(--mx-red);color:#fff;
}
.mx-btn-danger:hover{
filter:brightness(1.1);
box-shadow:0 4px 14px rgba(248,113,113,0.25);
}
/* Pill — Miuix style capsule button */
.mx-btn-pill{
border-radius:var(--mx-r-pill);
height:32px;padding:0 14px;
font-size:12px;
}
/* Icon button */
.mx-btn-icon{
width:36px;height:36px;padding:0;
border-radius:var(--mx-r-sm);
}
/* Sizes */
.mx-btn-sm{height:30px;padding:0 12px;font-size:12px;border-radius:var(--mx-r-xs)}
.mx-btn-lg{height:42px;padding:0 22px;font-size:14px}
/* Disabled */
.mx-btn[disabled]{
opacity:0.4;cursor:not-allowed;pointer-events:none;
}
/* Mobile: 加大触控区 */
/* ═══ DARK MODE — button pressed inner shadow ═══ */
[data-theme="dark"] .mx-btn:active{box-shadow:inset 0 2px 4px rgba(0,0,0,0.3)}
@media(max-width:767px){
.mx-btn{height:40px;padding:0 20px;font-size:14px}
.mx-btn-sm{height:36px;padding:0 14px;font-size:13px}
.mx-btn-lg{height:46px;padding:0 24px;font-size:15px}
.mx-btn-icon{width:40px;height:40px}
.mx-btn-pill{height:34px;padding:0 16px;font-size:13px}
}
+67
View File
@@ -0,0 +1,67 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Card Component
对应 Miuix Card.kt
CornerRadius = 16.dp, surfaceContainer 背景
═══════════════════════════════════════════ */
.mx-card{
background:var(--mx-s2);
border-radius:var(--mx-r);
overflow:hidden;
box-shadow:var(--mx-sh1);
transition:box-shadow var(--mx-d3) var(--mx-ease);
}
.mx-card:hover{
box-shadow:var(--mx-sh2);
transition-duration:var(--mx-d2);
}
.mx-card-head{
display:flex;align-items:center;justify-content:space-between;
padding:12px 16px;
border-bottom:1px solid var(--mx-divider);
}
.mx-card-title{font-size:15px;font-weight:700}
.mx-card-body{padding:16px}
.mx-card-body > * + * { margin-top: 12px; }
.mx-card-body > .mx-table-wrap { margin-top: 0; }
.mx-card-body > .mx-chart { margin-top: 0; }
/* 可点击卡片 — Miuix BasicCard with press feedback */
.mx-card-clickable{
cursor:pointer;
transition:box-shadow var(--mx-d3) var(--mx-ease),
transform var(--mx-d3) var(--mx-ease);
}
.mx-card-clickable:hover{
transition-duration:var(--mx-d2);
}
.mx-card-clickable:active{transform:scale(0.98)}
/* Mobile: 卡片内边距调整 */
@media(max-width:767px){
.mx-card-body{padding:14px}
.mx-card-head{padding:12px 14px}
}
/* Miuix: 顶部 accent 线 */
.mx-card-accent{
position:relative;overflow:hidden;
}
.mx-card-accent::before{
content:'';position:absolute;top:0;left:0;right:0;height:2px;
background:var(--mx-card-accent,var(--mx-primary));
opacity:0;transition:opacity var(--mx-d2);
}
.mx-card-accent:hover::before{opacity:1}
/* Miuix: 右上角柔光晕 */
.mx-card-accent::after{
content:'';position:absolute;top:-40%;right:-20%;
width:100px;height:100px;
background:var(--mx-card-accent,var(--mx-primary));
border-radius:50%;opacity:0.04;
transition:opacity var(--mx-d2);
}
.mx-card-accent:hover::after{opacity:0.08}
+139
View File
@@ -0,0 +1,139 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Checkbox & Radio Component
═══════════════════════════════════════════ */
/* ── Checkbox ── */
.mx-checkbox{
display:inline-flex;align-items:center;gap:8px;
cursor:pointer;
-webkit-tap-highlight-color:transparent;
}
.mx-checkbox input{display:none}
.mx-checkbox-box{
width:18px;height:18px;
border:2px solid var(--mx-border);
border-radius:5px;
display:flex;align-items:center;justify-content:center;
flex-shrink:0;
transition:all var(--mx-d2) var(--mx-spring);
background:transparent;
}
.mx-checkbox-box svg{
width:12px;height:12px;
color:#fff;opacity:0;
transform:scale(0);
transition:all var(--mx-d2) var(--mx-spring);
}
/* Checked */
.mx-checkbox input:checked + .mx-checkbox-box{
background:var(--mx-primary);
border-color:var(--mx-primary);
}
.mx-checkbox input:checked + .mx-checkbox-box svg{
opacity:1;transform:scale(1);
}
/* Indeterminate */
.mx-checkbox input:indeterminate + .mx-checkbox-box{
background:var(--mx-primary);
border-color:var(--mx-primary);
}
.mx-checkbox input:indeterminate + .mx-checkbox-box svg{
opacity:1;transform:scale(1);
}
/* Hover */
.mx-checkbox:hover .mx-checkbox-box{border-color:var(--mx-primary)}
/* Disabled */
.mx-checkbox input:disabled + .mx-checkbox-box{
opacity:0.4;cursor:not-allowed;
}
.mx-checkbox input:disabled ~ .mx-checkbox-label{
opacity:0.4;cursor:not-allowed;
}
/* Focus */
.mx-checkbox input:focus-visible + .mx-checkbox-box{
box-shadow:0 0 0 3px var(--mx-primary-glow);
}
/* Label */
.mx-checkbox-label{
font-size:14px;color:var(--mx-text);
transition:color var(--mx-d1);
user-select:none;
}
/* ── Radio ── */
.mx-radio{
display:inline-flex;align-items:center;gap:8px;
cursor:pointer;
-webkit-tap-highlight-color:transparent;
}
.mx-radio input{display:none}
.mx-radio-dot{
width:18px;height:18px;
border:2px solid var(--mx-border);
border-radius:50%;
display:flex;align-items:center;justify-content:center;
flex-shrink:0;
transition:all var(--mx-d2) var(--mx-spring);
}
.mx-radio-dot::after{
content:'';width:8px;height:8px;
border-radius:50%;background:#fff;
transform:scale(0);
transition:transform var(--mx-d2) var(--mx-spring);
}
/* Checked */
.mx-radio input:checked + .mx-radio-dot{
background:var(--mx-primary);
border-color:var(--mx-primary);
}
.mx-radio input:checked + .mx-radio-dot::after{
transform:scale(1);
}
/* Hover */
.mx-radio:hover .mx-radio-dot{border-color:var(--mx-primary)}
/* Disabled */
.mx-radio input:disabled + .mx-radio-dot{
opacity:0.4;cursor:not-allowed;
}
.mx-radio input:disabled ~ .mx-radio-label{
opacity:0.4;cursor:not-allowed;
}
/* Focus */
.mx-radio input:focus-visible + .mx-radio-dot{
box-shadow:0 0 0 3px var(--mx-primary-glow);
}
/* Label */
.mx-radio-label{
font-size:14px;color:var(--mx-text);
transition:color var(--mx-d1);
user-select:none;
}
/* ── Checkbox Group / Radio Group layout ── */
.mx-checkbox-group,.mx-radio-group{
display:flex;flex-direction:column;gap:10px;
}
.mx-checkbox-group.horizontal,.mx-radio-group.horizontal{
flex-direction:row;flex-wrap:wrap;gap:16px;
}
/* Mobile: 加大触控区 */
@media(max-width:767px){
.mx-checkbox,.mx-radio{min-height:44px;padding:4px 0}
.mx-checkbox-box,.mx-radio-dot{width:22px;height:22px}
.mx-checkbox-box svg{width:14px;height:14px}
.mx-radio-dot::after{width:10px;height:10px}
}
+93
View File
@@ -0,0 +1,93 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Drawer / Side Panel Component
═══════════════════════════════════════════ */
/* Overlay */
.mx-drawer-overlay{
position:fixed;inset:0;z-index:900;
background:var(--mx-window-dim);
opacity:0;visibility:hidden;
transition:opacity var(--mx-d2) var(--mx-ease),
visibility var(--mx-d2);
}
.mx-drawer-overlay.open{opacity:1;visibility:visible}
/* Drawer */
.mx-drawer{
position:fixed;top:0;z-index:950;
width:320px;height:100dvh;
background:var(--mx-s1);
box-shadow:var(--mx-sh3);
display:flex;flex-direction:column;
transition:transform var(--mx-d3) var(--mx-spring);
}
/* Position: right (default) */
.mx-drawer-right{
right:0;
transform:translateX(100%);
}
.mx-drawer-right.open{transform:translateX(0)}
/* Position: left */
.mx-drawer-left{
left:0;
transform:translateX(-100%);
}
.mx-drawer-left.open{transform:translateX(0)}
/* Size variants */
.mx-drawer-sm{width:280px}
.mx-drawer-lg{width:420px}
@media(min-width:1024px){
.mx-drawer-xl{width:560px}
}
/* Header */
.mx-drawer-head{
display:flex;align-items:center;justify-content:space-between;
padding:16px 20px;
border-bottom:1px solid var(--mx-divider);
flex-shrink:0;
}
.mx-drawer-title{font-size:15px;font-weight:700}
.mx-drawer-close{
width:28px;height:28px;
display:flex;align-items:center;justify-content:center;
border-radius:var(--mx-r-xs);
cursor:pointer;color:var(--mx-t3);
transition:all var(--mx-d1);
}
.mx-drawer-close:hover{background:var(--mx-s-hover);color:var(--mx-text)}
/* Body */
.mx-drawer-body{
flex:1;overflow-y:auto;padding:20px;
font-size:14px;line-height:1.6;
}
/* Footer */
.mx-drawer-foot{
display:flex;align-items:center;justify-content:flex-end;gap:8px;
padding:12px 20px;
border-top:1px solid var(--mx-divider);
flex-shrink:0;
}
/* Full width on mobile */
@media(max-width:767px){
.mx-drawer{width:100%}
.mx-drawer-sm,.mx-drawer-lg,.mx-drawer-xl{width:100%}
}
/* Tablet */
@media(min-width:768px) and (max-width:1023px){
.mx-drawer{width:360px}
.mx-drawer-sm{width:300px}
.mx-drawer-lg{width:420px}
}
/* ═══ DARK MODE INNER GLOW — unified with Card/Stat ═══ */
[data-theme="dark"] .mx-drawer{
box-shadow:var(--mx-sh3),inset 0 1px 0 rgba(255,255,255,0.04);
}
+46
View File
@@ -0,0 +1,46 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Empty State Component
═══════════════════════════════════════════ */
.mx-empty{
display:flex;flex-direction:column;
align-items:center;justify-content:center;
padding:48px 24px;text-align:center;
}
.mx-empty-icon{
width:64px;height:64px;
border-radius:var(--mx-r);
background:var(--mx-s3);
display:flex;align-items:center;justify-content:center;
margin-bottom:16px;
color:var(--mx-t3);
}
.mx-empty-icon svg{width:28px;height:28px}
.mx-empty-title{
font-size:15px;font-weight:700;
color:var(--mx-text);margin-bottom:6px;
}
.mx-empty-desc{
font-size:13px;color:var(--mx-t3);
line-height:1.5;max-width:320px;margin-bottom:20px;
}
/* Inline variant — smaller */
.mx-empty-inline{
padding:24px 16px;
}
.mx-empty-inline .mx-empty-icon{
width:48px;height:48px;
}
.mx-empty-inline .mx-empty-icon svg{width:22px;height:22px}
/* Mobile */
@media(max-width:767px){
.mx-empty{padding:32px 16px}
.mx-empty-icon{width:52px;height:52px}
.mx-empty-icon svg{width:24px;height:24px}
.mx-empty-title{font-size:14px}
.mx-empty-desc{font-size:12px}
}
+77
View File
@@ -0,0 +1,77 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Input Component
═══════════════════════════════════════════ */
.mx-input-wrap{
display:flex;align-items:center;gap:10px;
background:var(--mx-s3);
border:1px solid var(--mx-border);
border-radius:var(--mx-r-sm);
padding:0 16px;height:40px;
transition:all var(--mx-d2) var(--mx-ease);
}
.mx-input-wrap:focus-within{
border-color:var(--mx-primary);
box-shadow:0 0 0 3px var(--mx-primary-glow);
background:var(--mx-s2);
}
.mx-input-wrap .mx-input-icon{
color:var(--mx-t3);flex-shrink:0;
display:flex;align-items:center;
}
.mx-input{
width:100%;height:100%;
background:none;
color:var(--mx-text);font-size:14px;
font-family:var(--mx-font);
}
.mx-input::placeholder{color:var(--mx-t3)}
/* Textarea */
.mx-textarea-wrap{
padding:12px 14px;height:auto;min-height:80px;
align-items:flex-start;
}
.mx-textarea{
width:100%;resize:vertical;min-height:60px;
background:none;border:none;outline:none;
color:var(--mx-text);font-size:14px;
font-family:var(--mx-font);line-height:1.6;
}
.mx-textarea::placeholder{color:var(--mx-t3)}
/* Sizes */
.mx-input-sm{height:34px;padding:0 12px;font-size:13px;border-radius:var(--mx-r-xs)}
.mx-input-lg{height:46px;padding:0 16px;font-size:15px}
/* Error */
.mx-input-error{border-color:var(--mx-red)}
.mx-input-error:focus-within{box-shadow:0 0 0 3px rgba(248,113,113,0.15)}
/* Disabled */
.mx-input-wrap.mx-disabled{
opacity:0.4;cursor:not-allowed;
}
.mx-input-wrap.mx-disabled input{pointer-events:none}
/* Label */
.mx-label{
display:block;font-size:12px;font-weight:600;
color:var(--mx-t2);margin-bottom:6px;
text-transform:uppercase;letter-spacing:0.04em;
}
/* Helper text */
.mx-helper{font-size:12px;color:var(--mx-t3);margin-top:4px}
.mx-helper-error{color:var(--mx-red)}
/* Mobile: 防止 iOS 自动缩放 + 加大触控区 */
@media(max-width:767px){
.mx-input-wrap{height:44px;padding:0 16px}
.mx-input{font-size:16px}
.mx-input-sm{height:38px;font-size:15px}
.mx-input-lg{height:50px;font-size:16px}
.mx-textarea-wrap{min-height:88px}
.mx-textarea{font-size:16px;min-height:72px}
.mx-label{font-size:13px;margin-bottom:8px}
}
+327
View File
@@ -0,0 +1,327 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Layout System
全设备适配:手机 / 平板 / 桌面 / 大屏
═══════════════════════════════════════════ */
/* ── App Shell ── */
.mx-app{display:flex;flex-direction:column;height:100dvh}
/* ── Scrollable Body ── */
.mx-body{
flex:1;overflow-y:auto;overflow-x:hidden;
-webkit-overflow-scrolling:touch;
}
/* ── 自动为手机端主内容区添加底部内边距,防止 fixed 底栏遮挡 ── */
@media(max-width:1023px){
.mx-app > .mx-body,
.mx-app > .mx-desktop-main.mx-body{
padding-bottom:calc(72px + var(--mx-safe-b));
}
}
@media(min-width:1024px){
.mx-app > .mx-body,
.mx-app > .mx-desktop-main.mx-body{
padding-bottom:0;
}
}
/* ── Padding utilities ── */
.mx-pad{padding:12px}
.mx-pad-b{padding-bottom:calc(72px + var(--mx-safe-b))}
@media(min-width:768px){.mx-pad{padding:20px}.mx-pad-b{padding-bottom:20px}}
@media(min-width:1024px){.mx-pad{padding:28px}}
/* ── Page Header ── */
.mx-page-head{margin-bottom:16px}
@media(min-width:768px){.mx-page-head{margin-bottom:20px}}
.mx-page-title{
font-size:20px;font-weight:800;letter-spacing:-0.02em;
background:linear-gradient(135deg,var(--mx-text),var(--mx-t2));
-webkit-background-clip:text;-webkit-text-fill-color:transparent;
}
@media(min-width:768px){.mx-page-title{font-size:24px}}
.mx-page-sub{
font-size:12px;color:var(--mx-t3);margin-top:4px;
display:flex;align-items:center;gap:6px;
}
/* ── Section ── */
.mx-section{margin-bottom:12px}
@media(min-width:768px){.mx-section{margin-bottom:16px}}
/* ══════════════════════════════════════════
MOBILE (< 768px) — 触控优先
══════════════════════════════════════════ */
@media(max-width:767px){
/* 触控友好的最小高度 */
.mx-btn{height:40px;padding:0 20px;font-size:14px}
.mx-btn-sm{height:36px;padding:0 14px;font-size:13px}
.mx-btn-lg{height:46px;padding:0 24px;font-size:15px}
.mx-btn-icon{width:40px;height:40px}
/* 输入框加大 */
.mx-input-wrap{height:44px;padding:0 16px}
.mx-input{font-size:16px} /* 防止 iOS 自动缩放 */
.mx-input-sm{height:38px;font-size:15px}
.mx-input-lg{height:50px;font-size:16px}
/* Select 加大 */
.mx-select-trigger{height:44px;font-size:16px}
/* Switch 加大 */
.mx-switch-track{width:48px;height:28px}
.mx-switch-thumb{width:22px;height:22px;top:3px;left:3px}
.mx-switch input:checked + .mx-switch-track .mx-switch-thumb{transform:translateX(20px)}
/* Checkbox/Radio 加大触控区 */
.mx-checkbox-box,.mx-radio-dot{width:20px;height:20px}
.mx-checkbox-box svg{width:14px;height:14px}
.mx-radio-dot::after{width:9px;height:9px}
/* Slider 触控加大 */
.mx-slider input[type="range"]::-webkit-slider-thumb{width:22px;height:22px}
.mx-slider input[type="range"]::-moz-range-thumb{width:22px;height:22px}
/* Navigation 触控加大 */
.mx-nav-item{padding:11px 10px}
.mx-btm-item{padding:8px 16px}
.mx-btm-item span{font-size:11px}
/* TopBar */
.mx-topbar{height:48px;padding:0 12px}
/* BottomNav */
.mx-bottom-nav{height:auto}
/* Modal 全屏化 */
.mx-modal-overlay{padding:0;align-items:flex-end}
.mx-modal{
max-width:100%;max-height:90dvh;
border-radius:var(--mx-r) var(--mx-r) 0 0;
transform:translateY(100%);
opacity:1;
}
.mx-modal-overlay.open .mx-modal{transform:translateY(0)}
.mx-modal-sm,.mx-modal-lg,.mx-modal-xl{max-width:100%}
/* Drawer 全宽 */
.mx-drawer{width:100%}
.mx-drawer-sm,.mx-drawer-lg,.mx-drawer-xl{width:100%}
/* Grid 单列降级 */
.mx-grid-2,.mx-grid-3{grid-template-columns:1fr}
.mx-grid-sidebar{grid-template-columns:1fr}
/* Stat 单列(窄屏手机) */
.mx-stat-grid{grid-template-columns:1fr 1fr}
/* Table 卡片式响应 */
.mx-table{border:0}
.mx-table thead{display:none}
.mx-table tbody tr{
display:block;margin-bottom:12px;
border:1px solid var(--mx-divider);
border-radius:var(--mx-r-sm);
padding:12px;
background:var(--mx-s2);
}
.mx-table tbody td{
display:flex;justify-content:space-between;align-items:center;
padding:6px 0;border-bottom:1px solid var(--mx-divider);
white-space:normal;
}
.mx-table tbody td:last-child{border-bottom:none}
.mx-table tbody td::before{
content:attr(data-label);
font-size:11px;font-weight:700;color:var(--mx-t3);
text-transform:uppercase;letter-spacing:0.04em;
flex-shrink:0;margin-right:12px;
}
.mx-table tbody tr:hover td{padding-left:0}
/* Tabs 横向滚动 */
.mx-tabs{overflow-x:auto;-webkit-overflow-scrolling:touch}
.mx-tab{padding:10px 14px}
/* Pagination 精简 */
.mx-page-prev span,.mx-page-next span{display:none}
.mx-page-info{display:none}
.mx-pagination{gap:2px}
.mx-page-btn{width:32px;height:32px;font-size:12px}
/* Popover 全宽 */
.mx-popover{
position:fixed;left:8px!important;right:8px!important;
bottom:8px!important;top:auto!important;
width:auto!important;max-width:none;
transform:translateY(100%)!important;
transform-origin:bottom center;
border-radius:var(--mx-r);
}
.mx-popover.open{transform:translateY(0)!important}
/* Select dropdown 全宽 */
.mx-select-dropdown{
position:fixed;left:8px!important;right:8px!important;
bottom:8px!important;top:auto!important;
max-height:50dvh;
transform:translateY(100%)!important;
transform-origin:bottom center;
border-radius:var(--mx-r);
}
.mx-select-dropdown.open{transform:translateY(0)!important}
/* Datepicker dropdown 全宽 */
.mx-datepicker-dropdown{
position:fixed;left:8px!important;right:8px!important;
bottom:8px!important;top:auto!important;
transform:translateY(100%)!important;
transform-origin:bottom center;
border-radius:var(--mx-r);
}
.mx-datepicker-dropdown.open{transform:translateY(0)!important}
/* Accordion */
.mx-accordion-header{padding:12px 14px}
/* Upload */
.mx-upload{padding:24px 16px}
/* Avatar group */
.mx-avatar-group .mx-avatar,
.mx-avatar-group .mx-avatar-img{margin-left:-10px}
}
/* ══════════════════════════════════════════
TABLET (768px — 1023px)
══════════════════════════════════════════ */
@media(min-width:768px) and (max-width:1023px){
.mx-grid-3{grid-template-columns:1fr 1fr}
.mx-grid-sidebar{grid-template-columns:1fr}
.mx-stat-grid{grid-template-columns:repeat(4,1fr)}
/* Modal 稍宽 */
.mx-modal{max-width:480px}
/* Drawer */
.mx-drawer{width:360px}
.mx-drawer-sm{width:300px}
.mx-drawer-lg{width:420px}
/* Tabs 横向滚动 */
.mx-tabs{overflow-x:auto;-webkit-overflow-scrolling:touch}
}
/* ══════════════════════════════════════════
DESKTOP (≥ 1024px)
══════════════════════════════════════════ */
@media(min-width:1024px){
.mx-app{flex-direction:row}
.mx-app>.mx-topbar{display:none}
.mx-app>.mx-bottom-nav{display:none!important}
.mx-desktop-shell{
display:flex;flex-direction:column;width:100%;
}
.mx-desktop-topbar{
display:flex;align-items:center;justify-content:space-between;
height:52px;padding:0 24px;
border-bottom:1px solid var(--mx-divider);
backdrop-filter:blur(24px) saturate(1.8);
-webkit-backdrop-filter:blur(24px) saturate(1.8);
flex-shrink:0;
}
[data-theme="dark"] .mx-desktop-topbar{background:rgba(0,0,0,0.6)}
[data-theme="light"] .mx-desktop-topbar{background:rgba(247,247,247,0.65)}
.mx-desktop-main{
flex:1;padding:28px;overflow-y:auto;background:var(--mx-bg);
}
.mx-sidebar{display:block}
.mx-bottom-nav{display:none!important}
/* Grid 正常 */
.mx-grid-2{grid-template-columns:1fr 1fr}
.mx-grid-3{grid-template-columns:1fr 1fr 1fr}
.mx-grid-sidebar{display:grid;grid-template-columns:1fr 320px;gap:16px}
.mx-stat-grid{grid-template-columns:repeat(4,1fr)}
}
/* Hide desktop elements on mobile */
@media(max-width:1023px){
.mx-sidebar{display:none}
.mx-desktop-shell{display:none}
}
/* ── Wide (≥1440px) ── */
@media(min-width:1440px){
.mx-sidebar{width:260px}
.mx-desktop-main{padding:28px 32px}
}
/* ══════════════════════════════════════════
TOUCH DETECTION — 精确触控增强
══════════════════════════════════════════ */
@media(hover:none) and (pointer:coarse){
/* 触控设备额外加大可交互区域 */
.mx-tab{min-height:44px}
.mx-nav-item{min-height:44px}
.mx-accordion-header{min-height:48px}
.mx-popover-item{min-height:44px}
.mx-select-option{min-height:44px}
.mx-page-btn{min-height:36px}
.mx-tag{min-height:32px}
/* 禁用 hover 效果(触控无 hover) */
.mx-card:hover{box-shadow:var(--mx-sh1)}
.mx-stat:hover::before{opacity:0}
.mx-stat:hover::after{opacity:0.04}
.mx-stat:hover .mx-stat-icon{transform:none}
.mx-table tbody tr:hover{background:transparent}
.mx-table tbody tr:hover td{padding-left:14px}
.mx-table th:hover::after{transform:scaleX(0)}
/* 用 :active 替代 */
.mx-card:active{box-shadow:var(--mx-sh2)}
.mx-stat:active{box-shadow:var(--mx-sh2)}
.mx-table tbody tr:active{background:var(--mx-s-hover)}
/* Tooltip 改为长按触发 */
.mx-tooltip::after{
transition:none;
opacity:0;visibility:hidden;
}
.mx-tooltip:active::after{
opacity:1;visibility:visible;
}
}
/* ══════════════════════════════════════════
LANDSCAPE PHONE — 横屏手机
══════════════════════════════════════════ */
@media(max-height:500px) and (orientation:landscape){
.mx-topbar{height:40px}
.mx-bottom-nav{display:none!important}
.mx-modal{max-height:95dvh;border-radius:var(--mx-r)}
.mx-modal-overlay{align-items:center;padding:8px}
.mx-drawer{height:100dvh}
}
/* ══════════════════════════════════════════
FLEX utilities
══════════════════════════════════════════ */
.mx-flex{display:flex}
.mx-flex-center{display:flex;align-items:center;justify-content:center}
.mx-flex-between{display:flex;align-items:center;justify-content:space-between}
.mx-gap-4{gap:4px}.mx-gap-8{gap:8px}.mx-gap-12{gap:12px}.mx-gap-16{gap:16px}
/* ══════════════════════════════════════════
SAFE AREA — 全面屏设备
══════════════════════════════════════════ */
@supports(padding:max(0px)){
.mx-pad{padding:max(12px, env(safe-area-inset-left)) max(12px, env(safe-area-inset-right))}
@media(min-width:768px){.mx-pad{padding:max(20px, env(safe-area-inset-left)) max(20px, env(safe-area-inset-right))}}
.mx-bottom-nav{padding-bottom:max(4px, env(safe-area-inset-bottom))}
}
+117
View File
@@ -0,0 +1,117 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Modal / Dialog Component
对应 Miuix Dialog — 多层 Surface + 弹簧入场
═══════════════════════════════════════════ */
/* Overlay */
.mx-modal-overlay{
position:fixed;inset:0;z-index:1000;
display:flex;align-items:center;justify-content:center;
background:var(--mx-window-dim);
opacity:0;visibility:hidden;
transition:opacity var(--mx-d2) var(--mx-ease),
visibility var(--mx-d2);
padding:16px;
}
.mx-modal-overlay.open{
opacity:1;visibility:visible;
}
/* Dialog */
.mx-modal{
background:var(--mx-s2);
border-radius:var(--mx-r);
box-shadow:var(--mx-sh3);
width:100%;max-width:420px;
max-height:calc(100dvh - 48px);
overflow:hidden;
display:flex;flex-direction:column;
transform:scale(0.92) translateY(16px);
opacity:0;
transition:transform var(--mx-d3) var(--mx-spring),
opacity var(--mx-d2) var(--mx-ease);
}
.mx-modal-overlay.open .mx-modal{
transform:scale(1) translateY(0);
opacity:1;
}
/* Size variants */
.mx-modal-sm{max-width:340px}
.mx-modal-lg{max-width:560px}
.mx-modal-xl{max-width:720px}
.mx-modal-full{max-width:calc(100dvw - 32px);max-height:calc(100dvh - 32px)}
/* Header */
.mx-modal-head{
display:flex;align-items:center;justify-content:space-between;
padding:16px 20px;
border-bottom:1px solid var(--mx-divider);
flex-shrink:0;
}
.mx-modal-title{
font-size:15px;font-weight:700;
}
.mx-modal-close{
width:28px;height:28px;
display:flex;align-items:center;justify-content:center;
border-radius:var(--mx-r-xs);
cursor:pointer;color:var(--mx-t3);
transition:all var(--mx-d1) var(--mx-ease);
}
.mx-modal-close:hover{background:var(--mx-s-hover);color:var(--mx-text)}
.mx-modal-close:active{transform:scale(0.9)}
/* Body */
.mx-modal-body{
padding:20px;
overflow-y:auto;flex:1;
font-size:14px;line-height:1.6;color:var(--mx-text-on-surface);
}
/* Footer */
.mx-modal-foot{
display:flex;align-items:center;justify-content:flex-end;gap:8px;
padding:12px 20px;
border-top:1px solid var(--mx-divider);
flex-shrink:0;
}
/* Confirmation variant — icon + centered text */
.mx-modal-confirm-icon{
width:48px;height:48px;
border-radius:50%;
display:flex;align-items:center;justify-content:center;
margin:0 auto 16px;
}
.mx-modal-confirm-icon.info{background:rgba(96,165,250,0.12);color:var(--mx-blue)}
.mx-modal-confirm-icon.success{background:rgba(52,211,153,0.12);color:var(--mx-green)}
.mx-modal-confirm-icon.warning{background:rgba(251,191,36,0.12);color:var(--mx-amber)}
.mx-modal-confirm-icon.danger{background:rgba(248,113,113,0.12);color:var(--mx-red)}
.mx-modal-confirm-text{
text-align:center;font-size:14px;color:var(--mx-text-on-surface);
line-height:1.6;margin-bottom:4px;
}
.mx-modal-confirm-title{
text-align:center;font-size:16px;font-weight:700;
margin-bottom:8px;
}
.mx-modal-confirm-foot{justify-content:center}
/* Mobile: 按钮全宽堆叠 */
@media(max-width:767px){
.mx-modal-foot{flex-direction:column-reverse}
.mx-modal-foot .mx-btn{width:100%}
}
/* Tablet: 居中弹窗 */
@media(min-width:768px) and (max-width:1023px){
.mx-modal-overlay{align-items:center;padding:16px}
.mx-modal{max-width:480px;transform:scale(0.92) translateY(16px)}
.mx-modal-overlay.open .mx-modal{transform:scale(1) translateY(0)}
}
/* ═══ DARK MODE INNER GLOW — unified with Card/Stat ═══ */
[data-theme="dark"] .mx-modal{
box-shadow:var(--mx-sh3),inset 0 1px 0 rgba(255,255,255,0.04);
}
+212
View File
@@ -0,0 +1,212 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Navigation Components
TopBar + Sidebar + BottomNav
═══════════════════════════════════════════ */
/* ── TopBar — Miuix frosted glass ── */
.mx-topbar{
position:sticky;top:0;z-index:100;
display:flex;align-items:center;justify-content:space-between;
height:52px;padding:0 16px;
padding-top:var(--mx-safe-t);
border-bottom:1px solid var(--mx-divider);
backdrop-filter:blur(24px) saturate(1.8);
-webkit-backdrop-filter:blur(24px) saturate(1.8);
flex-shrink:0;
}
[data-theme="dark"] .mx-topbar{background:rgba(0,0,0,0.6)}
[data-theme="light"] .mx-topbar{background:rgba(247,247,247,0.65)}
.mx-topbar-left{display:flex;align-items:center;gap:10px}
.mx-topbar-right{display:flex;align-items:center;gap:4px}
/* Logo */
.mx-logo{
display:flex;align-items:center;gap:10px;
}
.mx-logo-icon{
width:32px;height:32px;
background:linear-gradient(135deg,var(--mx-primary),var(--mx-accent));
border-radius:10px;
display:flex;align-items:center;justify-content:center;
transition:transform var(--mx-d2) var(--mx-ease);
box-shadow:0 2px 8px rgba(76,139,245,0.2);
flex-shrink:0;
}
.mx-logo-icon:active{transform:scale(0.92)}
.mx-logo-icon svg{color:#fff}
.mx-logo-text{font-size:16px;font-weight:700}
/* ── Sidebar ── */
.mx-sidebar{
width:240px;flex-shrink:0;
background:var(--mx-s1);
border-right:1px solid var(--mx-divider);
padding:12px;
overflow-y:auto;scrollbar-width:none;
}
.mx-sidebar::-webkit-scrollbar{display:none}
.mx-sidebar-section{
font-size:11px;font-weight:700;color:var(--mx-t3);
text-transform:uppercase;letter-spacing:0.06em;
padding:0 10px;margin:16px 0 4px;
}
.mx-sidebar-section:first-child{margin-top:4px}
.mx-nav-item{
display:flex;align-items:center;gap:10px;
padding:8px 10px;border-radius:var(--mx-r-sm);
cursor:pointer;color:var(--mx-t2);
font-size:13px;font-weight:500;
transition:all var(--mx-d1) var(--mx-ease);
position:relative;
-webkit-tap-highlight-color:transparent;
}
.mx-nav-item::before{
content:'';position:absolute;left:0;top:50%;
width:3px;height:0;
background:var(--mx-primary);
border-radius:0 3px 3px 0;
transform:translateY(-50%);
transition:height var(--mx-d2) var(--mx-spring);
}
.mx-nav-item:hover{background:var(--mx-s-hover);color:var(--mx-text)}
.mx-nav-item.active{background:var(--mx-primary-glow);color:var(--mx-primary)}
.mx-nav-item.active::before{height:18px}
.mx-nav-item:active{transform:scale(0.97)}
.mx-nav-item svg{flex-shrink:0}
.mx-nav-label{flex:1}
.mx-sidebar-bottom{
margin-top:auto;padding-top:12px;
border-top:1px solid var(--mx-divider);
}
/* ── BottomNav — mobile only ── */
.mx-bottom-nav{
position:fixed;bottom:0;left:0;right:0;z-index:200;
border-top:1px solid var(--mx-divider);
backdrop-filter:blur(24px) saturate(1.8);
-webkit-backdrop-filter:blur(24px) saturate(1.8);
padding:4px 0;
padding-bottom:calc(4px + var(--mx-safe-b));
}
[data-theme="dark"] .mx-bottom-nav{background:rgba(0,0,0,0.6)}
[data-theme="light"] .mx-bottom-nav{background:rgba(247,247,247,0.65)}
.mx-bottom-nav-items{
display:flex;justify-content:space-around;
}
.mx-btm-item{
display:flex;flex-direction:column;align-items:center;gap:2px;
padding:6px 16px;border-radius:var(--mx-r-sm);
cursor:pointer;color:var(--mx-t3);
transition:all var(--mx-d2) var(--mx-spring);
-webkit-tap-highlight-color:transparent;
position:relative;
}
.mx-btm-item.active{color:var(--mx-primary)}
.mx-btm-item.active::before{
content:'';position:absolute;top:2px;left:50%;
width:5px;height:5px;
background:var(--mx-primary);
border-radius:50%;transform:translateX(-50%);
animation:mx-dot-in var(--mx-d2) var(--mx-spring);
}
.mx-btm-item span{font-size:10px;font-weight:600}
.mx-btm-item:active{transform:scale(0.88)}
@keyframes mx-dot-in{
from{transform:translateX(-50%) scale(0);opacity:0}
to{transform:translateX(-50%) scale(1);opacity:1}
}
/* ── Breadcrumb ── */
.mx-breadcrumb{
display:flex;align-items:center;gap:8px;
font-size:13px;color:var(--mx-t3);
}
.mx-breadcrumb span{transition:color var(--mx-d1)}
.mx-breadcrumb span:last-child{color:var(--mx-t2);font-weight:500}
.mx-breadcrumb .mx-breadcrumb-sep{color:var(--mx-t3);font-size:11px}
/* ── Pill Group — density/theme toggle ── */
.mx-pill-group{
display:inline-flex;
background:var(--mx-s3);
border-radius:var(--mx-r-pill);
padding:3px;gap:2px;
}
.mx-pill-group button{
padding:5px 14px;border-radius:var(--mx-r-pill);
font-size:12px;font-weight:600;cursor:pointer;
color:var(--mx-t3);
transition:all var(--mx-d2) var(--mx-ease);
}
.mx-pill-group button.active{
background:var(--mx-primary);color:#fff;
box-shadow:0 2px 8px rgba(76,139,245,0.25);
}
.mx-pill-group button:hover:not(.active){color:var(--mx-text)}
/* ── Avatar ── */
.mx-avatar{
width:32px;height:32px;border-radius:50%;
background:linear-gradient(135deg,var(--mx-primary),var(--mx-accent));
display:flex;align-items:center;justify-content:center;
font-size:13px;font-weight:700;color:#fff;
cursor:pointer;flex-shrink:0;
transition:all var(--mx-d2) var(--mx-ease);
box-shadow:0 0 0 0 var(--mx-primary-glow);
}
.mx-avatar:hover{box-shadow:0 0 0 4px var(--mx-primary-glow)}
.mx-avatar:active{transform:scale(0.9)}
/* ── Notification Dot ── */
.mx-notify{
position:relative;
}
.mx-notify .mx-notify-dot{
position:absolute;top:7px;right:7px;
width:7px;height:7px;
background:var(--mx-red);
border-radius:50%;
border:2px solid var(--mx-s1);
animation:mx-pulse 2s infinite;
}
/* ═══ MOBILE ADAPTATIONS ═══ */
@media(max-width:767px){
/* TopBar 更紧凑 */
.mx-topbar{height:48px;padding:0 12px}
.mx-logo-icon{width:28px;height:28px;border-radius:8px}
.mx-logo-text{font-size:14px}
.mx-avatar{width:28px;height:28px;font-size:12px}
/* BottomNav 加大触控区 */
.mx-btm-item{padding:8px 16px;min-width:56px}
.mx-btm-item span{font-size:11px}
.mx-btm-item svg{width:24px;height:24px}
/* Sidebar section */
.mx-sidebar-section{font-size:10px}
.mx-nav-item{padding:11px 10px;min-height:44px}
/* Breadcrumb 滚动 */
.mx-breadcrumb{overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch}
/* Pill group */
.mx-pill-group button{padding:6px 12px;font-size:11px}
/* Notification dot */
.mx-notify .mx-notify-dot{top:5px;right:5px;width:6px;height:6px}
}
/* ═══ TABLET ADAPTATIONS ═══ */
@media(min-width:768px) and (max-width:1023px){
.mx-topbar{height:50px}
.mx-bottom-nav{padding:6px 0}
.mx-btm-item span{font-size:10px}
}
+83
View File
@@ -0,0 +1,83 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Pagination Component
═══════════════════════════════════════════ */
.mx-pagination{
display:flex;align-items:center;gap:4px;
font-size:13px;
}
/* Page button */
.mx-page-btn{
width:34px;height:34px;
display:flex;align-items:center;justify-content:center;
border-radius:var(--mx-r-xs);
cursor:pointer;color:var(--mx-t2);
font-weight:500;
transition:all var(--mx-d1) var(--mx-ease);
-webkit-tap-highlight-color:transparent;
}
.mx-page-btn:hover{background:var(--mx-s-hover);color:var(--mx-text)}
.mx-page-btn:active{transform:scale(0.92)}
/* Active */
.mx-page-btn.active{
background:var(--mx-primary);color:#fff;
box-shadow:0 2px 8px rgba(76,139,245,0.25);
}
/* Disabled */
.mx-page-btn.disabled{
opacity:0.3;pointer-events:none;
}
/* Ellipsis */
.mx-page-ellipsis{
width:34px;height:34px;
display:flex;align-items:center;justify-content:center;
color:var(--mx-t3);font-size:12px;
letter-spacing:2px;
}
/* Prev / Next with text */
.mx-page-prev,.mx-page-next{
display:flex;align-items:center;gap:4px;
padding:0 10px;height:34px;
border-radius:var(--mx-r-xs);
cursor:pointer;color:var(--mx-t2);
font-size:13px;font-weight:500;
transition:all var(--mx-d1) var(--mx-ease);
}
.mx-page-prev:hover,.mx-page-next:hover{
background:var(--mx-s-hover);color:var(--mx-text);
}
.mx-page-prev:active,.mx-page-next:active{transform:scale(0.95)}
.mx-page-prev.disabled,.mx-page-next.disabled{
opacity:0.3;pointer-events:none;
}
/* Size info */
.mx-page-info{
font-size:12px;color:var(--mx-t3);
margin:0 8px;
}
/* Simple variant — just prev/next + info */
.mx-pagination-simple .mx-page-btn{display:none}
.mx-pagination-simple .mx-page-ellipsis{display:none}
/* Mobile: 精简显示 */
@media(max-width:767px){
.mx-page-prev span,.mx-page-next span{display:none}
.mx-page-info{display:none}
.mx-pagination{gap:2px}
.mx-page-btn{width:32px;height:32px;font-size:12px}
.mx-page-prev,.mx-page-next{padding:0 6px;height:32px}
/* 只显示前 5 页 */
.mx-page-btn:nth-child(n+8){display:none}
}
/* Tablet */
@media(min-width:768px) and (max-width:1023px){
.mx-page-btn{width:36px;height:36px}
}
+87
View File
@@ -0,0 +1,87 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Popover Component
═══════════════════════════════════════════ */
.mx-popover-wrap{position:relative;display:inline-flex}
.mx-popover{
position:absolute;z-index:600;
min-width:180px;
background:var(--mx-s4);
border:1px solid var(--mx-divider);
border-radius:var(--mx-r-sm);
box-shadow:var(--mx-sh3);
padding:6px;
opacity:0;visibility:hidden;
transform:scale(0.95) translateY(-4px);
transform-origin:top center;
transition:all var(--mx-d2) var(--mx-spring);
pointer-events:none;
}
.mx-popover.open{
opacity:1;visibility:visible;
transform:scale(1) translateY(0);
pointer-events:auto;
}
/* Position: bottom */
.mx-popover-bottom{
top:calc(100% + 6px);left:50%;
transform:translateX(-50%) scale(0.95) translateY(-4px);
transform-origin:top center;
}
.mx-popover-bottom.open{
transform:translateX(-50%) scale(1) translateY(0);
}
/* Position: left */
.mx-popover-left{
right:calc(100% + 6px);top:50%;
transform:translateY(-50%) scale(0.95) translateX(4px);
transform-origin:center right;
}
.mx-popover-left.open{
transform:translateY(-50%) scale(1) translateX(0);
}
/* Position: right */
.mx-popover-right{
left:calc(100% + 6px);top:50%;
transform:translateY(-50%) scale(0.95) translateX(-4px);
transform-origin:center left;
}
.mx-popover-right.open{
transform:translateY(-50%) scale(1) translateX(0);
}
/* Item */
.mx-popover-item{
display:flex;align-items:center;gap:8px;
padding:8px 10px;border-radius:var(--mx-r-xs);
font-size:13px;font-weight:500;
cursor:pointer;color:var(--mx-text);
transition:all var(--mx-d1) var(--mx-ease);
}
.mx-popover-item:hover{background:var(--mx-s-hover)}
.mx-popover-item:active{background:var(--mx-s-active);transform:scale(0.98)}
.mx-popover-item svg{flex-shrink:0;color:var(--mx-t2)}
/* Divider */
.mx-popover-divider{
height:1px;background:var(--mx-divider);
margin:4px 0;
}
/* Danger item */
.mx-popover-item.danger{color:var(--mx-red)}
.mx-popover-item.danger svg{color:var(--mx-red)}
/* Mobile: 底部弹出 + 加大触控 */
@media(max-width:767px){
.mx-popover-item{padding:12px 14px;min-height:44px;font-size:14px}
}
/* ═══ DARK MODE INNER GLOW — unified with Card/Stat ═══ */
[data-theme="dark"] .mx-popover{
box-shadow:var(--mx-sh3),inset 0 1px 0 rgba(255,255,255,0.04);
}
+135
View File
@@ -0,0 +1,135 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Progress Component
进度条 + 加载指示器
═══════════════════════════════════════════ */
/* ── Linear Progress ── */
.mx-progress{
height:4px;background:var(--mx-s3);
border-radius:var(--mx-r-pill);
overflow:hidden;
position:relative;
}
.mx-progress-bar{
height:100%;
background:var(--mx-primary);
border-radius:var(--mx-r-pill);
transition:width var(--mx-d3) var(--mx-ease);
position:relative;
}
/* Striped */
.mx-progress-striped .mx-progress-bar{
background-image:linear-gradient(
45deg,
rgba(255,255,255,0.15) 25%,
transparent 25%,
transparent 50%,
rgba(255,255,255,0.15) 50%,
rgba(255,255,255,0.15) 75%,
transparent 75%
);
background-size:16px 16px;
}
/* Animated striped */
.mx-progress-animated .mx-progress-bar{
animation:mx-progress-stripes 0.8s linear infinite;
}
@keyframes mx-progress-stripes{
from{background-position:16px 0}
to{background-position:0 0}
}
/* Indeterminate */
.mx-progress-indeterminate{
overflow:hidden;
}
.mx-progress-indeterminate .mx-progress-bar{
width:30%;
animation:mx-progress-slide 1.5s var(--mx-ease) infinite;
}
@keyframes mx-progress-slide{
0%{transform:translateX(-100%)}
100%{transform:translateX(400%)}
}
/* Color variants */
.mx-progress-success .mx-progress-bar{background:var(--mx-green)}
.mx-progress-warning .mx-progress-bar{background:var(--mx-amber)}
.mx-progress-error .mx-progress-bar{background:var(--mx-red)}
/* Size */
.mx-progress-sm{height:2px}
.mx-progress-lg{height:8px}
/* With label */
.mx-progress-label{
display:flex;align-items:center;justify-content:space-between;
margin-bottom:6px;
font-size:12px;font-weight:600;color:var(--mx-t2);
}
.mx-progress-label .mx-progress-value{
color:var(--mx-primary);font-variant-numeric:tabular-nums;
}
/* ── Circular Progress (Spinner) ── */
.mx-spinner{
width:24px;height:24px;
border:2.5px solid var(--mx-s3);
border-top-color:var(--mx-primary);
border-radius:50%;
animation:mx-spin 0.7s linear infinite;
}
@keyframes mx-spin{to{transform:rotate(360deg)}}
.mx-spinner-sm{width:18px;height:18px;border-width:2px}
.mx-spinner-lg{width:36px;height:36px;border-width:3px}
/* Dots spinner */
.mx-spinner-dots{
display:flex;gap:4px;
}
.mx-spinner-dots span{
width:6px;height:6px;
border-radius:50%;
background:var(--mx-primary);
animation:mx-dot-bounce 1.2s ease-in-out infinite;
}
.mx-spinner-dots span:nth-child(2){animation-delay:0.15s}
.mx-spinner-dots span:nth-child(3){animation-delay:0.3s}
@keyframes mx-dot-bounce{
0%,80%,100%{transform:scale(0.6);opacity:0.4}
40%{transform:scale(1);opacity:1}
}
/* ── Progress Ring (circular) ── */
.mx-progress-ring{
display:inline-flex;align-items:center;justify-content:center;
position:relative;
}
.mx-progress-ring svg{
transform:rotate(-90deg);
}
.mx-progress-ring-track{
fill:none;stroke:var(--mx-s3);stroke-width:4;
}
.mx-progress-ring-bar{
fill:none;stroke:var(--mx-primary);stroke-width:4;
stroke-linecap:round;
transition:stroke-dashoffset var(--mx-d3) var(--mx-ease);
}
.mx-progress-ring-text{
position:absolute;
font-size:12px;font-weight:700;
color:var(--mx-text);
font-variant-numeric:tabular-nums;
}
/* Mobile */
@media(max-width:767px){
.mx-progress{height:6px}
.mx-progress-lg{height:10px}
.mx-spinner{width:28px;height:28px}
.mx-spinner-lg{width:40px;height:40px}
}
+130
View File
@@ -0,0 +1,130 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Select / Dropdown Component
═══════════════════════════════════════════ */
/* Trigger */
.mx-select{
position:relative;display:inline-flex;
}
.mx-select-trigger{
display:flex;align-items:center;gap:8px;
height:40px;padding:0 16px;
background:var(--mx-s3);
border:1px solid var(--mx-border);
border-radius:var(--mx-r-sm);
font-size:14px;color:var(--mx-text);
cursor:pointer;
transition:all var(--mx-d2) var(--mx-ease);
min-width:160px;
}
.mx-select-trigger:hover{border-color:var(--mx-t3)}
.mx-select-trigger.open{
border-color:var(--mx-primary);
box-shadow:0 0 0 3px var(--mx-primary-glow);
}
.mx-select-trigger .mx-select-placeholder{color:var(--mx-t3);flex:1}
.mx-select-trigger .mx-select-value{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mx-select-trigger .mx-select-arrow{
color:var(--mx-t3);flex-shrink:0;
transition:transform var(--mx-d2) var(--mx-ease);
}
.mx-select-trigger.open .mx-select-arrow{transform:rotate(180deg)}
/* Sizes */
.mx-select-sm .mx-select-trigger{height:34px;padding:0 12px;font-size:13px;border-radius:var(--mx-r-xs)}
.mx-select-lg .mx-select-trigger{height:46px;padding:0 16px;font-size:15px}
/* Dropdown */
.mx-select-dropdown{
position:absolute;top:calc(100% + 4px);left:0;z-index:700;
min-width:100%;max-height:280px;
background:var(--mx-s4);
border:1px solid var(--mx-divider);
border-radius:var(--mx-r-sm);
box-shadow:var(--mx-sh3);
padding:4px;
overflow-y:auto;
opacity:0;visibility:hidden;
transform:scale(0.96) translateY(-4px);
transform-origin:top center;
transition:all var(--mx-d2) var(--mx-spring);
}
.mx-select-dropdown.open{
opacity:1;visibility:visible;
transform:scale(1) translateY(0);
}
/* Search input inside dropdown */
.mx-select-search{
display:flex;align-items:center;gap:8px;
padding:8px 10px;margin-bottom:2px;
border-bottom:1px solid var(--mx-divider);
}
.mx-select-search input{
flex:1;background:none;border:none;outline:none;
font-size:13px;color:var(--mx-text);
}
.mx-select-search input::placeholder{color:var(--mx-t3)}
.mx-select-search svg{color:var(--mx-t3);flex-shrink:0}
/* Option */
.mx-select-option{
display:flex;align-items:center;gap:8px;
padding:8px 10px;border-radius:var(--mx-r-xs);
font-size:13px;cursor:pointer;
color:var(--mx-text);
transition:all var(--mx-d1) var(--mx-ease);
}
.mx-select-option:hover{background:var(--mx-s-hover)}
.mx-select-option:active{background:var(--mx-s-active)}
.mx-select-option.selected{
background:var(--mx-primary-glow);color:var(--mx-primary);
font-weight:600;
}
.mx-select-option .mx-select-check{
margin-left:auto;color:var(--mx-primary);
opacity:0;transition:opacity var(--mx-d1);
}
.mx-select-option.selected .mx-select-check{opacity:1}
/* Group label */
.mx-select-group-label{
font-size:11px;font-weight:700;color:var(--mx-t3);
text-transform:uppercase;letter-spacing:0.06em;
padding:8px 10px 4px;
}
/* Disabled */
.mx-select.disabled{opacity:0.4;pointer-events:none}
/* Mobile: trigger 加大 */
@media(max-width:767px){
.mx-select-trigger{height:44px;font-size:16px}
.mx-select-sm .mx-select-trigger{height:40px;font-size:15px}
.mx-select-lg .mx-select-trigger{height:50px;font-size:16px}
.mx-select-option{min-height:44px;padding:10px}
}
/* Multi-select tags */
.mx-select-tags{
display:flex;flex-wrap:wrap;gap:4px;flex:1;
}
.mx-select-tag{
display:inline-flex;align-items:center;gap:4px;
padding:2px 8px;border-radius:var(--mx-r-pill);
background:var(--mx-primary-glow);
color:var(--mx-primary);
font-size:12px;font-weight:600;
}
.mx-select-tag-remove{
width:14px;height:14px;
display:flex;align-items:center;justify-content:center;
border-radius:50%;cursor:pointer;
transition:background var(--mx-d1);
}
.mx-select-tag-remove:hover{background:rgba(52,130,255,0.2)}
/* ═══ DARK MODE INNER GLOW — unified with Card/Stat ═══ */
[data-theme="dark"] .mx-select-dropdown{
box-shadow:var(--mx-sh3),inset 0 1px 0 rgba(255,255,255,0.04);
}
+79
View File
@@ -0,0 +1,79 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Stat Card Component
═══════════════════════════════════════════ */
.mx-stat{
background:var(--mx-s2);
border-radius:var(--mx-r);
padding:16px;
position:relative;overflow:hidden;
cursor:pointer;
box-shadow:var(--mx-sh1);
transition:all var(--mx-d3) var(--mx-ease);
}
.mx-stat:hover{transition-duration:var(--mx-d2)}
.mx-stat:active{transform:scale(0.97)}
/* 顶部 accent 线 */
.mx-stat::before{
content:'';position:absolute;top:0;left:0;right:0;height:2px;
background:var(--mx-stat-accent,var(--mx-primary));
opacity:0;transition:opacity var(--mx-d2);
}
.mx-stat:hover::before{opacity:1}
/* 右上角柔光晕 */
.mx-stat::after{
content:'';position:absolute;top:-40%;right:-20%;
width:100px;height:100px;
background:var(--mx-stat-accent,var(--mx-primary));
border-radius:50%;opacity:0.04;
transition:opacity var(--mx-d2);
}
.mx-stat:hover::after{opacity:0.08}
.mx-stat-label{
font-size:11px;font-weight:600;color:var(--mx-t3);
text-transform:uppercase;letter-spacing:0.06em;
margin-bottom:10px;display:flex;align-items:center;gap:8px;
}
.mx-stat-icon{
width:26px;height:26px;border-radius:var(--mx-r-xs);
display:flex;align-items:center;justify-content:center;
transition:transform var(--mx-d2) var(--mx-ease);
}
.mx-stat:hover .mx-stat-icon{transform:scale(1.12) rotate(-3deg)}
.mx-stat-value{
font-size:28px;font-weight:800;
letter-spacing:-0.03em;
font-variant-numeric:tabular-nums;
line-height:1;margin-bottom:8px;
}
.mx-stat-delta{
display:inline-flex;align-items:center;gap:4px;
font-size:11px;font-weight:600;
padding:2px 8px;border-radius:var(--mx-r-pill);
}
.mx-stat-delta.up{background:rgba(52,211,153,0.1);color:var(--mx-green)}
.mx-stat-delta.down{background:rgba(248,113,113,0.1);color:var(--mx-red)}
/* Grid layout */
.mx-stat-grid{
display:grid;grid-template-columns:repeat(2,1fr);gap:12px;
}
@media(min-width:768px){
.mx-stat-grid{grid-template-columns:repeat(4,1fr)}
}
/* Mobile */
@media(max-width:767px){
.mx-stat{padding:14px}
.mx-stat-value{font-size:22px}
.mx-stat-icon{width:24px;height:24px}
.mx-stat-icon svg{width:12px;height:12px}
.mx-stat-label{font-size:10px}
.mx-stat-delta{font-size:10px;padding:2px 6px}
}
+67
View File
@@ -0,0 +1,67 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Switch Component
对应 Miuix Switch.kt — miuixCapsuleShape
═══════════════════════════════════════════ */
.mx-switch{
display:inline-flex;align-items:center;gap:10px;
cursor:pointer;
-webkit-tap-highlight-color:transparent;
}
.mx-switch input{display:none}
.mx-switch-track{
width:44px;height:26px;
background:var(--mx-s4);
border-radius:var(--mx-r-pill);
position:relative;
transition:background var(--mx-d2) var(--mx-ease);
flex-shrink:0;
}
.mx-switch-thumb{
position:absolute;top:3px;left:3px;
width:20px;height:20px;
background:#fff;
border-radius:50%;
box-shadow:0 1px 4px rgba(0,0,0,0.25);
transition:transform var(--mx-d2) var(--mx-spring);
}
@keyframes mx-switch-bounce{
0%{transform:translateX(0)}
50%{transform:translateX(22px)}
100%{transform:translateX(20px)}
}
/* Checked */
.mx-switch input:checked + .mx-switch-track{
background:var(--mx-primary);
}
.mx-switch input:checked + .mx-switch-track .mx-switch-thumb{
animation:mx-switch-bounce 0.3s cubic-bezier(0.34,1.56,0.64,1) forwards;
}
/* Disabled */
.mx-switch input:disabled + .mx-switch-track{
opacity:0.4;cursor:not-allowed;
}
/* Label */
.mx-switch-label{
font-size:14px;color:var(--mx-text);
transition:color var(--mx-d1);
}
/* Mobile: 加大触控区 */
@media(max-width:767px){
.mx-switch{min-height:44px;padding:4px 0}
.mx-switch-track{width:48px;height:28px}
.mx-switch-thumb{width:22px;height:22px;top:3px;left:3px}
@keyframes mx-switch-bounce-mobile{
0%{transform:translateX(0)}
50%{transform:translateX(22px)}
100%{transform:translateX(20px)}
}
.mx-switch input:checked + .mx-switch-track .mx-switch-thumb{animation:mx-switch-bounce-mobile 0.3s cubic-bezier(0.34,1.56,0.64,1) forwards}
.mx-switch-label{font-size:15px}
}
+85
View File
@@ -0,0 +1,85 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Table Component
═══════════════════════════════════════════ */
.mx-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
.mx-table{width:100%;border-collapse:collapse}
.mx-table th{
padding:12px 16px;
font-size:11px;font-weight:700;
color:var(--mx-t3);text-align:left;
text-transform:uppercase;letter-spacing:0.06em;
border-bottom:1px solid var(--mx-divider);
white-space:nowrap;cursor:pointer;
position:relative;transition:color var(--mx-d1);
-webkit-user-select:none;user-select:none;
}
.mx-table th:hover{color:var(--mx-t2)}
/* Miuix: 表头 hover 底部亮线 */
.mx-table th::after{
content:'';position:absolute;bottom:0;left:14px;right:14px;
height:2px;background:var(--mx-primary);border-radius:1px;
transform:scaleX(0);transition:transform var(--mx-d2) var(--mx-ease);
}
.mx-table th:hover::after{transform:scaleX(1)}
.mx-table td{
padding:12px 16px;
font-size:13px;
border-bottom:1px solid var(--mx-divider);
white-space:nowrap;
transition:padding var(--mx-d1);
}
.mx-table tbody tr{
transition:background var(--mx-d3);
}
.mx-table tbody tr:hover{
background:var(--mx-s-hover);
transition-duration:var(--mx-d2);
}
.mx-table tbody tr:active{background:var(--mx-s-active)}
/* Miuix: hover 时左 padding 微推 */
.mx-table tbody tr:hover td{padding-left:18px}
/* Mono cell */
.mx-table .mono{
font-family:var(--mx-mono);font-size:12px;color:var(--mx-t2);
}
/* Compact mode */
.mx-table-compact th{padding:8px 12px}
.mx-table-compact td{padding:10px 12px}
.mx-table-compact tbody tr:hover td{padding-left:14px}
/* Mobile: 表格卡片化(需 data-label 属性配合) */
@media(max-width:767px){
.mx-table-wrap{overflow-x:visible}
.mx-table{border:0}
.mx-table thead{display:none}
.mx-table tbody tr{
display:block;margin-bottom:12px;
border:1px solid var(--mx-divider);
border-radius:var(--mx-r-sm);
padding:12px;
background:var(--mx-s2);
}
.mx-table tbody td{
display:flex;justify-content:space-between;align-items:center;
padding:6px 0;border-bottom:1px solid var(--mx-divider);
white-space:normal;
}
.mx-table tbody td:last-child{border-bottom:none}
.mx-table tbody td::before{
content:attr(data-label);
font-size:11px;font-weight:700;color:var(--mx-t3);
text-transform:uppercase;letter-spacing:0.04em;
flex-shrink:0;margin-right:12px;
}
.mx-table tbody tr:hover td{padding-left:0}
.mx-table tbody tr:active{background:var(--mx-s-hover)}
.mx-table-compact tbody tr{padding:10px}
.mx-table-compact td{padding:5px 0}
}
+94
View File
@@ -0,0 +1,94 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Tabs Component
═══════════════════════════════════════════ */
/* Tab bar */
.mx-tabs{
display:flex;align-items:center;
border-bottom:1px solid var(--mx-divider);
overflow-x:auto;scrollbar-width:none;
-webkit-overflow-scrolling:touch;
}
.mx-tabs::-webkit-scrollbar{display:none}
/* Tab item */
.mx-tab{
display:flex;align-items:center;gap:6px;
padding:10px 16px;
font-size:13px;font-weight:500;
color:var(--mx-t3);
cursor:pointer;white-space:nowrap;
position:relative;
transition:all var(--mx-d1) var(--mx-ease);
-webkit-tap-highlight-color:transparent;
}
.mx-tab:hover{color:var(--mx-text)}
/* Active indicator — bottom line */
.mx-tab::after{
content:'';position:absolute;bottom:0;left:8px;right:8px;
height:2px;border-radius:1px;
background:var(--mx-primary);
transform:scaleX(0);
transition:transform var(--mx-d2) var(--mx-spring);
}
.mx-tab.active{color:var(--mx-primary);font-weight:600}
.mx-tab.active::after{transform:scaleX(1)}
/* Badge in tab */
.mx-tab .mx-count{margin-left:4px}
/* Disabled */
.mx-tab.disabled{opacity:0.4;pointer-events:none}
/* Pill variant */
.mx-tabs-pill{
border-bottom:none;
background:var(--mx-s3);
border-radius:var(--mx-r-pill);
padding:3px;gap:2px;
}
.mx-tabs-pill .mx-tab{
border-radius:var(--mx-r-pill);
padding:6px 14px;
}
.mx-tabs-pill .mx-tab::after{display:none}
.mx-tabs-pill .mx-tab.active{
background:var(--mx-primary);color:#fff;
box-shadow:0 2px 8px rgba(76,139,245,0.25);
}
/* Card variant */
.mx-tabs-card{
border-bottom:none;gap:4px;
}
.mx-tabs-card .mx-tab{
border-radius:var(--mx-r-sm);
padding:8px 14px;
}
.mx-tabs-card .mx-tab::after{display:none}
.mx-tabs-card .mx-tab.active{
background:var(--mx-primary-glow);color:var(--mx-primary);
}
/* Tab content */
.mx-tab-panel{display:none;padding:16px 0}
.mx-tab-panel.active{display:block}
/* Alignment */
.mx-tabs-center{justify-content:center}
.mx-tabs-end{justify-content:flex-end}
/* Mobile: 触控友好 + 可滚动 */
@media(max-width:767px){
.mx-tab{padding:12px 14px;min-height:44px;font-size:14px}
.mx-tabs-pill .mx-tab{padding:8px 16px}
.mx-tabs-card .mx-tab{padding:10px 14px}
/* 隐藏超出的 badge */
.mx-tab .mx-count{display:none}
}
/* Tablet: 可滚动 */
@media(min-width:768px) and (max-width:1023px){
.mx-tabs{overflow-x:auto;-webkit-overflow-scrolling:touch}
}
+94
View File
@@ -0,0 +1,94 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Tag / Chip Component
═══════════════════════════════════════════ */
.mx-tag{
display:inline-flex;align-items:center;gap:4px;
padding:4px 10px;
border-radius:var(--mx-r-pill);
font-size:12px;font-weight:600;
background:var(--mx-s3);color:var(--mx-text);
transition:all var(--mx-d1) var(--mx-ease);
cursor:default;
-webkit-tap-highlight-color:transparent;
}
/* Clickable */
.mx-tag-clickable{cursor:pointer}
.mx-tag-clickable:hover{background:var(--mx-s4)}
.mx-tag-clickable:active{transform:scale(0.95)}
/* Color variants */
.mx-tag-primary{background:var(--mx-primary-glow);color:var(--mx-primary)}
.mx-tag-success{background:rgba(52,211,153,0.1);color:var(--mx-green)}
.mx-tag-warning{background:rgba(251,191,36,0.1);color:var(--mx-amber)}
.mx-tag-error{background:rgba(248,113,113,0.1);color:var(--mx-red)}
.mx-tag-info{background:rgba(96,165,250,0.1);color:var(--mx-blue)}
/* Outline variant */
.mx-tag-outline{
background:transparent;
border:1px solid var(--mx-border);
}
.mx-tag-outline.mx-tag-primary{border-color:var(--mx-primary);color:var(--mx-primary)}
.mx-tag-outline.mx-tag-success{border-color:var(--mx-green);color:var(--mx-green)}
.mx-tag-outline.mx-tag-warning{border-color:var(--mx-amber);color:var(--mx-amber)}
.mx-tag-outline.mx-tag-error{border-color:var(--mx-red);color:var(--mx-red)}
/* With dot */
.mx-tag-dot::before{
content:'';width:6px;height:6px;
border-radius:50%;flex-shrink:0;
}
.mx-tag-primary.mx-tag-dot::before{background:var(--mx-primary)}
.mx-tag-success.mx-tag-dot::before{background:var(--mx-green)}
.mx-tag-warning.mx-tag-dot::before{background:var(--mx-amber)}
.mx-tag-error.mx-tag-dot::before{background:var(--mx-red)}
.mx-tag-info.mx-tag-dot::before{background:var(--mx-blue)}
/* Close button */
.mx-tag-close{
width:14px;height:14px;
display:flex;align-items:center;justify-content:center;
border-radius:50%;cursor:pointer;
transition:background var(--mx-d1);
}
.mx-tag-close:hover{background:rgba(0,0,0,0.1)}
[data-theme="dark"] .mx-tag-close:hover{background:rgba(255,255,255,0.1)}
/* Sizes */
.mx-tag-sm{padding:2px 8px;font-size:11px}
.mx-tag-lg{padding:6px 14px;font-size:13px}
/* Tag group */
.mx-tag-group{
display:flex;flex-wrap:wrap;gap:6px;
}
/* Input tag — for editable tag list */
.mx-tag-input{
display:flex;flex-wrap:wrap;gap:6px;
padding:6px 10px;
background:var(--mx-s3);
border:1px solid var(--mx-border);
border-radius:var(--mx-r-sm);
min-height:40px;align-items:center;
transition:all var(--mx-d2) var(--mx-ease);
cursor:text;
}
/* Mobile */
@media(max-width:767px){
.mx-tag{min-height:32px;padding:4px 12px}
.mx-tag-lg{min-height:38px}
.mx-tag-close{width:18px;height:18px}
}
.mx-tag-input:focus-within{
border-color:var(--mx-primary);
box-shadow:0 0 0 3px var(--mx-primary-glow);
}
.mx-tag-input input{
flex:1;min-width:60px;border:none;outline:none;
background:none;font-size:13px;color:var(--mx-text);
}
.mx-tag-input input::placeholder{color:var(--mx-t3)}
+98
View File
@@ -0,0 +1,98 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Toast / Snackbar Component
Miuix 轻量反馈 — 底部弹出 + 自动消失
═══════════════════════════════════════════ */
/* Container */
.mx-toast-container{
position:fixed;bottom:16px;left:50%;
transform:translateX(-50%);
z-index:2000;
display:flex;flex-direction:column-reverse;align-items:center;gap:8px;
pointer-events:none;
padding-bottom:var(--mx-safe-b);
}
/* Toast */
.mx-toast{
display:flex;align-items:center;gap:10px;
padding:10px 16px;
background:var(--mx-s4);
border-radius:var(--mx-r-sm);
box-shadow:var(--mx-sh3);
font-size:13px;font-weight:500;
color:var(--mx-text);
pointer-events:auto;
max-width:calc(100vw - 32px);
transform:translateY(12px) scale(0.95);
opacity:0;
transition:transform var(--mx-d3) var(--mx-spring),
opacity var(--mx-d2) var(--mx-ease);
}
.mx-toast.show{
transform:translateY(0) scale(1);
opacity:1;
}
.mx-toast.hide{
transform:translateY(-8px) scale(0.95);
opacity:0;
}
/* Icon */
.mx-toast-icon{
width:20px;height:20px;flex-shrink:0;
display:flex;align-items:center;justify-content:center;
}
.mx-toast-icon svg{width:18px;height:18px}
/* Variants */
.mx-toast-success .mx-toast-icon{color:var(--mx-green)}
.mx-toast-warning .mx-toast-icon{color:var(--mx-amber)}
.mx-toast-error .mx-toast-icon{color:var(--mx-red)}
.mx-toast-info .mx-toast-icon{color:var(--mx-blue)}
/* Action button */
.mx-toast-action{
padding:4px 10px;border-radius:var(--mx-r-xs);
font-size:12px;font-weight:600;
cursor:pointer;
transition:all var(--mx-d1) var(--mx-ease);
flex-shrink:0;
}
.mx-toast-action{color:var(--mx-primary)}
.mx-toast-action:hover{background:var(--mx-primary-glow)}
/* Close button */
.mx-toast-close{
width:20px;height:20px;
display:flex;align-items:center;justify-content:center;
border-radius:var(--mx-r-xs);
cursor:pointer;color:var(--mx-t3);
transition:all var(--mx-d1);
flex-shrink:0;
}
.mx-toast-close:hover{color:var(--mx-text)}
/* Progress bar (auto dismiss) */
.mx-toast-progress{
position:absolute;bottom:0;left:0;
height:2px;border-radius:0 0 var(--mx-r-sm) var(--mx-r-sm);
background:var(--mx-primary);
opacity:0.4;
transition:width linear;
}
/* Mobile — full width + 底部安全区 */
@media(max-width:767px){
.mx-toast-container{
left:8px;right:8px;
transform:none;
align-items:stretch;
}
.mx-toast{border-radius:var(--mx-r)}
}
/* Tablet */
@media(min-width:768px) and (max-width:1023px){
.mx-toast-container{bottom:20px}
}
+54
View File
@@ -0,0 +1,54 @@
/* ═══════════════════════════════════════════
MIUIX CONSOLE — Tooltip Component
═══════════════════════════════════════════ */
.mx-tooltip{
position:relative;
}
.mx-tooltip::after{
content:attr(data-tooltip);
position:absolute;
bottom:calc(100% + 8px);left:50%;
transform:translateX(-50%) translateY(4px);
padding:5px 10px;
background:var(--mx-s4);
color:var(--mx-text);
font-size:12px;font-weight:500;
white-space:nowrap;
border-radius:var(--mx-r-xs);
box-shadow:var(--mx-sh2);
opacity:0;visibility:hidden;
pointer-events:none;
transition:all var(--mx-d2) var(--mx-spring);
z-index:500;
}
.mx-tooltip:hover::after{
opacity:1;visibility:visible;
transform:translateX(-50%) translateY(0);
}
/* Position variants */
.mx-tooltip-bottom::after{
bottom:auto;top:calc(100% + 8px);
transform:translateX(-50%) translateY(-4px);
}
.mx-tooltip-bottom:hover::after{
transform:translateX(-50%) translateY(0);
}
.mx-tooltip-left::after{
bottom:auto;left:auto;
right:calc(100% + 8px);top:50%;
transform:translateY(-50%) translateX(4px);
}
.mx-tooltip-left:hover::after{
transform:translateY(-50%) translateX(0);
}
.mx-tooltip-right::after{
bottom:auto;left:calc(100% + 8px);top:50%;
transform:translateY(-50%) translateX(-4px);
}
.mx-tooltip-right:hover::after{
transform:translateY(-50%) translateX(0);
}