/* —— 自托管字体（替代谷歌外链，大陆直连秒开；与门户/报告系统同一套 OFL 字体）—— */
@font-face{font-family:"Noto Sans SC";font-weight:500;font-display:swap;src:url("/static/fonts/noto-lat-500.woff2") format("woff2");unicode-range:U+0000-00FF,U+2000-206F,U+2190-22FF}
@font-face{font-family:"Noto Sans SC";font-weight:500;font-display:swap;src:url("/static/fonts/noto-sc-500-subset.woff2") format("woff2");unicode-range:U+3000-303F,U+3400-9FFF,U+FF00-FFEF}
@font-face{font-family:"Noto Sans SC";font-weight:700;font-display:swap;src:url("/static/fonts/noto-lat-700.woff2") format("woff2");unicode-range:U+0000-00FF,U+2000-206F,U+2190-22FF}
@font-face{font-family:"Noto Sans SC";font-weight:700;font-display:swap;src:url("/static/fonts/noto-sc-700-subset.woff2") format("woff2");unicode-range:U+3000-303F,U+3400-9FFF,U+FF00-FFEF}
@font-face{font-family:"Noto Sans SC";font-weight:900;font-display:swap;src:url("/static/fonts/noto-sc-900.woff2") format("woff2");unicode-range:U+3000-303F,U+3400-9FFF,U+FF00-FFEF}
@font-face{font-family:"Space Grotesk";font-weight:600;font-display:swap;src:url("/static/fonts/sg-600.woff2") format("woff2")}
@font-face{font-family:"Space Grotesk";font-weight:700;font-display:swap;src:url("/static/fonts/sg-700.woff2") format("woff2")}

/* 学员成长档案 · 视觉对齐 CLD 新东方暗壳(token/极光/玻璃拟态复用门户 brand.css) */
:root{
  --brand:#00695F; --brand-l:#00897C; --brand-d:#005046; --brand-deep:#0a3d2e;
  --ink:#06110d;
  --gold:#e8920c; --gold-l:#f4a52a; --gold-glow:#ffc24b;
  --text:#eaf1ed; --text-mute:#9fb3aa;
  --glass:rgba(255,255,255,.06); --glass-line:rgba(255,255,255,.14);
  --font:"Noto Sans SC",-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",system-ui,sans-serif;
  --display:"Space Grotesk","Noto Sans SC",-apple-system,"PingFang SC",sans-serif;
}
*{box-sizing:border-box}
.brand-dark{margin:0;font-family:var(--font);color:var(--text);background:var(--ink);
  -webkit-font-smoothing:antialiased;line-height:1.6}
a{color:inherit}

/* ===== 极光炫光背景(复用 CLD .bg-aurora) ===== */
.bg-aurora{position:fixed;inset:0;z-index:-3;background:
  radial-gradient(60% 80% at 12% 14%, rgba(0,105,95,.5), transparent 60%),
  radial-gradient(55% 70% at 92% 96%, rgba(232,146,12,.30), transparent 62%),
  linear-gradient(160deg,#06110d 0%,#0a1813 45%,#0b1410 100%)}
.bg-aurora::before,.bg-aurora::after{content:"";position:fixed;border-radius:50%;filter:blur(80px);opacity:.42;z-index:-3}
.bg-aurora::before{width:48vw;height:48vw;left:-10vw;top:-10vw;
  background:radial-gradient(circle,rgba(0,137,124,.62),transparent 65%);animation:drift1 26s ease-in-out infinite}
.bg-aurora::after{width:42vw;height:42vw;right:-8vw;bottom:-12vw;
  background:radial-gradient(circle,rgba(244,165,42,.44),transparent 65%);animation:drift2 30s ease-in-out infinite}
@keyframes drift1{0%,100%{transform:translate(0,0) scale(1)}50%{transform:translate(6vw,4vh) scale(1.12)}}
@keyframes drift2{0%,100%{transform:translate(0,0) scale(1)}50%{transform:translate(-5vw,-4vh) scale(1.1)}}

.glass{background:var(--glass);border:1px solid var(--glass-line);
  backdrop-filter:saturate(150%) blur(16px);-webkit-backdrop-filter:saturate(150%) blur(16px)}

/* ===== 顶栏 ===== */
.topbar{position:fixed;top:0;left:0;right:0;z-index:10;display:flex;align-items:center;gap:16px;
  padding:12px 24px;background:rgba(6,17,13,.55);border-bottom:1px solid var(--glass-line)}
.brand-logo{height:26px;width:auto;display:block;filter:drop-shadow(0 1px 4px rgba(0,0,0,.4))}
.topbar-title{display:flex;flex-direction:column;line-height:1.15}
.t-main{font-weight:700;font-size:17px;letter-spacing:.5px}
.t-slogan{font-size:11px;color:var(--gold-glow);letter-spacing:.4px}
.t-slogan em{font-style:normal;display:inline-block;margin-left:8px;font-family:var(--display);
  font-size:8.5px;letter-spacing:2px;color:#7f938a;text-transform:uppercase}
#search{margin-left:auto;padding:9px 16px;min-width:210px;border-radius:999px;font-family:var(--font);
  font-size:13.5px;color:var(--text);background:rgba(0,0,0,.3);border:1px solid var(--glass-line);
  transition:border-color .18s,box-shadow .18s}
#search::placeholder{color:#7f938a}
#search:focus{outline:0;border-color:var(--gold);box-shadow:0 0 0 3px rgba(232,146,12,.22)}

/* ===== 首页:漂浮人名(JS 驱动磁吸/浮动/辉光) ===== */
.sky{position:fixed;inset:0;overflow:hidden}
.name-float{position:absolute;transform:translate(-50%,-50%);white-space:nowrap;text-decoration:none;
  font-family:var(--display);font-weight:600;color:var(--nc,#eaf5ef);cursor:pointer;
  will-change:transform,opacity;transition:color .2s ease, text-shadow .25s ease;
  user-select:none;-webkit-user-select:none}
.name-float:hover{color:#fff7ea;
  text-shadow:0 0 14px rgba(255,194,75,.7),0 0 26px rgba(0,137,124,.5)}
.name-float.dim{opacity:.07!important;filter:saturate(.3)}
.sky-hint{position:absolute;left:50%;bottom:22px;transform:translateX(-50%);
  font-size:12px;letter-spacing:3px;color:#6f8178;pointer-events:none}
/* 点击涟漪:柔和水波纹(多层细环) */
.ripple{position:fixed;border-radius:50%;pointer-events:none;z-index:6;
  border:1.5px solid rgba(255,213,130,.4);filter:blur(.3px);
  transform:translate(-50%,-50%) scale(.1);opacity:.55;
  animation:ripple 1.15s cubic-bezier(.12,.6,.2,1) forwards}
@keyframes ripple{55%{opacity:.3}100%{transform:translate(-50%,-50%) scale(1);opacity:0}}
/* 外圈绿金光点(仿门户光电) */
.spark{position:absolute;border-radius:50%;pointer-events:none;z-index:0;transform:translate(-50%,-50%)}
.spark.g{background:radial-gradient(circle,#a9f0e0 0%,rgba(0,137,124,0) 70%);box-shadow:0 0 8px rgba(0,137,124,.7)}
.spark.gold{background:radial-gradient(circle,#ffe6a3 0%,rgba(255,194,75,0) 70%);box-shadow:0 0 10px rgba(255,194,75,.8)}

/* ===== 档案页 ===== */
.page-top{position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:16px;
  padding:12px 22px;background:rgba(6,17,13,.9);border-bottom:1px solid var(--glass-line)}
.back{text-decoration:none;color:var(--text);font-size:14px;padding:6px 14px;border-radius:999px;
  border:1px solid var(--glass-line);background:rgba(0,0,0,.25);transition:border-color .18s,color .18s}
.back:hover{color:var(--gold-glow);border-color:var(--gold)}
.page-top .brand-logo{margin-left:auto}
.wrap{max-width:1240px;margin:0 auto;padding:22px 20px 80px}
.wrap.narrow{max-width:860px}

.card{padding:26px;border-radius:18px;margin-bottom:16px;box-shadow:0 24px 60px rgba(0,0,0,.4);
  background:rgba(11,24,18,.66);border:1px solid var(--glass-line)}
.card h1{margin:0 0 14px;font-size:26px;color:#fff;font-family:var(--display);letter-spacing:.5px}
/* 就读→目标 双院校面板 */
.journey{display:flex;align-items:stretch;gap:12px;flex-wrap:wrap}
.jcol{flex:1;min-width:210px;background:rgba(255,255,255,.04);border:1px solid var(--glass-line);
  border-radius:14px;padding:13px 15px}
.jcol.target{border-color:rgba(232,146,12,.4);
  background:linear-gradient(135deg,rgba(232,146,12,.1),rgba(232,146,12,.03))}
.jlabel{font-size:11px;letter-spacing:2px;color:var(--text-mute);font-weight:600}
.jcol.target .jlabel{color:var(--gold-glow)}
.jbody{display:flex;align-items:center;gap:12px;margin-top:9px}
.col-logo{width:52px;height:52px;flex:none;object-fit:contain;border-radius:11px;
  background:#fff;padding:5px;box-shadow:0 4px 14px rgba(0,0,0,.3)}
.jtext{min-width:0}
.jname{display:block;font-size:16px;font-weight:700;color:#fff;line-height:1.25}
.jcol:not(.target) .jname{font-weight:600;color:var(--text)}
.jmajor{display:block;font-size:12.5px;color:#7f938a;margin-top:2px}
.col-motto{display:block;margin-top:5px;font-size:12.5px;color:var(--gold-glow);
  font-style:italic;letter-spacing:.3px}
.j-arrow{flex:none;align-self:center;width:36px;height:36px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;color:var(--gold-glow);
  background:rgba(232,146,12,.14);border:1px solid rgba(232,146,12,.4)}
@media(max-width:560px){.j-arrow{transform:rotate(90deg)}}
.meta{list-style:none;padding:0;margin:16px 0 0;display:flex;gap:12px;flex-wrap:wrap}
.meta li{font-size:13px;color:var(--text-mute);background:rgba(0,0,0,.25);
  border:1px solid var(--glass-line);border-radius:999px;padding:5px 12px}
.meta b{color:var(--gold-glow)}
/* 顶部四项统计 */
.stats{display:flex;gap:10px;flex-wrap:wrap;margin:4px 0 18px}
.stat{flex:1;min-width:64px;text-align:center;padding:13px 8px;border-radius:14px;
  background:rgba(0,0,0,.28);border:1px solid var(--glass-line);transition:transform .18s,border-color .18s}
.stat:hover{transform:translateY(-2px);border-color:var(--gold)}
.stat b{display:block;font-family:var(--display);font-size:27px;font-weight:700;color:var(--gold-glow);line-height:1}
.stat span{display:block;margin-top:6px;font-size:12px;color:var(--text-mute);letter-spacing:2px}

.att-strip{padding:16px 20px;border-radius:14px;margin-bottom:20px;
  background:rgba(11,24,18,.55);border:1px solid var(--glass-line)}
.att-strip h2{margin:0 0 10px;font-size:14px;color:var(--text-mute);font-weight:600;letter-spacing:1px}
.dots{display:flex;flex-wrap:wrap;gap:5px}
.dot{width:12px;height:12px;border-radius:50%;box-shadow:0 0 6px rgba(0,0,0,.4)}
.s-出勤{background:var(--brand-l);box-shadow:0 0 8px rgba(0,137,124,.6)}
.s-缺勤{background:#ff6b6b}
.s-请假{background:var(--gold-glow)}
.s-线上,.s-线下{background:#5f7a72}

/* 时间线 */
.timeline{position:relative;margin:6px 0 0;padding-left:26px;
  border-left:2px solid rgba(255,255,255,.16)}
.tl-item{position:relative;margin:0 0 20px}
.tl-item::before{content:"";position:absolute;left:-33px;top:6px;width:12px;height:12px;border-radius:50%;
  background:var(--brand-l);box-shadow:0 0 0 4px rgba(0,137,124,.18),0 0 10px rgba(0,137,124,.7)}
.type-stage_test::before{background:var(--gold-glow);box-shadow:0 0 0 4px rgba(232,146,12,.2),0 0 12px rgba(255,194,75,.75)}
.type-word_test::before{background:#5cc0ff;box-shadow:0 0 0 4px rgba(92,192,255,.16),0 0 12px rgba(92,192,255,.7)}
.type-homework::before{background:#c58bff;box-shadow:0 0 0 4px rgba(197,139,255,.16),0 0 12px rgba(197,139,255,.7)}
.tl-note{margin-top:8px;font-size:12.5px;color:var(--text-mute);line-height:1.6}
.tl-date{font-size:12px;color:#7f938a;font-family:var(--display);letter-spacing:.5px;margin-bottom:6px}
.tl-body{padding:14px 16px;border-radius:14px;background:rgba(255,255,255,.045);border:1px solid var(--glass-line)}
.tl-title{font-weight:600;color:var(--text)}
.score{margin-left:10px;color:#06110d;background:var(--gold-glow);border-radius:999px;
  padding:1px 10px;font-size:13px;font-weight:700}
.thumbs{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.thumb{height:104px;border-radius:10px;cursor:zoom-in;object-fit:cover;
  border:1px solid var(--glass-line);transition:transform .18s,box-shadow .18s}
.thumb:hover{transform:scale(1.04);box-shadow:0 8px 24px rgba(0,0,0,.5)}
.k-correction{outline:2px solid var(--gold);outline-offset:1px}

/* ===== 档案页:共享时间轴 + 分支到各列 ===== */
.tgrid{display:grid;grid-template-columns:96px repeat(5,minmax(0,1fr));margin-top:8px;
  background:var(--glass);border:1px solid var(--glass-line);border-radius:16px;overflow:hidden}
.trow{display:contents}
.thead>div{padding:12px 8px;font-weight:700;font-size:13px;text-align:center;color:var(--text);
  background:rgba(0,0,0,.38);border-bottom:1px solid var(--glass-line)}
.thead .taxis{text-align:left;color:var(--text-mute)}
.taxis{position:relative;padding:16px 10px 16px 18px;color:var(--text-mute);font-family:var(--display);
  font-size:12px;border-right:1px solid var(--glass-line);border-bottom:1px solid rgba(255,255,255,.05)}
.taxis .tnode{position:absolute;left:-6px;top:19px;width:11px;height:11px;border-radius:50%;
  background:var(--brand-l);box-shadow:0 0 0 3px rgba(0,137,124,.2),0 0 10px rgba(0,137,124,.75)}
.tcell{padding:10px 8px;border-bottom:1px solid rgba(255,255,255,.05);border-left:1px dashed rgba(255,255,255,.06);
  display:flex;flex-direction:column;gap:8px;min-width:0}
.tcell.has{background:rgba(255,255,255,.02)}
.tgrid .thumbs{gap:5px;margin-top:0}
.tgrid .thumb{height:62px}
.mini .mt{font-size:12px;font-weight:600;line-height:1.4}
.mini .tl-note{margin-top:6px;font-size:11.5px;color:var(--text-mute);line-height:1.5}
.chip{align-self:flex-start;padding:3px 10px;border-radius:999px;font-size:12px;font-weight:600;color:#06110d}
.chip.s-出勤{background:var(--brand-l)} .chip.s-缺勤{background:#ff6b6b;color:#fff}
.chip.s-请假{background:var(--gold-glow)} .chip.s-线上,.chip.s-线下{background:#6f8a82;color:#fff}
.rank{margin-left:12px;font-family:var(--display);font-size:14px;font-weight:600;color:var(--gold-glow);vertical-align:middle}
.rank small{color:var(--text-mute);font-size:11px}
@media(max-width:760px){ .wrap{max-width:100%;padding:14px 10px 60px} .tgrid{grid-template-columns:60px repeat(5,minmax(0,1fr))} }

/* 首页 top10:原地闪烁星芒(星芒数=JS 按排名,越靠前越多)。已去掉呼吸气场光晕 */
.name-float.top{text-shadow:0 0 9px rgba(255,214,130,.32)}
.name-float.top .spk{position:absolute;left:50%;top:50%;pointer-events:none;z-index:1;
  font-size:var(--sz,11px);line-height:1;color:var(--c,#ffd27a);text-shadow:0 0 7px var(--c,#ffd27a);
  opacity:0;transform:translate(calc(-50% + var(--x)),calc(-50% + var(--y))) scale(0);
  animation:twinkle var(--dur,2.4s) ease-in-out infinite;animation-delay:var(--dly,0s)}
@keyframes twinkle{
  0%,100%{opacity:0;transform:translate(calc(-50% + var(--x)),calc(-50% + var(--y))) scale(0) rotate(0)}
  50%{opacity:1;transform:translate(calc(-50% + var(--x)),calc(-50% + var(--y))) scale(1) rotate(40deg)}}

.lightbox{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;
  background:rgba(3,8,6,.92);backdrop-filter:blur(5px);cursor:zoom-out;
  opacity:0;visibility:hidden;transition:opacity .28s ease, visibility .28s}
.lightbox.on{opacity:1;visibility:visible}
.lightbox img{max-width:90vw;max-height:90vh;border-radius:10px;box-shadow:0 30px 90px rgba(0,0,0,.7);transition:opacity .2s}
.lightbox [data-nav]{position:absolute;top:50%;transform:translateY(-50%);width:46px;height:46px;border-radius:50%;
  border:1px solid var(--glass-line);background:rgba(255,255,255,.08);color:#fff;font-size:26px;line-height:1;
  cursor:pointer;transition:background .18s}
.lightbox [data-nav]:hover{background:rgba(255,255,255,.22)}
.lightbox [data-nav=prev]{left:22px} .lightbox [data-nav=next]{right:22px}
.lb-count{position:absolute;bottom:22px;left:50%;transform:translateX(-50%);color:#bfeee0;
  font-family:var(--display);font-size:13px;letter-spacing:1px}

@media(max-width:560px){
  /* 手机:标题横排单行(原竖排折行占半屏)、slogan 收起、搜索/按钮换行铺满 */
  .topbar{flex-wrap:wrap;gap:8px 10px;padding:10px 12px}
  .brand-logo{height:20px}
  .topbar-title{flex-direction:row;align-items:baseline;gap:8px;min-width:0}
  .t-main{font-size:15px;white-space:nowrap}
  .t-slogan{display:none}
  #search{flex:1 1 150px;min-width:0;margin-left:0;order:3;padding:8px 13px}
  .topbar .stu-admin,.topbar .stu-words,.topbar .stu-tiku{
    order:4;margin-left:0!important;padding:6px 9px!important;font-size:12px!important}
  .card h1{font-size:22px} .wrap{padding:16px 14px 60px}
  .sky-hint{font-size:12px;text-align:center;padding:0 16px}
}

/* ===== 动效优化:滚动渐显 / 星系入场 / 减动态无障碍 ===== */
.tl-item.pre{opacity:0;transform:translateY(18px);transition:opacity .55s ease, transform .55s ease}
.tl-item.pre.in{opacity:1;transform:none}
.sky{animation:skyin 1.1s ease both}
@keyframes skyin{from{opacity:0}to{opacity:1}}
@media (prefers-reduced-motion: reduce){
  .bg-aurora::before,.bg-aurora::after{animation:none}
  .name-float.top .spk{animation:none;opacity:.5}
  .sky{animation:none;opacity:1}
  .ripple{animation-duration:.35s}
  .tl-item.pre{opacity:1;transform:none;transition:none}
}

/* ===== 背景随机流星(纯 transform/opacity,合成层,开销极低)===== */
.meteors{position:fixed;inset:0;z-index:-2;overflow:hidden;pointer-events:none}
.meteor{position:absolute;width:3px;height:3px;border-radius:50%;
  background:rgb(var(--c,255,240,205));box-shadow:0 0 7px 1px rgba(var(--c,255,240,205),.8);
  opacity:0;transform:translate(0,0) rotate(-40deg);
  animation:shoot var(--d,7s) linear infinite;animation-delay:var(--dl,0s)}
.meteor::before{content:"";position:absolute;top:50%;left:2px;transform:translateY(-50%);
  width:var(--len,130px);height:1.6px;border-radius:2px;
  background:linear-gradient(90deg, rgba(var(--c,255,240,205),.9), rgba(var(--c,255,240,205),0))}
@keyframes shoot{
  0%{opacity:0;transform:translate(0,0) rotate(-40deg)}
  6%{opacity:1}16%{opacity:1}24%{opacity:0}
  100%{opacity:0;transform:translate(-48vw,40vh) rotate(-40deg)}
}
@media (prefers-reduced-motion: reduce){ .meteors{display:none} }

/* ============================ CLD craft 工艺层（全平台统一 · 2026-07-03）============================
   与门户 portal-brand.css v6 同款纪律：品牌琥珀选区 / 细滚动条 / 品牌色控件 / 键盘焦点环 /
   数字等宽 / 深色自动填充修正 / color-scheme 跟随主题。浅色默认,.brand-dark 为暗壳。 */
body{color-scheme:light}
body.brand-dark{color-scheme:dark}
::selection{background:rgba(232,146,12,.3);color:#16241d}
.brand-dark ::selection{background:rgba(232,146,12,.34);color:#fff}
html{scrollbar-width:thin;scrollbar-color:rgba(90,98,92,.4) transparent}
body.brand-dark{scrollbar-color:rgba(157,176,166,.35) transparent}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{border-radius:999px;border:3px solid transparent;
  background-color:rgba(90,98,92,.32);background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background-color:rgba(90,98,92,.5)}
.brand-dark ::-webkit-scrollbar-thumb{background-color:rgba(157,176,166,.3)}
.brand-dark ::-webkit-scrollbar-thumb:hover{background-color:rgba(157,176,166,.5)}
input,select,textarea{caret-color:#e8920c}
input[type=checkbox],input[type=radio]{accent-color:#e8920c}
:where(a,button,summary,select):focus-visible{outline:2px solid rgba(232,146,12,.75);outline-offset:2px;border-radius:8px}
table{font-variant-numeric:tabular-nums}
input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus{
  transition:background-color 9999999s ease-in-out 0s}
.brand-dark input:-webkit-autofill{-webkit-text-fill-color:#fff;caret-color:#fff}

/* ---- 返回工作台 · 全站左下角悬浮按钮（全平台统一，与报告/抽奖同款） ---- */
.cld-home-fab{position:fixed;left:18px;bottom:18px;z-index:9999;display:inline-flex;align-items:center;gap:7px;
  padding:10px 17px;border-radius:999px;font-family:var(--font,-apple-system,"PingFang SC",sans-serif);
  font-size:13.5px;font-weight:700;line-height:1;text-decoration:none;
  transition:transform .16s ease,box-shadow .16s ease,background .16s,border-color .16s,color .16s}
.cld-home-fab span{font-size:15px}
/* 日间：白胶囊 + 新东方绿字描边 */
.cld-home-fab{color:#00695F;background:#fff;border:1px solid #cfe4dd;box-shadow:0 8px 22px rgba(0,105,95,.16)}
.cld-home-fab:hover{transform:translateY(-2px);background:#f2faf8;color:#00564E;box-shadow:0 12px 28px rgba(0,105,95,.24)}
/* 夜间：墨绿玻璃胶囊 + 微光 */
body.brand-dark .cld-home-fab{color:#eafff8;background:linear-gradient(135deg,rgba(0,137,124,.92),rgba(0,80,70,.94));
  border:1px solid rgba(255,255,255,.18);box-shadow:0 8px 24px rgba(0,0,0,.4),0 0 0 1px rgba(0,137,124,.3)}
body.brand-dark .cld-home-fab:hover{transform:translateY(-2px);color:#fff;box-shadow:0 12px 32px rgba(0,0,0,.5),0 0 18px rgba(0,137,124,.4)}
@media print{.cld-home-fab{display:none}}
@media(max-width:640px){.cld-home-fab{left:12px;bottom:12px;padding:10px 14px}}

/* ---- 学习日历:有学习活动的日期亮起(绿热力4档),格底彩点=活动类型(与时间线同色),
       描边=当天出勤状态(缺勤红最醒目),悬停/点按出当天明细浮层 ---- */
.cal-card h2{display:flex;align-items:baseline;flex-wrap:wrap;gap:12px}
.cal-legend{display:inline-flex;align-items:center;flex-wrap:wrap;gap:11px;margin-left:auto;
  font-size:11.5px;color:#8da99b;font-weight:400}
.cal-legend .lg{width:9px;height:9px;border-radius:50%;display:inline-block;margin-right:4px;vertical-align:-1px}
.cal-legend .rg{background:transparent!important}
.cal-months{display:grid;grid-template-columns:repeat(auto-fit,minmax(228px,1fr));gap:22px;margin-top:14px}
.cal-title{font-size:13px;font-weight:700;color:#cfe0d7;letter-spacing:.6px;margin-bottom:8px}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
.cal-wd{font-size:10.5px;color:#6f8a82;text-align:center;padding-bottom:3px}
.cal-cell{position:relative;aspect-ratio:1;border-radius:8px;background:rgba(255,255,255,.045);
  display:flex;align-items:center;justify-content:center}
.cal-cell.empty{background:transparent}
.cal-cell i{font-style:normal;font-size:11px;color:#7d8f86;line-height:1}
.cal-cell.lit i{color:#eaf1ed;font-weight:700}
/* 亮格=统一绿热力,深浅=活动数量 4 档;类型交给格底彩点(一次活动一个点) */
.cal-cell.l1{background:rgba(0,137,124,.18)}
.cal-cell.l2{background:rgba(0,137,124,.30)}
.cal-cell.l3{background:rgba(0,137,124,.44)}
.cal-cell.l4{background:rgba(0,137,124,.58);box-shadow:0 0 14px rgba(0,137,124,.35)}
.cal-dots{position:absolute;left:0;right:0;bottom:3px;display:flex;justify-content:center;gap:2.5px}
.cal-dots b{width:5px;height:5px;border-radius:50%;box-shadow:0 0 0 1px rgba(6,17,13,.55)}  /* 深色描边,亮格上也清晰 */
.cd-daily_screenshot{background:#2fd6ae}
.cd-word_test{background:#5cc0ff}
.cd-homework{background:#c58bff}
.cd-stage_test{background:#ffc24b}
.cd-word_practice{background:#ff8fa0}
.ring-出勤{border:1.5px solid rgba(0,220,185,.7)}
.ring-线上,.ring-线下{border:1.5px solid rgba(140,165,155,.75)}
.ring-请假{border:1.5px dashed rgba(255,194,75,.85)}
.ring-缺勤{border:1.5px solid rgba(255,107,107,.9)}
.cal-cell[data-tip]{cursor:pointer;transition:transform .14s ease}
.cal-cell[data-tip]:hover,.cal-cell[data-tip]:focus-visible{transform:scale(1.15);z-index:3}
/* 明细浮层(JS 定位,textContent 填充;可交互:光标可移入、点图放大) */
.cal-tip{position:fixed;z-index:10000;max-width:260px;
  background:rgba(8,20,15,.97);border:1px solid rgba(0,137,124,.45);border-radius:11px;
  padding:10px 13px;font-size:12.5px;line-height:1.6;color:#dcefe6;
  box-shadow:0 18px 44px rgba(0,0,0,.5)}
.cal-tip .ct-date{display:block;font-size:12px;color:#ffc24b;letter-spacing:.5px;margin-bottom:6px}
.cal-tip .ct-row{display:flex;align-items:center;gap:7px}
.cal-tip .ct-dot{width:8px;height:8px;border-radius:50%;flex:none}
.cal-tip .ct-sub{color:#8da99b;font-size:11.5px;padding-left:15px;max-width:230px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 浮层内当天图片:固定尺寸(定位前即知高度,不跳) */
.cal-tip .ct-imgs{display:flex;gap:6px;margin-top:8px}
.cal-tip .ct-imgs img{width:56px;height:56px;object-fit:cover;border-radius:8px;cursor:zoom-in;
  border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.05);transition:transform .14s ease,border-color .14s}
.cal-tip .ct-imgs img:hover{transform:scale(1.07);border-color:rgba(255,194,75,.6)}
.cal-tip .ct-hint{margin-top:6px;font-size:10.5px;color:#6f8a82;letter-spacing:.5px}
/* 全屏看图层:点缩略图放大,←/→ 切换,Esc/点空白关闭 */
.cal-view{position:fixed;inset:0;z-index:10001;display:flex;align-items:center;justify-content:center;gap:14px;
  background:rgba(3,10,7,.92);backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px)}
.cal-view[hidden]{display:none}
.cal-view img{max-width:88vw;max-height:90vh;border-radius:12px;cursor:pointer;
  box-shadow:0 30px 90px rgba(0,0,0,.6),0 0 0 1px rgba(255,255,255,.1)}
.cal-view .cv-nav{width:44px;height:44px;border-radius:50%;border:1px solid rgba(255,255,255,.25);flex:none;
  background:rgba(255,255,255,.08);color:#fff;font-size:26px;line-height:1;cursor:pointer;transition:background .15s}
.cal-view .cv-nav:hover{background:rgba(255,255,255,.2)}
.cal-view .cv-count{position:fixed;bottom:22px;left:50%;transform:translateX(-50%);
  font-size:12.5px;color:#cfe0d7;letter-spacing:1px}
@media(max-width:560px){.cal-months{gap:16px}.cal-legend{margin-left:0}}

/* ---- 学习总结:数据一句话 + 听写周测 chips + 每日一句鼓励(琥珀高亮) ---- */
.sum-card .sum-text{color:#cfe0d7;font-size:14.5px;line-height:1.9;margin-top:6px}
.sum-dict{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:12px}
.sum-dict .sd-label{font-size:12.5px;color:#5cc0ff;font-weight:700;letter-spacing:.5px;margin-right:2px}
.sum-dict .sd-chip{font-size:12px;color:#bcd7e8;background:rgba(92,192,255,.1);
  border:1px solid rgba(92,192,255,.28);border-radius:999px;padding:3px 11px}
.sum-card .sum-cheer{margin-top:14px;padding:13px 16px;border-radius:12px;
  color:#ffd98a;font-size:14.5px;font-weight:700;line-height:1.75;
  background:rgba(232,146,12,.1);border:1px solid rgba(232,146,12,.28)}
.sum-card .sum-cheer span{margin-right:8px}

/* ===== 单词·进度宇宙:星空 + 3D 球体(词根/词缀/话题星系复用) ===== */
.starfield{position:fixed;inset:0;z-index:-2;pointer-events:none;overflow:hidden}
.starfield i{position:absolute;border-radius:50%;background:#fff;
  box-shadow:0 0 4px 1px rgba(255,255,255,.55);
  animation:starTwinkle var(--du,3s) ease-in-out infinite;animation-delay:var(--dl,0s)}
@keyframes starTwinkle{0%,100%{opacity:calc(var(--o,.6) * .25)}50%{opacity:var(--o,.6)}}

/* 3D 球体:高光 + 球面渐变 + 明暗内阴影(--c1/2/3 由 JS 按星球着色) */
.p3d{--c1:#4a6b5e;--c2:#24413a;--c3:#0f221b;border-radius:50%;
  background:
    radial-gradient(circle at 30% 26%, rgba(255,255,255,.55) 0, rgba(255,255,255,0) 17%),
    radial-gradient(circle at 34% 30%, var(--c1) 0%, var(--c2) 45%, var(--c3) 77%, #060f0b 100%);
  box-shadow:inset -7px -9px 22px rgba(0,0,0,.62), inset 5px 6px 15px rgba(255,255,255,.12),
    0 8px 22px rgba(0,0,0,.45)}
.p3d.gold{
  background:
    radial-gradient(circle at 30% 26%, rgba(255,255,255,.8) 0, rgba(255,255,255,0) 18%),
    radial-gradient(circle at 34% 30%, #fff0c2 0%, #ffcf5e 42%, #e8920c 76%, #7a4a06 100%);
  box-shadow:inset -6px -8px 18px rgba(80,45,0,.55), inset 5px 6px 16px rgba(255,255,255,.42),
    0 0 40px 8px rgba(255,201,75,.55)}

/* 真实行星贴图(CC0 20张):暗→亮随进度,全背金光。背景图与滤镜由 JS 按进度设 */
.pimg{border-radius:50%;background-size:cover;background-position:center;
  filter:brightness(.5) saturate(.82);transition:filter .55s,box-shadow .55s}

/* ===== 自转行星:赤道贴图卷动 + 云层 + 大气halo(词根/词缀/话题星系复用) ===== */
.globe{position:absolute;inset:0;border-radius:50%;overflow:hidden;isolation:isolate;
  -webkit-clip-path:circle(50% at 50% 50%);clip-path:circle(50% at 50% 50%);   /* Safari/WebKit:祖先或子层带 transform 时 border-radius+overflow 不裁,必须 clip-path */
  transition:filter .55s}
.gsurf,.gcloud{position:absolute;top:0;left:0;height:100%;width:400%;
  background-repeat:repeat-x;background-size:auto 100%;will-change:transform;
  animation:gspin linear infinite}
.gsurf{animation-duration:26s}
.gcloud{animation-duration:40s;opacity:.3;mix-blend-mode:screen;filter:contrast(1.15) brightness(1.1)}
@keyframes gspin{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}
.gshade{position:absolute;inset:0;border-radius:50%;pointer-events:none;
  background:radial-gradient(circle at 30% 26%, rgba(255,255,255,.5) 0, rgba(255,255,255,0) 24%),
    radial-gradient(circle at 50% 48%, rgba(0,0,0,0) 50%, rgba(0,0,0,.55) 100%);
  box-shadow:inset -8px -10px 26px rgba(0,0,0,.6)}
.atmo{position:absolute;inset:0;border-radius:50%;pointer-events:none;
  box-shadow:0 0 15px 4px rgba(130,190,255,.30), inset 0 0 10px rgba(150,205,255,.22);transition:box-shadow .55s}
.done .atmo{animation:goldGlow 2.6s ease-in-out infinite}
@keyframes goldGlow{
  0%,100%{box-shadow:0 0 16px 5px rgba(255,206,90,.85),0 0 38px 15px rgba(255,176,44,.5),inset 0 0 14px rgba(255,235,170,.45)}
  50%{box-shadow:0 0 28px 9px rgba(255,224,120,1),0 0 62px 24px rgba(255,190,55,.72),inset 0 0 20px rgba(255,242,190,.6)}}
