/* Build46 — physical Exchange cabinetry. Cosmetic layers only; semantics and ownership stay put.
   Thick walnut bodies, leather rebates, engraved brass controls. No changes to table rendering. */
body.exchange-world:not(.playing){
 --em-leather:url('art/exchange-world/leather-v46.png');
 --em-wood:url('art/theme/table-walnut-b31.webp');
 --em-cabinet:linear-gradient(135deg,color-mix(in srgb,var(--ink-3) 48%,transparent),color-mix(in srgb,var(--ink) 78%,transparent)) padding-box,var(--em-leather) center/460px padding-box,var(--em-wood) center/420px border-box;
 --em-inset:linear-gradient(160deg,color-mix(in srgb,var(--ink) 24%,transparent),color-mix(in srgb,var(--ink) 76%,transparent)),var(--em-leather) center/380px;
 --em-brass:linear-gradient(125deg,var(--brass-hi),var(--brass) 34%,var(--brass-deep) 100%);
 --em-edge:0 2px 0 color-mix(in srgb,var(--brass-hi) 72%,var(--ink)),0 5px 0 var(--brass-deep),0 9px 0 var(--ink),0 18px 28px color-mix(in srgb,var(--ink) 90%,transparent);
 --em-engraved:0 1px 0 color-mix(in srgb,var(--ivory) 30%,transparent);
}
/* Build54: keep the compact Build53 geometry with the original shared gold material. */
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck{width:min(850px,88vw);border:4px solid transparent;border-radius:9px;background:var(--em-cabinet);padding:12px;box-shadow:0 1px 0 #c6a665,0 4px 0 #342515,0 8px 18px #0008,inset 0 0 0 1px #c6a66570,inset 0 2px 8px #000b;gap:24px}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck::before{top:-3px;left:14px;right:14px;height:1px;background:linear-gradient(90deg,transparent,#f6dfa0 24%,#8d6a33 70%,transparent);opacity:.65}
body.exchange-world:not(.playing) #v2title .modeIcon,body.exchange-world:not(.playing) #metaNav button>span{display:none!important}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck>.ttmodes{gap:10px 12px;align-content:center}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.ttmode{position:relative;box-sizing:border-box;flex:0 0 calc(50% - 6px);max-width:calc(50% - 6px);min-height:48px;height:48px;grid-template-columns:minmax(0,1fr);grid-template-rows:auto;align-content:center;justify-items:center;gap:0;padding:6px 10px 8px;border:2px solid var(--brass-deep);border-top-color:var(--brass-hi);border-left-color:var(--brass);border-radius:7px;background:var(--em-brass);color:var(--ink);text-shadow:var(--em-engraved);box-shadow:0 2px 0 var(--brass-deep),0 5px 0 var(--ink),0 8px 12px color-mix(in srgb,var(--ink) 80%,transparent),inset 0 1px 1px var(--ivory),inset 0 -3px 8px color-mix(in srgb,var(--brass-deep) 55%,transparent);font-size:16px;line-height:1.05;letter-spacing:.75px;text-align:center;transition:transform 100ms ease,filter 120ms ease,box-shadow 100ms ease}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmode>span:not(.modeIcon){grid-column:1;grid-row:1;min-width:0;white-space:nowrap}
/* Redundant PLAY / JOIN / PRIVATE labels consume the same space as the actual mode name. */
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>button.ttmode:not(.campaignRow)>b{display:none}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .tutorialMode em{position:static;display:block;grid-column:1;grid-row:2;justify-self:center;margin:3px 0 0;padding:0;border:0;background:none;box-shadow:none;color:#243220;text-shadow:0 1px #fbe5aa77;font:700 9px/1 var(--font-body);letter-spacing:.5px}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .tutorialMode.complete em{position:absolute;grid-area:auto;right:9px;top:50%;bottom:auto;transform:translateY(-50%);margin:0;font-size:0}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .tutorialMode.complete em::before{content:'✓';font:800 12px/1 var(--font-body)}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .tutorialMode.complete>span:not(.modeIcon){padding-inline:8px}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .campaignRow>b{display:block;grid-column:1;grid-row:2;margin-top:3px;font:600 10px/1.1 var(--font-body);letter-spacing:0;text-transform:none;color:#243220;opacity:1;white-space:nowrap}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .campaignRow .ttLock{font-size:10px;vertical-align:1px;margin-left:3px}
@media(hover:hover){body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.ttmode:hover{transform:translateY(-2px);border-color:var(--brass-hi);box-shadow:0 4px 0 var(--brass-deep),0 7px 0 var(--ink),0 14px 20px var(--ink),inset 0 1px 2px var(--ivory)}}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.ttmode:active{transform:translateY(3px);box-shadow:0 1px 0 var(--ink),inset 0 2px 6px var(--brass-deep)}
body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.ttmode:focus-visible{outline:2px solid var(--ivory);outline-offset:5px}
body.exchange-world:not(.playing) #v2title .floorBoard{border:0;padding:8px 4px 8px 20px;background:none;box-shadow:-7px 0 10px -10px var(--ink)}
body.exchange-world:not(.playing) #v2title .floorRow{border-bottom:1px solid color-mix(in srgb,var(--ink) 80%,transparent);box-shadow:0 1px 0 color-mix(in srgb,var(--brass-hi) 10%,transparent)}
/* A walnut desk rail with lettering cut into individual metal keys. Status pips remain. */
body.exchange-world:not(.playing) #metaNav{border:8px solid transparent;padding:5px;border-radius:10px;background:var(--em-cabinet);gap:6px;box-shadow:0 2px 0 var(--brass-deep),0 7px 0 var(--ink),0 16px 32px var(--ink),inset 0 0 5px var(--ink)}
body.exchange-world:not(.playing) #metaNav button{min-height:50px;min-width:104px;padding:10px 14px;border:2px solid var(--ink);border-bottom-color:var(--brass-deep);border-radius:5px;background:var(--em-inset);color:var(--brass-hi);box-shadow:inset 0 2px 6px var(--ink),0 1px 0 color-mix(in srgb,var(--brass-hi) 28%,transparent);text-shadow:0 2px 2px var(--ink)}
body.exchange-world:not(.playing) #metaNav button.on{background:var(--em-brass);border-top-color:var(--ivory);border-left-color:var(--brass);border-right-color:var(--brass-deep);border-bottom-color:var(--brass-deep);color:var(--ink);text-shadow:var(--em-engraved);box-shadow:0 2px 0 var(--brass-deep),0 4px 8px var(--ink),inset 0 1px 0 var(--brass-hi)}
body.exchange-world:not(.playing) #metaNav b{font:800 var(--fs-12)/1.15 var(--font-body);letter-spacing:var(--ls-label)}
body.exchange-world:not(.playing) #metaHeader button{border:3px solid var(--brass-deep);border-top-color:var(--brass);background:var(--em-inset);box-shadow:0 3px 0 var(--ink),inset 0 1px 2px var(--ink);border-radius:7px}
/* Primary windows are cabinet interiors, with the visible frame outside the readable leather. */
body.exchange-world:not(.playing) :is(#v3lobby .lbCard,#v2mbox,.climbTowerCard,.alertDrawer){position:relative;box-sizing:border-box;border:12px solid transparent;border-radius:14px;background:var(--em-cabinet);box-shadow:var(--em-edge),inset 0 0 0 2px var(--brass-deep),inset 0 3px 8px var(--ink);padding:24px;backdrop-filter:none}
body.exchange-world:not(.playing) #v3lobby{background:linear-gradient(color-mix(in srgb,var(--ink) 22%,transparent),color-mix(in srgb,var(--ink) 68%,transparent));padding:22px;box-sizing:border-box}
body.exchange-world:not(.playing) #v3lobby::before{display:none}
body.exchange-world:not(.playing) #v3lobby .lbCard{width:min(880px,94vw);max-height:calc(100dvh - 48px);overflow-y:auto;overflow-x:hidden;padding:24px 28px 22px;animation:none}
body.exchange-world:not(.playing) #v3lobby .lbCard::before{inset:2px;border:0;background:radial-gradient(circle at 8px 8px,var(--brass-hi) 0 2px,var(--brass-deep) 3px 4px,transparent 5px),radial-gradient(circle at calc(100% - 8px) 8px,var(--brass-hi) 0 2px,var(--brass-deep) 3px 4px,transparent 5px);pointer-events:none}
body.exchange-world:not(.playing) #v3lobby .lbCard::after{display:none}
body.exchange-world:not(.playing) .lbHead{padding-bottom:18px;border-bottom:0;box-shadow:0 3px 0 color-mix(in srgb,var(--ink) 75%,transparent),0 4px 0 color-mix(in srgb,var(--brass) 25%,transparent);align-items:center;gap:16px}
body.exchange-world:not(.playing) .lbHead>span{font:500 clamp(24px,3vw,38px)/1.1 'Bodoni Moda',serif;letter-spacing:0;text-shadow:0 2px 2px var(--ink)}
body.exchange-world:not(.playing) .lbHead>span small{color:var(--brass-hi);font-size:var(--fs-11);letter-spacing:var(--ls-eyebrow);margin-bottom:8px}
body.exchange-world:not(.playing) .lbSteps{gap:8px;margin:24px 0 20px;grid-template-columns:minmax(0,1fr) 20px minmax(0,1fr)}
body.exchange-world:not(.playing) .lbSteps>i{height:5px;border-radius:var(--r-chip);background:var(--ink);box-shadow:0 1px 0 var(--hairline)}
body.exchange-world:not(.playing) .lbSteps button{border:2px solid var(--ink);border-radius:6px;background:var(--em-inset);padding:9px 12px;box-shadow:inset 0 3px 7px var(--ink),0 1px 0 var(--hairline);color:var(--muted)}
body.exchange-world:not(.playing) .lbSteps button.on{background:var(--em-brass);border:2px solid var(--brass-deep);border-top-color:var(--brass-hi);color:var(--ink);box-shadow:0 3px 0 var(--ink),inset 0 1px 0 var(--ivory);text-shadow:var(--em-engraved)}
body.exchange-world:not(.playing) .lbSteps button b{border:0;background:transparent;color:inherit;box-shadow:none;font-family:Georgia,serif;font-size:var(--fs-20);width:22px}
body.exchange-world:not(.playing) .lbStep.on{animation:none}
body.exchange-world:not(.playing) :is(.lbIdent,.lbJoinIdent,.lbSoloIdentity){border:0;border-radius:8px;background:var(--em-inset);box-shadow:inset 0 3px 9px var(--ink),inset 0 -1px 0 var(--hairline),0 1px 0 color-mix(in srgb,var(--brass-hi) 18%,transparent);padding:16px;margin-block:18px}
body.exchange-world:not(.playing) :is(#lbName,#lbCode,#lbJoinName,.friendAdd input){border:3px solid var(--ink);border-bottom-color:var(--brass-deep);background:linear-gradient(var(--ink),var(--ink-2));border-radius:5px;box-shadow:inset 0 3px 9px var(--ink),0 1px 0 var(--hairline);color:var(--ivory)}
body.exchange-world:not(.playing) :is(#lbName,#lbCode,#lbJoinName,.friendAdd input):focus{outline:2px solid var(--brass-hi);outline-offset:2px}
body.exchange-world:not(.playing) .lbSetupGrid{gap:16px}
body.exchange-world:not(.playing) .lbSetupGrid .lbRow{padding:16px;border:0;border-radius:8px;background:var(--em-inset);box-shadow:inset 0 3px 8px var(--ink),0 1px 0 var(--hairline)}
body.exchange-world:not(.playing) .lbLbl{color:var(--brass-hi);font:800 var(--fs-11)/1.4 var(--font-body);margin-bottom:10px}
body.exchange-world:not(.playing) :is(.lbChoice,.lbStepper button,.lbAvatarChoice){border:2px solid var(--brass-deep);border-top-color:var(--hairline);border-radius:6px;background:var(--em-inset);box-shadow:0 3px 0 var(--ink),inset 0 1px 0 var(--hairline)}
body.exchange-world:not(.playing) .lbAvatarChoice{padding:12px 6px}
body.exchange-world:not(.playing) :is(.lbChoice.on,.lbChoice.selected,.lbAvatarChoice.on){border-color:var(--brass);background:linear-gradient(145deg,color-mix(in srgb,var(--brass-deep) 70%,var(--ink-3)),var(--ink));box-shadow:0 3px 0 var(--ink),inset 0 0 0 1px var(--brass-hi)}
body.exchange-world:not(.playing) .lbSeat{border:5px solid transparent;background:var(--em-cabinet);border-radius:9px;box-shadow:0 4px 0 var(--ink),inset 0 0 0 1px var(--brass-deep)}
body.exchange-world:not(.playing) .lbSeat.you{box-shadow:0 4px 0 var(--ink),inset 0 0 0 2px var(--brass-hi)}
body.exchange-world:not(.playing) .lbSeat.ready{box-shadow:0 4px 0 var(--ink),inset 0 0 0 2px var(--jade-bright)}
body.exchange-world:not(.playing) .lbReadyDock{background:linear-gradient(transparent,var(--ink) 32%);padding:18px 0 8px;bottom:-22px}
body.exchange-world:not(.playing) :is(#lbReady,.lbContinue){min-height:56px;border:4px solid var(--brass-deep);border-top-color:var(--brass-hi);border-left-color:var(--brass);border-radius:8px;background:var(--em-brass);box-shadow:0 5px 0 var(--ink),0 9px 12px var(--ink),inset 0 1px 0 var(--ivory);color:var(--ink);text-shadow:var(--em-engraved);letter-spacing:var(--ls-eyebrow);font-weight:700}
body.exchange-world:not(.playing) #lbReady.armed{background:linear-gradient(var(--jade-bright),var(--jade));color:var(--ink);border-color:var(--jade)}
/* Every destination uses the same cabinet construction without replacing its content layout. */
body.exchange-world:not(.playing) #metaPanel{padding-top:58px;padding-bottom:104px;background:linear-gradient(90deg,color-mix(in srgb,var(--ink) 25%,transparent),color-mix(in srgb,var(--ink) 45%,transparent),color-mix(in srgb,var(--ink) 25%,transparent))}
body.exchange-world:not(.playing) .metaPanelCard{height:100%;border:10px solid transparent;border-radius:12px;background:var(--em-cabinet);padding:0 24px;box-shadow:var(--em-edge),inset 0 0 0 2px var(--brass-deep);box-sizing:border-box}
body.exchange-world:not(.playing) .metaPanelHead{padding-top:22px;padding-bottom:18px;border:0;box-shadow:0 3px 0 color-mix(in srgb,var(--ink) 70%,transparent),0 4px 0 var(--hairline)}
body.exchange-world:not(.playing) .metaPanelHead h2{font-size:clamp(24px,3vw,38px);line-height:1.1;text-shadow:0 2px 3px var(--ink)}
body.exchange-world:not(.playing) :is(.metaPanelHead>button,.v2opt,.collectionDiscoveryTabs button,.discoveryFilters button,.tabs[role="tablist"] .tab){border:2px solid var(--brass-deep);border-top-color:var(--brass);border-radius:6px;background:var(--em-inset);box-shadow:0 3px 0 var(--ink),inset 0 1px 0 var(--hairline);color:var(--ivory);min-height:44px}
body.exchange-world:not(.playing) :is(.v2opt.gold,.collectionDiscoveryTabs button[aria-pressed='true'],.tabs[role="tablist"] .tab[aria-selected="true"]){background:var(--em-brass);color:var(--ink);border-top-color:var(--ivory);text-shadow:var(--em-engraved);box-shadow:0 3px 0 var(--brass-deep),0 5px 0 var(--ink),inset 0 1px 0 var(--brass-hi)}
body.exchange-world:not(.playing) .v2opt.red{color:var(--crash);border-color:var(--crash)}
body.exchange-world:not(.playing) .v2opt.gold small{color:var(--ink-2)}
body.exchange-world:not(.playing) .collectionDiscoveryTabs{background:var(--em-inset);border:0;padding:12px 8px;margin-bottom:20px;border-radius:7px;box-shadow:inset 0 3px 6px var(--ink),0 1px 0 var(--hairline)}
body.exchange-world:not(.playing) :is(.metaCard,.accountCard,.friendCode,.friendRowSlide,.houseBanner,.socialProfileHero,.socialProfileCard,.profileHero,.characterHero,.characterSheet){border:0;border-radius:9px;background:var(--em-inset);box-shadow:inset 0 2px 6px var(--ink),0 2px 0 var(--hairline),0 6px 14px color-mix(in srgb,var(--ink) 55%,transparent)}
body.exchange-world:not(.playing) :is(.profileHero,.characterHero){padding:20px}
body.exchange-world:not(.playing) .lookRows article.lookReward{border:0;border-radius:8px;background:var(--em-inset);box-shadow:0 3px 0 var(--ink),inset 0 1px 0 var(--hairline);margin-bottom:12px}
body.exchange-world:not(.playing) .lookRowToggle{padding:14px}
body.exchange-world:not(.playing) .masteryLookExpanded{background:color-mix(in srgb,var(--ink) 55%,transparent);box-shadow:inset 0 4px 8px var(--ink)}
body.exchange-world:not(.playing) .climbFloor{background:var(--em-inset);border-color:var(--brass-deep);box-shadow:0 3px 0 var(--ink),inset 0 1px 0 var(--hairline);border-radius:6px}
body.exchange-world:not(.playing) .climbFloor.here{border:2px solid var(--brass-hi);box-shadow:0 3px 0 var(--ink),inset 0 0 16px color-mix(in srgb,var(--brass-deep) 55%,transparent)}
body.exchange-world:not(.playing) .alertDrawer{position:fixed;padding:18px;border-width:8px;max-width:calc(100vw - 24px)}
body.exchange-world:not(.playing) #v2mbox{max-height:calc(100dvh - 40px);max-width:min(900px,calc(100vw - 32px));overflow-y:auto}
body.exchange-world:not(.playing) #v2mbox h3{font-family:'Bodoni Moda',serif;text-shadow:0 2px 2px var(--ink);line-height:1.2}
body.exchange-world:not(.playing) :is(#v2mbox.discoveryModal,#v2mbox.editionModal){border:12px solid transparent;background:var(--em-cabinet);border-radius:12px;box-shadow:var(--em-edge),inset 0 0 0 2px var(--brass-deep)}
body.exchange-world:not(.playing) .discoveryCatalog .discoveryCard{background:none;border:0;box-shadow:none}
body.exchange-world:not(.playing) .discoveryCatalog .discoveryFace{box-shadow:0 9px 0 -5px var(--brass-deep),0 13px 14px var(--ink)}
/* Hover stays local; parent choreography is owned exclusively by ExchangeWorld. */
@media(hover:hover){body.exchange-world:not(.playing) :is(.v2opt,.lbChoice,.lbAvatarChoice,.collectionDiscoveryTabs button,.discoveryFilters button):hover{filter:brightness(1.12);transform:translateY(-1px)}}
body.exchange-world:not(.playing) :is(.v2opt,.lbChoice,.lbAvatarChoice,.collectionDiscoveryTabs button,.discoveryFilters button):active{transform:translateY(2px);box-shadow:inset 0 2px 5px var(--ink)}
/* Phones keep the same material thickness at a smaller scale, with content staying readable. */
@media(max-width:900px){
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck{width:min(296px,100%);border-width:4px;padding:10px 10px 13px;gap:12px;border-radius:8px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.ttmode{min-height:48px;height:48px;padding:6px 8px 8px;font-size:16px;border-width:2px}
 body.exchange-world:not(.playing) #v2title .floorBoard{padding:4px 0}
 body.exchange-world:not(.playing) #metaNav{border-width:6px;padding:3px;gap:3px}
 body.exchange-world:not(.playing) #metaNav button{min-width:0;padding:8px 3px;min-height:48px}
 body.exchange-world:not(.playing) #metaNav b{font-size:var(--fs-11);letter-spacing:0}
 body.exchange-world:not(.playing) #metaPanel{padding:60px 10px calc(92px + env(safe-area-inset-bottom))}
 body.exchange-world:not(.playing) .metaPanelCard{border-width:7px;padding-inline:12px;border-radius:9px}
 body.exchange-world:not(.playing) .metaPanelHead{padding:16px 0 14px;gap:8px}
 body.exchange-world:not(.playing) .metaPanelHead h2{font-size:var(--fs-24)}
 body.exchange-world:not(.playing) #metaPanelBody{padding-top:14px}
 body.exchange-world:not(.playing) #v3lobby{padding:12px}
 body.exchange-world:not(.playing) #v3lobby .lbCard{width:100%;max-height:calc(100dvh - 28px);padding:18px 14px;border-width:8px;border-radius:10px}
 body.exchange-world:not(.playing) .lbHead{padding-bottom:14px;gap:10px}
 body.exchange-world:not(.playing) .lbHead>span{font-size:var(--fs-24)}
 body.exchange-world:not(.playing) .lbSteps{margin:18px 0 14px;grid-template-columns:minmax(0,1fr) 12px minmax(0,1fr);gap:5px}
 body.exchange-world:not(.playing) .lbSteps button{padding:6px;font-size:var(--fs-11);gap:4px;letter-spacing:0}
 body.exchange-world:not(.playing) :is(.lbIdent,.lbJoinIdent,.lbSoloIdentity){padding:12px;margin-block:12px}
 body.exchange-world:not(.playing) .lbSetupGrid .lbRow{padding:12px}
 body.exchange-world:not(.playing) .lbSetupGrid{gap:10px}
 body.exchange-world:not(.playing) .lbAvatarChoice{padding:8px 4px}
 body.exchange-world:not(.playing) .lbSeat{border-width:3px}
 body.exchange-world:not(.playing) .lbReadyDock{bottom:-18px;padding-top:12px}
 body.exchange-world:not(.playing) :is(#lbReady,.lbContinue){min-height:52px;border-width:3px}
 body.exchange-world:not(.playing) #v2mbox{border-width:8px;padding:16px;max-width:calc(100vw - 24px);max-height:calc(100dvh - 28px)}
 body.exchange-world:not(.playing) :is(#v2mbox.discoveryModal,#v2mbox.editionModal){border-width:8px;padding:16px}
 body.exchange-world:not(.playing) :is(.profileHero,.characterHero){padding:12px}
 body.exchange-world:not(.playing) .collectionDiscoveryTabs{padding:8px 5px;margin-bottom:12px;gap:6px}
 body.exchange-world:not(.playing) .collectionDiscoveryTabs button{padding:6px}
 body.exchange-world:not(.playing) .discoveryFilters button{min-width:78px}
}
@media(max-width:380px){
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck{padding:10px 10px 13px;border-width:4px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.ttmode{font-size:16px;min-height:48px;height:48px;padding:6px 8px 8px;text-align:center}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .tutorialMode em{justify-self:center}
 body.exchange-world:not(.playing) #metaPanel{padding-inline:6px}
 body.exchange-world:not(.playing) .metaPanelCard{padding-inline:8px;border-width:5px}
 body.exchange-world:not(.playing) #v3lobby .lbCard{padding:14px 10px;border-width:6px}
 body.exchange-world:not(.playing) .lbHead>span{font-size:var(--fs-20)}
 body.exchange-world:not(.playing) .lbHead .metaPanelBack{padding-inline:8px}
 body.exchange-world:not(.playing) #v2mbox{padding:12px;border-width:6px}
 body.exchange-world:not(.playing) #metaPanelBody{padding-top:10px}
}
@media(max-height:520px) and (orientation:landscape){body.exchange-world:not(.playing) #v3lobby .lbCard{max-height:calc(100dvh - 20px)}body.exchange-world:not(.playing) #metaPanel{padding-top:54px}body.exchange-world:not(.playing) .metaPanelHead{padding-top:12px}}
@media(prefers-reduced-motion:reduce){body.exchange-world:not(.playing) :is(.v2opt,.lbChoice,.lbAvatarChoice,.collectionDiscoveryTabs button,.discoveryFilters button){transition:none!important}}
/* Final room continuity: quiet frames, local switches, and readable menu-lobby overlap. */
body.exchange-world:not(.playing).lobby-open .ew-room-label{display:none}
body.exchange-world:not(.playing) :is(.lbTarget button,.lbShare button,.lbChatComposer button,.lbHead .metaPanelBack){border:2px solid var(--brass-deep);border-top-color:var(--brass);border-radius:6px;background:var(--em-inset);box-shadow:0 3px 0 var(--ink),inset 0 1px 0 var(--hairline);color:var(--ivory);min-height:44px}
body.exchange-world:not(.playing) .lbTarget button.on{background:var(--em-brass);border-top-color:var(--ivory);color:var(--ink);box-shadow:0 3px 0 var(--brass-deep),inset 0 1px 0 var(--brass-hi);text-shadow:var(--em-engraved)}
body.exchange-world:not(.playing) .lbChat{background:var(--em-inset);border:0;box-shadow:inset 0 3px 8px var(--ink),0 1px 0 var(--hairline);border-radius:8px}
body.exchange-world:not(.playing) .lbShare{background:var(--em-inset);border:0;box-shadow:inset 0 3px 8px var(--ink),0 1px 0 var(--hairline);border-radius:8px}
/* Reduce decorative overhead in the Climb lobby, retaining all progression and setup data. */
body.exchange-world:not(.playing) #lbClimb .climbStrip{padding:10px 12px;margin-bottom:8px;gap:4px 12px}
body.exchange-world:not(.playing) .lbSoloIdentity{padding:8px 12px;margin-block:10px}
@media(min-width:901px){
 body.exchange-world:not(.playing) #lbClimb .climbPath{height:108px}
 body.exchange-world:not(.playing) #lbClimb .climbStripCrest .seatCrestMark{width:46px;height:46px}
 body.exchange-world:not(.playing) #lbClimb .climbStrip{grid-template-columns:60px minmax(0,1fr) auto}
 body.exchange-world:not(.playing) #v3lobby #lbSeats .lbSeat{min-height:128px;padding-top:20px;padding-bottom:10px}
 body.exchange-world:not(.playing) #v3lobby #lbSeats .lbSeat :is(img,video[data-living-portrait]){width:64px;height:64px}
}
@media(max-width:900px){
 body.exchange-world:not(.playing) #lbClimb .climbPath{height:94px}
 body.exchange-world:not(.playing) #lbClimb .climbStrip{gap:4px 8px}
 body.exchange-world:not(.playing) #lbClimb .climbStripCurrent>b{font-size:var(--fs-16)}
}

/* Exact live component selectors, verified against generated profile/character markup. */
body.exchange-world:not(.playing) .tabs[role='tablist']{padding:10px 8px;background:var(--em-inset);border:0;border-radius:7px;box-shadow:inset 0 3px 6px var(--ink),0 1px 0 var(--hairline)}
body.exchange-world:not(.playing) :is(.metaPrimary,.metaSecondary):not(.metaDanger):not(.red){border:2px solid var(--brass-deep);border-top-color:var(--brass);border-radius:6px;background:var(--em-inset);box-shadow:0 3px 0 var(--ink),inset 0 1px 0 var(--hairline);color:var(--ivory);min-height:44px}
body.exchange-world:not(.playing) .metaPrimary:not(.metaDanger):not(.red){background:var(--em-brass);border-top-color:var(--ivory);color:var(--ink);text-shadow:var(--em-engraved);box-shadow:0 3px 0 var(--brass-deep),0 5px 0 var(--ink),inset 0 1px 0 var(--brass-hi)}
body.exchange-world:not(.playing) :is(.metaPrimary,.metaSecondary):disabled,body.exchange-world:not(.playing) :is(.metaPrimary,.metaSecondary)[aria-disabled='true']{opacity:.5;cursor:not-allowed;filter:saturate(.25);transform:none;box-shadow:inset 0 2px 5px var(--ink)}
body.exchange-world:not(.playing) .masteryLookExpanded{background:color-mix(in srgb,var(--ink) 55%,transparent);box-shadow:inset 0 4px 8px var(--ink);border-top:0}
@media(max-width:600px){body.exchange-world:not(.playing) .tabs[role='tablist']{padding:8px 5px;gap:6px}body.exchange-world:not(.playing) .tabs[role='tablist'] .tab{padding-inline:6px;letter-spacing:0}}
/* On narrow Settings sheets a long state gets its own line, never painted over its label. */
@media(max-width:380px){
 body.exchange-world:not(.playing) #v2mbox .rowGroup>.row{display:grid;grid-template-columns:minmax(0,1fr);gap:7px;align-items:start;justify-content:start;padding:10px 12px;min-height:54px}
 body.exchange-world:not(.playing) #v2mbox .rowGroup>.row>b{grid-column:1;white-space:normal;line-height:1.3;overflow-wrap:anywhere}
 body.exchange-world:not(.playing) #v2mbox .rowGroup>.row>.pill{grid-column:1;justify-self:start;max-width:100%;box-sizing:border-box;white-space:normal;line-height:1.3;overflow-wrap:anywhere}
 body.exchange-world:not(.playing) #v2mbox .rowGroup>.row:has(>.go){grid-template-columns:minmax(0,1fr) auto;align-items:center}
}

/* Preserve the authored crest staircase extent; compact the surrounding case, not its steps. */
@media(max-width:400px){body.exchange-world:not(.playing) #lbClimb .climbPath{height:84px}}
@media(max-width:380px){
 body.exchange-world:not(.playing) #v2mbox .rowGroup>.slider{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;padding:10px 12px}
 body.exchange-world:not(.playing) #v2mbox .rowGroup>.slider>input[type='range']{grid-column:1/-1;width:100%;min-width:0;min-height:44px;margin:0}
}

/* Build48 — utility plaques use the same leather and brass as the hall.
   Paint only: keep existing dimensions, padding, borders and touch targets. */
body.exchange-world:not(.playing):not(.lobby-open) #metaInfluence.houseUtility,
body.exchange-world:not(.playing):not(.lobby-open) #v2setB.houseUtility,
body.exchange-world:not(.playing).lobby-open #v2setB.houseUtility{
 background:linear-gradient(120deg,color-mix(in srgb,var(--brass-hi) 9%,transparent),transparent 44%),var(--em-inset);
 border-color:var(--brass-deep);border-top-color:var(--brass-hi);border-left-color:var(--brass);
 box-shadow:inset 0 1px 0 color-mix(in srgb,var(--ivory) 32%,transparent),inset 0 0 0 2px var(--brass-deep),inset 0 0 0 3px var(--ink),inset 0 -4px 6px var(--ink),0 3px 0 var(--brass-deep),0 5px 0 var(--ink),0 8px 16px color-mix(in srgb,var(--ink) 65%,transparent);
 text-shadow:0 1px 1px var(--ink)
}
body.exchange-world:not(.playing):not(.lobby-open) #metaInfluence.houseUtility:hover,
body.exchange-world:not(.playing):not(.lobby-open) #v2setB.houseUtility:hover{
 background:linear-gradient(120deg,color-mix(in srgb,var(--brass-hi) 16%,transparent),transparent 65%),var(--em-inset);
 box-shadow:inset 0 1px 0 var(--brass-hi),inset 0 0 0 2px var(--brass),inset 0 0 0 3px var(--ink),0 3px 0 var(--brass-deep),0 6px 12px var(--ink)
}
body.exchange-world:not(.playing):not(.lobby-open) #metaInfluence.houseUtility:active,
body.exchange-world:not(.playing):not(.lobby-open) #v2setB.houseUtility:active{box-shadow:inset 0 2px 5px var(--ink),inset 0 0 0 2px var(--brass-deep),0 1px 0 var(--brass-deep)}
body.exchange-world:not(.playing):not(.lobby-open) #v2setB.houseUtility>svg{background:var(--em-brass);fill:var(--ink);border-color:var(--brass-hi);box-shadow:inset 0 1px 1px var(--ivory),inset 0 -2px 3px var(--brass-deep),0 2px 3px var(--ink)}

/* Build12: separate membership from earned honours; inset every mark from the seat frame. */
#v3lobby #lbSeats .lbSeat{min-width:0}
body.exchange-world:not(.playing) #v3lobby #lbSeats .lbSeat{padding-top:30px}
#v3lobby #lbSeats .lbCred{box-sizing:border-box;max-width:100%;flex-wrap:wrap;gap:6px;padding:8px 5px 3px}
#v3lobby #lbSeats .seatHouse{position:absolute;top:5px;right:5px;width:20px;height:20px;background-size:contain;background-repeat:no-repeat;background-position:center;filter:drop-shadow(0 1px 2px var(--ink))}
@media(max-width:700px){#v3lobby #lbSeats .seatHouse{width:18px;height:18px}#v3lobby #lbSeats .lbCred{column-gap:5px;padding-inline:3px}}
@media(max-width:700px){
 body.exchange-world:not(.playing) #v3lobby #lbSeats .lbSeat{padding-top:42px}
 #v3lobby #lbSeats .lbSeat.founder .seatHouse{top:19px}
}

/* Build 99 (David 26 Sep, iPhone lobby: the FOUNDER pill clipped to "FOUNDE"). Older rules gave the pill a FIXED width
   (37-42px) and, at the phone breakpoint, an 11px font - wider than the pill. The pill now sizes to its word, at one
   small type size, never wraps and never exceeds its seat. The House mark already drops below it on a Founder seat. */
#v3lobby #lbSeats .lbSeat.founder::before{left:5px;top:5px;width:auto;min-width:0;max-width:calc(100% - 10px);height:14px;box-sizing:border-box;padding:0 6px;font:900 8px/1 Barlow,sans-serif;letter-spacing:.5px;white-space:nowrap;overflow:hidden;text-overflow:clip}
#v3lobby .lbIdent.founder::before{width:auto;min-width:0;height:14px;box-sizing:border-box;padding:0 7px;font:900 8px/1 Barlow,sans-serif;letter-spacing:.5px;white-space:nowrap}
@media(max-width:360px){#v3lobby #lbSeats .lbSeat.founder::before{left:4px;top:4px;padding:0 4px;font-size:7px;letter-spacing:.3px}}

/* Build88: content-sized desktop dock; presence must not multiply the tallest row. */
@media(min-width:901px){
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck{grid-template-columns:minmax(0,1fr) 280px;align-items:start;gap:24px;padding:18px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck>.ttmodes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(3,minmax(56px,1fr));align-self:stretch;align-content:start;gap:10px 12px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.ttmode{grid-column:auto;width:auto;max-width:none;height:auto;min-height:56px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.campaignRow{grid-column:1/-1;max-width:none}
 body.exchange-world:not(.playing) #v2title .floorBoard{grid-template-rows:repeat(3,max-content);align-content:start;gap:12px;padding:0 0 0 20px;border-left:1px solid var(--hairline);box-shadow:none}
 body.exchange-world:not(.playing) #v2title .floorRow{grid-template-rows:auto auto;align-content:start;gap:4px 8px;padding:0 0 12px;min-width:0}
 body.exchange-world:not(.playing) #v2title .floorRow:last-child{padding-bottom:0;border-bottom:0;box-shadow:none}
 body.exchange-world:not(.playing) #v2title .floorRow>.floorRowBody{grid-column:1;grid-row:2}
 body.exchange-world:not(.playing) #v2title .floorRow>.btnLink{grid-column:2;grid-row:1/3;align-self:start}
 body.exchange-world:not(.playing) #v2title .floorRow:first-child>.floorRowBody{grid-column:1/-1}
 body.exchange-world:not(.playing) #v2title .floorRow:first-child>.btnLink{grid-row:1;min-height:24px;padding-block:2px}
 body.exchange-world:not(.playing) #v2title .floorRow>small{grid-column:1;grid-row:1;align-self:center}
 body.exchange-world:not(.playing) #v2title .floorFace em{max-width:56px}
 body.exchange-world:not(.playing) #v2title .floorFace{padding-top:2px;width:56px}
 body.exchange-world:not(.playing) #v2title .floorRowBody span{white-space:normal;overflow:visible}
}

/* Build 99 visual sweep (26 Sep): the narrowest phones (320-360px). "COLLECTION" was wider than its
   bottom-bar tab and was clipped to "OLLECTION" when selected, and the "CHARACTER COLLECTION" heading
   was cut to "CHARACTER COLLE...". Equal-share tabs with a little extra room for the long word, and a
   heading size that fits the card. */
@media(max-width:360px){
 body.exchange-world:not(.playing) #metaNav button{flex:1 1 0;min-width:0;padding-inline:2px}
 body.exchange-world:not(.playing) #metaNav button[data-meta=collection]{flex-grow:1.5}
 body.exchange-world:not(.playing) #metaNav b{font-size:10px;letter-spacing:0}
 body.exchange-world:not(.playing) .metaPanelHead h2{font-size:20px}
}

/* Build 99 visual sweep (26 Sep): on a phone held sideways (and short laptop windows) the Play deck sat
   BEHIND the bottom bar - HOST TABLE, JOIN TABLE and THE SCHISM were hidden until the player happened to
   scroll. The deck goes three-across and the title block tightens so every mode is on screen at once. */
@media(max-height:520px) and (max-width:900px) and (orientation:landscape){
 body.exchange-world[data-exchange-wing] #v2title.cardStoryTitle{padding-top:54px}
 body.exchange-world #v2title>.tt2{display:none}
 body.exchange-world #v2title>#ewHallTabs{margin-top:4px;margin-bottom:2px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck{width:min(600px,92vw);margin-top:2px;padding:8px 10px 10px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.ttmode{min-height:44px;height:44px;width:auto;max-width:none}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.campaignRow{grid-column:span 2}
}
/* Same sweep, wider short screens (big phones sideways at 926-932px, small laptop windows): the desktop
   hall stacks a card showcase and discovery links above the deck, which pushed every mode button under the
   bottom bar. Below 620px of height the decorative card showcase steps aside so the modes are visible on
   arrival; the room placard and the update banner, which the deck would cover, step aside too (the
   notes stay one tap away on the WHAT'S NEW link). */
@media(min-width:901px) and (max-height:620px){
 body.exchange-world #v2title.cardStoryTitle .titleCardShowcase{display:none}
 /* the room placard and the update banner were drawn UNDER the deck once it moved up - step them aside too */
 body.exchange-world .ew-room-label,body.exchange-world #v2title.cardStoryTitle>.patchBanner{display:none}
}
@media(min-width:901px) and (max-height:480px){
 body.exchange-world #v2title>.tt2{display:none}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes{grid-template-columns:repeat(3,minmax(0,1fr));grid-template-rows:none;gap:8px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.ttmode{min-height:44px;height:44px}
 body.exchange-world:not(.playing) #v2title.cardStoryTitle .playDeck .ttmodes>.campaignRow{grid-column:span 2}
}
/* Same sweep: on landscape phones the lobby's worded SETTINGS button sat on top of the HOST TABLE /
   JOIN TABLE tag in the lobby header. In the lobby on a short landscape screen it is the icon-only
   44px button the portrait phone already uses - and on tablets up to 900px wide, where its shadow sat
   across the top of the same tag. */
@media(max-height:520px) and (orientation:landscape),(max-width:900px){
 body.lobby-open #v2setB.houseUtility{width:44px;min-width:44px;height:44px;min-height:44px;padding:10px}
 body.lobby-open #v2setB.houseUtility>span{display:none}
}
/* Same sweep (667x375 and other sub-700px landscape phones): the phone rule gives the turn label a
   100% basis so it can sit on its own row in PORTRAIT, but in landscape the row does not wrap - the
   label took the whole lane and pushed the four action pips and the turn clock out of sight. In
   landscape the label only takes the room it needs. */
@media(max-width:700px) and (orientation:landscape){
 #v2command #v2act{flex-wrap:nowrap}
 #v2command #v2act .actlabel{flex:0 1 auto}
}
