/* ═══════════════════════════════════════════════════════════════
   CONSOLE — 新控制台页面样式（用户工作台 + 管理员控制台）
   全部使用系统主题变量，随 data-theme 自动切换明暗
   ═══════════════════════════════════════════════════════════════ */

/* 工作台内容区不再限宽 1520px：那条上限让 1920 屏右侧白留 100px（左 28 / 右 100.1，实测），
   看着就是整块贴左。全站其他页面都是跟随 .content 的对称 28px 内边距铺满，这里去掉上限即与之一致，
   左右边距由 .content 的 padding 天然对齐（顶栏 .header 同为 28px，竖边线对得上） */
.console{animation:fadeUp .35s ease both}

/* ── 角色切换条 ── */
.c-rolebar{display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;gap:16px;flex-wrap:wrap}
.c-roletabs{display:inline-flex;gap:0;padding:3px;border-radius:12px;border:1px solid var(--border-default);background:var(--bg-surface)}
.c-role-tab{padding:8px 22px;border-radius:10px;border:none;cursor:pointer;font-family:inherit;font-weight:600;font-size:var(--fs-2);background:transparent;color:var(--text-secondary);transition:all .25s}
.c-role-tab:hover{color:var(--text-bright)}
.c-role-tab.active{background:linear-gradient(135deg,var(--accent-bg),var(--accent-glow));color:var(--accent);box-shadow:0 0 12px var(--accent-glow)}

/* ── 问候区 ── */
.c-greeting{margin-bottom:20px;display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap}
.c-greeting-l{min-width:0}
.c-greeting h2{font-size:var(--fs-4);font-weight:700;color:var(--text-bright);margin-bottom:4px}
.c-greeting h2 .c-name{background:linear-gradient(135deg,var(--accent),var(--accent-deep));-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.c-greeting p{font-size:var(--fs-2);color:var(--text-secondary);margin-bottom:0}
.c-user-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:flex-start;gap:12px;margin-bottom:0;flex:1 1 auto}
/* block overlap: each card shifts left over the previous one */
.c-um-card{position:relative;display:inline-flex;align-items:center;gap:8px;padding:7px 14px;margin-left:0;border-radius:12px;background:var(--bg2);border:1px solid var(--border-subtle);box-shadow:0 4px 12px rgba(0,0,0,.22);backdrop-filter:blur(6px);color:var(--text-bright);transition:transform .25s ease,box-shadow .25s ease;z-index:1}
.c-um-card:first-child{margin-left:0}
.c-um-card:hover{transform:translateY(-6px);box-shadow:0 10px 22px rgba(0,0,0,.35);z-index:6}
.c-um-ico{font-size:var(--fs-2);line-height:1}
.c-um-k{color:var(--text-ghost);font-size:var(--fs-1);letter-spacing:.04em}
.c-um-v{color:var(--text-bright);font-weight:700;font-size:var(--fs-2);word-break:break-word}
.c-um-v-scroll{overflow:hidden;max-width:170px;white-space:nowrap}
.c-um-marquee{display:inline-block;padding-left:100%;animation:cUmMarquee 8s linear infinite}
@keyframes cUmMarquee{0%{transform:translateX(0)}100%{transform:translateX(-100%)}}
.c-um-c1{background:linear-gradient(150deg,var(--blue-bg),var(--bg2))}
.c-um-c2{background:linear-gradient(150deg,var(--accent-bg),var(--bg2))}
.c-um-c3{background:linear-gradient(150deg,var(--highlight-bg),var(--bg2))}
.c-um-c4{background:linear-gradient(150deg,var(--emerald-bg),var(--bg2))}
.c-um-c5{background:linear-gradient(150deg,var(--highlight-bg),var(--bg2))}
.c-um-c6{background:linear-gradient(150deg,var(--violet-bg),var(--bg2))}
.c-greeting p strong{font-weight:600}
.c-date-badge{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap;padding:4px 12px;border-radius:8px;font-size:var(--fs-3);font-weight:700;font-family:var(--font-body);color:var(--text-secondary);background:var(--bg-surface);border:1px solid var(--border-subtle);margin-bottom:20px}

/* ── 用户快速统计 ── */
.c-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:18px}
.c-qcard{display:flex;align-items:center;gap:14px;padding:16px 18px;border-radius:14px;background:var(--bg-card);border:1px solid var(--border-subtle);transition:all .25s;cursor:default}
.c-qcard:hover{transform:translateY(-2px);border-color:var(--accent-glow);box-shadow:0 4px 14px var(--accent-glow)}
.c-qicon{width:44px;height:44px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:var(--fs-3);flex-shrink:0}
.c-qnum{font-size:var(--fs-4);font-weight:700;line-height:1.1;color:var(--text-bright)}
.c-qlabel{font-size:var(--fs-1);color:var(--text-secondary);margin-top:2px}

/* ── 滚动消息条 ── */
.c-ticker{display:flex;align-items:center;gap:0;margin-bottom:14px;border-radius:12px;background:var(--bg-card);border:1px solid var(--border-subtle);overflow:hidden;height:40px}
.c-ticker-label{display:flex;align-items:center;gap:6px;padding:0 14px;height:100%;font-size:var(--fs-1);font-weight:600;color:var(--accent);background:var(--accent-bg);white-space:nowrap;flex-shrink:0}
.c-ticker-track{flex:1;overflow:hidden;position:relative;height:100%;display:flex;align-items:center}
.c-ticker-content{display:flex;align-items:center;gap:0;white-space:nowrap;animation:cTickerScroll 50s linear infinite;will-change:transform}
.c-ticker-content:hover{animation-play-state:paused}
.c-ticker-item{display:inline-flex;align-items:center;gap:6px;padding:0 4px;font-size:var(--fs-1);color:var(--text-primary);transition:color .2s}
.c-ticker-item:hover{color:var(--accent)}
.c-ticker-warning{color:#d97706}
.c-ticker-warning .c-ticker-icon{animation:cTickerBlink 1.2s ease-in-out infinite}
.c-ticker-critical{color:#dc2626}
.c-ticker-critical .c-ticker-icon{animation:cTickerBlink .7s ease-in-out infinite}
@keyframes cTickerBlink{0%,100%{opacity:1}50%{opacity:.35}}
.c-ticker-icon{font-size:var(--fs-2);flex-shrink:0}
.c-ticker-text{overflow:hidden;text-overflow:ellipsis;max-width:380px}
.c-ticker-sep{color:var(--text-ghost);margin:0 10px;flex-shrink:0}
@keyframes cTickerScroll{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}
@media(max-width:768px){.c-ticker{height:36px}.c-ticker-label{padding:0 10px;font-size:var(--fs-1)}.c-ticker-text{max-width:200px}.c-ticker-content{animation-duration:31.25s}}
/* 上传动态滚动条：点赞 CTA 与上传专属样式 */
.c-ticker-uploads .c-ticker-item.c-ticker-upload{padding-right:14px}
.c-ticker-uploads .c-ticker-item.c-ticker-upload .c-ticker-text{max-width:none;font-weight:500}
.c-ticker-cta{display:inline-flex;align-items:center;gap:3px;margin-left:8px;padding:1px 8px;border-radius:999px;font-size:var(--fs-1);font-weight:600;color:var(--accent);background:var(--accent-bg);white-space:nowrap;flex-shrink:0;transition:transform .15s,background .2s}
.c-ticker-uploads .c-ticker-item.c-ticker-upload:hover .c-ticker-cta{transform:scale(1.06);background:var(--accent);color:#fff}

/* ── 面板 ── */
.c-panel{border-radius:14px;background:var(--bg-card);border:1px solid var(--border-subtle);overflow:hidden;transition:background .3s,border-color .3s}
.c-panel-hd{display:flex;align-items:center;justify-content:space-between;padding:13px 18px;border-bottom:1px solid var(--border-subtle)}
.c-panel-title{font-weight:600;font-size:var(--fs-2);color:var(--text-bright);display:flex;align-items:center;gap:8px}
.c-live-dot{width:7px;height:7px;border-radius:50%;background:var(--emerald);box-shadow:0 0 6px var(--emerald);animation:cPulse 2s ease infinite}
.c-tag{font-size:var(--fs-1);padding:2px 9px;border-radius:8px;font-weight:500;font-family:var(--font-body)}
.c-tag.cyan{background:var(--blue-bg);color:var(--blue)}.c-tag.green{background:var(--emerald-bg);color:var(--emerald)}
.c-tag.amber{background:var(--highlight-bg);color:var(--highlight)}.c-tag.rose{background:var(--rose-bg);color:var(--rose)}
.c-tag.violet{background:var(--violet-bg);color:var(--violet)}

/* ── 应用网格 ── */
.c-app-grid{display:grid;grid-template-columns:repeat(16,1fr);justify-items:center;gap:10px;padding:14px 18px}
.c-app-card{display:flex;flex-direction:column;align-items:center;gap:7px;padding:16px 10px;width:100%;border-radius:12px;cursor:pointer;transition:all .22s;border:1px solid transparent;animation:fadeUp .4s ease both}
.c-app-card:hover{background:var(--bg-card-hover);border-color:var(--accent-glow);transform:translateY(-2px)}
.c-app-card:active{transform:scale(.96)}
.c-app-icon{width:46px;height:46px;border-radius:14px;display:flex;align-items:center;justify-content:center;font-size:var(--fs-3);position:relative}
.c-app-icon .c-online{position:absolute;bottom:-1px;right:-1px;width:11px;height:11px;border-radius:50%;border:2px solid var(--bg-card)}
.c-online.on{background:var(--emerald)}.c-online.off{background:var(--rose)}
.c-app-name{font-size:var(--fs-1);font-weight:500;color:var(--text-bright);text-align:center;line-height:1.3}
.c-app-desc{font-size:var(--fs-1);color:var(--text-ghost);text-align:center;line-height:1.3}
.c-app-icon svg,.c-acat-icon svg{width:20px;height:20px}
.c-acat-icon svg{width:16px;height:16px}

/* ── 应用中心：按业务分类聚合 ── */
.c-acat-list{display:flex;flex-wrap:wrap;align-items:flex-start;gap:14px;padding:6px 18px 18px}
.c-acat-list>.c-acat{flex:0 0 auto;max-width:100%}
.c-acat-hd{display:flex;align-items:center;gap:10px;margin:14px 0 2px}
.c-acat{padding:14px 16px 14px;border-radius:16px;border:none;min-height:150px;display:flex;flex-direction:column;box-shadow:0 8px 22px rgba(15,23,42,.10),0 2px 6px rgba(15,23,42,.06);transition:transform .22s,box-shadow .22s}
.c-acat:first-child .c-acat-hd{margin-top:6px}
.c-acat:hover{transform:translateY(-3px);box-shadow:0 14px 30px rgba(15,23,42,.16),0 4px 10px rgba(15,23,42,.08)}
.c-acat-icon{width:30px;height:30px;border-radius:9px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.c-acat-name{font-weight:600;font-size:var(--fs-2);color:var(--text-bright)}
.c-acat-count{font-size:var(--fs-1);color:var(--text-ghost);background:var(--bg2);padding:2px 9px;border-radius:10px;font-family:var(--font-body)}
/* 组内卡片单行不折行，超出横向滚动 */
.c-acat .c-app-grid{display:flex;flex-wrap:nowrap;gap:10px;padding:10px 0 4px;overflow-x:auto}
.c-acat .c-app-grid>.c-app-card{flex:0 0 104px;width:104px}

/* ── 待办 / 消息列表 ── */
.c-list{padding:4px 0;max-height:340px;overflow-y:auto}
.c-list::-webkit-scrollbar{width:3px}.c-list::-webkit-scrollbar-thumb{background:var(--border-default);border-radius:3px}
.c-item{display:flex;align-items:flex-start;gap:12px;padding:11px 18px;border-bottom:1px solid var(--border-subtle);transition:background .2s;cursor:pointer;animation:fadeUp .35s ease both}
.c-item:last-child{border-bottom:none}
.c-item:hover{background:var(--bg-hover)}
.c-item-icon{width:30px;height:30px;border-radius:9px;display:flex;align-items:center;justify-content:center;font-size:var(--fs-2);font-weight:700;flex-shrink:0}
.c-item-body{flex:1;min-width:0}
.c-item-title{font-size:var(--fs-2);font-weight:500;color:var(--text-bright);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.c-item-title .c-hl{color:var(--accent);font-weight:600}
.c-item-meta{font-size:var(--fs-1);color:var(--text-ghost);margin-top:3px;display:flex;gap:8px;align-items:center}
.c-open-hint{margin-left:auto;color:var(--accent);font-weight:600;font-size:var(--fs-1)}
.c-pri{font-size:var(--fs-1);padding:1px 6px;border-radius:5px;font-weight:600}
.c-pri.high{background:var(--rose-bg);color:var(--rose)}.c-pri.mid{background:var(--highlight-bg);color:var(--highlight)}.c-pri.low{background:var(--emerald-bg);color:var(--emerald)}
.c-unread{width:7px;height:7px;border-radius:50%;background:var(--accent);flex-shrink:0;margin-top:6px;box-shadow:0 0 6px var(--accent)}
.c-empty{padding:34px 18px;text-align:center;color:var(--text-ghost);font-size:var(--fs-2)}

/* ── 流程卡片 ── */
.c-flow-list{padding:10px 18px 14px;display:flex;flex-direction:column;gap:10px}
.c-flow-card{padding:12px 14px;border-radius:10px;background:var(--bg-surface);border:1px solid var(--border-subtle);transition:border-color .2s}
.c-flow-card:hover{border-color:var(--accent-glow)}
.c-flow-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.c-flow-name{font-size:var(--fs-2);font-weight:600;color:var(--text-bright);display:flex;align-items:center;gap:6px}
.c-flow-status{font-size:var(--fs-1);padding:2px 8px;border-radius:8px;font-weight:500;font-family:var(--font-body)}
.c-flow-status.running{background:var(--emerald-bg);color:var(--emerald)}.c-flow-status.pending{background:var(--highlight-bg);color:var(--highlight)}.c-flow-status.done{background:var(--blue-bg);color:var(--blue)}
.c-flow-bar{width:100%;height:5px;border-radius:3px;background:var(--bg-hover);overflow:hidden;margin-bottom:6px}
.c-flow-bar .cf{height:100%;border-radius:3px;transition:width 1.2s ease}
.c-flow-steps{font-size:var(--fs-1);color:var(--text-ghost);font-family:var(--font-body)}

/* ── 账号与安全 ── */
.c-sec-list{padding:12px 18px;display:flex;flex-direction:column;gap:10px}
.c-sec-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 12px;border-radius:10px;background:var(--bg-surface)}
.c-sec-left{display:flex;align-items:center;gap:10px;min-width:0}
.c-sec-icon{width:34px;height:34px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:var(--fs-2);flex-shrink:0}
.c-sec-label{font-size:var(--fs-2);font-weight:500;color:var(--text-bright)}
.c-sec-desc{font-size:var(--fs-1);color:var(--text-ghost);margin-top:1px}


/* ── 布局网格 ── */
.c-grid-2{display:grid;grid-template-columns:5fr 3fr;gap:14px;margin-bottom:14px}
.c-grid-tm{display:grid;grid-template-columns:3fr 2fr;gap:14px;margin-top:16px}
/* 拍板「面板整行满宽 + 宜忌另开一栏」：日历面板独占整行（7 列网格拿到整宽才放得下长文案），
   待办与消息降到下方两列并排——原先它们挤在 1fr 右列里，整块高度被日历顶死 */
.c-grid-tm2{display:grid;grid-template-columns:minmax(0,1fr);gap:14px;margin-top:16px}
.c-grid-tm2>.c-panel{display:flex;flex-direction:column;min-width:0}
.c-tm-stack{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;min-width:0}
.c-tm-half{display:flex;flex-direction:column;flex:1;min-height:0}
.c-tm-half .c-list.c-tm-scroll{flex:1;overflow:auto;min-height:0;max-height:320px}
.c-tm-scroll{overflow:auto}
@media(max-width:1100px){.c-tm-stack{grid-template-columns:minmax(0,1fr)}}

.c-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:14px;margin-bottom:14px}
.c-row{display:grid;gap:14px;margin-bottom:14px}
.c-row-1{grid-template-columns:7fr 5fr}
.c-row-2{grid-template-columns:5fr 4fr 3fr}

/* ── 管理员指标卡 ── */
.c-metrics{display:grid;grid-template-columns:repeat(6,1fr);gap:12px;margin-bottom:18px}
.c-mc{background:var(--bg-card);border:1px solid var(--border-subtle);border-radius:14px;padding:15px 18px;position:relative;overflow:hidden;animation:fadeUp .45s ease both;transition:border-color .25s,transform .25s}
.c-mc:hover{border-color:var(--accent-glow);transform:translateY(-2px)}
.c-mc::before{content:'';position:absolute;top:0;left:0;right:0;height:2px}
.c-mc:nth-child(1)::before{background:linear-gradient(90deg,var(--accent),transparent)}
.c-mc:nth-child(2)::before{background:linear-gradient(90deg,var(--blue),transparent)}
.c-mc:nth-child(3)::before{background:linear-gradient(90deg,var(--emerald),transparent)}
.c-mc:nth-child(4)::before{background:linear-gradient(90deg,var(--highlight),transparent)}
.c-mc:nth-child(5)::before{background:linear-gradient(90deg,var(--rose),transparent)}
.c-mc:nth-child(6)::before{background:linear-gradient(90deg,var(--violet),transparent)}
.c-mc-label{font-size:var(--fs-1);color:var(--text-secondary);display:flex;align-items:center;gap:5px;margin-bottom:8px}
.c-mc-val{font-size:var(--fs-5);font-weight:700;line-height:1;letter-spacing:-0.02em}
.c-mc-sub{font-size:var(--fs-1);color:var(--text-ghost);margin-top:6px}
.c-mc-sub .up{color:var(--emerald)}.c-mc-sub .warn{color:var(--highlight)}

/* ── 运行状态表 ── */
.c-tbl-wrap{padding:6px 18px 14px;overflow-x:auto}
.c-tbl{width:100%;border-collapse:collapse;min-width:400px}
.c-tbl th{text-align:center;font-size:var(--fs-1);color:var(--text-ghost);font-weight:500;text-transform:uppercase;letter-spacing:.04em;padding:10px 0;border-bottom:1px solid var(--border-subtle);font-family:var(--font-body)}
.c-tbl td{padding:9px 0;border-bottom:1px solid var(--border-subtle);font-size:var(--fs-2);color:var(--text-primary)}
.c-tbl tr:last-child td{border-bottom:none}
.c-badge{display:inline-flex;align-items:center;gap:4px;font-size:var(--fs-1);padding:2px 9px;border-radius:8px;font-weight:500;font-family:var(--font-body)}
.c-badge.ok{background:var(--emerald-bg);color:var(--emerald)}
.c-badge.warn{background:var(--highlight-bg);color:var(--highlight)}
.c-badge.bad{background:var(--rose-bg);color:var(--rose)}
.c-bar{width:70px;height:5px;border-radius:3px;background:var(--bg-hover);overflow:hidden;display:inline-block;vertical-align:middle;margin-left:8px}
.c-bar .bf{height:100%;border-radius:3px;transition:width 1s ease}

/* ── 安全态势 ── */
.c-sec-gauge{display:flex;align-items:center;gap:20px;padding:18px}
.c-gauge-ring{position:relative;width:92px;height:92px;flex-shrink:0}
.c-gauge-ring svg{width:100%;height:100%;transform:rotate(-90deg)}
.c-gauge-bg{fill:none;stroke:var(--bg-hover);stroke-width:6}
.c-gauge-fill{fill:none;stroke-width:6;stroke-linecap:round;transition:stroke-dashoffset 1.4s ease}
.c-gauge-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center}
.c-gauge-center .gv{font-size:var(--fs-4);font-weight:700;line-height:1}
.c-gauge-center .gl{font-size:var(--fs-1);color:var(--text-ghost);margin-top:2px}
.c-sec-items{flex:1;display:flex;flex-direction:column;gap:9px;min-width:0}
.c-sec-item{display:flex;align-items:center;justify-content:space-between;gap:8px}
.c-sec-item .sl{font-size:var(--fs-1);color:var(--text-secondary);display:flex;align-items:center;gap:6px;white-space:nowrap}
.c-sec-item .sv{font-size:var(--fs-1);font-family:var(--font-body);font-weight:500}

/* ── 告警列表 ── */
.c-alert-list{padding:4px 0;max-height:200px;overflow-y:auto}
.c-alert-list::-webkit-scrollbar{width:3px}.c-alert-list::-webkit-scrollbar-thumb{background:var(--border-default);border-radius:3px}
.c-alert-item{display:flex;align-items:flex-start;gap:10px;padding:9px 18px;border-bottom:1px solid var(--border-subtle)}
.c-alert-item:last-child{border-bottom:none}
.c-alert-sev{width:6px;height:6px;border-radius:50%;margin-top:6px;flex-shrink:0}
.c-alert-sev.critical{background:var(--rose);box-shadow:0 0 5px var(--rose)}
.c-alert-sev.warning{background:var(--highlight);box-shadow:0 0 5px var(--highlight)}
.c-alert-sev.info{background:var(--blue);box-shadow:0 0 5px var(--blue)}
.c-alert-text{font-size:var(--fs-1);color:var(--text-primary);line-height:1.4}
.c-alert-text strong{color:var(--text-bright);font-weight:600}
.c-alert-meta{font-size:var(--fs-1);color:var(--text-ghost);font-family:var(--font-body);margin-top:2px}

/* ── 工作流卡片 ── */
.c-wf-list{padding:8px 18px 14px;display:flex;flex-direction:column;gap:10px}
.c-wf-card{padding:12px 14px;border-radius:10px;background:var(--bg-surface);border:1px solid var(--border-subtle);transition:border-color .2s}
.c-wf-card:hover{border-color:var(--accent-glow)}
.c-wf-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.c-wf-name{font-size:var(--fs-2);font-weight:600;color:var(--text-bright);display:flex;align-items:center;gap:6px}
.c-wf-pct{font-size:var(--fs-1);font-family:var(--font-body);font-weight:500}
.c-wf-bar{width:100%;height:5px;border-radius:3px;background:var(--bg-hover);overflow:hidden;margin-bottom:6px}
.c-wf-bar .wf{height:100%;border-radius:3px;transition:width 1.5s ease}
.c-wf-steps{font-size:var(--fs-1);color:var(--text-ghost);font-family:var(--font-body)}

/* ── Loading / Error ── */
.c-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:90px 0;gap:16px;color:var(--text-secondary)}
.c-spinner{width:38px;height:38px;border:3px solid var(--border-default);border-top-color:var(--accent);border-radius:50%;animation:spin 1s linear infinite}
.c-error{text-align:center;padding:70px 0;color:var(--text-secondary)}
.c-error .em{font-size:38px;margin-bottom:10px}
.c-error button{margin-top:14px}

/* ── 动画 ── */
@keyframes cPulse{0%,100%{opacity:1}50%{opacity:.35}}

/* ── 响应式 ── */
@media(max-width:1280px){
  .c-stats{grid-template-columns:repeat(2,1fr)}
  .c-grid-2,.c-grid-3,.c-grid-tm,.c-row-1,.c-row-2{grid-template-columns:1fr}
  .c-metrics{grid-template-columns:repeat(3,1fr)}
  .c-app-grid{grid-template-columns:repeat(8,1fr)}
}
@media(max-width:900px){
  .c-app-grid{grid-template-columns:repeat(4,1fr)}
  .c-metrics{grid-template-columns:repeat(2,1fr)}
  .c-stats{grid-template-columns:1fr 1fr}
}
@media(max-width:560px){
  .c-app-grid{grid-template-columns:repeat(2,1fr)}
}

/* �T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T ��ɫȨ�޹��� �T�T�T�T�T�T�T�T�T�T�T�T�T�T�T�T */
.rp-wrap{display:flex;flex-direction:column;gap:16px;padding:4px 2px;height:100%;}
.rp-head .rp-title{font-size:var(--fs-3);font-weight:700;margin:0;color:var(--text);}
.rp-head .rp-sub{margin:4px 0 0;color:var(--text-ghost);font-size:var(--fs-2);}
.rp-body{display:grid;grid-template-columns:300px 1fr;gap:16px;flex:1;min-height:0;}
.rp-roles{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:10px;overflow:auto;max-height:calc(100vh - 220px);}
.rp-roles-loading,.rp-empty,.rp-error,.rp-perms-empty{padding:24px;color:var(--text-ghost);text-align:center;font-size:var(--fs-2);}
.rp-error{color:var(--rose);}
.rp-role-item{display:flex;align-items:center;gap:10px;padding:10px;border-radius:10px;cursor:pointer;transition:background .15s;border:1px solid transparent;}
.rp-role-item:hover{background:var(--hover);}
.rp-role-item.active{background:var(--hover);border-color:var(--accent);}
.rp-role-dot{width:10px;height:10px;border-radius:50%;flex:0 0 auto;}
.rp-role-meta{flex:1;min-width:0;}
.rp-role-name{font-weight:600;font-size:var(--fs-2);color:var(--text);}
.rp-role-desc{font-size:var(--fs-1);color:var(--text-ghost);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.rp-role-count{font-size:var(--fs-1);color:var(--text-ghost);background:var(--chip-bg);padding:2px 8px;border-radius:20px;}
.rp-perms{background:var(--card);border:1px solid var(--border);border-radius:14px;padding:16px;overflow:auto;max-height:calc(100vh - 220px);}
.rp-node{margin:2px 0;}
.rp-module>.rp-node-label{font-weight:700;font-size:var(--fs-2);color:var(--text);}
.rp-children{margin-left:22px;border-left:1px dashed var(--border);padding-left:10px;}
.rp-node-label{display:flex;align-items:center;gap:8px;padding:5px 0;cursor:pointer;}
.rp-node-label input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);cursor:pointer;}
.rp-leaf .rp-node-name{font-weight:500;font-size:var(--fs-2);color:var(--text);}
.rp-node-key{font-size:var(--fs-1);color:var(--text-ghost);font-family:monospace;margin-left:6px;}
@media(max-width:900px){.rp-body{grid-template-columns:1fr;}.rp-roles{max-height:none;}}

/* ═══════════════════════════════════════════════════════════════
   个人工作台 · 日历信息模块（日历网格 + 个人日程列表）
   全部使用系统主题变量，随 data-theme 自动切换明暗
   ═══════════════════════════════════════════════════════════════ */
/* 面板整行满宽后，内部再分两栏：左＝日历，右＝「吉凶宜忌 / 我的日程」一栏两页。
   两档同走「日历 3/5 + 右栏 2/5」（拍板「右侧内容还是太过拥挤，要占总宽度的 2/5」）。右栏此前在完整档
   咬死 380px，那个常数是倒推出来的——格子要整条放下 9 字节日名「九三抗战胜利纪念日」（400px 时格子文案
   恰剩 107px，与所需 107px 分毫不差即零余量）；现格子已改判「一行最多五个字」（见 js/console.js 的
   holCut），长名不再要求整条塞进一行，380 便失去依据，遂与简洁档并成同一条栅格。
   1600 屏实测右栏 491.8px（旧 380）、1920 屏 615.3px，多出的宽度全给右栏的间距与两列排布（见 .c-alm） */
.c-sched-panel .c-sched-wrap{display:grid;grid-template-columns:minmax(0,3fr) minmax(0,2fr);gap:16px;padding:16px 18px;align-items:start}
.c-sched-panel{display:flex;flex-direction:column;overflow:visible}.c-sched-panel .c-sched-list{max-height:420px;overflow:auto}
/* 侧栏窄到放不下日历七列的正常宽度时（约 1280 屏），整栏降到日历下方，绝不为塞住右侧而把格子压窄 */
@media(max-width:1320px){.c-sched-panel .c-sched-wrap{grid-template-columns:minmax(0,1fr)}}
/* 简洁档：月历在左、当日日程在右同一行（拍板「日程移到右侧」），栅格与完整档同一条（3/5 + 2/5）。
   这一档每格只有「日期 + 一行」，格子收高见下方 .c-cal-cell，铺满会把两行小字漂在一大片空白中间
   （用户判「不简洁」的正是这个密度） */
/* 档位切换件（面板头右侧：切换件 + 本月计数） */
.c-hd-right{display:flex;align-items:center;gap:10px;min-width:0}
.c-cal-mode .au-segmented-item{padding:.35rem .7rem;font-size:var(--fs-2)}
/* 简洁档格子只有两行，把完整档为五项预留的 82px 收到 40px，整月不再是一堆空框 */
.c-sched-wrap[data-cal-mode=simple] .c-cal-cell{min-height:40px;padding:4px 2px;gap:0}
/* 图例整条不出：这一档格子里既无放假角标也无底色块，只剩边框色，一条图例换来的是「三行字里的一行」不值；
   颜色含义仍在每格的 data-tip 里（悬停读得到），所以是收口不是丢信息 */
.c-sched-wrap[data-cal-mode=simple] .c-cal-legend{display:none}

/* ── 右侧栏：页签 + 内容（两页共用同一栏，切换不额外发请求） ── */
/* 栏内间距由 10px 放到 12px：右栏拿到 2/5 后不必再靠压紧行距省宽度，「拥挤」正是从这类 8~10px 的
   贴边间距攒出来的（拍板「宽度 + 间距 + 宜忌词条两列」三件一起改） */
.c-side{display:flex;flex-direction:column;gap:12px;min-width:0}
.c-side-tabs{width:100%}
.c-side-tabs .au-segmented-item{flex:1;text-align:center;padding:.5rem .25rem;font-size:var(--fs-2)}
.c-side-body{min-width:0}

/* ── 日历网格 ── */
.c-cal{display:flex;flex-direction:column;gap:8px}
.c-cal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px}
.c-cal-title{font-weight:600;font-size:var(--fs-2);color:var(--text-bright)}
.c-cal-weekrow,.c-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
.c-cal-theme{flex:1;text-align:center;font-size:var(--fs-1);color:var(--text-secondary);font-family:var(--font-body);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.c-cal-week{text-align:center;font-size:var(--fs-1);color:var(--text-ghost);padding:2px 0}
.c-cal-cell{border:1px solid var(--border-subtle);border-radius:9px;min-height:54px;padding:5px 6px;cursor:pointer;background:var(--bg-surface);transition:all .18s;display:flex;flex-direction:column;gap:3px}
.c-cal-cell:hover{border-color:var(--accent-glow)}
.c-cal-empty{background:transparent;border:none;cursor:default}
.c-cal-num{font-size:var(--fs-1);font-weight:600;color:var(--text-primary)}
.c-cal-lunar{font-size:var(--fs-1);line-height:1.1;color:var(--text-ghost);transform:scale(.92);transform-origin:center;margin-top:-1px;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
.c-cal-term{font-size:var(--fs-1);font-weight:700;line-height:1.1;color:var(--accent);transform:scale(.95);transform-origin:center;margin-top:-1px;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
.c-cal-term-day .c-cal-num{color:var(--accent);font-weight:700}
.c-cal-today .c-cal-lunar{color:var(--accent)}
.c-cal-dots{display:flex;flex-wrap:nowrap;gap:3px;align-items:center;justify-content:center;max-width:100%;overflow:hidden}
.c-cal-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}
.c-cal-more{font-size:var(--fs-1);color:var(--text-ghost)}
.c-cal-today .c-cal-num{color:var(--accent);background:var(--accent-bg);border-radius:6px;padding:0 5px;display:inline-block;width:fit-content}
.c-cal-sel{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-glow) inset;background:var(--accent-bg)}

/* ── 日程列表 ── */
.c-sched{display:flex;flex-direction:column;gap:10px}
.c-sched-head{display:flex;align-items:center;justify-content:space-between}
.c-sched-date{font-weight:600;font-size:var(--fs-2);color:var(--text-bright);font-family:var(--font-body)}
.c-sched-list{display:flex;flex-direction:column;gap:10px;max-height:340px;overflow:auto}
.c-sched-row{display:flex;align-items:stretch;gap:10px;padding:12px 14px;border-radius:10px;background:var(--bg-surface);border:1px solid var(--border-subtle)}
.c-sched-bar{width:4px;border-radius:4px;flex-shrink:0}
.c-sched-body{flex:1;min-width:0}
.c-sched-title{font-weight:600;font-size:var(--fs-2);color:var(--text-bright);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.c-sched-meta{font-size:var(--fs-1);color:var(--text-secondary);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ── 添加表单 ── */
.c-sched-form{display:flex;flex-direction:column;gap:8px;padding:12px;border-radius:10px;background:var(--bg-surface);border:1px dashed var(--border-default)}
.c-sf-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.c-sf-chk{display:inline-flex;align-items:center;gap:5px;font-size:var(--fs-1);color:var(--text-secondary);white-space:nowrap}
.c-sf-sep{color:var(--text-ghost);font-size:var(--fs-2)}
.c-form-input{flex:1;min-width:0;padding:7px 11px;border:1px solid var(--border-default);border-radius:8px;background:var(--bg);color:var(--text);font-family:inherit;font-size:var(--fs-2);outline:none;transition:border-color .18s}
.c-form-input:focus{border-color:var(--accent)}
.c-form-input:disabled{opacity:.5;cursor:not-allowed}

/* ── 会议安排合入日历（会议管理 P4a）：勿扰行 + 冲突提醒 + 日历会议点 ── */
.c-cal-cell{position:relative}
.c-cal-dot--meet{width:7px;height:7px;box-shadow:0 0 0 1.5px var(--bg-surface)}
.c-cal-meet{background-image:repeating-linear-gradient(135deg,transparent 0 7px,var(--violet-bg) 7px 9px)}
.c-cal-warn{position:absolute;top:3px;right:5px;min-width:13px;height:13px;line-height:13px;text-align:center;border-radius:50%;background:var(--danger);color:#fff;font-size:10px;font-weight:700}
.c-meet-row{border-left:2px solid var(--violet)}
.c-meet-row .c-sched-title{gap:5px}
.c-meet-dnd{display:inline-flex;align-items:center;gap:2px;font-size:var(--fs-1);font-weight:500;color:var(--violet);background:var(--violet-bg);border:1px solid var(--border-subtle);border-radius:6px;padding:0 5px;cursor:help}
.c-meet-conf{display:flex;flex-direction:column;gap:3px;margin-top:5px}
.c-meet-c{font-size:var(--fs-1);line-height:1.5;border-radius:6px;padding:2px 7px;color:var(--text-secondary);background:var(--bg-surface)}
.c-meet-c-block{background:var(--danger-soft);color:var(--danger)}
.c-meet-c-warn{background:var(--warning-soft);color:var(--warning)}
.c-meet-c-info{background:var(--blue-bg);color:var(--blue)}

/* ── 日历格子五项（公历/星期/农历/节气/放假），数据源＝平台工作日历逐日接口 ──
   休息/调休只用边框、描边与角标着色，不覆盖 background —— 否则会把 .c-cal-sel 选中态和 .c-cal-meet 斜纹顶掉 */
.c-cal-top{display:flex;align-items:center;justify-content:center;gap:.25rem;min-width:0}
/* 内容一律单行不折行：格子用 align-items:center 收成居中窄列，放不下靠省略号截，绝不换行挤坏行高 */
/* 左右内边距 4→3、徽章内边距 4→2、列间距 5→4：三处各让出几像素给长文案。旧口径是「9 字节日名整条不许截字」，
   所以这几像素是为它腾的；现口径改为「一行最多五个字」（超出由 JS 截字、全名进气泡），格子不再需要为最长的
   名字预留整条宽度，这几处内边距维持原样即可（再收就白收，五字加省略号在 102px 格子里已有余量） */
.c-cal-cell{min-height:82px;gap:2px;align-items:center;justify-content:center;min-width:0;overflow:hidden;padding:5px 3px}
.c-cal-wd{font-size:var(--fs-1);color:var(--text-ghost);transform:scale(.9);white-space:nowrap}
/* 放假角标：可见文案已由 js/console.js 截到「一行最多五个字」（拍板 A 案），所以这里不再为长名预留宽度，
   max-width:100% 只兜住五字加省略号这一档；全名与「另有 X 节」在格子 data-tip 里，气泡是唯一补全出口 */
.c-cal-hol{font-size:var(--fs-1);line-height:1.3;font-weight:600;border-radius:5px;padding:0 2px;align-self:center;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center}
.c-cal-hol--rest{color:var(--danger);background:var(--danger-soft)}
.c-cal-hol--makeup{color:var(--warning);background:var(--warning-soft)}
.c-cal-hol--mark{color:var(--accent);background:var(--accent-soft)}
.c-cal-hol--half{color:var(--info);background:var(--info-soft)}
.c-cal-rest{border-color:color-mix(in srgb, var(--danger) 45%, transparent)}
.c-cal-rest .c-cal-num{color:var(--text-ghost)}
.c-cal-makeup{outline:1px dashed var(--warning);outline-offset:-2px}
.c-cal-state{display:flex;align-items:center;gap:.5rem;font-size:var(--fs-1);color:var(--text-ghost)}
.c-cal-state--err{color:var(--danger)}
.c-cal-legend{display:flex;flex-wrap:wrap;gap:.25rem 1rem;align-items:center;font-size:var(--fs-1);color:var(--text-ghost)}
.c-cal-lg{display:inline-block;width:.5rem;height:.5rem;border-radius:2px;margin-right:.25rem;vertical-align:middle}
.c-cal-lg--rest{background:var(--danger-soft);border:1px solid var(--danger)}
.c-cal-lg--makeup{background:var(--warning-soft);border:1px dashed var(--warning)}
.c-cal-lg--term{background:var(--accent-soft);border:1px solid var(--accent)}

/* ── 传统历法宜忌（右侧栏·数据源 GET /platform/time/almanacs）──
   词条一律由接口数组逐条渲染，前端不做归纳也不补「无」这类假占位；空数组整行不出 */
/* 面板改两列栅格（拍板「右栏宽度 + 间距 + 宜忌词条两列」三件一起改）：右栏拿到 2/5 后，「宜 | 忌」与
   「吉神 | 凶煞」两组各占一半并排，四组从四行压成两行；「键：值」行、冲本命提示、状态与空态这类
   整幅内容一律 grid-column:1/-1 跨两列，绝不跟词条组抢位置。align-items:start 是让某一组词条少时
   只按自身高度收，不被同排那组拉成空壳高框 */
.c-alm{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px 12px;align-items:start}
.c-alm-hd,.c-alm-row,.c-alm-clash,.c-alm-state,.c-alm .c-empty{grid-column:1/-1}
.c-alm-hd{display:flex;align-items:center;justify-content:space-between;gap:8px}
.c-alm-src{display:flex;align-items:center;gap:6px}
.c-alm-more{font-size:var(--fs-1);color:var(--text-ghost);border:1px solid var(--border-subtle);border-radius:6px;padding:0 6px;cursor:help}
.c-alm-row{display:flex;align-items:baseline;gap:10px;min-width:0}
.c-alm-k{flex:0 0 auto;font-size:var(--fs-1);color:var(--text-ghost);white-space:nowrap}
/* 键名列只在全幅的「键：值」行里定宽（干支/建除/冲煞/纳音/六曜 对齐成一列，值不再左贴边参差）；
   .c-alm-k 同时是词条组的块级标签，那条 flex-basis 会沿列轴向变成它的行高，故必须限定在 .c-alm-row 内 */
.c-alm-row .c-alm-k{flex:0 0 3.2em}
.c-alm-v{font-size:var(--fs-2);color:var(--text-primary);min-width:0;overflow-wrap:anywhere}
.c-alm-grp{display:flex;flex-direction:column;gap:6px;padding:10px 12px;border-radius:10px;background:var(--bg-surface);border:1px solid var(--border-subtle)}
.c-alm-grp .c-alm-k{font-weight:600}
.c-alm-terms{display:flex;flex-wrap:wrap;gap:5px 6px}
.c-alm-term{font-size:var(--fs-1);line-height:1.6;border-radius:6px;padding:0 7px;border:1px solid var(--border-subtle);color:var(--text-secondary);background:var(--bg)}
.c-alm-term--yi{color:var(--emerald);border-color:color-mix(in srgb, var(--emerald) 35%, transparent);background:var(--emerald-bg, var(--accent-soft))}
.c-alm-term--ji{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 35%, transparent);background:var(--danger-soft)}
.c-alm-term--god{color:var(--accent);background:var(--accent-soft)}
.c-alm-term--evil{color:var(--warning);background:var(--warning-soft)}
.c-alm-state{display:flex;align-items:center;gap:.5rem;font-size:var(--fs-1);color:var(--text-ghost)}
.c-alm-state--err{color:var(--danger)}
/* 本命角标与「今日冲本命」提示：属相取自后端农历出口，取不到就整条不出，故样式只为「有值」服务 */
.c-alm-bm{font-size:var(--fs-1);line-height:1.7;border-radius:6px;padding:0 7px;color:var(--text-secondary);border:1px solid var(--border-subtle);background:var(--bg);cursor:help;white-space:nowrap}
.c-alm-clash{font-size:var(--fs-2);line-height:1.5;color:var(--amber);background:var(--highlight-bg);border:1px solid color-mix(in srgb, var(--amber) 40%, transparent);border-radius:8px;padding:4px 8px;cursor:help}
