/* v29: clean wheel in the main app shell; reference-proportioned market. */
body[data-screen=spin] {background:var(--bg);padding-top:var(--mafia-safe-top,0px)}
body[data-screen=spin] .topbar,body[data-screen=spin] #tabbar {display:flex}
body[data-screen=spin] #tabbar {display:grid}
body[data-screen=spin] .view {padding:10px 18px calc(110px + var(--mafia-safe-bottom,0px));max-width:640px;margin:auto;min-height:0}
body[data-screen=spin] .cyber-detail {min-height:0;padding:6px 8px 20px;background:none;border:0;overflow:visible}
body[data-screen=spin] .cyber-frame,body[data-screen=spin] .cyber-wordmark,body[data-screen=spin] .cyber-wallet {display:none}
body[data-screen=spin] .cyber-detail .subhead {position:static;margin:0 0 20px}
body[data-screen=spin] .cyber-detail .subhead h1 {display:block;font-size:22px}
body[data-screen=spin] .cyber-detail .row-x {top:8px;right:6px}
body[data-screen=spin] .wheel-stage {width:90%;margin:42px auto 38px}
body[data-screen=spin] .wheel.is-spinning {transition:transform 5.2s cubic-bezier(.12,.65,.08,1)}
body[data-screen=spin] .wheel-hub {transition:filter .5s}
body[data-screen=spin] .is-ice .wheel-hub {filter:brightness(1.3);animation:none}
body[data-screen=spin] .spin-actions {width:min(96%,380px)}
@media(prefers-reduced-motion:reduce){body[data-screen=spin] .wheel.is-spinning{transition-duration:.1s}}
body[data-screen=market] {background:#030208}
body[data-screen=market] .topbar {display:none}
body[data-screen=market] .view {max-width:724px;padding:12px 16px calc(160px + var(--mafia-safe-bottom,0px))}
.market-toolbar {display:grid;grid-template-columns:minmax(0,1.85fr) minmax(0,1fr) 44px;gap:8px;align-items:center;margin-bottom:22px}
body[data-screen=market] .market-toolbar .seg--caps {width:100%;margin:0;height:48px;padding:3px;background:#08070e;border:1px solid #65616e;border-radius:99px;display:flex}
body[data-screen=market] .seg__btn {min-width:0;padding:8px 10px;font-size:11px;white-space:nowrap;border-radius:99px}
body[data-screen=market] .seg__btn.is-on {background:#100b20;border:1px solid #8471ef;box-shadow:inset 0 0 0 2px #08070e;color:white}
.market-balance {display:flex;align-items:center;justify-content:space-between;gap:4px;border:1px solid #4e415f;border-radius:99px;background:linear-gradient(125deg,#20122e,#080710);padding:5px 6px 5px 10px;height:48px;min-width:0}
.market-balance span {min-width:0;text-align:center;line-height:1.2}.market-balance b{font-size:13px;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.market-balance small{font-size:10px;color:#a29aa9}
.market-balance i{font-style:normal;border-radius:50%;background:linear-gradient(120deg,#ba4aff,#158fff);width:32px;height:32px;flex:none;font-size:28px;line-height:30px}
.market-profile{width:44px;height:44px;border-radius:50%;border:1px solid #66466e;background:radial-gradient(at 30% 20%,#6b287c,#110b1c);display:grid;place-items:center}
body[data-screen=market] .seg--filter {width:100%;height:48px;margin:0 0 16px;padding:3px;display:grid;grid-template-columns:.65fr 1.15fr 1.2fr;border:1px solid #625b70;background:#090711;border-radius:99px;gap:3px}
body[data-screen=market] .seg--filter .seg__btn{display:flex;justify-content:center;align-items:center;gap:5px;font-size:12px;padding:4px}
body[data-screen=market] .ggrid {display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:10px;align-items:stretch}
body[data-screen=market] .ggrid .gcard {display:flex!important;flex-direction:column!important;gap:0;min-width:0;width:auto;height:auto;position:relative;padding:6px 6px 10px!important;border-radius:19px!important;border:1px solid #594071!important;background:linear-gradient(135deg,#160d24,#090615 70%)!important;box-shadow:inset 0 0 0 2px #24133366;overflow:hidden}
body[data-screen=market] .ggrid .gcard__art {position:relative;width:100%;height:auto;aspect-ratio:1;min-height:0;border-radius:13px!important;overflow:hidden;flex:none}
body[data-screen=market] .market-pattern {position:absolute;inset:0;width:100%;height:100%;pointer-events:none}
body[data-screen=market] .gcard__img {inset:16% 10% 8%;width:80%;height:76%;object-fit:contain}
body[data-screen=market] .gbadge{top:8px;left:8px;height:24px;padding:0 7px;font-size:10px;max-width:calc(100% - 16px);z-index:2}
body[data-screen=market] .gcard__t {font-size:16px;margin:11px 5px 0;line-height:1.3}
body[data-screen=market] .gcard__m {margin:5px 5px 0;font-size:12px;gap:5px}
body[data-screen=market] .gcard__p {font-size:20px;margin:12px 5px 0;line-height:1.25}
body[data-screen=market] .gcard__s {font-size:11px;margin:5px 5px 0;color:#92889f}
body[data-screen=market] .gcard .buy-btn {width:calc(100% - 10px);align-self:center;min-height:44px;padding:8px 5px;margin:13px 5px 0;border-radius:99px!important;background:linear-gradient(105deg,#a54df6,#068eff)!important;font-size:12px;letter-spacing:.02em;box-shadow:none}
body[data-screen=market] .mk-dock {bottom:calc(82px + max(env(safe-area-inset-bottom),var(--mafia-safe-bottom,0px)));max-width:692px;gap:8px}
body[data-screen=market] .dock-search,body[data-screen=market] .dock-btn{height:46px;background:#130c1dea;border-color:#786585}
body[data-screen=market] .dock-btn{width:46px}.dock-search input{font-size:13px}
.rank-heading{padding-bottom:22px}.rank-heading h1{font-size:19px;letter-spacing:.015em}
.rank-list .rank-player {padding:12px 14px;grid-template-columns:46px 1fr 38px;gap:12px}
.rank-list .rank-portrait{width:46px;height:46px;border:1px solid #8e6eb866;box-shadow:0 3px 9px #0004}
.rank-info b{font-size:13px;line-height:1.4}.rank-info strong{font-variant-numeric:tabular-nums;font-size:14px;color:#7ce4c1}
.rank-list .rank-player+.rank-player{border-top:1px solid #9386b026}
@media(min-width:520px){body[data-screen=market] .gcard__t{font-size:22px}body[data-screen=market] .gcard__m{font-size:16px}body[data-screen=market] .gcard__p{font-size:26px}body[data-screen=market] .gcard__s{font-size:14px}body[data-screen=market] .gcard .buy-btn{min-height:56px;font-size:16px}.market-toolbar{grid-template-columns:1.85fr 1fr 58px}.market-profile{width:58px;height:58px}}
/* Spin is a transparent floating dialog over the home page. */
body[data-screen=spin] .view {max-width:640px;padding:10px 14px 110px}
.spin-home-underlay {pointer-events:none;user-select:none;filter:blur(3px);opacity:.3}
.spin-overlay {position:fixed;inset:0;z-index:80;display:flex;align-items:center;justify-content:center;padding:calc(46px + var(--mafia-safe-top,0px)) 14px calc(18px + var(--mafia-safe-bottom,0px));overflow:auto;background:transparent}
.spin-overlay-content {width:min(100%,480px);margin:auto}
body[data-screen=spin] .spin-overlay .cyber-detail {padding:0;background:none;min-height:0}
body[data-screen=spin] .spin-overlay .subhead,body[data-screen=spin] .spin-overlay .row-x {display:none}
.spin-dismiss {position:fixed;top:calc(12px + var(--mafia-safe-top,0px));right:18px;z-index:82;width:40px;height:40px;color:white;font-size:34px;text-shadow:0 2px 8px #000;border-radius:50%}
body[data-screen=spin] .spin-overlay .wheel-stage {width:86%;margin:28px auto 38px}
body[data-screen=spin] .spin-overlay .spin-actions {display:grid;grid-template-columns:1fr;width:82%}
body[data-screen=spin] .spin-overlay .spin-actions .btn {width:100%;min-height:68px}
body[data-screen=spin] .topbar,body[data-screen=spin] #tabbar {pointer-events:none}

body[data-screen=spin]{overflow:hidden;height:100dvh}
body[data-screen=spin] .view{height:calc(100dvh - var(--mafia-safe-top,0px));overflow:hidden}
.market-balance small .ic{width:10px;height:10px}
/* v31: home and wheel share the same visible surface. */
body[data-screen=spin] .topbar {display:none}
.spin-home-underlay {filter:none;opacity:1}
.spin-overlay {align-items:flex-start;padding-top:calc(68px + var(--mafia-safe-top,0px));padding-bottom:95px;background:none}
.spin-overlay-content {position:relative;margin:0 auto;width:min(100%,440px)}
.spin-dismiss {position:absolute;top:-18px;right:0;width:40px;height:40px;padding:0;filter:drop-shadow(0 3px 8px #07031480)}
.spin-dismiss svg{width:100%;height:100%;display:block}
.spin-dismiss:active{transform:scale(.94)}
body[data-screen=spin] .spin-overlay .wheel-stage{width:86%;margin:20px auto 30px}
body[data-screen=spin] .wheel-hub img{opacity:.55;filter:saturate(.8)}
body[data-screen=spin] .spin-overlay .wheel-hub{width:28%;height:28%}
@media(max-height:690px){.spin-overlay-content{width:min(100%,360px)}.spin-overlay{padding-top:calc(48px + var(--mafia-safe-top,0px))}}
/* v32: dialog is attached to body; home DOM, route and carousel are untouched. */
body.spin-open{overflow:hidden}
body.spin-open #app{filter:blur(3px);pointer-events:none}
.spin-live-modal{z-index:100;background:rgba(8,3,18,.16);align-items:center;padding:calc(44px + var(--mafia-safe-top,0px)) 14px calc(26px + var(--mafia-safe-bottom,0px));overscroll-behavior:contain}
.spin-live-modal .spin-overlay-content{position:relative;width:min(100%,440px);margin:auto;animation:spin-appear .32s cubic-bezier(.16,1,.3,1) both}
.spin-live-modal .cyber-detail{background:none;min-height:0;padding:0;overflow:visible}
.spin-live-modal .cyber-frame,.spin-live-modal .cyber-wordmark,.spin-live-modal .cyber-wallet,.spin-live-modal .subhead,.spin-live-modal .row-x{display:none}
.spin-live-modal .wheel-stage{width:86%;margin:28px auto 35px}
.spin-live-modal .spin-actions{display:grid;grid-template-columns:1fr;width:82%}
.spin-live-modal .spin-actions .btn{width:100%;min-height:66px}
.spin-live-modal .wheel-pointer{background-image:url('assets/components/pointer-up.svg');top:-42px;width:38px;height:54px}
.spin-live-modal .wheel.is-spinning{transition:transform 5.2s cubic-bezier(.12,.65,.08,1)}
.spin-live-modal .wheel-hub{width:29%;height:29%}
.spin-live-modal .wheel-hub img{opacity:.55}
.spin-live-modal .is-ice .wheel-hub{animation:core-flash 5.2s ease-out both}
@keyframes core-flash{0%{scale:1;filter:brightness(1)}12%{scale:1.55;filter:brightness(1.8) drop-shadow(0 0 18px #9cefff)}65%{scale:1.15;filter:brightness(1.2)}100%{scale:1;filter:brightness(1)}}
@keyframes spin-appear{from{opacity:0;transform:translateY(22px) scale(.88)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.spin-live-modal .spin-overlay-content,.spin-live-modal .is-ice .wheel-hub{animation:none}.spin-live-modal .wheel.is-spinning{transition-duration:.1s}}
/* v33 painted transparent game assets; CSS only animates the finished art. */
.spin-live-modal .spin-rim,.spin-live-modal .spin-lights,.spin-live-modal .wheel-weather{display:none}
.spin-live-modal .wheel-stage,.spin-live-modal .wheel-stage::before,.spin-live-modal .wheel-stage::after{border:0;background:none;box-shadow:none}
.spin-live-modal .wheel-painted{display:block;width:100%;height:100%;object-fit:contain;filter:drop-shadow(0 0 8px #9c30eb55)}
.spin-live-modal .wheel-hub{width:28%;height:28%;background:none;border:0;box-shadow:none;pointer-events:none}
.spin-live-modal .wheel-hub img{opacity:1;filter:none;animation:painted-core-turn 14s linear infinite}
.spin-live-modal .wheel-pointer{background-image:url('assets/components/pointer-up.svg');transform:translateX(-50%) rotate(180deg);top:-30px}
.spin-live-modal .wheel-stage.is-ice .wheel-hub{animation:core-flash 5.2s ease-out both}
.spin-live-modal .wheel-stage.is-ice .wheel-hub img{animation:painted-core-turn 1.4s linear infinite}
@keyframes painted-core-turn{to{transform:rotate(360deg)}}
@media(prefers-reduced-motion:reduce){.spin-live-modal .wheel-hub img,.spin-live-modal .wheel-stage.is-ice .wheel-hub img{animation:none}}
/* v34: stable core anchor; emitted effects have their own independent layers. */
.spin-live-modal .wheel-stage .wheel-hub,
.spin-live-modal .wheel-stage.is-ice .wheel-hub {
  position:absolute;left:50%;top:50%;width:26%;height:26%;margin:0;
  transform:translate(-50%,-50%)!important;scale:1!important;rotate:0deg!important;
  animation:none!important;filter:none!important;transform-origin:center;
}
.spin-live-modal .wheel-stage .wheel-hub img,
.spin-live-modal .wheel-stage.is-ice .wheel-hub img {
  display:block;width:100%;height:100%;object-fit:contain;opacity:1;
  transform:none!important;scale:1!important;animation:none!important;filter:none;
}
.spin-live-modal .wheel-stage.is-ice .wheel-hub img {filter:brightness(1.2) drop-shadow(0 0 6px #b1edff)}
.spin-live-modal .wheel-hub::before,.spin-live-modal .wheel-hub::after {display:none!important}
.spin-live-modal .wheel-pointer {top:-18px;z-index:8}
.painted-electric-rim {position:absolute;inset:-6%;width:112%;height:112%;max-width:none;pointer-events:none;z-index:3;opacity:.45;animation:rim-breathe 3s ease-in-out infinite}
.painted-core-wave {position:absolute;left:50%;top:50%;width:28%;height:28%;max-width:none;pointer-events:none;z-index:4;opacity:0;transform:translate(-50%,-50%);transform-origin:center}
.is-ice .painted-core-wave {animation:core-emission 1.3s ease-out 4}
.is-ice .painted-electric-rim {animation:rim-charge 1s ease-in-out infinite}
@keyframes core-emission {0%{opacity:0;transform:translate(-50%,-50%) scale(.8)}18%{opacity:.65}100%{opacity:0;transform:translate(-50%,-50%) scale(2.4)}}
@keyframes rim-breathe{0%,100%{opacity:.25}50%{opacity:.55}}
@keyframes rim-charge{0%,100%{opacity:.55;filter:brightness(1)}50%{opacity:.85;filter:brightness(1.25)}}
@media(prefers-reduced-motion:reduce){.painted-electric-rim,.is-ice .painted-electric-rim{animation:none;opacity:.4}.is-ice .painted-core-wave{animation:none}}
/* v35 */
.spin-live-modal .spin-overlay-content{width:min(100%,490px)}
.spin-live-modal .wheel-stage{width:94%;aspect-ratio:1;height:auto;flex:none;position:relative}
.spin-live-modal .wheel-painted{width:100%!important;height:100%!important;aspect-ratio:1;object-fit:contain;transform-origin:50% 50%;border-radius:0;max-width:none}
.spin-live-modal .wheel.is-spinning{transition:transform 5.2s cubic-bezier(.08,.70,.12,1)}
.painted-electric-rim{animation:rim-flow 12s linear infinite,rim-breathe 3s ease-in-out infinite;transform-origin:center}
.is-ice .painted-electric-rim{animation:rim-flow 5s linear infinite,rim-charge 1s ease-in-out infinite}
@keyframes rim-flow{to{transform:rotate(360deg)}}
.spin-live-modal .cyber-detail{position:relative}
.spin-live-modal .result{position:absolute;inset:8% 5% auto;z-index:20;text-align:center;padding:22px 18px;border:1px solid #d594ff;border-radius:26px;background:radial-gradient(at 50% 10%,#643289,#160c27 65%);box-shadow:0 16px 80px #000b,0 0 40px #b35bef55;animation:reward-in .45s cubic-bezier(.16,1,.3,1) both}
.reward-art{display:block;width:115px;height:115px;object-fit:contain;margin:0 auto 10px;filter:drop-shadow(0 0 15px #c884ff66)}
.result h2{font-size:20px;color:#f4deff;margin-bottom:12px}.result .dash-primary{margin-top:20px;width:100%}
@keyframes reward-in{from{opacity:0;transform:translateY(15px) scale(.75)}to{opacity:1;transform:none}}
.dash-home{display:grid;gap:14px}.dash-link{display:flex;align-items:center;gap:12px;width:100%;padding:12px;border:1px solid #573270;border-radius:18px;background:#11091d;text-align:left}.dash-link>img{width:48px;height:48px;object-fit:contain}.dash-link>span{flex:1}.dash-link b{display:block;font-size:14px}.dash-link small{display:block;color:#a49bb3;margin-top:4px;font-size:12px}
.dash-hero{position:relative;min-height:225px;border:1px solid #673986;border-radius:22px;overflow:hidden;background:radial-gradient(at 90% 70%,#53217a,#11081f 75%);padding:24px 18px}.dash-hero>img{position:absolute;right:-18px;bottom:-10px;width:60%;height:100%;object-fit:contain;object-position:right bottom;pointer-events:none}.dash-hero>div{position:relative;width:65%;z-index:1}.dash-hero small{color:#cb8df1;font-size:12px;letter-spacing:.12em}.dash-hero h1{font-size:27px;line-height:1.05;margin:12px 0}.dash-hero p{font-size:12px;color:#c5b5d8;max-width:80%;margin:10px 0 18px}
.dash-primary{border:0;border-radius:99px;padding:14px 19px;background:linear-gradient(105deg,#ac4afa,#079cff);color:white;font-weight:800;font-size:12px;min-height:46px}
.dash-pair{display:grid;grid-template-columns:1fr 1fr;gap:12px}.dash-pair>button{border:1px solid #47245c;border-radius:20px;background:linear-gradient(140deg,#211030,#090711);padding:16px;text-align:left}.dash-pair h2{font-size:20px;color:#c77ef4}.dash-pair img{display:block;width:100%;height:110px;object-fit:contain}.dash-pair span{display:block;border-radius:99px;background:linear-gradient(100deg,#553275,#123850);padding:11px 6px;text-align:center;font-size:12px;font-weight:700}
.dash-topup h2{font-size:17px;margin:22px 0 16px}.pay-method{display:flex;align-items:center;gap:15px;border-radius:22px;padding:22px;background:linear-gradient(130deg,#ffca29,#d99204);color:#fff}.pay-method span .ic{width:54px;height:54px;fill:#fff56a;stroke:#ffec55}.pay-method b{flex:1}.pay-packs{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.pay-packs button{display:grid;justify-items:center;gap:10px;padding:22px 8px;border-radius:20px;background:linear-gradient(135deg,#30220a,#120d09);border:1px solid #584123}.pay-packs .ic{width:38px;height:38px;fill:#ffe53e;stroke:#ffe53e}.pay-packs b{font-size:22px}.pay-packs small{color:#b8a99c}.pay-packs .selected{border-color:#b769ff;box-shadow:0 0 0 1px #b769ff}.dash-topup>.dash-primary{width:100%;margin-top:20px}.dash-topup>.hint{margin-top:15px}
.inventory-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:18px}.inventory-grid article{padding:16px;border:1px solid #27658c;border-radius:20px;background:radial-gradient(at 50% 20%,#163b55,#090a19 80%)}.inventory-art{height:110px;display:grid;place-items:center}.inventory-art .ic{width:64px;height:64px;color:#c387ff}.inventory-grid p{font-size:12px;color:#9f9bb0;margin:8px 0}.inventory-grid span{font-size:13px;color:#d5aff6}
@media(prefers-reduced-motion:reduce){.painted-electric-rim,.is-ice .painted-electric-rim,.spin-live-modal .result{animation:none}}
.nft-home{display:grid;gap:16px}.nft-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:13px}.nft-tile{position:relative;min-height:210px;padding:19px 16px;text-align:left;overflow:hidden;border-radius:22px;border:1px solid #513163;background:radial-gradient(at 90% 70%,#32114c77,transparent 70%),#0c0714;isolation:isolate}.nft-tile h2{font-size:clamp(18px,5vw,25px);color:#c66ff3;position:relative;z-index:2}.nft-tile p{font-size:12px;color:#a69aae;position:relative;z-index:2;margin-top:9px;max-width:82%}.nft-tile img{position:absolute;right:-8%;bottom:30px;width:88%;height:130px;object-fit:contain;z-index:-1}.nft-tile>span{position:absolute;bottom:14px;left:12px;right:12px;border-radius:99px;background:linear-gradient(100deg,#552679,#073b64);padding:11px;display:flex;align-items:center;justify-content:center;gap:10px;font-size:12px;font-weight:800}.nft-tile.nft-wide{grid-column:1/-1;min-height:180px}.nft-wide img{width:48%;height:180px;right:0;bottom:0}.nft-wide p{max-width:50%}.nft-wide>span{right:53%}.nft-heading{padding:18px 4px 24px}.nft-heading small{color:#bf72f4;letter-spacing:.18em}.nft-heading h1{font-size:36px;margin:8px 0}.nft-heading p{color:#9e91af}.nft-empty{padding:24px 18px;border:1px solid #523261;border-radius:20px;margin:16px 0;background:#120a1c}.nft-empty p{font-size:13px;color:#a79aae;margin-top:8px}.nft-section{font-size:17px;margin-top:24px}.nft-reward-img{width:100%;height:120px;object-fit:contain}
#tabbar{border:1px solid #67517880;background:linear-gradient(110deg,#241038e8,#07070deb 65%);box-shadow:inset 0 1px 1px #ffffff13,0 14px 45px #0007}
#tabbar::before{transition:left .48s cubic-bezier(.22,1,.36,1),transform .48s cubic-bezier(.22,1,.36,1);background:radial-gradient(at 40% 25%,#55258066,#09070b 75%);border:1px solid #86758b55;border-radius:50%;box-shadow:inset 0 1px 3px #ffffff19}
#tabbar .tab .ic{transition:color .3s,transform .4s}#tabbar .tab.is-on .ic{transform:translateY(-2px) scale(1.07);color:#b86bff}
.v6-ref-hero{background:radial-gradient(at 80% 30%,#513072,#10091e);border:1px solid #71478a;border-radius:24px;padding:25px}.v6-ref-stats article{border:1px solid #604078;border-radius:20px;background:#160c24}.rank-screen{background:radial-gradient(at 50% 0,#32105233,transparent 60%)}
