/* ============================================================
   Z-VENUE — animated visitor journey (ticketing-solution page)
   Discover → book → pay → QR ticket → scan in at the Hikvision
   turnstile → join → scan out (one-time QR). Driven by
   js/zvenue.js via [data-step] + .is-a/.is-b/.is-c/.is-d.
   Navy/amber per tokens.css; green/red only for gate status.
   ============================================================ */
.zv-intro { max-inline-size: 46rem; color: var(--text-muted); font-size: var(--fs-lg); margin: 0 0 var(--sp-4); }
.zv-intro strong { color: var(--text); }

.zv {
  --ok: #1f9d55; --ok-soft: #e3f6eb; --bad: #d64545; --bad-soft: #fde8e8;
  display: grid; grid-template-columns: minmax(0, 20rem) minmax(0, 1fr);
  gap: var(--sp-4); align-items: stretch;
}
.zv > * { min-inline-size: 0; }

/* ---------- step list ---------- */
.zv__steps {
  list-style: none; margin: 0; padding: .5rem;
  display: flex; flex-direction: column; gap: .2rem;
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg);
  box-shadow: var(--shadow-1);
}
.zv__step {
  all: unset; box-sizing: border-box; cursor: pointer; inline-size: 100%;
  display: grid; grid-template-columns: auto 1fr; column-gap: .8rem;
  padding: .65rem .75rem; border-radius: 12px; color: var(--text);
  transition: background-color .25s var(--ease), color .25s var(--ease);
}
.zv__step:hover { background: rgba(40, 73, 144, .06); }
.zv__step:focus-visible { outline: 3px solid var(--amber); outline-offset: 2px; }
.zv__num {
  grid-row: span 2; display: grid; place-items: center;
  inline-size: 2.2rem; block-size: 2.2rem; border-radius: 9px;
  background: rgba(40, 73, 144, .08); color: var(--navy);
  font: 700 var(--fs-sm)/1 var(--font-mono);
}
.zv__name { font-weight: 700; font-size: var(--fs-sm); line-height: 1.3; align-self: center; }
.zv__text { font-size: var(--fs-xs); line-height: 1.45; color: var(--text-muted); display: none; }
.zv__step.is-active { background: var(--navy); color: #fff; }
.zv__step.is-active .zv__num { background: var(--amber); color: var(--ink); }
.zv__step.is-active .zv__text { display: block; color: #c9d3e8; margin-block-start: .2rem; }
.zv__step.is-done .zv__num { background: rgba(31, 157, 85, .14); color: #17733f; }

/* ---------- stage ---------- */
.zv__stage {
  position: relative; overflow: hidden; border-radius: 22px;
  background: radial-gradient(120% 100% at 70% 0%, #2a4a92 0%, #142650 45%, #0b1630 100%);
  color: var(--text-on-navy); padding: var(--sp-4);
  display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--sp-4); align-items: center;
  min-block-size: 36rem; box-shadow: 0 30px 60px -30px rgba(14, 26, 51, .55);
}
.zv__bar { position: absolute; inset-block-start: 0; inset-inline: 0; block-size: 3px; background: rgba(255,255,255,.08); }
.zv__bar span { display: block; block-size: 100%; inline-size: 0; background: var(--amber); }
.zv__toggle {
  position: absolute; inset-block-end: .9rem; inset-inline-end: .9rem; z-index: 3;
  display: inline-flex; align-items: center; gap: .45rem; cursor: pointer;
  padding: .4rem .8rem; border-radius: 999px; border: 1px solid rgba(255,255,255,.22);
  background: rgba(10, 20, 44, .55); color: #fff; font: 600 var(--fs-xs)/1 var(--font-en);
}
[dir="rtl"] .zv__toggle { font-family: var(--font-ar); }
.zv__toggle:focus-visible { outline: 3px solid var(--amber); outline-offset: 2px; }
.zv__toggle-i { inline-size: .55rem; block-size: .65rem; border-inline: 3px solid currentColor; box-sizing: border-box; }
.zv__toggle[aria-pressed="false"] .zv__toggle-i { border: 0; block-size: 0; inline-size: 0; border-block: .33rem solid transparent; border-inline-start: .55rem solid currentColor; }
.zv__note { position: absolute; inset-block-end: 1.05rem; inset-inline-start: var(--sp-4); margin: 0; font-size: var(--fs-xs); color: var(--text-on-navy-muted); }

/* ---------- phone ---------- */
.zv-phone {
  position: relative; inline-size: 15.5rem; aspect-ratio: 9 / 18.5;
  border-radius: 2.4rem; padding: .55rem; background: #05090f;
  box-shadow: 0 0 0 2px #2b3445, 0 30px 50px -18px rgba(0,0,0,.7), inset 0 0 0 1px #3a4458;
  transition: transform .7s var(--ease);
}
.zv-phone::before { /* camera island */
  content: ""; position: absolute; z-index: 4; inset-block-start: 1rem; inset-inline-start: 50%;
  inline-size: 4.4rem; block-size: 1.15rem; margin-inline-start: -2.2rem; border-radius: 999px; background: #05090f;
}
.zv-phone__screen {
  position: relative; block-size: 100%; overflow: hidden; border-radius: 1.9rem;
  background: #f5f6fa; color: #121a2b; font-size: .72rem; line-height: 1.35;
}
.zv-scr {
  position: absolute; inset: 0; padding: 2.4rem .85rem .85rem;
  display: flex; flex-direction: column; gap: .55rem;
  opacity: 0; transform: translateY(14px); transition: opacity .45s var(--ease), transform .45s var(--ease);
  pointer-events: none;
}
.zv-scr.is-on { opacity: 1; transform: none; }
.zv-app { display: flex; align-items: center; justify-content: space-between; font-weight: 800; font-size: .8rem; }
.zv-app__logo { display: inline-flex; align-items: center; gap: .35rem; }
.zv-app__logo i { inline-size: 1.15rem; block-size: 1.15rem; border-radius: .35rem; background: var(--grad-navy); }
.zv-app small { font-weight: 600; color: #6b7487; font-size: .62rem; }
.zv-h { font-weight: 800; font-size: .95rem; line-height: 1.2; margin: 0; }
.zv-sub { color: #6b7487; font-size: .64rem; margin: 0; }
.zv-tabs { display: flex; gap: .3rem; }
.zv-tabs span { padding: .25rem .6rem; border-radius: 999px; background: #e7eaf2; font-weight: 700; font-size: .62rem; }
.zv-tabs span:first-child { background: var(--navy); color: #fff; }
.zv-card { background: #fff; border-radius: .8rem; box-shadow: 0 2px 8px rgba(14,26,51,.08); overflow: hidden; }
.zv-card__img { block-size: 3.6rem; background-size: cover; background-position: center; }
.zv-card__b { padding: .45rem .55rem; display: grid; grid-template-columns: 1fr auto; gap: .1rem .4rem; align-items: center; }
.zv-card__t { font-weight: 800; font-size: .7rem; }
.zv-card__m { color: #6b7487; font-size: .6rem; grid-column: 1; }
.zv-card__p { grid-row: 1 / span 2; grid-column: 2; font-weight: 800; color: var(--navy); font-size: .66rem; white-space: nowrap; }
.zv-card--pick { outline: 2px solid var(--amber); outline-offset: -2px; }
.zv-chips { display: flex; flex-wrap: wrap; gap: .3rem; }
.zv-chips span { padding: .3rem .5rem; border-radius: .5rem; background: #fff; border: 1px solid #dfe3ec; font-weight: 700; font-size: .6rem; }
.zv-chips .on { background: var(--navy); border-color: var(--navy); color: #fff; }
.zv-row { display: flex; align-items: center; justify-content: space-between; background: #fff; border-radius: .7rem; padding: .5rem .6rem; font-weight: 700; }
.zv-stepper { display: inline-flex; align-items: center; gap: .5rem; }
.zv-stepper b { display: grid; place-items: center; inline-size: 1.25rem; block-size: 1.25rem; border-radius: 50%; background: #e7eaf2; }
.zv-btn {
  margin-block-start: auto; display: flex; align-items: center; justify-content: center; gap: .4rem;
  padding: .7rem; border-radius: .8rem; background: var(--navy); color: #fff; font-weight: 800; font-size: .72rem;
  transition: transform .2s, background-color .3s;
}
.zv-btn--amber { background: var(--amber); color: var(--ink); }
.zv-field { background: #fff; border: 1px solid #dfe3ec; border-radius: .6rem; padding: .45rem .55rem; display: grid; gap: .1rem; }
.zv-field small { color: #6b7487; font-size: .56rem; font-weight: 600; }
.zv-field b { font-family: var(--font-mono); font-size: .7rem; letter-spacing: .04em; }
.zv-fields { display: grid; grid-template-columns: 1fr 1fr; gap: .4rem; }
.zv-total { display: flex; justify-content: space-between; font-weight: 800; font-size: .8rem; padding-block: .2rem; }
.zv-lock { display: flex; align-items: center; gap: .3rem; color: #6b7487; font-size: .58rem; justify-content: center; }

/* pay: processing → success */
.zv-spin { inline-size: .85rem; block-size: .85rem; border-radius: 50%; border: 2px solid rgba(255,255,255,.35); border-top-color: #fff; display: none; animation: zv-spin .8s linear infinite; }
@keyframes zv-spin { to { transform: rotate(360deg); } }
.zv[data-step="2"].is-a .zv-scr[data-s="2"] .zv-btn { transform: scale(.96); }
.zv[data-step="2"].is-a .zv-scr[data-s="2"] .zv-spin { display: inline-block; }
.zv-done {
  position: absolute; inset: 0; z-index: 2; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .5rem;
  background: #f5f6fa; text-align: center; padding: 1rem; opacity: 0; transition: opacity .35s;
}
.zv[data-step="2"].is-b .zv-scr[data-s="2"] .zv-done { opacity: 1; }
.zv-tick { inline-size: 3.4rem; block-size: 3.4rem; border-radius: 50%; display: grid; place-items: center; background: var(--ok); color: #fff; box-shadow: 0 0 0 .5rem var(--ok-soft); }
.zv-tick svg { inline-size: 1.7rem; block-size: 1.7rem; fill: none; stroke: currentColor; stroke-width: 3; stroke-linecap: round; stroke-linejoin: round; }
.zv-tick--bad { background: var(--bad); box-shadow: 0 0 0 .5rem var(--bad-soft); }
.zv[data-step="2"].is-b .zv-done .zv-tick { animation: zv-pop .5s var(--ease) both; }
@keyframes zv-pop { from { transform: scale(.4); opacity: 0; } }

/* ticket */
.zv-ticket { background: #fff; border-radius: 1rem; box-shadow: 0 6px 18px rgba(14,26,51,.12); overflow: hidden; }
.zv-ticket__top { background: var(--grad-navy); color: #fff; padding: .6rem .7rem; }
.zv-ticket__top b { display: block; font-size: .78rem; }
.zv-ticket__top small { color: #c9d3e8; font-size: .6rem; }
.zv-ticket__qr { position: relative; display: grid; place-items: center; padding: .7rem; border-block-end: 2px dashed #dfe3ec; }
.zv-qr { inline-size: 7.4rem; block-size: 7.4rem; display: block; }
.zv-qr rect { fill: #0d1424; }
.zv-ticket__b { display: grid; grid-template-columns: 1fr 1fr; gap: .35rem; padding: .55rem .7rem; }
.zv-ticket__b small { display: block; color: #6b7487; font-size: .55rem; }
.zv-ticket__b b { font-size: .64rem; }
.zv-pill { display: inline-flex; align-items: center; gap: .25rem; padding: .15rem .45rem; border-radius: 999px; font-size: .58rem; font-weight: 800; background: #e7eaf2; color: #3b4559; }
.zv-pill--ok { background: var(--ok-soft); color: #17733f; }
.zv-pill--bad { background: var(--bad-soft); color: #a62f2f; }
.zv-scan-line {
  position: absolute; inset-inline: 18%; block-size: 2px; inset-block-start: 15%; background: var(--ok);
  box-shadow: 0 0 10px var(--ok); opacity: 0;
}
.zv.is-a:not(.is-b) .zv-scr.is-on .zv-scan-line, .zv.is-d .zv-scr.is-on .zv-scan-line { opacity: 1; animation: zv-scan 1s ease-in-out infinite alternate; }
@keyframes zv-scan { to { inset-block-start: 82%; } }
.zv-res { display: none; align-items: center; justify-content: center; gap: .35rem; padding: .5rem; border-radius: .7rem; font-weight: 800; font-size: .72rem; }
.zv-res--ok { background: var(--ok-soft); color: #17733f; }
.zv-res--bad { background: var(--bad-soft); color: #a62f2f; }
.zv-hint { text-align: center; color: #6b7487; font-weight: 700; font-size: .66rem; }
.zv[data-step="4"].is-b .zv-scr[data-s="4"] .zv-res--ok,
.zv[data-step="6"].is-b:not(.is-d) .zv-scr[data-s="6"] .zv-res--ok,
.zv[data-step="6"].is-d .zv-scr[data-s="6"] .zv-res--bad { display: flex; }
.zv[data-step="4"].is-b .zv-scr[data-s="4"] .zv-hint,
.zv[data-step="6"].is-b .zv-scr[data-s="6"] .zv-hint { display: none; }
.zv[data-step="6"].is-b .zv-scr[data-s="6"] .zv-ticket { opacity: .55; filter: grayscale(1); transition: opacity .4s, filter .4s; }
.zv-inside { display: flex; flex-direction: column; align-items: center; text-align: center; gap: .45rem; padding-block: .6rem; }

/* ---------- scenes (right side) ---------- */
.zv__scenes { position: relative; block-size: 100%; min-block-size: 30rem; }
.zv-scene {
  position: absolute; inset: 0; display: flex; flex-direction: column; justify-content: center; gap: var(--sp-2);
  opacity: 0; visibility: hidden; transition: opacity .5s var(--ease), visibility 0s .5s;
}
.zv-scene.is-on { opacity: 1; visibility: visible; transition: opacity .5s var(--ease); }
.zv-scene__photo { position: relative; margin: 0; border-radius: 18px; overflow: hidden; box-shadow: 0 20px 40px -20px rgba(0,0,0,.6); }
.zv-scene__photo img { display: block; inline-size: 100%; block-size: 21rem; object-fit: cover; }
.zv-scene__photo figcaption {
  position: absolute; inset-block-end: .8rem; inset-inline-start: .8rem; display: inline-flex; align-items: center; gap: .45rem;
  padding: .45rem .8rem; border-radius: 999px; background: rgba(10, 20, 44, .78); backdrop-filter: blur(6px);
  font-weight: 700; font-size: var(--fs-sm); color: #fff;
}
.zv-scene__photo figcaption i { inline-size: .55rem; block-size: .55rem; border-radius: 50%; background: var(--amber); }
.zv-scene.is-on .zv-scene__photo img { animation: zv-kb 9s linear both; }
@keyframes zv-kb { from { transform: scale(1.08); } to { transform: scale(1); } }
.zv-scene__cap { margin: 0; font-size: var(--fs-lg); font-weight: 700; color: #fff; line-height: 1.35; max-inline-size: 30rem; }
.zv-scene__cap small { display: block; font-size: var(--fs-sm); font-weight: 500; color: var(--text-on-navy-muted); margin-block-start: .25rem; }
.zv-flow { display: flex; flex-wrap: wrap; gap: .4rem; margin: 0; padding: 0; list-style: none; }
.zv-flow li { padding: .3rem .65rem; border-radius: 999px; border: 1px solid rgba(255,255,255,.18); font-size: var(--fs-xs); font-weight: 600; color: var(--text-on-navy-muted); transition: background-color .3s, color .3s, border-color .3s; }
.zv-flow li.on { background: var(--amber); border-color: var(--amber); color: var(--ink); }

/* gate (SVG) */
.zv-gate { inline-size: 100%; max-inline-size: 34rem; margin-inline: auto; display: block; overflow: visible; }
.zv-gate__tag { position: absolute; inset-block-start: 0; inset-inline-start: 0; display: inline-flex; gap: .45rem; align-items: center; padding: .4rem .8rem; border-radius: 999px; background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.16); font-size: var(--fs-xs); font-weight: 700; letter-spacing: .04em; text-transform: uppercase; }
.zv-gate__toast {
  align-self: center; display: inline-flex; align-items: center; gap: .5rem; padding: .55rem 1rem; border-radius: 999px;
  font-weight: 800; font-size: var(--fs-sm); background: rgba(255,255,255,.08); color: var(--text-on-navy-muted);
  border: 1px solid rgba(255,255,255,.14); transition: background-color .3s, color .3s;
}
.zv-gate__toast .t-ok, .zv-gate__toast .t-bad { display: none; }
.zv.is-b:not(.is-d) .zv-scene.is-on .zv-gate__toast { background: var(--ok); color: #fff; border-color: var(--ok); }
.zv.is-b:not(.is-d) .zv-scene.is-on .zv-gate__toast .t-wait { display: none; }
.zv.is-b:not(.is-d) .zv-scene.is-on .zv-gate__toast .t-ok { display: inline; }
.zv.is-d .zv-scene.is-on .zv-gate__toast { background: var(--bad); color: #fff; border-color: var(--bad); }
.zv.is-d .zv-scene.is-on .zv-gate__toast .t-wait { display: none; }
.zv.is-d .zv-scene.is-on .zv-gate__toast .t-bad { display: inline; }

.zv-gate .flap { transition: transform .55s cubic-bezier(.5,0,.2,1); transform-box: fill-box; }
.zv-gate .flap--l { transform-origin: left center; }
.zv-gate .flap--r { transform-origin: right center; }
.zv.is-b:not(.is-c) .zv-scene.is-on .zv-gate .flap--l { transform: translateX(-92%); }
.zv.is-b:not(.is-c) .zv-scene.is-on .zv-gate .flap--r { transform: translateX(92%); }
.zv-gate .led { fill: #4f8bff; transition: fill .3s; filter: drop-shadow(0 0 4px #4f8bff); }
.zv.is-b:not(.is-d) .zv-scene.is-on .zv-gate .led { fill: #2fd27a; filter: drop-shadow(0 0 6px #2fd27a); }
.zv.is-d .zv-scene.is-on .zv-gate .led { fill: #ff5a5a; filter: drop-shadow(0 0 6px #ff5a5a); }
.zv-gate .arrow { fill: #2fd27a; opacity: 0; transition: opacity .3s; }
.zv.is-b:not(.is-c):not(.is-d) .zv-scene.is-on .zv-gate .arrow { opacity: 1; }
.zv-gate .xmark { stroke: #ff5a5a; opacity: 0; transition: opacity .3s; }
.zv.is-d .zv-scene.is-on .zv-gate .xmark { opacity: 1; }
.zv-gate .mini { transition: transform .8s var(--ease); transform-box: view-box; }
.zv.is-a .zv-scene.is-on .zv-gate .mini { transform: translate(0, 58px); }
.zv.is-c:not(.is-d) .zv-scene.is-on .zv-gate .mini { transform: translate(0, 0); }
.zv.is-d .zv-scene.is-on .zv-gate .mini { transform: translate(0, 58px); }
.zv-gate .beam { opacity: 0; }
.zv.is-a:not(.is-b) .zv-scene.is-on .zv-gate .beam,
.zv.is-d .zv-scene.is-on .zv-gate .beam { opacity: 1; animation: zv-blink .5s steps(2) infinite; }
@keyframes zv-blink { 50% { opacity: .25; } }
.zv-gate .walker { opacity: 0; transition: transform 1.6s linear, opacity .3s; transform-box: fill-box; transform-origin: 50% 100%; }
.zv.is-b:not(.is-d) .zv-scene.is-on .zv-gate .walker { opacity: 1; transform: translate(0, -70px) scale(.8); }

/* hall (join scene) */
.zv-hall { inline-size: 100%; max-inline-size: 34rem; margin-inline: auto; display: block; border-radius: 18px; }
.zv-hall .spot { animation: zv-spot 3s ease-in-out infinite alternate; transform-origin: 50% 0; transform-box: fill-box; }
@keyframes zv-spot { from { transform: rotate(-6deg); } to { transform: rotate(6deg); } }

/* ---------- components below ---------- */
.zv-parts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-3); margin-block: var(--sp-5) var(--sp-4); list-style: none; padding: 0; }
.zv-part { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-1); display: flex; flex-direction: column; }
.zv-part img { display: block; inline-size: 100%; block-size: 12rem; object-fit: cover; background: #fff; }
.zv-part--contain img { object-fit: contain; padding: .75rem; }
.zv-part div { padding: var(--sp-2) var(--sp-3) var(--sp-3); }
.zv-part h3 { margin: 0 0 .35rem; font-size: var(--fs-lg); }
.zv-part p { margin: 0; color: var(--text-muted); font-size: var(--fs-sm); }
.zv-arch { margin: 0 0 var(--sp-3); background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); padding: var(--sp-3); }
.zv-arch img { display: block; inline-size: 100%; block-size: auto; }
.zv-arch figcaption { margin-block-start: var(--sp-2); color: var(--text-muted); font-size: var(--fs-sm); }
.zv-feats { display: flex; flex-wrap: wrap; gap: .5rem; list-style: none; padding: 0; margin: 0; }
.zv-feats li { padding: .45rem .9rem; border-radius: 999px; background: rgba(40, 73, 144, .07); color: var(--navy); font-weight: 700; font-size: var(--fs-sm); }

/* ---------- responsive / motion ---------- */
@media (max-width: 1099px) {
  .zv { grid-template-columns: 1fr; }
  .zv__steps { flex-direction: row; overflow-x: auto; scrollbar-width: thin; }
  .zv__steps li { flex: none; }
  .zv__step { grid-template-columns: auto auto; }
  .zv__step .zv__text { display: none !important; }
}
@media (max-width: 760px) {
  .zv__stage { grid-template-columns: 1fr; justify-items: center; padding: var(--sp-3) var(--sp-2) 3.5rem; }
  .zv__scenes { inline-size: 100%; min-block-size: 22rem; }
  .zv-scene__photo img { block-size: 13rem; }
  .zv-parts { grid-template-columns: 1fr; }
  .zv__note { inset-inline-start: var(--sp-2); }
}
@media (prefers-reduced-motion: reduce) {
  .zv *, .zv *::before { animation: none !important; transition: none !important; }
}

/* ticket pills flip to "Used" once the gate grants */
.zv-pill.p1 { display: none; }
.zv.is-b .zv-scr.is-on .zv-pill.p0 { display: none; }
.zv.is-b .zv-scr.is-on .zv-pill.p1 { display: inline-flex; }

/* client reference (Where It's Installed) */
.zv-client { display: flex; align-items: center; gap: var(--sp-4); margin: 0 0 var(--sp-4); }
.zv-client img { flex: none; inline-size: 13rem; block-size: auto; padding: var(--sp-2) var(--sp-3); background: #fff; border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow-1); }
.zv-client p { margin: 0; max-inline-size: 40rem; color: var(--text-muted); font-size: var(--fs-lg); }
.zv-client strong { color: var(--text); }
@media (max-width: 640px) { .zv-client { flex-direction: column; align-items: flex-start; } .zv-client img { inline-size: 11rem; } }
