/* 想换成更圆润的字体：把字体文件放进 assets/fonts/，取消下面注释并改成你的文件名，
   这样完全离线也能用。默认走系统字体，打开最快。
@font-face{
  font-family:"Zen Maru Gothic";
  src:url("assets/fonts/ZenMaruGothic-Bold.ttf") format("truetype");
  font-weight:700;font-display:swap;
} */

/* ============================================================
   1. 设计变量
   ============================================================ */
:root{
  --font: "M PLUS Rounded 1c","Zen Maru Gothic","PingFang SC","Hiragino Sans GB",
          "MiSans","HarmonyOS Sans SC","Source Han Sans SC","Noto Sans SC",
          "Microsoft YaHei UI","Microsoft YaHei",system-ui,sans-serif;
  /* 刘海屏 / 小白条安全区 */
  --safe-t:env(safe-area-inset-top,0px);
  --safe-b:env(safe-area-inset-bottom,0px);
  /* 颜色 */
  --pink-600:#E84A7F;
  --pink-500:#FF5D8F;
  --pink-400:#FF8FB1;
  --pink-200:#FFD3E1;
  --pink-050:#FFEDF3;
  --cream:#FFF8F3;
  --ink:#4A3A44;
  --ink-soft:#918087;
  --ink-faint:#BCAAB2;
  --line:#EFE0D8;
  --grey-tag:#EDE7E4;
  --mint:#79D6BE;
  --gold:#FFC15E;
  --sky:#8FC7FF;
  --danger:#F0666B;

  /* 动效：时长与曲线统一管理，避免每条动画各写各的 */
  --dur-1:110ms;
  --dur-2:180ms;
  --dur-3:280ms;
  --dur-4:440ms;
  --ease-out:cubic-bezier(.22,1,.36,1);
  --ease-spring:cubic-bezier(.34,1.56,.64,1);
  --ease-soft:cubic-bezier(.65,.05,.36,1);

  /* 圆角与阴影 */
  --r-sm:10px;
  --r-md:14px;
  --r-lg:20px;
  --r-xl:26px;
  --sh-1:0 2px 0 rgba(74,58,68,.05), 0 4px 14px rgba(74,58,68,.06);
  --sh-2:0 6px 0 rgba(74,58,68,.05), 0 14px 30px rgba(74,58,68,.12);
  --sh-press:0 1px 0 rgba(74,58,68,.10);

  --card:84px;
  --label-w:132px;
}

/* ============================================================
   2. 基础
   ============================================================ */
*{box-sizing:border-box;}
html{-webkit-text-size-adjust:100%;}
html,body{height:100%;}
@supports (height:100dvh){html,body{height:100dvh;}}
body{
  margin:0;
  display:flex;
  flex-direction:column;
  overflow:hidden;
  color:var(--ink);
  background:var(--cream);
  font-family:var(--font);
  font-weight:500;
  -webkit-font-smoothing:antialiased;
  -webkit-tap-highlight-color:transparent;
  overscroll-behavior:none;
}
body.is-dragging{cursor:grabbing;}
body.is-dragging{user-select:none;-webkit-user-select:none;}
img{-webkit-user-drag:none;user-drag:none;}
button{font-family:inherit;}

::selection{background:var(--pink-200);color:var(--ink);}

/* ============================================================
   3. 背景装饰
   ============================================================ */
.bg{position:fixed;inset:0;z-index:0;overflow:hidden;pointer-events:none;}
.bg::before{
  content:"";position:absolute;inset:0;
  background:
    radial-gradient(120% 62% at 50% -12%, #FFE8F0 0%, rgba(255,232,240,0) 62%),
    radial-gradient(70% 46% at 6% 104%, #E7FAF2 0%, rgba(231,250,242,0) 60%),
    radial-gradient(66% 44% at 98% 100%, #FFF1DC 0%, rgba(255,241,220,0) 58%),
    rgba(255,249,245,var(--veil,.87));
}
.deco{position:absolute;display:block;}
.cloud{
  background:rgba(255,255,255,.86);
  border-radius:999px;
  filter:blur(.2px);
  box-shadow:0 6px 18px rgba(180,150,165,.06);
}
.cloud::before,.cloud::after{
  content:"";position:absolute;background:inherit;border-radius:999px;
}
.cloud::before{width:60%;height:150%;left:12%;bottom:38%;}
.cloud::after{width:42%;height:120%;right:8%;bottom:32%;}
.c1{width:132px;height:34px;top:12%;left:-160px;animation:drift 62s linear infinite;}
.c2{width:92px;height:26px;top:34%;left:-160px;animation:drift 88s linear -30s infinite;}
.c3{width:160px;height:40px;top:62%;left:-220px;animation:drift 104s linear -60s infinite;opacity:.72;}
.grass{
  left:0;right:0;bottom:0;height:130px;opacity:.5;
  background:
    repeating-linear-gradient(90deg,#E9F7DC 0 22px,#E1F2D0 22px 44px);
  border-radius:50% 50% 0 0 / 26px 26px;
  -webkit-mask-image:linear-gradient(to top,#000 24%,transparent);
  mask-image:linear-gradient(to top,#000 24%,transparent);
}
.star{color:var(--pink-400);font-size:18px;opacity:.55;animation:twinkle 4.4s var(--ease-soft) infinite;}
.s1{top:22%;left:6%;}
.s2{top:56%;right:7%;font-size:14px;animation-delay:-1.5s;}
.s3{top:8%;right:22%;color:var(--mint);font-size:22px;animation-delay:-2.6s;}

@keyframes drift{
  from{transform:translateX(0);}
  to{transform:translateX(calc(100vw + 320px));}
}
@keyframes twinkle{
  0%,100%{transform:scale(.85) rotate(0deg);opacity:.28;}
  50%{transform:scale(1.15) rotate(18deg);opacity:.7;}
}

/* ============================================================
   4. 顶栏
   ============================================================ */
.topbar{
  position:relative;z-index:6;
  flex:0 0 auto;
  display:flex;align-items:center;gap:16px;
  padding:calc(11px + var(--safe-t)) 22px 8px;
}
.brand{display:flex;align-items:center;gap:12px;min-width:0;}
.brand-text{min-width:0;}

.logo{
  position:relative;
  flex:0 0 auto;
  width:52px;height:52px;
  border-radius:17px;
  box-shadow:0 3px 0 rgba(232,74,127,.28), 0 10px 22px rgba(255,93,143,.28);
  animation:logo-in 620ms var(--ease-spring) both;
}
@keyframes logo-in{
  from{transform:translateY(-14px) scale(.8) rotate(-8deg);opacity:0;}
  to{transform:none;opacity:1;}
}

h1{
  margin:0;
  display:flex;align-items:center;gap:8px;
  font-size:19px;font-weight:800;letter-spacing:.2px;line-height:1.2;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.brand-name{font-weight:800;}
/* 「从夯到拉」做小一号的粉色胶囊，不抢群名 */
.brand-tag{
  flex:0 0 auto;
  padding:3px 10px 4px;
  font-size:12.5px;font-weight:800;letter-spacing:.6px;color:#fff;
  background:linear-gradient(180deg,#FF8FB5,#FF5D8F 60%,#F5508A);
  border-radius:999px;
  box-shadow:0 2px 0 #D93C6E, inset 0 2px 0 rgba(255,255,255,.45);
  transform:translateY(-1px);
}
.brand-sub{
  margin:2px 0 0;
  font-size:12px;font-weight:500;color:var(--ink-soft);
}

.tools{display:flex;align-items:center;gap:8px;margin-left:auto;flex-wrap:wrap;justify-content:flex-end;}

/* ============================================================
   5. 按钮（立体糖果键：底部实心投影 + 按下真下沉）
   ============================================================ */
.btn{
  --edge:#DECCC3;
  display:inline-flex;align-items:center;gap:6px;
  height:40px;padding:0 15px;
  font-size:14px;font-weight:700;color:var(--ink);
  background:linear-gradient(180deg,#FFFFFF 0%,#FFF5F7 100%);
  border:2px solid #FFFFFF;
  border-radius:var(--r-md);
  box-shadow:
    0 5px 0 var(--edge),
    0 10px 18px rgba(74,58,68,.14),
    inset 0 2px 0 #fff,
    inset 0 -3px 0 rgba(74,58,68,.05);
  cursor:pointer;
  transition:transform var(--dur-1) var(--ease-out),
             box-shadow var(--dur-1) var(--ease-out),
             background-color var(--dur-1) linear,
             border-color var(--dur-1) linear;
}
.btn:hover{
  transform:translateY(-2px);
  box-shadow:
    0 7px 0 var(--edge),
    0 15px 24px rgba(74,58,68,.17),
    inset 0 2px 0 #fff,
    inset 0 -3px 0 rgba(74,58,68,.05);
}
.btn:active{
  transform:translateY(4px);
  box-shadow:
    0 1px 0 var(--edge),
    0 2px 5px rgba(74,58,68,.12),
    inset 0 3px 7px rgba(74,58,68,.13);
}
.btn:focus-visible{outline:3px solid var(--sky);outline-offset:2px;}
.btn.primary{
  --edge:#C9315F;
  color:#fff;border-color:#FFB3CE;
  background:linear-gradient(180deg,#FF9CC0 0%,#FF6C99 52%,#F5508A 100%);
  box-shadow:
    0 5px 0 var(--edge),
    0 11px 20px rgba(255,93,143,.34),
    inset 0 2px 0 rgba(255,255,255,.6),
    inset 0 -3px 0 rgba(150,20,70,.18);
}
.btn.primary:hover{
  box-shadow:
    0 7px 0 var(--edge),
    0 16px 26px rgba(255,93,143,.42),
    inset 0 2px 0 rgba(255,255,255,.6),
    inset 0 -3px 0 rgba(150,20,70,.18);
}
.btn.primary:active{
  box-shadow:
    0 1px 0 var(--edge),
    0 2px 6px rgba(255,93,143,.3),
    inset 0 3px 7px rgba(150,20,70,.25);
}
.btn.ghost{--edge:#EFE3DC;color:var(--ink-soft);}
.btn.danger{--edge:#EBB9B9;color:var(--danger);border-color:#FFECEC;background:linear-gradient(180deg,#FFFFFF,#FFF3F3);}
/* 功能按钮：金色（战力检测） */
.btn.accent{
  --edge:#D9A032;
  color:#6B4A16;border-color:#FFE3A8;
  background:linear-gradient(180deg,#FFE39B 0%,#FFC15E 55%,#FFB039 100%);
  box-shadow:
    0 5px 0 var(--edge),
    0 11px 18px rgba(255,180,60,.32),
    inset 0 2px 0 rgba(255,255,255,.7),
    inset 0 -3px 0 rgba(160,100,10,.16);
}
.btn.accent:hover{
  box-shadow:
    0 7px 0 var(--edge),
    0 16px 24px rgba(255,180,60,.4),
    inset 0 2px 0 rgba(255,255,255,.7),
    inset 0 -3px 0 rgba(160,100,10,.16);
}
.btn.accent:active{
  box-shadow:0 1px 0 var(--edge), 0 2px 6px rgba(255,180,60,.3), inset 0 3px 7px rgba(160,100,10,.22);
}
.btn.small{height:36px;padding:0 13px;font-size:13px;}
.btn.icon{width:40px;padding:0;justify-content:center;font-size:17px;}
.btn[aria-pressed="false"]{opacity:.5;}
/* BGM 播放中：粉底高亮 */
#btn-bgm[aria-pressed="true"]{
  --edge:#D98BA8;
  background:linear-gradient(180deg,#FFE3EE,#FFC7DC);
  border-color:#FFB3CE;
  box-shadow:0 5px 0 var(--edge), 0 10px 18px rgba(255,93,143,.24), inset 0 2px 0 #fff;
}

/* 更多菜单 */
.menu{
  position:absolute;top:60px;right:22px;z-index:20;
  display:flex;flex-direction:column;
  min-width:190px;padding:6px;
  background:#fff;border:2px solid var(--line);border-radius:var(--r-md);
  box-shadow:var(--sh-2);
  transform-origin:top right;
  animation:menu-in var(--dur-3) var(--ease-spring) both;
}
.menu[hidden]{display:none;}
@keyframes menu-in{from{transform:scale(.9) translateY(-6px);opacity:0;}to{transform:none;opacity:1;}}
.menu button{
  height:38px;padding:0 12px;
  text-align:left;font-size:14px;font-weight:700;color:var(--ink);
  background:transparent;border:0;border-radius:var(--r-sm);cursor:pointer;
  transition:background-color var(--dur-1) linear;
}
.menu button:hover{background:var(--pink-050);}
.menu button.danger{color:var(--danger);}
.menu button.danger:hover{background:#FFF0F0;}
.menu-note{
  margin:6px 4px 2px;padding:8px 4px 0;
  border-top:1px solid var(--line);
  font-size:10.5px;font-weight:600;line-height:1.55;color:var(--ink-faint);
}

/* ============================================================
   6. 舞台 / 梯度榜
   ============================================================ */
.stage{
  position:relative;z-index:2;
  flex:1 1 auto;overflow-y:auto;overflow-x:hidden;
  padding:6px 22px 10px;
  scrollbar-width:thin;
  overscroll-behavior-y:contain;
  -webkit-overflow-scrolling:touch;
}
.board{
  display:flex;flex-direction:column;gap:10px;
  max-width:1180px;margin:0 auto;
}

.tier{
  --tier-ink:#fff;
  display:flex;align-items:stretch;
  min-height:88px;
  background:#fff;
  border:2px solid var(--line);
  border-radius:var(--r-lg);
  box-shadow:var(--sh-1);
  overflow:hidden;
  transition:box-shadow var(--dur-3) var(--ease-out),
             border-color var(--dur-2) linear,
             transform var(--dur-3) var(--ease-out);
  animation:tier-in var(--dur-4) var(--ease-out) both;
  animation-delay:calc(var(--ti,0) * 45ms);
}
@keyframes tier-in{
  from{transform:translateX(-26px);opacity:0;}
  to{transform:none;opacity:1;}
}
/* 入场动画只跑一次，播完把 transform 的控制权交还给 hover / 拖拽 */
.tier.entered{animation:none;}
.tier.drop-active{
  border-color:var(--tier-color);
  transform:translateY(-1px);
  box-shadow:0 0 0 4px color-mix(in srgb, var(--tier-color) 20%, transparent), var(--sh-2);
}
/* 落位后的一道光扫过 */
.tier.sweep::after{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(100deg,transparent 20%,color-mix(in srgb,var(--tier-color) 34%,transparent) 48%,transparent 74%);
  animation:sweep 620ms var(--ease-out) both;
}
.tier{position:relative;}
@keyframes sweep{
  from{transform:translateX(-100%);opacity:.9;}
  to{transform:translateX(100%);opacity:0;}
}

.tier-label{
  position:relative;
  flex:0 0 var(--label-w);
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  padding:10px 14px 10px 8px;
  background:var(--tier-color);
  color:var(--tier-ink);
  border:0;cursor:pointer;
  box-shadow:inset 0 3px 0 rgba(255,255,255,.26), inset 0 -6px 0 rgba(0,0,0,.10);
  transition:filter var(--dur-2) linear;
}
.tier-label:hover{filter:brightness(1.05) saturate(1.05);}
.tier-label:focus-visible{outline:3px solid var(--sky);outline-offset:-4px;}
/* 右侧斜切箭头，做出赛道指示感 */
.tier-label::after{
  content:"";position:absolute;right:-18px;top:0;bottom:0;width:20px;
  background:var(--tier-color);
  clip-path:polygon(0 0,100% 50%,0 100%);
  transition:filter var(--dur-2) linear;
}
.tier-emoji{font-size:20px;line-height:1;filter:drop-shadow(0 2px 2px rgba(0,0,0,.14));}
.tier-name{
  font-size:19px;font-weight:800;letter-spacing:.5px;line-height:1.1;
  text-shadow:0 2px 0 rgba(0,0,0,.10);
  max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.tier-tag{
  font-size:10.5px;font-weight:700;letter-spacing:.6px;
  padding:2px 7px;border-radius:999px;
  background:color-mix(in srgb,var(--tier-ink) 22%,transparent);
  white-space:nowrap;
}

.dropzone{
  position:relative;
  flex:1 1 auto;min-width:0;
  display:flex;flex-wrap:wrap;align-content:flex-start;gap:10px;
  padding:10px 12px 10px 26px;
  min-height:84px;
  transition:background-color var(--dur-2) linear;
}
.tier.drop-active .dropzone{background:color-mix(in srgb,var(--tier-color) 7%,#fff);}
.dropzone.is-empty::after{
  content:attr(data-hint);
  display:flex;align-items:center;justify-content:center;
  width:100%;height:100%;min-height:76px;
  font-size:13px;font-weight:700;color:var(--ink-faint);
  border:2px dashed var(--line);border-radius:var(--r-md);
  transition:border-color var(--dur-2) linear,color var(--dur-2) linear;
}
.tier.drop-active .dropzone.is-empty::after{border-color:var(--tier-color);color:var(--tier-color);}

/* 增加梯度 */
.add-tier{
  display:block;width:100%;max-width:1180px;margin:10px auto 0;
  height:46px;
  font-size:13.5px;font-weight:700;color:var(--ink-soft);
  background:rgba(255,255,255,.6);
  border:2px dashed var(--line);border-radius:var(--r-lg);
  cursor:pointer;
  box-shadow:0 3px 0 rgba(74,58,68,.05);
  transition:border-color var(--dur-2) linear,color var(--dur-2) linear,background-color var(--dur-2) linear,transform var(--dur-2) var(--ease-out);
}
.add-tier:hover{color:var(--pink-500);border-color:var(--pink-400);background:#fff;transform:translateY(-2px);}

.tips{
  max-width:1180px;margin:12px auto 4px;
  font-size:12px;color:var(--ink-faint);text-align:center;line-height:1.7;
}
.tips b{color:var(--ink-soft);}

/* ============================================================
   7. 卡片
   ============================================================ */
.card{
  position:relative;
  width:var(--card);
  flex:0 0 auto;
  padding:4px 4px 0;
  background:#fff;
  border-radius:var(--r-md);
  box-shadow:0 3px 0 rgba(74,58,68,.07), 0 8px 16px rgba(74,58,68,.11);
  cursor:grab;
  touch-action:none;
  user-select:none;
  transition:transform var(--dur-2) var(--ease-out), box-shadow var(--dur-2) var(--ease-out);
  animation:card-in var(--dur-4) var(--ease-spring) both;
  animation-delay:calc(var(--i,0) * 26ms);
  will-change:transform;
}
@keyframes card-in{
  from{transform:translateY(12px) scale(.86) rotate(-3deg);opacity:0;}
  to{transform:none;opacity:1;}
}
.card.entered{animation:none;}
.card:hover{transform:translateY(-4px) rotate(-1.2deg);box-shadow:0 5px 0 rgba(74,58,68,.07), 0 16px 26px rgba(74,58,68,.17);}
.card:focus-visible{outline:3px solid var(--sky);outline-offset:2px;}

.thumb{
  position:relative;
  width:100%;aspect-ratio:1/1;
  display:grid;place-items:center;
  overflow:hidden;
  border-radius:11px;
  background:var(--c-soft,var(--pink-050));
}
.thumb img{width:100%;height:100%;object-fit:cover;object-position:top center;pointer-events:none;}
.thumb .initial{
  font-size:30px;font-weight:800;color:#fff;
  text-shadow:0 2px 0 rgba(0,0,0,.12);
  transform:translateY(1px);
}
/* 无立绘时的可爱占位：底色 + 马耳剪影 */
.thumb .ph-ear{
  position:absolute;top:6px;left:50%;
  width:26px;height:16px;transform:translateX(-50%);
  opacity:.5;
}
.thumb .ph-ear::before,.thumb .ph-ear::after{
  content:"";position:absolute;top:0;width:11px;height:14px;
  background:rgba(255,255,255,.85);
  border-radius:60% 60% 20% 20%;
}
.thumb .ph-ear::before{left:0;transform:rotate(-18deg);}
.thumb .ph-ear::after{right:0;transform:rotate(18deg);}
.thumb .gloss{
  position:absolute;inset:0;
  background:linear-gradient(150deg,rgba(255,255,255,.45),transparent 46%);
  pointer-events:none;
}

.card .name{
  display:block;
  padding:4px 2px 5px;
  font-size:10.5px;font-weight:700;line-height:1.2;text-align:center;color:var(--ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
/* 名字特别长的卡（比如 Steam 广告位），字号自动缩小一点 */
.card .name.name-xs{font-size:8.5px;letter-spacing:-.2px;}

.card-menu{
  position:absolute;top:-6px;right:-6px;
  width:24px;height:24px;
  display:grid;place-items:center;
  font-size:14px;font-weight:800;line-height:1;color:var(--ink);
  background:#fff;border:2px solid var(--line);border-radius:999px;
  box-shadow:0 2px 6px rgba(74,58,68,.16);
  cursor:pointer;
  opacity:0;transform:scale(.7);
  transition:opacity var(--dur-2) var(--ease-out),transform var(--dur-2) var(--ease-spring),border-color var(--dur-1) linear;
}
.card:hover .card-menu,.card:focus-within .card-menu{opacity:1;transform:none;}
.card-menu:hover{border-color:var(--pink-400);color:var(--pink-600);}
.card-menu:focus-visible{opacity:1;transform:none;outline:3px solid var(--sky);outline-offset:1px;}
@media (hover:none){.card-menu{opacity:1;transform:none;}}

/* 被选中（键盘操作） */
.card.is-active{outline:3px solid var(--pink-400);outline-offset:2px;}

/* 拖拽中 */
.card.is-dragging{
  position:fixed;left:0;top:0;
  z-index:999;
  margin:0;
  cursor:grabbing;
  pointer-events:none;
  box-shadow:0 22px 40px rgba(74,58,68,.26), 0 4px 0 rgba(74,58,68,.06);
  animation:none;
}
.card.pop{animation:card-pop 420ms var(--ease-spring);}
@keyframes card-pop{
  0%{transform:scale(1);}
  38%{transform:scale(1.13) rotate(2.5deg);}
  70%{transform:scale(.97) rotate(-1deg);}
  100%{transform:none;}
}

.placeholder{
  flex:0 0 auto;
  border-radius:var(--r-md);
  border:2px dashed var(--pink-200);
  background:rgba(255,255,255,.72);
  animation:placeholder-in var(--dur-2) var(--ease-out) both;
}
@keyframes placeholder-in{from{transform:scale(.9);opacity:0;}to{transform:none;opacity:1;}}

.drag-layer{position:fixed;inset:0;z-index:998;pointer-events:none;}

/* 拖入图片文件时的全屏提示 */
body.is-file-hover::after{
  content:"松手就把图片变成卡片 🐴";
  position:fixed;inset:14px;z-index:1100;
  display:grid;place-items:center;
  font-size:18px;font-weight:800;color:var(--pink-600);
  background:rgba(255,241,246,.86);
  border:3px dashed var(--pink-400);border-radius:var(--r-xl);
  pointer-events:none;
}

/* ============================================================
   8. 待命马厩（底部）
   ============================================================ */
.dock{
  position:relative;z-index:5;
  flex:0 0 auto;
  display:flex;align-items:stretch;gap:12px;
  width:calc(100% - 44px);max-width:1180px;
  margin:0 auto 8px;padding:10px 12px 10px 0;
  background:#fff;
  border:2px solid var(--line);border-radius:var(--r-xl);
  box-shadow:var(--sh-1);
  animation:dock-in var(--dur-4) var(--ease-spring) both 120ms;
}
@keyframes dock-in{from{transform:translateY(26px);opacity:0;}to{transform:none;opacity:1;}}
.dock-label{
  flex:0 0 62px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  margin-left:0;
  font-size:12px;font-weight:800;color:#fff;
  background:linear-gradient(165deg,#9FE3CF,#5CC9AE);
  border-radius:var(--r-xl) 0 var(--r-xl) var(--r-xl);
  letter-spacing:1px;
}
.dock-label span{font-size:10px;opacity:.9;}
.dock-label strong{font-size:15px;text-shadow:0 2px 0 rgba(0,0,0,.10);}

.dock-zone{
  flex:1 1 auto;
  display:flex;align-items:center;gap:10px;
  min-width:0;min-height:90px;
  padding:6px 4px;
  flex-wrap:nowrap;
  overflow-x:auto;overflow-y:hidden;
  align-content:center;
  scrollbar-width:thin;
}
.dock-zone.is-empty{justify-content:center;}

.dock.drop-active{border-color:var(--mint);box-shadow:0 0 0 4px rgba(121,214,190,.22), var(--sh-2);}
.dock-zone.is-empty::after{
  content:"把卡片拖回这里 = 先不排名";
  display:grid;place-items:center;
  width:100%;height:88px;
  font-size:13px;font-weight:700;color:var(--ink-faint);
  border:2px dashed var(--line);border-radius:var(--r-md);
  background-image:url("assets/free/pastel-unicorn.svg");
  background-repeat:no-repeat;
  background-position:calc(50% - 118px) center;
  background-size:52px 52px;
  background-position:calc(50% - 132px) center;
}
.dock.drop-active .dock-zone.is-empty::after{border-color:var(--mint);color:#4FB79B;}

/* ============================================================
   8.5 立绘装饰（用群友的 AI 立绘）
   ============================================================ */
/* 待命马厩上沿探头的群友头像 */
.peek-badge{
  position:absolute;right:110px;bottom:calc(100% - 18px);z-index:2;
  width:78px;height:78px;padding:3px;
  background:#fff;border-radius:999px;
  box-shadow:0 4px 0 rgba(74,58,68,.08), 0 12px 20px rgba(74,58,68,.2);
  cursor:pointer;
  transition:transform var(--dur-3) var(--ease-spring), box-shadow var(--dur-3) var(--ease-out);
}
.peek-badge img{
  width:100%;height:100%;border-radius:999px;object-fit:cover;object-position:center 18%;
  animation:bob-peek 4.6s var(--ease-soft) infinite -1.4s;
}
.peek-badge:hover{transform:translateY(-7px) scale(1.06) rotate(-2deg);box-shadow:0 6px 0 rgba(74,58,68,.08), 0 18px 26px rgba(74,58,68,.24);}
.peek-badge:active{transform:translateY(-1px) scale(.98);}
@media (max-width:1000px){.peek-badge{width:64px;height:64px;right:40px;}}
@media (max-width:620px){.peek-badge{display:none;}}
body.present .peek-badge{display:none;}

@keyframes bob-peek{
  0%,100%{transform:translateY(0);}
  50%{transform:translateY(-5px);}
}

/* 底部致谢 */
.credit{
  position:relative;z-index:5;
  flex:0 0 auto;
  margin:0 0 10px;
  font-size:11.5px;font-weight:700;letter-spacing:.4px;
  color:var(--ink-faint);text-align:center;
}
.credit b{color:var(--pink-600);}

.add-card{
  flex:0 0 104px;
  align-self:center;
  max-height:112px;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  font-size:12px;font-weight:800;color:#fff;
  background:linear-gradient(180deg,#FF9CC0,#FF6C99 55%,#F5508A);
  border:2px solid #FFB3CE;border-radius:var(--r-lg);
  cursor:pointer;
  box-shadow:
    0 5px 0 #C9315F,
    0 12px 20px rgba(255,93,143,.3),
    inset 0 2px 0 rgba(255,255,255,.55);
  transition:transform var(--dur-2) var(--ease-out),box-shadow var(--dur-2) var(--ease-out),filter var(--dur-2) linear;
}
.add-card .plus{font-size:22px;}
.add-card:hover{
  transform:translateY(-2px);
  box-shadow:0 7px 0 #C9315F,0 16px 26px rgba(255,93,143,.36),inset 0 2px 0 rgba(255,255,255,.55);
  filter:brightness(1.03);
}
.add-card:active{
  transform:translateY(4px);
  box-shadow:0 1px 0 #C9315F,0 2px 6px rgba(255,93,143,.3),inset 0 3px 8px rgba(150,20,70,.22);
}

/* ============================================================
   9. 提示 / 粒子
   ============================================================ */
.toast{
  position:fixed;left:50%;bottom:152px;z-index:1200;
  padding:10px 18px;
  font-size:13.5px;font-weight:700;color:var(--ink);
  background:#fff;border:2px solid var(--line);border-radius:999px;
  box-shadow:var(--sh-2);
  opacity:0;transform:translate(-50%,12px) scale(.94);
  pointer-events:none;
  transition:opacity var(--dur-3) var(--ease-out),transform var(--dur-3) var(--ease-spring);
  max-width:min(80vw,620px);text-align:center;
}
.toast.show{opacity:1;transform:translate(-50%,0) scale(1);}
body.present .toast{bottom:24px;}

.spark{position:fixed;z-index:1100;pointer-events:none;font-size:14px;line-height:1;}

/* ============================================================
   10. 弹窗
   ============================================================ */
.dialog{
  padding:0;border:0;background:transparent;
  max-width:min(92vw,520px);
}
.dialog.wide{max-width:min(94vw,780px);}
.dialog::backdrop{background:rgba(74,58,68,.28);backdrop-filter:blur(3px);}
.dialog[open] .dialog-card{animation:dialog-in var(--dur-4) var(--ease-spring) both;}
@keyframes dialog-in{from{transform:translateY(18px) scale(.94);opacity:0;}to{transform:none;opacity:1;}}
.dialog-card{
  padding:20px 22px 16px;
  background:#fff;
  border:2px solid var(--line);border-radius:var(--r-xl);
  box-shadow:var(--sh-2);
  max-height:88vh;overflow:auto;
}
.dialog-card h2{
  margin:0 0 16px;
  font-size:17px;font-weight:800;
}
.dialog-card h2::before{
  content:"";display:inline-block;width:10px;height:10px;margin-right:8px;
  background:var(--pink-400);border-radius:3px;transform:rotate(45deg) translateY(-1px);
}
.edit-row{display:flex;gap:18px;align-items:flex-start;}
.edit-col{display:flex;flex-direction:column;gap:12px;}
.fields{flex:1 1 auto;display:flex;flex-direction:column;gap:12px;min-width:0;}

.preview{
  flex:0 0 118px;width:118px;height:118px;
  display:grid;place-items:center;
  border-radius:var(--r-lg);
  border:2px dashed var(--line);
  background:var(--pink-050);
  overflow:hidden;
}
.preview img{width:100%;height:100%;object-fit:cover;object-position:top center;}
.preview .initial{font-size:38px;font-weight:800;color:#fff;text-shadow:0 2px 0 rgba(0,0,0,.12);}

.field{display:flex;flex-direction:column;gap:6px;font-size:12.5px;font-weight:700;color:var(--ink-soft);}
.field input{
  height:40px;padding:0 12px;
  font:inherit;font-size:14px;font-weight:700;color:var(--ink);
  background:#FFFBF9;
  border:2px solid var(--line);border-radius:var(--r-md);
  transition:border-color var(--dur-2) linear,background-color var(--dur-2) linear;
}
.field textarea{
  padding:10px 12px;
  font:inherit;font-size:14px;font-weight:700;color:var(--ink);line-height:1.7;
  background:#FFFBF9;
  border:2px solid var(--line);border-radius:var(--r-md);
  resize:vertical;min-height:150px;
  transition:border-color var(--dur-2) linear,background-color var(--dur-2) linear;
}
#card-review{min-height:86px;}
.field input:focus,.field textarea:focus{outline:none;border-color:var(--pink-400);background:#fff;}
.hint{margin:2px 0 0;font-size:11.5px;font-weight:500;color:var(--ink-faint);line-height:1.6;}
.upload-row{display:flex;gap:8px;flex-wrap:wrap;}

.swatches{display:flex;gap:8px;flex-wrap:wrap;}
.swatch{
  width:32px;height:32px;padding:0;
  border:2px solid #fff;border-radius:10px;
  box-shadow:0 0 0 2px var(--line);
  cursor:pointer;
  transition:transform var(--dur-2) var(--ease-spring),box-shadow var(--dur-2) linear;
}
.swatch:hover{transform:scale(1.1);}
.swatch[aria-pressed="true"]{box-shadow:0 0 0 3px var(--ink);transform:scale(1.06);}

.dialog-actions{display:flex;align-items:center;gap:10px;margin-top:18px;}
.dialog-actions .spacer{flex:1 1 auto;}

/* ============================================================
   10.5 战力检测器
   ============================================================ */
.power-sub{
  margin:-8px 0 14px;
  font-size:12.5px;font-weight:600;color:var(--ink-soft);
}
.power-stage{
  padding:18px 16px 16px;
  text-align:center;
  background:linear-gradient(180deg,#FFF6E8,#FFF9F5 60%,#FFF3F7);
  border:2px solid var(--line);border-radius:var(--r-lg);
}
.power-num{
  display:flex;align-items:baseline;justify-content:center;gap:6px;
  font-size:48px;font-weight:800;line-height:1;color:var(--ink);
  font-variant-numeric:tabular-nums;
  text-shadow:0 3px 0 rgba(74,58,68,.06);
}
.power-num em{font-size:15px;font-style:normal;font-weight:800;color:var(--ink-soft);}
.power-num.counting{animation:pulse-num .5s var(--ease-spring) infinite alternate;}
@keyframes pulse-num{from{transform:scale(1);}to{transform:scale(1.03);}}
.power-gauge{
  height:12px;max-width:320px;margin:16px auto 12px;
  background:#EFE1DA;border-radius:999px;overflow:hidden;
  box-shadow:inset 0 2px 4px rgba(74,58,68,.12);
}
.power-gauge i{
  display:block;height:100%;width:0;border-radius:999px;
  background:linear-gradient(90deg,#FFD36E,#FF8FB1 55%,#FF5D8F);
  transition:width 260ms var(--ease-out);
}
.power-tier{
  display:inline-flex;align-items:center;gap:6px;
  padding:5px 14px;
  font-size:13px;font-weight:800;color:#fff;
  background:var(--tier-color,#FF5D8F);
  border-radius:999px;
  box-shadow:0 3px 0 rgba(0,0,0,.12), inset 0 2px 0 rgba(255,255,255,.3);
  transition:background-color var(--dur-2) linear;
}
.power-tier span{font-size:15px;}
.power-row{
  display:flex;align-items:flex-end;gap:10px;
  margin-top:14px;
}
.power-row .field{flex:1 1 auto;}
.power-row .btn{flex:0 0 auto;height:40px;}
.power-flavor{
  min-height:20px;
  margin:12px 0 0;
  font-size:12.5px;font-weight:600;line-height:1.7;color:var(--ink-soft);
  text-align:center;
}

/* ============================================================
   10.6 卡片档案
   ============================================================ */
.detail-head{display:flex;gap:18px;align-items:flex-start;}
.detail-pic{
  position:relative;
  flex:0 0 236px;width:236px;
  display:grid;place-items:center;
  aspect-ratio:1/1;
  border-radius:var(--r-lg);overflow:hidden;
  background:#F6EFEA;
  box-shadow:0 6px 0 #EFE3DC, 0 16px 26px rgba(74,58,68,.18);
}
.detail-pic img{width:100%;height:100%;object-fit:cover;object-position:center top;}
.detail-pic .detail-initial{
  display:none;
  font-size:88px;font-weight:800;color:#fff;
  text-shadow:0 3px 0 rgba(0,0,0,.12);
}
.detail-info{flex:1 1 auto;min-width:0;}
.detail-info h2{margin:0 0 8px;font-size:22px;}
.detail-badges{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:2px;}
.detail-tier{
  display:inline-flex;align-items:center;gap:5px;
  padding:5px 13px;
  font-size:13px;font-weight:800;color:#fff;
  background:var(--tier-color,#A9B7D0);
  border-radius:999px;
  box-shadow:0 3px 0 rgba(0,0,0,.12), inset 0 2px 0 rgba(255,255,255,.3);
}
.detail-rank{
  display:inline-flex;align-items:center;
  padding:5px 13px;
  font-size:12.5px;font-weight:800;color:var(--ink-soft);
  background:#F5EEEA;border-radius:999px;
}
.detail-list{
  display:grid;grid-template-columns:auto 1fr;
  gap:9px 12px;margin:14px 0 0;
  font-size:13px;
}
.detail-list dt{
  font-weight:800;color:var(--ink-soft);white-space:nowrap;
  padding-top:1px;
}
.detail-list dd{
  margin:0;font-weight:600;line-height:1.75;color:var(--ink);
  overflow-wrap:anywhere;white-space:pre-line;
}
.detail-list dd:empty::after{content:"—";color:var(--ink-faint);}
.detail-shield{
  margin:16px 0 0;padding:10px 13px;
  font-size:11.5px;font-weight:600;line-height:1.7;color:#8A6A3F;
  background:#FFF7E6;border:1.5px dashed #F0D9A8;border-radius:var(--r-md);
}

/* 底部叠甲 */
.disclaimer{
  position:relative;z-index:5;flex:0 0 auto;
  margin:0 12px calc(8px + var(--safe-b));
  font-size:10.5px;font-weight:600;line-height:1.6;
  color:var(--ink-faint);text-align:center;
}

/* ============================================================
   11. 展示模式
   ============================================================ */
.exit-present{display:none;}
body.present{--card:112px;--label-w:170px;}
body.present .tools,
body.present .dock,
body.present .tips,
body.present .add-tier,
body.present .card-menu{display:none;}
body.present .topbar{padding:18px 26px 12px;}
body.present .tier-name{font-size:23px;}
body.present .tier-emoji{font-size:24px;}
body.present .card .name{font-size:13px;padding:7px 2px 8px;}
body.present .exit-present{
  display:block;position:fixed;right:22px;bottom:22px;z-index:50;
  height:44px;padding:0 20px;
  font-size:14px;font-weight:800;color:var(--ink);
  background:#fff;border:2px solid var(--line);border-radius:999px;
  box-shadow:var(--sh-2);cursor:pointer;
}
body.present .stage{padding:6px 26px 26px;}

/* ============================================================
   11.5 访客只读模式（发布出去后别人不可编辑）
   ============================================================ */
body.guest .card-menu,
body.guest #btn-add-card,
body.guest #detail-edit,
body.guest .menu button[data-act="bulk"],
body.guest .menu button[data-act="import-json"],
body.guest .menu button[data-act="reset"]{display:none !important;}
.guest-note{display:none;}
body.guest .guest-note{display:block;}
/* 访客模式下 Dock 只剩待命区，把添加按钮的位置让给卡片 */
body.guest .dock{padding-right:14px;}

/* ============================================================
   11.6 触屏（手机）适配
   ============================================================ */
/* 按钮类：去掉 300ms 延迟和双击缩放 */
.btn,.add-card,.add-tier,.tier-label,.card-menu,.swatch,.menu button,.exit-present{
  touch-action:manipulation;
}
/* 长按卡片不要弹 iOS 的「拷贝/存储图片」菜单 */
.card,.peek-badge,.detail-pic{-webkit-touch-callout:none;}
/* 手机上给拖拽留白：横向留白 + 行间距都能滑动滚动 */
@media (pointer:coarse){
  .tier-label{touch-action:pan-y;}
  .dropzone{touch-action:pan-y;}
  .card-menu{width:30px;height:30px;top:-8px;right:-8px;}
  .btn{min-height:44px;}          /* 手指友好 */
  .btn.icon{min-width:44px;}
  .swatch{width:38px;height:38px;}
}

/* ============================================================
   12. 响应式 / 无障碍
   ============================================================ */
@media (max-width:1080px){
  :root{--card:80px;--label-w:118px;}
  .btn span{display:none;}
  .btn{padding:0 12px;}
  .btn.primary span{display:inline;}
}
@media (max-width:720px){
  :root{--card:68px;--label-w:88px;}
  h1{font-size:16px;}
  .brand-sub{display:none;}
  .topbar{padding:10px 12px 8px;gap:8px;flex-wrap:wrap;row-gap:8px;}
  .brand{width:100%;}
  .tools{
    width:100%;margin-left:0;justify-content:flex-start;
    flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;
    padding-bottom:4px;scrollbar-width:none;
  }
  .tools .btn{flex:0 0 auto;}
  .tools::-webkit-scrollbar{display:none;}
  .menu{position:fixed;top:auto;bottom:150px;right:12px;}
  .stage{padding:4px 12px 8px;}
  .tier{min-height:80px;border-radius:var(--r-md);}
  .tier-name{font-size:14px;}
  .tier-tag{font-size:9px;padding:1px 5px;}
  .dropzone{padding:8px 8px 8px 18px;gap:8px;min-height:78px;}
  .dock{width:calc(100% - 24px);margin-bottom:10px;padding:8px 8px 8px 0;}
  .dock-label{flex-basis:50px;font-size:10px;}
  .dock-label strong{font-size:12px;}
  .add-card{flex-basis:74px;font-size:11px;}
  .dock-zone{min-height:78px;}
  .dock-zone.is-empty::after{height:70px;font-size:12px;}
  .credit{font-size:10.5px;}
  .disclaimer{font-size:9.5px;}
  .tips{display:none;}
  .edit-row{flex-direction:column;}
  .preview{width:100%;height:150px;}
  .power-row{flex-direction:column;align-items:stretch;}
  .power-row .btn{width:100%;}
  .power-num{font-size:38px;}
  .detail-head{flex-direction:column;align-items:center;}
  .detail-pic{flex:0 0 auto;width:min(72vw,240px);}
  .detail-list{grid-template-columns:1fr;gap:3px 0;}
  .detail-list dd{margin-bottom:8px;}
}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:.001ms !important;
    animation-delay:0ms !important;
    transition-duration:.001ms !important;
  }
}
