/* DO NOT EDIT — verbatim copy of SAFE_PLUS/public/css/card-structures-v3.css (abc06de5). The rig file is canonical; recopy on engine change. */
/* ============ THEME DESIGNER V3 — CARD STRUCTURES (spec 2026-07-12) ============
   Class contract shared by stackManager.js and theme-designer-admin preview.
   Structure A (v2 layout) retires: any .card-inner.v3 renders one of these. */

/* THE POP — universal (TN ruling 1). Size uses em so the operator's existing
   px overrides (inline style / stackFontSize) still win when set. No color:
   theme vars keep owning color. */
.card-inner.v3 .stack-card-message {
  font-size: 1.35em;
  font-weight: 750;
  line-height: 1.3;
  letter-spacing: -0.01em;
  text-shadow: 0 2px 10px rgba(0,0,0,.75), 0 1px 2px rgba(0,0,0,.9);
}
/* Name = small-caps eyebrow everywhere (D killed the vertical name). */
.card-inner.v3 .stack-card-name {
  text-transform: uppercase;
  letter-spacing: .16em;
  font-weight: 800;
  font-size: 12px;
  text-shadow: 0 1px 3px rgba(0,0,0,.7);
}

/* Layout resets: v3 stacks its own rows. */
.card-inner.v3 .stack-card-layout { display: block; }
.card-inner.v3 .v3-head { display: flex; align-items: center; gap: 8px; min-width: 0; margin-bottom: 6px; }
.card-inner.v3 .v3-head .stack-card-avatar img,
.card-inner.v3 .v3-head .stack-card-avatar-img { width: 26px; height: 26px; }

/* ── NICE badges: glow pills (TN ruling 3) ── */
.card-inner.v3 .stack-card-badge {
  display: inline-flex; align-items: center; gap: 3px; flex: none;
  font-size: 10px; font-weight: 800; letter-spacing: .07em;
  padding: 3px 8px; border-radius: 999px; color: #fff;
  border: 1px solid transparent;
  background: linear-gradient(rgba(10,10,16,.92), rgba(10,10,16,.92)) padding-box,
              linear-gradient(100deg, var(--b1, #ffd166), var(--b2, #ff5a99)) border-box;
  box-shadow: 0 1px 6px rgba(0,0,0,.5);
  text-shadow: 0 1px 2px rgba(0,0,0,.8);
}
.card-inner.v3 .stack-card-badge img { width: 12px; height: 12px; filter: drop-shadow(0 1px 1px rgba(0,0,0,.6)); }
.card-inner.v3 .bt-sub     { --b1:#ffd166; --b2:#ff9a3d; }
.card-inner.v3 .bt-vip     { --b1:#ff5a99; --b2:#c86bff; }
.card-inner.v3 .bt-mod     { --b1:#45e08a; --b2:#2bb8a3; }
.card-inner.v3 .bt-founder { --b1:#6ea8fe; --b2:#9d7bff; }
.card-inner.v3 .bt-gifter  { --b1:#c86bff; --b2:#6ea8fe; }
.card-inner.v3 .bt-streak  { --b1:#7cf0ff; --b2:#45e08a; }
.card-inner.v3 .bt-raider  { --b1:#ff7a5c; --b2:#ffd166; }
.card-inner.v3 .bt-any     { --b1:#ffd166; --b2:#ff5a99; }

/* ── badge strips: loop ONLY on overflow (TN ruling 2) ── */
.v3-bstrip { overflow: hidden; max-width: 100%; min-width: 0; flex: 1; }
.v3-bstrip.looping {
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}
.v3-btrack { display: inline-flex; gap: 5px; white-space: nowrap; will-change: transform; }
.v3-btrack .stack-card-badges { display: inline-flex; gap: 5px; flex-wrap: nowrap; }
.v3-bstrip.looping .v3-btrack { animation: v3bloop var(--loop-dur, 9s) linear infinite; }
/* !important is the contract: a static strip must NEVER show its dupe, and the
   vertical variant's display rules below would otherwise out-specificity this. */
.v3-bstrip:not(.looping) .v3-dupe { display: none !important; }
@keyframes v3bloop { to { transform: translateX(-50%); } }

/* vertical variant (D's rail) — absolutely pinned inside the rail (mockup's
   proven geometry): the strip must be CONSTRAINED by the rail's box, never
   grown by its own content, or scrollHeight can never overflow clientHeight
   and the loop never triggers. Rail is position:relative; 52px clears the
   avatar above. */
.v3-bstrip.v3-vert { position: absolute; top: 52px; bottom: 6px; left: 3px; right: 3px; display: flex; justify-content: center; }
.v3-bstrip.v3-vert.looping {
  -webkit-mask-image: linear-gradient(180deg, transparent, #000 12%, #000 88%, transparent);
          mask-image: linear-gradient(180deg, transparent, #000 12%, #000 88%, transparent);
}
.v3-bstrip.v3-vert .v3-btrack { display: flex; flex-direction: column; align-items: center; gap: 5px; white-space: normal; }
.v3-bstrip.v3-vert .v3-btrack .stack-card-badges { display: flex; flex-direction: column; align-items: center; gap: 5px; }
.v3-bstrip.v3-vert.looping .v3-btrack { animation: v3bloopV var(--loop-dur, 10s) linear infinite; }
@keyframes v3bloopV { to { transform: translateY(-50%); } }

/* ── C · GLASS SCRIM: frosted panel; opacity/blur are designer dials ── */
.struct-scrim .v3-panel {
  background: rgba(8, 9, 15, var(--scrim-opacity, .55));
  -webkit-backdrop-filter: blur(var(--scrim-blur, 7px));
          backdrop-filter: blur(var(--scrim-blur, 7px));
  border: 1px solid rgba(255,255,255,.14);
  border-radius: 11px;
  padding: 12px 14px;
  display: flex; flex-direction: column; gap: 7px;
}
.struct-scrim .v3-head { margin-bottom: 0; }

/* ── D · SPLIT RAIL: avatar top + vertical badge loop; name horizontal ── */
/* Selector carries .card-inner.v3 to beat the generic display:block reset above. */
.card-inner.v3.struct-rail .stack-card-layout { display: flex; gap: 12px; align-items: stretch; min-height: 120px; }
.struct-rail .v3-rail {
  position: relative; flex: none; width: 52px;
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  padding: 7px 4px;
  background: rgba(8,9,15,.5);
  -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px);
  border-radius: 10px; border: 1px solid rgba(255,255,255,.12);
}
.struct-rail .v3-rail .stack-card-avatar img,
.struct-rail .v3-rail .stack-card-avatar-img { width: 34px; height: 34px; }
.struct-rail .v3-rail .stack-card-badge { padding: 3px 5px; font-size: 8.5px; }
.struct-rail .v3-body { flex: 1; min-width: 0; display: flex; flex-direction: column; justify-content: center; gap: 6px; }

/* ── E · HEADLINE + FOOTER ── */
.struct-headline .v3-hero { padding: 4px 2px 10px; }
.struct-headline .v3-hero .stack-card-message { font-size: 1.45em; font-weight: 800; line-height: 1.25; letter-spacing: -0.015em; }
.struct-headline .v3-foot {
  display: flex; align-items: center; gap: 8px; min-width: 0;
  margin: 0 -2px -2px; padding: 8px 12px;
  background: linear-gradient(to top, rgba(8,9,15,.78), rgba(8,9,15,.35));
  -webkit-backdrop-filter: blur(5px); backdrop-filter: blur(5px);
  border-radius: 0 0 10px 10px;
}
.struct-headline .v3-foot .stack-card-avatar img,
.struct-headline .v3-foot .stack-card-avatar-img { width: 24px; height: 24px; }
.struct-headline .v3-foot .stack-card-name { font-size: 11px; flex: none; }

@media (prefers-reduced-motion: reduce) {
  .v3-bstrip.looping .v3-btrack { animation: none !important; }
}
