<!-- SOLID CITY · part 89 -->
.href = lastURL; dl.download = name; dl.id = 'cap-dl'; bs.appendChild(dl);
  m.appendChild(bs); res.appendChild(m);
}
var busy = false;
function shoot() {
  if (busy) return; busy = true; var go = $('cap-go'); if (go) { go.disabled = true; go.textContent = 'BUILDING\u2026'; }
  frameShot();
  setTimeout(function () { requestAnimationFrame(function () {
    capture().then(function (r) {
      flash(); last = r;
      if (lastURL) URL.revokeObjectURL(lastURL); lastURL = URL.createObjectURL(r.blob);
      var ext = (r.type === 'image/jpeg' ? 'jpg' : (r.type.split('/')[1] || 'png')), name = 'solid-city-' + stamp() + '-' + r.w + 'x' + r.h + '.' + ext;
      var file = null; try { file = new File([r.blob], name, { type: r.type }); } catch (e) {}
      showResult(r, name, file);
      var msg = '\uD83D\uDCF7 Captured ' + (r.what === 'menus' ? 'world + menus, ' : '') + ext.toUpperCase() + ' ' + r.w + '\u00d7' + r.h + ' (' + fmtBytes(r.blob.size) + ')';
      if ((A.IS_TOUCH || A.MOBILE) && file && canShareFile(file)) {
        shareFile(file).then(function () { toast(msg + ' \u2014 shared'); }).catch(function (e) { toast(e && e.name === 'AbortError' ? msg + ' \u2014 tap SHARE / SAVE to keep it' : msg + ' \u2014 tap SHARE / SAVE or OPEN', 4500); });
      } else if (A.IS_TOUCH && /iP(hone|ad|od)/.test(navigator.userAgent)) {
        toast(msg + ' \u2014 tap OPEN, then hold the image to save', 5000);
      } else { download(lastURL, name); toast(msg + ' \u2014 downloaded'); }
      if (r.note) setTimeout(function () { toast(r.note, 4000); }, 3300);
      window.dispatchEvent(new CustomEvent('city-capture', { detail: { w: r.w, h: r.h, type: r.type, bytes: r.blob.size, name: name } }));
    }).catch(function (e) { toast('Capture failed: ' + (e && e.message || e), 5000); })
      .then(function () { busy = false; if (go) { go.disabled = false; go.textContent = 'CAPTURE'; } });
  }); }, 320);   // let the scaffold frame build in first
}

/* ---------- auto-fade ---------- */
var Fade = (function () {
  var idle = false, last = performance.now(), wakeAt = 0, on = lsGet(FLS) !== '0';
  var PANELS = '#cap-panel,#uni-panel,#pd-panel,#bk-reader,#sc-talk,#sp-talk,#cz-talk,#sc-portal,#w-pick,#w-resume,.mp-panel,#hc-card,#fg,#rf-pick,.rf-pick,.fg-sheet,#ai-panel,#sc-count,#hyper-controller:not(.hc-folded):not(.hc-gone) .hc-menu';
  function shown(e) { if (e.hidden || !e.getClientRects().length) return false; var s = getComputedStyle(e); return s.display !== 'none' && s.visibility !== 'hidden' && +s.opacity > 0.05; }
  function blocked() {
    var b = $('sc-boot'); if (b && shown(b)) return 'boot';
    var hud = $('sc-hud'); if (!hud || hud.hidden) return 'nohud';
    var ae = document.activeElement; if (ae && (/^(INPUT|TEXTAREA|SELECT)$/.test(ae.tagName) || ae.isContentEditable)) return 'typing';
    var list = document.querySelectorAll(PANELS); for (var i = 0; i < list.length; i++) if (shown(list[i])) return 'panel:' + (list[i].id || list[i].className);
    if (document.querySelector('.bk-open, dialog[open]')) return 'dialog';
    return '';
  }
  function setIdle(v) { if (idle === v) return; idle = v; document.body.classList.toggle('hud-idle', v); }
  function act(e) {
    last = performance.now();
    if (idle) { setIdle(false); if (e && /down|start/.test(e.type)) wakeAt = last; }
  }
  // the waking tap must not press a (now visible) button: swallow the click that follows a wake
  addEventListener('click', function (e) { if (wakeAt && performance.now() - wakeAt < 700) { var t = e.target; if (t && t.closest && !t.closest('#ai-view-btn') && t.closest('#sc-hud button, #sc-hud a, #sc-hud [role=button], #sc-hud input, #sc-hud label')) { e.preventDefault(); e.stopPropagation(); } } }, true);
  ['pointerdown', 'touchstart', 'keydown', 'wheel', 'mousedown'].forEach(function (ev) { addEventListener(ev, act, { capture: true, passive: true }); });
  var lx = -1, ly = -1; addEventListener('pointermove', function (e) { if (Math.abs(e.clientX - lx) + Math.abs(e.clientY - ly) > 2) { lx = e.clientX; ly = e.clientY; act(e); } }, { capture: true, passive: true });
  function padActive() { if (!navigator.getGamepads) return false; var ps; try { ps = navigator.getGamepads(); } catch (e) { return false; } for (var i = 0; ps && i < ps.length; i++) { var p = ps[i]; if (!p) continue; for (var j = 0; j < p.buttons.length; j++) if (p.buttons[j].pressed || p.buttons[j].value > 0.2) return true; for (j = 0; j < p.axes.length; j++) if (Math.abs(p.axes[j]) > 0.25) return true; } return false; }
  setInterval(function () {
    var now = performance.now();
    if (padActive()) act();
    if (!on) { setIdle(false); return; }
    if (blocked()) { last = Math.max(last, now); setIdle(false); return; }   // the 5 s clock restarts after a panel closes
    if (!idle && now - last >= IDLE_MS) setIdle(true);
  }, 100);
  addEventListener('visibilitychange', function () { if (!document.hidden) act(); });
  return {
    enabled: funct