/* ============================================================
   星火社团 · 组件层 components.css
   目录：1 按钮 / 2 标签徽章 / 3 卡片 / 4 倒计时 / 5 活动列表
   6 排行榜 / 7 时间线 / 8 相册与灯箱 / 9 表单 / 10 详情页
   11 筛选栏 / 12 动效（reveal / 悬浮 / 骨架屏）
   ============================================================ */

/* ---------- 1. 按钮 ---------- */
.btn{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:.5rem;
  padding:.75rem 1.375rem;border-radius:var(--r-full);font-size:var(--fs-sm);font-weight:600;line-height:1;
  border:1px solid transparent;white-space:nowrap;overflow:hidden;transition:.22s var(--ease)}
.btn::after{content:"";position:absolute;inset:0;background:radial-gradient(circle at center,rgba(255,255,255,.45) 0,transparent 60%);opacity:0;transform:scale(.3);transition:.4s var(--ease)}
.btn:active::after{opacity:1;transform:scale(2.4);transition:0s}
.btn-primary{background:var(--c-primary);color:#fff;box-shadow:0 4px 14px rgba(43,92,230,.28)}
.btn-primary:hover{background:var(--c-primary-600);transform:translateY(-2px);box-shadow:0 10px 22px rgba(43,92,230,.32)}
.btn-accent{background:linear-gradient(135deg,var(--c-accent),#FF9A56);color:#fff;box-shadow:0 4px 14px rgba(255,122,47,.3)}
.btn-accent:hover{transform:translateY(-2px);box-shadow:0 10px 24px rgba(255,122,47,.4)}
.btn-ghost{background:#fff;border-color:var(--c-line);color:var(--c-text)}
.btn-ghost:hover{border-color:var(--c-primary);color:var(--c-primary);background:var(--c-primary-100)}
.btn-light{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.5);color:#fff;backdrop-filter:blur(6px)}
.btn-light:hover{background:#fff;color:var(--c-primary)}
.btn-lg{padding:1rem 1.75rem;font-size:1rem}
.btn-sm{padding:.5rem .875rem;font-size:var(--fs-xs)}
.btn-block{width:100%}
.btn:disabled{opacity:.6;cursor:not-allowed;transform:none}

/* ---------- 2. 标签 / 徽章 ---------- */
.badge{position:absolute;top:.75rem;left:.75rem;z-index:2;padding:.25rem .625rem;border-radius:var(--r-full);
  font-size:var(--fs-xs);font-weight:600;color:#fff;backdrop-filter:blur(4px)}
.badge-art{background:rgba(148,79,217,.9)}
.badge-sport{background:rgba(18,184,134,.92)}
.badge-tech{background:rgba(43,92,230,.92)}
.tag{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .625rem;border-radius:var(--r-sm);
  font-size:var(--fs-xs);font-weight:600;white-space:nowrap}
.tag-open{background:rgba(22,163,74,.12);color:var(--c-success)}
.tag-soon{background:rgba(245,158,11,.14);color:#B45309}
.tag-closed{background:rgba(100,116,139,.14);color:var(--c-muted)}
.tag-dot::before{content:"";width:.375rem;height:.375rem;border-radius:50%;background:currentColor;animation:pulse-dot 1.8s var(--ease) infinite}
@keyframes pulse-dot{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(1.5)}}
.chip{display:inline-block;padding:.25rem .75rem;border-radius:var(--r-full);background:var(--c-bg);
  border:1px solid var(--c-line);font-size:var(--fs-xs);color:var(--c-muted)}

/* ---------- 3. 卡片 ---------- */
.card{position:relative;display:flex;flex-direction:column;background:var(--c-surface);
  border:1px solid var(--c-line);border-radius:var(--r-md);overflow:hidden;transition:.28s var(--ease)}
.card:hover{transform:translateY(-6px);box-shadow:var(--sh-3);border-color:transparent}
.card:hover .card-media img{transform:scale(1.07)}
.card-media{position:relative;display:block;aspect-ratio:16/10;background:var(--c-primary-100);overflow:hidden}
.card-media img{width:100%;height:100%;object-fit:cover;transition:transform .5s var(--ease)}
.card-body{display:flex;flex-direction:column;gap:var(--sp-2);padding:var(--sp-4);flex:1}
.card-title{font-size:var(--fs-lg);font-weight:600;color:var(--c-ink)}
.card-title a{transition:color .2s var(--ease)}
.card-title a:hover{color:var(--c-primary)}
.card-desc{font-size:var(--fs-sm);color:var(--c-muted);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.card-fact{margin-top:auto;padding-top:var(--sp-3);font-size:var(--fs-xs);color:var(--c-muted)}
.card-fact b{color:var(--c-ink);font-family:var(--font-num)}
.card-meta{display:flex;align-items:center;gap:.5rem;padding-top:var(--sp-2);
  border-top:1px dashed var(--c-line);font-size:var(--fs-xs);color:var(--c-muted)}
.card-meta b{color:var(--c-primary);font-family:var(--font-num)}
.card-more{align-self:flex-start;margin-top:var(--sp-2)}
.card-feature::before{content:"";position:absolute;left:0;right:0;top:0;height:3px;
  background:linear-gradient(90deg,var(--c-primary),var(--c-accent));transform:scaleX(0);transform-origin:left;transition:transform .35s var(--ease)}
.card-feature:hover::before{transform:scaleX(1)}

/* ---------- 4. 首屏 Hero ---------- */
.hero{position:relative;overflow:hidden;background:linear-gradient(160deg,#F3F7FF 0%,#fff 45%,#FFF4EC 100%)}
.hero::before,.hero::after{content:"";position:absolute;border-radius:50%;filter:blur(2px);pointer-events:none}
.hero::before{width:28rem;height:28rem;right:-8rem;top:-10rem;background:radial-gradient(circle at 30% 30%,rgba(43,92,230,.16),transparent 65%);animation:float-a 14s ease-in-out infinite}
.hero::after{width:22rem;height:22rem;left:-6rem;bottom:-9rem;background:radial-gradient(circle at 60% 40%,rgba(255,122,47,.16),transparent 65%);animation:float-b 18s ease-in-out infinite}
@keyframes float-a{0%,100%{transform:translate3d(0,0,0)}50%{transform:translate3d(-1.5rem,1.75rem,0)}}
@keyframes float-b{0%,100%{transform:translate3d(0,0,0)}50%{transform:translate3d(1.75rem,-1.25rem,0)}}
.hero-inner{position:relative;z-index:1;display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);
  align-items:center;gap:var(--sp-8);padding:var(--sp-8) 0}
.hero-text{display:flex;flex-direction:column;gap:var(--sp-4);align-items:flex-start}
.hero-text h1 span{display:inline}
.hero-actions{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin-top:var(--sp-2)}
.hero-stats{display:flex;flex-wrap:wrap;gap:var(--sp-6);margin-top:var(--sp-5);padding-top:var(--sp-5);border-top:1px solid var(--c-line)}
.hero-stats dt{font-size:var(--fs-xs);color:var(--c-muted);order:2}
.hero-stats dd{font-family:var(--font-num);font-size:1.5rem;font-weight:700;color:var(--c-ink);line-height:1.2}
.hero-stats>div{display:flex;flex-direction:column-reverse}
.hero-media{position:relative}
.hero-shot{display:block;border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sh-3);transition:transform .28s var(--ease)}
.hero-shot:hover{transform:translateY(-4px)}
.hero-media picture,.hero-media img{border-radius:var(--r-lg)}
.hero-media img{width:100%;height:auto;aspect-ratio:16/10;object-fit:cover}
.hero-tip{margin-top:var(--sp-3);font-size:var(--fs-xs);color:var(--c-muted);text-align:right}
.hero-float{position:absolute;left:-1.5rem;bottom:4.25rem;display:flex;align-items:center;gap:.75rem;
  padding:.75rem 1rem;background:#fff;border-radius:var(--r-md);box-shadow:var(--sh-3);animation:float-card 5s ease-in-out infinite}
.hero-float .avatar{width:2.5rem;height:2.5rem;border-radius:50%;background:linear-gradient(135deg,var(--c-mint),var(--c-primary));color:#fff;display:grid;place-items:center;font-size:var(--fs-sm);font-weight:700}
.hero-float b{display:block;font-size:var(--fs-sm);color:var(--c-ink)}
.hero-float small{font-size:var(--fs-xs);color:var(--c-muted)}
.hero-dots{position:absolute;right:.5rem;bottom:.75rem;display:flex;align-items:center;gap:.125rem}
.hero-dot{display:grid;place-items:center;min-width:1.75rem;min-height:2.75rem;border:0;background:none;padding:0;cursor:pointer}
.hero-dot i{display:block;width:.5rem;height:.5rem;border-radius:var(--r-full);background:rgba(255,255,255,.6);transition:.2s var(--ease)}
.hero-dot:hover i{background:#fff}
.hero-dot.is-on i{width:1.5rem;background:#fff}
@keyframes float-card{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}
@media (max-width:1199px){
  .hero-inner{gap:var(--sp-7);padding:var(--sp-7) 0}
  .hero-float{left:0}
}
@media (max-width:767px){
  .hero-inner{grid-template-columns:minmax(0,1fr);gap:var(--sp-6);padding:var(--sp-6) 0 var(--sp-7)}
  .hero-stats{gap:var(--sp-4)}
  .hero-media img{aspect-ratio:4/3}
  .hero-float{position:static;left:auto;right:auto;bottom:auto;margin-top:var(--sp-3);padding:.5rem .75rem;gap:.5rem}
  .hero-float .avatar{width:2rem;height:2rem}
  /* 手机上圆点改为图片下方居中，避免压住信息卡 */
  .hero-dots{position:static;justify-content:center;padding-top:var(--sp-2)}
  .hero-tip{text-align:left}
}

/* ---------- 5. 倒计时 ---------- */
.countdown-wrap{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:var(--sp-7)}
.countdown-copy h2{margin-bottom:var(--sp-2)}
.countdown-copy p{color:var(--c-muted);font-size:var(--fs-sm);max-width:34rem}
.countdown{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--sp-3);width:min(100%,26rem)}
.countdown-num{position:relative;background:#fff;border:1px solid var(--c-line);border-radius:var(--r-md);
  padding:var(--sp-4) var(--sp-2);text-align:center;box-shadow:var(--sh-1);overflow:hidden}
.countdown-num::after{content:"";position:absolute;inset:0;border-radius:inherit;box-shadow:inset 0 -2px 0 rgba(43,92,230,.12)}
.countdown-num b{display:block;font-family:var(--font-num);font-variant-numeric:tabular-nums;
  font-size:clamp(1.5rem,1.1rem + 1.6vw,2.375rem);font-weight:700;color:var(--c-primary);line-height:1.1}
.countdown-num b.is-tick{animation:tick .45s var(--ease)}
@keyframes tick{0%{transform:translateY(35%) scale(.94);opacity:.2;filter:blur(1px)}100%{transform:none;opacity:1;filter:none}}
.countdown-num span{font-size:var(--fs-xs);color:var(--c-muted)}
.countdown-ended{display:flex;align-items:center;gap:.5rem;font-weight:600;color:var(--c-accent);margin:0}
@media (max-width:1199px){.countdown-wrap{grid-template-columns:minmax(0,1fr);gap:var(--sp-5)}}
@media (max-width:767px){.countdown{width:100%;gap:.5rem}.countdown-num{padding:var(--sp-3) .25rem}}

/* ---------- 6. 活动列表 ---------- */
.event-list{display:flex;flex-direction:column;gap:var(--sp-3)}
.event-item{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--sp-4);
  padding:var(--sp-4);background:#fff;border:1px solid var(--c-line);border-radius:var(--r-md);
  transition:.25s var(--ease);position:relative;overflow:hidden}
.event-item::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--c-primary);transform:scaleY(0);transition:transform .25s var(--ease)}
.event-item:hover{transform:translateX(4px);box-shadow:var(--sh-2);border-color:var(--c-primary-100)}
.event-item:hover::before{transform:scaleY(1)}
.event-date{display:grid;place-items:center;width:3.5rem;height:3.5rem;border-radius:var(--r-md);
  background:var(--c-primary-100);color:var(--c-primary);line-height:1;flex-shrink:0}
.event-date b{font-family:var(--font-num);font-size:1.375rem;font-weight:700}
.event-date span{font-size:var(--fs-xs);margin-top:.125rem}
.event-body h3{font-size:var(--fs-base);font-weight:600}
.event-body h3 a:hover{color:var(--c-primary)}
.event-meta{font-size:var(--fs-xs);color:var(--c-muted);margin-top:.25rem}
.event-desc{font-size:var(--fs-sm);color:var(--c-text);margin-top:var(--sp-2)}
.event-desc b{color:var(--c-ink);font-weight:600}
.event-links{margin-top:var(--sp-2)}
.event-item-full{align-items:start}
.event-item-full .tag{margin-top:.25rem}
@media (max-width:767px){
  .event-item{grid-template-columns:auto minmax(0,1fr);gap:var(--sp-3);padding:var(--sp-3)}
  .event-item .tag{grid-column:2;justify-self:start}
  .event-date{width:3rem;height:3rem}
}

/* ---------- 7. 排行榜 ---------- */
.rank-panel{position:relative;background:#fff;border:1px solid var(--c-line);border-radius:var(--r-lg);
  padding:var(--sp-5);box-shadow:var(--sh-1);align-self:start}
.rank-panel h2{font-size:var(--fs-lg);margin-bottom:var(--sp-4);display:flex;align-items:center;gap:.5rem}
.rank-list li{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--sp-3);
  padding:.75rem .25rem;border-bottom:1px dashed var(--c-line);transition:background .2s var(--ease)}
.rank-list li:hover{background:var(--c-bg)}
.rank-list li:last-child{border-bottom:0}
.rank-no{width:1.75rem;height:1.75rem;border-radius:50%;display:grid;place-items:center;
  font-family:var(--font-num);font-weight:700;font-size:var(--fs-xs);background:var(--c-line);color:var(--c-muted)}
.rank-list li:nth-child(1) .rank-no{background:#FFD666;color:#7A4B00;box-shadow:0 0 0 4px rgba(255,214,102,.28)}
.rank-list li:nth-child(2) .rank-no{background:#DCE3EC;color:#4A5568}
.rank-list li:nth-child(3) .rank-no{background:#F5C39A;color:#7A3E12}
.rank-name{font-size:var(--fs-sm);font-weight:500;color:var(--c-ink)}
.rank-bar{grid-column:2;height:4px;border-radius:var(--r-full);background:var(--c-bg);overflow:hidden;margin-top:.25rem;
  display:none}
.rank-val{font-family:var(--font-num);font-size:var(--fs-sm);color:var(--c-primary);font-weight:700}
.rank-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:var(--sp-3)}
.rank-foot{margin-top:var(--sp-4);padding-top:var(--sp-3);border-top:1px solid var(--c-line);font-size:var(--fs-xs);color:var(--c-muted)}
@media (min-width:768px){
  .rank-list li{grid-template-columns:auto minmax(0,1.1fr) minmax(0,1fr) auto}
  .rank-bar{display:block}
  .rank-bar i{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--c-primary),var(--c-mint));
    transform-origin:left;transform:scaleX(0);transition:transform 1.1s var(--ease)}
  .rank-list.is-lit .rank-bar i{transform:scaleX(1)}
}

/* ---------- 8. 分类筛选栏 ---------- */
.filter-bar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-bottom:var(--sp-6)}
.filter-btn{padding:.5rem 1.125rem;border-radius:var(--r-full);border:1px solid var(--c-line);background:#fff;
  font-size:var(--fs-sm);font-weight:500;color:var(--c-text);transition:.22s var(--ease)}
.filter-btn:hover{border-color:var(--c-primary);color:var(--c-primary);transform:translateY(-1px)}
.filter-btn.is-active{background:var(--c-primary);border-color:var(--c-primary);color:#fff;box-shadow:0 4px 12px rgba(43,92,230,.26)}
.filter-count{margin-left:auto;font-size:var(--fs-sm);color:var(--c-muted)}
.filter-count b{font-family:var(--font-num);color:var(--c-primary)}
@keyframes card-in{from{opacity:0;transform:translateY(14px) scale(.985)}to{opacity:1;transform:none}}
.card.is-in{animation:card-in .4s var(--ease) both}
.empty-state{grid-column:1/-1;text-align:center;padding:var(--sp-8) var(--sp-4);color:var(--c-muted)}
.empty-state svg{margin:0 auto var(--sp-4)}

/* ---------- 9. 相册与灯箱 ---------- */
.photo-wall{columns:3 16rem;column-gap:var(--gutter)}
.photo-item{position:relative;display:block;break-inside:avoid;margin-bottom:var(--gutter);
  border-radius:var(--r-md);overflow:hidden;background:var(--c-primary-100);cursor:zoom-in}
.photo-item img{width:100%;height:auto;display:block;transition:transform .55s var(--ease),filter .35s var(--ease)}
.photo-item:hover img{transform:scale(1.06)}
.photo-item::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,transparent 45%,rgba(15,23,42,.72));
  opacity:0;transition:opacity .3s var(--ease)}
.photo-item:hover::after,.photo-item:focus-visible::after{opacity:1}
.photo-cap{position:absolute;left:0;right:0;bottom:0;z-index:1;padding:var(--sp-3);color:#fff;font-size:var(--fs-sm);
  transform:translateY(.5rem);opacity:0;transition:.3s var(--ease)}
.photo-item:hover .photo-cap,.photo-item:focus-visible .photo-cap{transform:none;opacity:1}
@media (max-width:767px){.photo-wall{columns:2 9rem}}

.lightbox{position:fixed;inset:0;z-index:var(--z-lightbox);background:rgba(9,14,26,.93);
  display:grid;place-items:center;padding:var(--sp-5);opacity:0;visibility:hidden;transition:.28s var(--ease)}
.lightbox.is-open{opacity:1;visibility:visible}
.lightbox figure{margin:0;display:grid;justify-items:center;gap:var(--sp-3);
  transform:scale(.94);transition:.3s var(--ease)}
.lightbox.is-open figure{transform:scale(1)}
.lightbox img{max-width:min(1100px,92vw);max-height:78vh;width:auto;height:auto;object-fit:contain;
  border-radius:var(--r-md);box-shadow:var(--sh-3)}
.lb-cap{color:#CBD5E1;font-size:var(--fs-sm)}
.lb-btn{position:absolute;display:grid;place-items:center;color:#fff;background:rgba(255,255,255,.12);
  border:1px solid rgba(255,255,255,.2);transition:.2s var(--ease)}
.lb-btn:hover{background:rgba(255,255,255,.26)}
.lb-close{top:1rem;right:1rem;width:2.75rem;height:2.75rem;border-radius:50%;font-size:1.5rem;line-height:1;
  top:max(1rem,env(safe-area-inset-top));right:max(1rem,env(safe-area-inset-right))}
.lb-prev,.lb-next{top:50%;transform:translateY(-50%);width:3rem;height:3rem;border-radius:50%;font-size:1.25rem}
.lb-prev{left:max(.75rem,env(safe-area-inset-left))}
.lb-next{right:max(.75rem,env(safe-area-inset-right))}
.lb-counter{position:absolute;top:1.25rem;left:1.25rem;color:#94A3B8;font-family:var(--font-num);font-size:var(--fs-sm);
  top:max(1.25rem,env(safe-area-inset-top));left:max(1.25rem,env(safe-area-inset-left))}
@media (max-width:767px){.lb-prev,.lb-next{width:2.5rem;height:2.5rem}.lightbox img{max-height:70vh}}

/* ---------- 10. 表单 ---------- */
.form-card{background:#fff;border:1px solid var(--c-line);border-radius:var(--r-lg);padding:var(--sp-7);box-shadow:var(--sh-1)}
.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 var(--sp-5)}
.field{display:flex;flex-direction:column;gap:.375rem;margin-bottom:var(--sp-5)}
.field-full{grid-column:1/-1}
.field label{font-size:var(--fs-sm);font-weight:600;color:var(--c-ink)}
.field .req{color:var(--c-danger);margin-left:.125rem}
.field-hint{font-size:var(--fs-xs);color:var(--c-muted)}
.input,.select,.textarea{width:100%;padding:.75rem .875rem;border:1px solid var(--c-line);border-radius:var(--r-sm);
  background:#fff;font-size:var(--fs-sm);color:var(--c-text);transition:border-color .2s var(--ease),box-shadow .2s var(--ease),background .2s var(--ease)}
.textarea{min-height:6.5rem;resize:vertical}
.input:focus,.select:focus,.textarea:focus{outline:none;border-color:var(--c-primary);box-shadow:0 0 0 3px rgba(43,92,230,.14)}
.field-error{font-size:var(--fs-xs);color:var(--c-danger);min-height:1.125rem;display:none}
.field.is-invalid .input,.field.is-invalid .select,.field.is-invalid .textarea{border-color:var(--c-danger);background:#FEF5F5}
.field.is-invalid .field-error,.field-check.is-invalid .field-error{display:block;animation:shake-in .3s var(--ease)}
@keyframes shake-in{0%{transform:translateX(-4px)}25%{transform:translateX(3px)}50%{transform:translateX(-2px)}100%{transform:none}}
.field.is-valid .input,.field.is-valid .select{border-color:var(--c-success)}
.char-left{font-size:var(--fs-xs);color:var(--c-muted);text-align:right;font-family:var(--font-num)}
.char-left.is-over{color:var(--c-danger)}
.field-check{display:flex;flex-wrap:wrap;align-items:flex-start;gap:.625rem;margin-bottom:var(--sp-5)}
.field-check input{width:1.125rem;height:1.125rem;margin-top:.2rem;accent-color:var(--c-primary);flex-shrink:0}
.field-check label{font-weight:400;font-size:var(--fs-sm);color:var(--c-text)}
.field-check .field-error{flex:0 0 100%;margin-left:1.75rem}
.field-check.is-invalid label{color:var(--c-danger)}
.radio-row{display:flex;flex-wrap:wrap;gap:var(--sp-3)}
.radio-card{position:relative;display:flex;align-items:center;gap:.5rem;padding:.625rem 1rem;border:1px solid var(--c-line);
  border-radius:var(--r-full);font-size:var(--fs-sm);cursor:pointer;transition:.2s var(--ease)}
.radio-card:hover{border-color:var(--c-primary);background:var(--c-primary-100)}
.radio-card input{position:absolute;opacity:0;width:0;height:0}
.radio-card.is-picked{border-color:var(--c-primary);background:var(--c-primary-100);color:var(--c-primary-600);font-weight:600}
.form-foot{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-4);margin-top:var(--sp-3)}
.form-note{font-size:var(--fs-xs);color:var(--c-muted)}
.form-notice{flex-basis:100%;margin:0;padding:.625rem .875rem;border-radius:var(--r-md);font-size:var(--fs-sm);background:var(--c-warning-bg,#FFF8E6);color:#8A5A00;border:1px solid #FDE68A}
.form-notice.is-error{background:#FEF2F2;color:#9B1C1C;border-color:#FECACA}
.form-notice.is-ok{background:#ECFDF5;color:#066641;border-color:#A7F3D0}
.api-note{margin:0 0 var(--sp-4);font-size:var(--fs-xs);color:var(--c-muted)}
.api-note b{color:var(--c-primary);font-family:var(--font-num)}
@media (max-width:767px){
  .form-card{padding:var(--sp-5) var(--sp-4)}
  .form-grid{grid-template-columns:minmax(0,1fr)}
}

/* 成功页 */
.result-card{max-width:34rem;margin-inline:auto;text-align:center;background:#fff;border:1px solid var(--c-line);
  border-radius:var(--r-lg);padding:var(--sp-8) var(--sp-6);box-shadow:var(--sh-2)}
.result-icon{width:5rem;height:5rem;margin:0 auto var(--sp-5);border-radius:50%;display:grid;place-items:center;
  background:rgba(22,163,74,.12);color:var(--c-success)}
.result-icon svg{width:2.75rem;height:2.75rem}
.result-icon path{stroke-dasharray:48;stroke-dashoffset:48;animation:draw .7s var(--ease) .2s forwards}
@keyframes draw{to{stroke-dashoffset:0}}
.result-card h1{font-size:var(--fs-h2);margin-bottom:var(--sp-3)}
.result-actions{display:flex;flex-wrap:wrap;gap:var(--sp-3);justify-content:center;margin-top:var(--sp-6)}
.result-meta{margin-top:var(--sp-5);padding-top:var(--sp-4);border-top:1px dashed var(--c-line);
  font-size:var(--fs-sm);color:var(--c-muted);display:grid;gap:.375rem}
.result-meta b{color:var(--c-ink);font-family:var(--font-num)}

/* ---------- 11. 详情页 ---------- */
.detail-hero{position:relative;background:var(--c-ink);color:#fff;padding:0;overflow:hidden}
.detail-cover{aspect-ratio:21/9;object-fit:cover;width:100%;opacity:.6}
.detail-overlay{position:absolute;inset:auto 0 0;padding:var(--sp-7) 0 var(--sp-6);
  background:linear-gradient(180deg,transparent,rgba(15,23,42,.92))}
.detail-overlay h1{color:#fff}
.detail-sub{margin-top:var(--sp-3);max-width:52rem;color:#E2E8F0;font-size:var(--fs-sm)}
.detail-actions{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3);margin-top:var(--sp-4)}
.info-strip{display:flex;flex-wrap:wrap;gap:var(--sp-5);padding:var(--sp-4) 0;border-bottom:1px solid var(--c-line);
  font-size:var(--fs-sm);color:var(--c-muted)}
.info-strip b{color:var(--c-ink);font-weight:600}
.person-card{display:flex;gap:var(--sp-4);align-items:center;padding:var(--sp-4);border:1px solid var(--c-line);
  border-radius:var(--r-md);background:#fff;transition:.25s var(--ease)}
.person-card:hover{box-shadow:var(--sh-2);transform:translateY(-3px)}
.avatar{width:3.25rem;height:3.25rem;border-radius:50%;display:grid;place-items:center;color:#fff;font-weight:700;
  background:linear-gradient(135deg,var(--c-primary),var(--c-mint));flex-shrink:0}
.person-card h3{font-size:var(--fs-base)}
.person-card p{font-size:var(--fs-xs);color:var(--c-muted)}
.dept-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(13rem,100%),1fr));gap:var(--sp-3)}
.dept-card{display:flex;align-items:baseline;justify-content:space-between;gap:var(--sp-3);
  padding:var(--sp-3) var(--sp-4);background:#fff;border:1px solid var(--c-line);border-radius:var(--r-md);transition:.25s var(--ease)}
.dept-card:hover{border-color:var(--c-primary-100);box-shadow:var(--sh-1);transform:translateY(-2px)}
.dept-card b{font-size:var(--fs-sm);color:var(--c-ink);font-weight:600}
.dept-card span{font-size:var(--fs-xs);color:var(--c-primary);font-family:var(--font-num)}
.side-sticky{position:sticky;top:calc(var(--header-h) + var(--sp-4))}
.side-cta{background:linear-gradient(135deg,var(--c-primary),#4A78F0);color:#fff;border-radius:var(--r-lg);padding:var(--sp-5)}
.side-cta h3{color:#fff;font-size:var(--fs-lg)}
.side-cta p{font-size:var(--fs-sm);color:rgba(255,255,255,.88);margin:var(--sp-2) 0 var(--sp-4)}
.side-facts{display:grid;gap:var(--sp-3);margin-top:var(--sp-5);font-size:var(--fs-sm)}
.side-facts div{display:flex;justify-content:space-between;gap:var(--sp-3);padding-bottom:var(--sp-2);border-bottom:1px dashed var(--c-line)}
.side-facts b{font-family:var(--font-num);color:var(--c-ink)}

/* ---------- 12. 时间线 ---------- */
.timeline{position:relative;padding-left:1.75rem}
.timeline::before{content:"";position:absolute;left:.4375rem;top:.75rem;bottom:.75rem;width:2px;
  background:linear-gradient(180deg,var(--c-primary),var(--c-mint));transform:scaleY(0);transform-origin:top;
  transition:transform 1s var(--ease)}
.timeline.is-lit::before{transform:scaleY(1)}
.timeline-item{position:relative;padding-bottom:var(--sp-6)}
.timeline-item:last-child{padding-bottom:0}
.timeline-item::before{content:"";position:absolute;left:-1.5rem;top:.4375rem;width:.75rem;height:.75rem;border-radius:50%;
  background:#fff;border:2px solid var(--c-primary);box-shadow:0 0 0 4px rgba(43,92,230,.12);transition:transform .3s var(--ease)}
.timeline-item:hover::before{transform:scale(1.35)}
.timeline-item time{font-family:var(--font-num);font-size:var(--fs-xs);color:var(--c-primary);font-weight:700}
.timeline-item h3{font-size:var(--fs-base);margin:.25rem 0 .25rem}
.timeline-item p{font-size:var(--fs-sm);color:var(--c-muted)}

/* ---------- 13. 通用块 ---------- */
.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(10rem,100%),1fr));gap:var(--sp-4)}
.stat{background:#fff;border:1px solid var(--c-line);border-radius:var(--r-md);padding:var(--sp-5);text-align:center;
  transition:.25s var(--ease)}
.stat:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:var(--c-primary-100)}
.stat b{display:block;font-family:var(--font-num);font-size:1.75rem;font-weight:700;color:var(--c-primary);line-height:1.2}
.stat span{font-size:var(--fs-xs);color:var(--c-muted)}
.step-list{counter-reset:step;display:grid;gap:var(--sp-4)}
.step-list>li{counter-increment:step;display:grid;grid-template-columns:auto minmax(0,1fr);gap:var(--sp-4);align-items:start;
  padding:var(--sp-4);background:#fff;border:1px solid var(--c-line);border-radius:var(--r-md)}
.step-list>li::before{content:counter(step,decimal-leading-zero);font-family:var(--font-num);font-weight:700;
  color:var(--c-primary);background:var(--c-primary-100);width:2.25rem;height:2.25rem;border-radius:var(--r-sm);display:grid;place-items:center}
.step-list h3{font-size:var(--fs-base)}
.step-list p{font-size:var(--fs-sm);color:var(--c-muted);margin-top:.25rem}

/* 色板 / 规范页 */
.swatch-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(10.5rem,100%),1fr));gap:var(--sp-4)}
.swatch{border:1px solid var(--c-line);border-radius:var(--r-md);overflow:hidden;background:#fff;font-size:var(--fs-xs)}
.swatch i{display:block;height:5rem}
.swatch div{padding:.625rem .75rem}
.swatch b{display:block;color:var(--c-ink)}
.swatch code{font-family:var(--font-num);color:var(--c-muted)}
.type-row{display:flex;align-items:baseline;gap:var(--sp-4);padding:var(--sp-3) 0;border-bottom:1px dashed var(--c-line);overflow:hidden}
.type-row small{font-family:var(--font-num);color:var(--c-muted);font-size:var(--fs-xs);margin-left:auto;flex-shrink:0}
.spec-table{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}
.spec-table th,.spec-table td{padding:.75rem;border-bottom:1px solid var(--c-line);text-align:left}
.spec-table th{background:var(--c-bg);color:var(--c-ink);font-weight:600}
.spec-table code{font-family:var(--font-num);font-size:var(--fs-xs);background:var(--c-primary-100);color:var(--c-primary-600);padding:.125rem .375rem;border-radius:4px}
.spec-table-wrap{overflow-x:auto;border:1px solid var(--c-line);border-radius:var(--r-md)}

/* ---------- 14. 滚动渐显动效 ---------- */
@keyframes fade-up{from{opacity:0;transform:translateY(22px)}to{opacity:1;transform:none}}
.reveal{opacity:0}
.reveal.is-visible{animation:fade-up .6s var(--ease) both}
.reveal[data-delay="1"]{animation-delay:.08s}
.reveal[data-delay="2"]{animation-delay:.16s}
.reveal[data-delay="3"]{animation-delay:.24s}
.reveal[data-delay="4"]{animation-delay:.32s}
.reveal[data-delay="5"]{animation-delay:.4s}
/* 无 JS 时兜底显示 */
.no-js .reveal,.reveal.no-anim{opacity:1}
.marquee{overflow:hidden;position:relative;isolation:isolate;border-block:1px solid var(--c-line);background:#fff;padding:.75rem 0}
.marquee-track{display:flex;gap:var(--sp-7);width:max-content;animation:marquee 28s linear infinite}
.marquee:hover .marquee-track{animation-play-state:paused}
.marquee span{display:inline-flex;align-items:center;gap:.5rem;font-size:var(--fs-sm);color:var(--c-muted);white-space:nowrap}
.marquee b{color:var(--c-primary);font-family:var(--font-num)}
@keyframes marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@media (prefers-reduced-motion:reduce){
  .marquee-track{animation:none}
  .reveal{opacity:1}
  .hero::before,.hero::after,.hero-float{animation:none}
  /* card-in 用 both 填充，动画被停用时会停在 opacity:0，必须显式补上终态 */
  .card.is-in{animation:none;opacity:1}
}

/* ---------- 15. 管理后台 ---------- */
.admin-login{display:flex;flex-wrap:wrap;gap:var(--sp-4);align-items:flex-end;padding:var(--sp-5);
  border:1px solid var(--c-line);border-radius:var(--r-lg);background:#fff;box-shadow:var(--sh-1)}
.admin-login .field{flex:1 1 16rem;min-width:0;margin:0}
/* 组件自带 display 会盖掉 [hidden] 的 UA 规则，必须全局补回 */
[hidden]{display:none !important}
.admin-hint{flex-basis:100%;margin:0;font-size:var(--fs-xs);color:var(--c-muted);line-height:1.7}
.admin-hint code{font-family:var(--font-num);font-size:.8125rem;background:var(--c-bg);padding:.0625rem .375rem;border-radius:4px}
.admin-notice{margin-top:var(--sp-4)}
.stat-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(11rem,100%),1fr));gap:var(--sp-4);margin:var(--sp-5) 0}
.stat-card{padding:var(--sp-4) var(--sp-5);border:1px solid var(--c-line);border-radius:var(--r-lg);background:linear-gradient(180deg,#fff,var(--c-bg))}
.stat-card b{display:block;font-family:var(--font-num);font-size:var(--fs-h2);color:var(--c-primary);line-height:1.15}
.stat-card span{font-size:var(--fs-xs);color:var(--c-muted)}
.admin-panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(20rem,100%),1fr));gap:var(--sp-4);margin-bottom:var(--sp-5);align-items:start}
.admin-panel{padding:var(--sp-5);border:1px solid var(--c-line);border-radius:var(--r-lg);background:#fff;margin:0}
.admin-panel h2{font-size:var(--fs-h3);margin-bottom:var(--sp-4)}
.trend{display:flex;align-items:flex-end;gap:.5rem;height:7rem}
.trend-bar{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:.375rem;height:100%}
.trend-bar i{width:100%;min-height:2px;border-radius:6px 6px 0 0;background:linear-gradient(180deg,var(--c-mint),var(--c-primary))}
.trend-bar i.is-zero{background:var(--c-line)}
.trend-bar small{font-size:var(--fs-xs);color:var(--c-muted);font-family:var(--font-num)}
.admin-tools{display:flex;flex-wrap:wrap;gap:var(--sp-3);align-items:center}
.admin-tools .input,.admin-tools .select{flex:0 1 13rem;min-width:9rem}
.admin-table td{white-space:nowrap}
.admin-table td:nth-child(4),.admin-table td:nth-child(8){white-space:normal}
.admin-table .op{display:inline-flex;gap:.5rem}
.data-empty{margin:0;padding:var(--sp-7);text-align:center;color:var(--c-muted)}
@media (max-width:767px){
  .admin-tools{width:100%}
  .admin-tools .input,.admin-tools .select{flex:1 1 100%}
  .admin-login .field{flex:1 1 100%}
}
