{
  "version": 3,
  "sources": ["/cdn/shop/t/33/assets/bb-budget.ui.js?cb=bbpolish01_20260112"],
  "sourcesContent": ["/* bb-budget.ui.js \u2014 DROP-IN REPLACEMENT (trimmed + safer wiring, keeps behavior) */\n;(() => {\n  \"use strict\";\n\n  // Always create namespace so it \"exists\"\n  window.TYBH = window.TYBH || {};\n  const TYBH = window.TYBH;\n\n  // DOM helper\n  // This file uses $(\"id\") heavily. Ensure it exists so the whole UI does not crash on load.\n  const $ = (id) => {\n    try { return document.getElementById(id); } catch(_e) { return null; }\n  };\n\n  // Prevent a complete second boot, but do not poison the namespace when\n  // Shopify loads this file before util/core. A later ordered reload must be\n  // allowed to initialize the real UI.\n  TYBH.ui = TYBH.ui || {};\n  if (TYBH.ui._scriptLoaded && typeof TYBH.ui.openEmbedded === \"function\") return;\n\n  const U = TYBH.util;\n  const C = TYBH.core;\n  if (!U || !C) {\n    TYBH.ui._dependencyMissing = true;\n    console.error(\n      \"Budget Hub: util/core missing. Load order must be: bb-budget.util.js -> bb-budget.core.js -> bb-budget.ui.js\"\n    );\n    return;\n  }\n  TYBH.ui._dependencyMissing = false;\n  TYBH.ui._scriptLoaded = true;\n\n  // Safe number cast helper (prevents num_ undefined crashes)\n  // Define on window as well to survive any bundling / scoping changes.\n  const num_ = (v) => {\n    const n = Number(v);\n    return Number.isFinite(n) ? n : 0;\n  };\n  try{\n    if(typeof window !== 'undefined'){\n      window.num_ = window.num_ || num_;\n      window.numb = window.numb || num_;\n    }\n  }catch(_e){}\n\n\n\n  // ===== Cloud backend (shares SLB login token) =====\n  const CLOUD = {\n    url: null,\n    token: \"\",\n    callsign: \"\",\n    isAdmin: false,\n    targetCallsign: \"\",   // admin: view as\n    profileKey: \"\",\n    lastLoadedAt: 0,\n    lastSavedAt: 0,\n    saving: false,\n    saveTimer: null,\n    lastSavedJson: \"\",\n    loadedOnce: false\n  };\n\n\n  function isSlbEmbedded_(){\n    try{\n      const root = document.getElementById(\"tyBudgetHub\");\n      return !!(root && root.getAttribute(\"data-slb-embedded\") === \"1\");\n    }catch(_e){ return false; }\n  }\n\n  let _embeddedLoadPromise = null;\n  let _embeddedSessionToken = \"\";\n\n  function cloudEls_(){\n    return {\n      card: $(\"cloudCard\"),\n      status: $(\"cloudStatus\"),\n      backend: $(\"cloudBackend\"),\n      backendInput: $(\"cloudBackendInput\"),\n      msg: $(\"cloudMsg\"),\n      loginRow: $(\"cloudLoginRow\"),\n      callsign: $(\"cloudCallsign\"),\n      pin: $(\"cloudPin\"),\n      saveBtn: $(\"cloudSaveBtn\"),\n      reloadBtn: $(\"cloudReloadBtn\"),\n      logoutBtn: $(\"cloudLogoutBtn\"),\n      adminRow: $(\"cloudAdminRow\"),\n      adminTools: $(\"cloudAdminTools\"),\n      viewCallsign: $(\"cloudViewCallsign\"),\n      shareKey: $(\"cloudShareKey\"),\n      shareCallsigns: $(\"cloudShareCallsigns\")\n    };\n  }\n\n  function slbResolveWebappUrl_(){\n    // Same resolution order as SLB (more reliable than a hardcoded default)\n    // 1) window.SLB_WEBAPP_URL\n    // 2) localStorage 'slb_webapp_url'\n    // 3) URL query ?slb_backend=... (or ?backend=...)\n    // 4) baked fallback (same as SLB bundle)\n    try{\n      if(typeof window!== 'undefined' && window.SLB_WEBAPP_URL && String(window.SLB_WEBAPP_URL).trim()){\n        return String(window.SLB_WEBAPP_URL).trim();\n      }\n    }catch(_e){}\n    try{\n      const v = localStorage.getItem('slb_webapp_url');\n      if(v && String(v).trim()) return String(v).trim();\n    }catch(_e){}\n    try{\n      const u = new URL(location.href);\n      const q = u.searchParams.get('slb_backend') || u.searchParams.get('backend');\n      if(q && String(q).trim()){\n        const vv = String(q).trim();\n        try{ localStorage.setItem('slb_webapp_url', vv); }catch(_e){}\n        return vv;\n      }\n    }catch(_e){}\n    return \"https://script.google.com/macros/s/AKfycbwFTGsr-IfaETXvCC4IfTSHTJ3ESkNn46797KvI-hp-n2OIDhlnR7104sfZpheu0YzXCA/exec\";\n  }\n\n  // Phase 5 transport is handled exclusively by SLBPostBridge.\n\n\n  function tywApi_(action, args, opts){\n    opts = opts || {};\n    args = args || {};\n    const requestId = (opts.requestId ? String(opts.requestId) : (\"p5b_\" + Date.now() + \"_\" + Math.random().toString(16).slice(2)));\n    const token = (CLOUD.token || (window.SLB_SESSION&&window.SLB_SESSION.get?String(window.SLB_SESSION.get(\"token\")||\"\"):\"\") || (sessionStorage.getItem(\"tyw_token\")||\"\"));\n    const payload = { requestId, action, token, args };\n\n    const timeoutMs = (function(){\n      const a = String(action||\"\");\n      if(a === \"budgetPutParts\") return 90000;\n      if(a === \"budgetPut\" || a === \"budgetGet\") return 120000;\n      if(a === \"budgetEnsureProfile\" || a === \"budgetDiag\") return 60000;\n      return 45000;\n    })();\n\n    // V4.7: inside normal SLB, Budget uses the same shared RPC owner as every\n    // other feature. This gives it route-aware READ coalescing, shared write\n    // single-flight, session ownership and the common secure transport.\n    try{\n      const app=window.SLB_APP||null;\n      const fn=app&&(typeof app.__realRpc===\"function\"?app.__realRpc:(typeof app.rpc===\"function\"?app.rpc:null));\n      if(fn){\n        return Promise.resolve(fn.call(app, action, args, Object.assign({}, opts, {\n          requestId: requestId,\n          timeoutMs: timeoutMs\n        })));\n      }\n    }catch(_eShared){}\n\n    // Standalone/recovery mode: preserve the direct secure bridge fallback.\n    if(!CLOUD.url){\n      return Promise.reject(new Error(\"Backend URL not set. Open any SLB page once, or add ?slb_backend=YOUR_WEBAPP_URL to this page.\"));\n    }\n    if(!window.SLBPostBridge || typeof window.SLBPostBridge.call !== \"function\"){\n      return Promise.reject(new Error(\"Secure SLB transport did not load. Hard refresh and try again.\"));\n    }\n    return window.SLBPostBridge.call(CLOUD.url, payload, {\n      timeoutMs: timeoutMs,\n      action: String(action || \"\")\n    });\n  }\n\n  function b64WebToUtf8_(b64){\n    try{\n      let s = String(b64 || \"\").trim();\n      if(!s) return \"\";\n      s = s.replace(/-/g, \"+\").replace(/_/g, \"/\");\n      // add padding\n      const pad = s.length % 4;\n      if(pad === 2) s += \"==\";\n      else if(pad === 3) s += \"=\";\n      else if(pad === 1) s += \"===\";\n\n      const bin = atob(s);\n      const bytes = new Uint8Array(bin.length);\n      for(let i=0;i<bin.length;i++) bytes[i] = bin.charCodeAt(i) & 0xff;\n      if(typeof TextDecoder !== \"undefined\"){\n        return new TextDecoder(\"utf-8\").decode(bytes);\n      }\n      // fallback (older browsers)\n      let str = \"\";\n      for(let i=0;i<bytes.length;i++) str += String.fromCharCode(bytes[i]);\n      try{ return decodeURIComponent(escape(str)); }catch(_e){ return str; }\n    }catch(_e){\n      return \"\";\n    }\n  }\n\n\n// Encode UTF-8 string -> websafe base64 (no padding)\nfunction utf8ToB64Web_(str){\n  try{\n    str = String(str || \"\");\n    if(!str) return \"\";\n    let bytes;\n    if(typeof TextEncoder !== \"undefined\"){\n      bytes = new TextEncoder().encode(str);\n    }else{\n      const esc = unescape(encodeURIComponent(str));\n      bytes = new Uint8Array(esc.length);\n      for(let i=0;i<esc.length;i++) bytes[i] = esc.charCodeAt(i) & 0xff;\n    }\n\n    let bin = \"\";\n    const step = 0x4000;\n    for(let i=0;i<bytes.length;i+=step){\n      bin += String.fromCharCode.apply(null, bytes.subarray(i, i+step));\n    }\n    return btoa(bin).replace(/\\+/g,\"-\").replace(/\\//g,\"_\").replace(/=+$/g,\"\");\n  }catch(_e){\n    return \"\";\n  }\n}\n\n  function cloudSetStatus_(s){\n    const el = cloudEls_().status;\n    if(el) el.textContent = String(s||\"\");\n  }\n  function cloudSetMsg_(s, kind){\n    const el = cloudEls_().msg;\n    if(!el) return;\n    el.textContent = String(s||\"\");\n    el.classList.remove(\"ok\",\"warn\",\"bad\");\n    if(kind) el.classList.add(kind);\n  }\n  function cloudShowLogin_(show){\n    const E = cloudEls_();\n    if(isSlbEmbedded_()) show = false;\n    if(E.loginRow) E.loginRow.style.display = show ? \"\" : \"none\";\n  }\n  function cloudShowAdmin_(show){\n    const E = cloudEls_();\n    if(E.adminRow) E.adminRow.style.display = show ? \"\" : \"none\";\n    if(E.adminTools) E.adminTools.style.display = show ? \"\" : \"none\";\n  }\n  function cloudEnableButtons_(enabled){\n    const E = cloudEls_();\n    if(E.saveBtn) E.saveBtn.disabled = !enabled;\n    if(E.reloadBtn) E.reloadBtn.disabled = !enabled;\n    if(E.logoutBtn) E.logoutBtn.disabled = !enabled;\n  }\n\n  function cloudSyncBackendUi_(){\n    const E = cloudEls_();\n    const url = String(CLOUD.url||\"\").trim();\n    if(E.backend) E.backend.textContent = url ? url : \"\u2014\";\n    if(E.backendInput && !E.backendInput.value) E.backendInput.value = url;\n  }\n\n  function cloudReadSession_(){\n    let state = null, hub = null;\n    try{ state = window.SLB_APP && window.SLB_APP.S ? window.SLB_APP.S : null; }catch(_e0){ state = null; }\n    try{ hub = window.SLB_SESSION && typeof window.SLB_SESSION.peek==='function' ? window.SLB_SESSION.peek() : null; }catch(_eH){ hub=null; }\n    try{\n      CLOUD.token = String((hub&&hub.token) || (state && state.token) || sessionStorage.getItem(\"tyw_token\") || \"\").trim();\n      CLOUD.callsign = String((hub&&hub.callsign) || (state && state.callsign) || sessionStorage.getItem(\"tyw_callsign\") || \"\").trim().toUpperCase();\n      const adminStored = String(sessionStorage.getItem(\"tyw_isAdmin\")||\"0\") === \"1\";\n      const modStored = String(sessionStorage.getItem(\"tyw_isModerator\")||\"0\") === \"1\";\n      CLOUD.isAdmin = !!((hub&&hub.isAdminOrMod) || (state && (state.isAdmin || state.isModerator || state.isAdminOrMod)) || adminStored || modStored);\n    }catch(_e){\n      CLOUD.token = String((hub&&hub.token) || (state && state.token) || \"\").trim();\n      CLOUD.callsign = String((hub&&hub.callsign) || (state && state.callsign) || \"\").trim().toUpperCase();\n      CLOUD.isAdmin = !!((hub&&hub.isAdminOrMod) || (state && (state.isAdmin || state.isModerator || state.isAdminOrMod)));\n    }\n  }\n\n\n  // Optional: auto-login using SLB \"Remember login\" values (cross-page)\n  let _cloudAutoLoginTried = false;\n  async function cloudAutoLoginFromSLB_(){\n    if(_cloudAutoLoginTried) return;\n    _cloudAutoLoginTried = true;\n    if(CLOUD.token) return;\n    let saved = null;\n    try{\n      saved = JSON.parse(localStorage.getItem(\"slb_saved_login_v1\") || \"null\");\n    }catch(_e){ saved = null; }\n    const callsign = String(saved && saved.callsign ? saved.callsign : \"\").trim().toUpperCase();\n    const pin = String(saved && saved.pin ? saved.pin : \"\").trim();\n    if(!callsign || !pin) return;\n    try{\n      const E = cloudEls_();\n      if(E.callsign && !E.callsign.value) E.callsign.value = callsign;\n      if(E.pin && !E.pin.value) E.pin.value = pin;\n    }catch(_e){}\n    try{ cloudSetMsg_(\"Auto-login from SLB saved login\u2026\", \"warn\"); }catch(_e){}\n    try{ await cloudLogin(); }catch(_e){}\n  }\n\n  function cloudApplyDashboard_(dash){\n    try{\n      if(dash && dash.profile){\n        const p = dash.profile;\n        CLOUD.callsign = String(p.callsign||\"\").trim().toUpperCase();\n        CLOUD.isAdmin = !!p.isAdmin;\n        if(window.SLB_SESSION&&typeof window.SLB_SESSION.accept==='function') window.SLB_SESSION.accept({token:CLOUD.token,callsign:CLOUD.callsign,displayName:String(p.displayName||\"\"),isAdmin:!!p.isAdmin,isModerator:!!p.isModerator,canCreatePouches:!!p.canCreatePouches},{persistSession:true,persistShared:!!CLOUD.token});\n        else{\n          sessionStorage.setItem(\"tyw_callsign\", CLOUD.callsign);\n          sessionStorage.setItem(\"tyw_displayName\", String(p.displayName||\"\"));\n          sessionStorage.setItem(\"tyw_isAdmin\", CLOUD.isAdmin ? \"1\" : \"0\");\n          sessionStorage.setItem(\"tyw_isModerator\", (p.isModerator ? \"1\" : \"0\"));\n        }\n      }\n    }catch(_e){}\n  }\n\n  async function cloudLogin(){\n    const E = cloudEls_();\n    const callsign = String((E.callsign && E.callsign.value) ? E.callsign.value : \"\").trim().toUpperCase();\n    const pin = String((E.pin && E.pin.value) ? E.pin.value : \"\").trim();\n    if(!callsign || !pin){\n      cloudSetMsg_(\"Enter callsign + PIN.\", \"warn\");\n      return;\n    }\n    cloudSetMsg_(\"Logging in\u2026\");\n    try{\n      const out = await tywApi_(\"loginBundle\", { callsign, pin });\n      if(!out || !out.token){\n        cloudSetMsg_(\"Login failed.\", \"bad\");\n        return;\n      }\n      CLOUD.token = String(out.token||\"\");\n      if(window.SLB_SESSION&&typeof window.SLB_SESSION.accept==='function') window.SLB_SESSION.accept({token:CLOUD.token,callsign:callsign},{persistSession:true,emit:false});\n      else sessionStorage.setItem(\"tyw_token\", CLOUD.token);\n      cloudApplyDashboard_(out.dash||null);\n      cloudReadSession_();\n      cloudSetMsg_(\"Logged in.\", \"ok\");\n      cloudShowLogin_(false);\n      cloudShowAdmin_(!!CLOUD.isAdmin);\n      await cloudLoadFromCloud_();\n    }catch(e){\n      cloudSetMsg_(String(e && e.message ? e.message : e), \"bad\");\n    }\n  }\n\n  function cloudLogout(){\n    if(isSlbEmbedded_()){\n      cloudSetMsg_(\"BB Budget uses your active SLB login. Use the main SLB Exit button to log out.\", \"warn\");\n      return;\n    }\n    try{\n      sessionStorage.removeItem(\"tyw_token\");\n      sessionStorage.removeItem(\"tyw_callsign\");\n      sessionStorage.removeItem(\"tyw_displayName\");\n      sessionStorage.removeItem(\"tyw_isAdmin\");\n      sessionStorage.removeItem(\"tyw_isModerator\");\n    }catch(_e){}\n    CLOUD.token = \"\";\n    CLOUD.loadedOnce = false;\n    CLOUD.callsign = \"\";\n    CLOUD.isAdmin = false;\n    CLOUD.viewAs = \"\";\n    cloudSetStatus_(\"Not logged in.\", \"warn\");\n    cloudSetMsg_(\"Logged out.\", \"ok\");\n    cloudShowLogin_(true);\n    cloudShowAdmin_(false);\n    cloudEnableButtons_(false);\n  }\n\n  function cloudSetBackend(){\n    const E = cloudEls_();\n    const url = String((E.backendInput && E.backendInput.value) ? E.backendInput.value : \"\").trim();\n    if(!url){\n      cloudSetMsg_(\"Paste your Apps Script Web app /exec URL.\", \"warn\");\n      return;\n    }\n    CLOUD.url = url;\n    try{ localStorage.setItem('slb_webapp_url', url); }catch(_e){}\n    cloudSyncBackendUi_();\n    cloudSetMsg_(\"Backend URL saved.\", \"ok\");\n  }\n\n  async function cloudPing(){\n    cloudSyncBackendUi_();\n    if(!CLOUD.url){\n      cloudSetMsg_(\"Backend URL not set.\", \"bad\");\n      return;\n    }\n    cloudSetMsg_(\"Pinging backend\u2026\");\n    try{\n      const out = await tywApi_(\"ping\", {});\n      const b = (out && out.build) ? String(out.build) : \"?\";\n      const t = (out && out.serverTime) ? String(out.serverTime) : \"\";\n      cloudSetMsg_(\"Backend OK. Build=\"+b+(t?(\" | \"+t):\"\")+\"\", \"ok\");\n    }catch(e){\n      cloudSetMsg_(String(e && e.message ? e.message : e), \"bad\");\n    }\n  }\n\n  function cloudPickTargetCallsign_(){\n    // admin view override stored in sessionStorage\n    try{\n      const t = String(sessionStorage.getItem(\"tybh_admin_target_callsign\")||\"\").trim().toUpperCase();\n      if(t) CLOUD.targetCallsign = t;\n    }catch(_e){}\n  }\n\n  function cloudApplySnapshot_(snap){\n    if(!snap || !snap.data) return false;\n    try{\n      // restore state fields (same as restoreLastSession) but treat as clean\n      state.settings = snap.data.settings || {};\n      state.rules = snap.data.rules || {};\n      state.accounts = snap.data.accounts || [];\n      state.bills = snap.data.bills || [];\n      state.budgets = snap.data.budgets || [];\n      state.goals = snap.data.goals || [];\n      state.categories = snap.data.categories || [];\n      state.grow = snap.data.grow || {};\n      state.move = snap.data.move || {};\n      state.tx = snap.data.tx || [];\n      state.loaded = true;\n      state._isDemo = false;\n\n      META.fileName = (snap.meta && snap.meta.fileName) ? snap.meta.fileName : (META.fileName || \"\");\n      META.dirty = false;\n      META.lastExportTs = (snap.meta && snap.meta.lastExportTs) ? snap.meta.lastExportTs : 0;\n      META.cloudSavedTs = Date.now();\n\n      // Keep a local snapshot mirror for offline\n      try{\n        localStorage.setItem(LS_KEY, JSON.stringify(snap));\n      }catch(_e){}\n\n      state._restoreOffered = false;\n      try{ dismissRestore(); }catch(_e){}\n      setDemoMode(false);\n\n      afterLoad();\n      updateStatusStrip();\n      return true;\n    }catch(e){\n      console.error(e);\n      return false;\n    }\n  }\n\n  async function cloudLoadFromCloud_(){\n    cloudReadSession_();\n    cloudPickTargetCallsign_();\n    if(!CLOUD.token){\n      cloudSetStatus_(\"Not logged in.\");\n      cloudShowLogin_(true);\n      cloudShowAdmin_(false);\n      cloudEnableButtons_(false);\n      return;\n    }\n    cloudEnableButtons_(true);\n    cloudShowLogin_(false);\n    cloudShowAdmin_(!!CLOUD.isAdmin);\n\n    const viewNote = (CLOUD.isAdmin && CLOUD.targetCallsign) ? (\" (viewing \" + CLOUD.targetCallsign + \")\") : \"\";\n    cloudSetStatus_(\"Loading\u2026\" + viewNote);\n\n    try{\n      const baseArgs = (CLOUD.isAdmin && CLOUD.targetCallsign) ? { targetCallsign: CLOUD.targetCallsign } : {};\n\n      // Step 0: ensure profile sheet exists (first-time users need a tab)\n      try{ await tywApi_(\"budgetEnsureProfile\", baseArgs); }catch(_e){}\n\n      // Step 1: meta (fast) \u2014 avoids huge JSONP payloads.\n      const meta = await tywApi_(\"budgetGet\", Object.assign({}, baseArgs, { mode: \"meta\" }));\n      CLOUD.profileKey = String(meta && meta.profileKey ? meta.profileKey : \"\");\n      CLOUD.lastLoadedAt = num_(meta && meta.updatedAt ? meta.updatedAt : 0) || 0;\n      const partsTotal = num_(meta && meta.parts ? meta.parts : 0) || 0;\n\n      if(partsTotal <= 0){\n        // No cloud data yet: keep current local state, but show ready status\n        CLOUD.loadedOnce = true;\n        cloudSetStatus_(\"Ready (empty). Profile: \" + (CLOUD.profileKey || \"\u2014\") + viewNote);\n        cloudSetMsg_(\"Cloud is empty for this profile. Import CSV or start adding transactions, then it will auto-save.\", \"warn\");\n        return;\n      }\n\n      // Step 2: fetch JSON in small parts (robust for large profiles)\n      const batch = 6;\n      const pieces = [];\n      let got = 0;\n\n      for(let p=1; p<=partsTotal; p+=batch){\n        const lim = Math.min(batch, partsTotal - p + 1);\n        cloudSetStatus_(\"Loading\u2026\" + viewNote + \" \" + Math.min(p + lim - 1, partsTotal) + \"/\" + partsTotal);\n        const pr = await tywApi_(\"budgetGet\", Object.assign({}, baseArgs, { mode: \"part\", start: p, limit: lim }));\n        const arr = (pr && pr.chunksB64 && Array.isArray(pr.chunksB64)) ? pr.chunksB64 : [];\n        for(let i=0;i<arr.length;i++){\n          const b64 = arr[i];\n          if(!b64) { pieces.push(\"\"); continue; }\n          pieces.push(b64WebToUtf8_(b64));\n        }\n        got += arr.length;\n      }\n\n      const rawJson = pieces.join(\"\");\n      let snap = null;\n      try{ snap = JSON.parse(String(rawJson)); }catch(_e){ snap = null; }\n      if(snap && snap.data){\n        cloudApplySnapshot_(snap);\n        CLOUD.loadedOnce = true;\n        cloudSetStatus_(\"Loaded. Profile: \" + (CLOUD.profileKey || \"\u2014\") + viewNote);\n        cloudSetMsg_(\"\", \"\");\n        return;\n      }\n\n      // If parse failed, fall back to legacy full-get (some environments might still be on older backend)\n      const out = await tywApi_(\"budgetGet\", baseArgs);\n      CLOUD.profileKey = String(out && out.profileKey ? out.profileKey : CLOUD.profileKey);\n      CLOUD.lastLoadedAt = num_(out && out.updatedAt ? out.updatedAt : CLOUD.lastLoadedAt) || 0;\n\n      let legacyRaw = \"\";\n      try{\n        if(out && String(out.encoding||\"\") === \"b64\" && out.jsonB64){\n          legacyRaw = b64WebToUtf8_(out.jsonB64);\n        }else{\n          legacyRaw = String(out && out.json ? out.json : \"\");\n        }\n      }catch(_e){ legacyRaw = String(out && out.json ? out.json : \"\"); }\n\n      let snap2 = null;\n      try{ snap2 = JSON.parse(String(legacyRaw||\"\")); }catch(_e){ snap2 = null; }\n      if(snap2 && snap2.data){\n        cloudApplySnapshot_(snap2);\n        CLOUD.loadedOnce = true;\n        cloudSetStatus_(\"Loaded. Profile: \" + (CLOUD.profileKey || \"\u2014\") + viewNote);\n        cloudSetMsg_(\"\", \"\");\n        return;\n      }\n\n      cloudSetStatus_(\"Cloud load failed.\");\n      cloudSetMsg_(\"Cloud data could not be parsed.\", \"bad\");\n    }catch(e){\n      cloudSetStatus_(\"Cloud load failed.\");\n      const baseMsg = String(e && e.message ? e.message : e);\n      cloudSetMsg_(baseMsg, \"bad\");\n\n      // Auto diagnostic (helps distinguish backend errors vs JSONP/size issues)\n      try{\n        const diagArgs = (CLOUD.isAdmin && CLOUD.targetCallsign) ? { targetCallsign: CLOUD.targetCallsign } : {};\n        const d = await tywApi_(\"budgetDiag\", diagArgs);\n        if(d){\n          const line = \"Diag: ssId=\" + (d.ssId||\"?\") + \", profileKey=\" + (d.profileKey||\"?\") + \", sheet=\" + (d.profileSheetName||\"?\") + \", exists=\" + (d.profileSheetExists?\"Y\":\"N\") + \", lastRow=\" + (d.profileLastRow||0);\n          cloudSetMsg_(baseMsg + \"\\n\" + line, \"bad\");\n        }\n      }catch(_e){}\n      // fall back to login if session expired\n      if(String(e && e.message || \"\").toLowerCase().indexOf(\"session expired\") >= 0){\n        try{ sessionStorage.removeItem(\"tyw_token\"); }catch(_e){}\n        CLOUD.token = \"\";\n        cloudShowLogin_(true);\n        cloudEnableButtons_(false);\n      }\n    }\n  }\n\n  function scheduleCloudSave_(){\n    if(state._isDemo) return;\n    if(!CLOUD.token) return;\n    if(CLOUD.saveTimer) clearTimeout(CLOUD.saveTimer);\n    CLOUD.saveTimer = setTimeout(()=>{ cloudSaveNow(false); }, 1800);\n  }\n\n\n\n\n  async function cloudSaveNow(force){\n    const __forceSave = (force !== false);\n    cloudReadSession_();\n    const viewNote = (CLOUD.isAdmin && CLOUD.targetCallsign) ? (\" (viewing \" + CLOUD.targetCallsign + \")\") : \"\";\n\n    if(!CLOUD.token){\n      cloudSetMsg_(\"Not logged in.\", \"warn\");\n      return;\n    }\n    if(CLOUD.saving) return;\n\n    // Only save when dirty (auto). Manual Save now forces save even if not dirty.\n    if(!META.dirty && !__forceSave) return;\n\n    try{\n      const snap = safeSnapshotPayload();\n      const json = JSON.stringify(snap);\n      if(!json) return;\n      if(json === CLOUD.lastSavedJson){\n        META.dirty = false;\n        updateStatusStrip();\n        return;\n      }\n\n      CLOUD.saving = true;\n      cloudSetStatus_(\"Saving\u2026\" + viewNote);\n      cloudSetMsg_(\"\");\n\n      const baseArgs = (CLOUD.isAdmin && CLOUD.targetCallsign) ? { targetCallsign: CLOUD.targetCallsign } : {};\n\n      // Ensure profile + sheet exists (important for first-time users)\n      try{ await tywApi_(\"budgetEnsureProfile\", baseArgs); }catch(_e){}\n\n      const v = snap.v || 0;\n\n      \nlet out = null;\n\n// Always use chunked writes with base64-encoded chunks.\n// Use small chunks to avoid Error 400 (URL too long) on JSONP GET.\n// Also retry with even smaller chunks if we still hit 400/network errors.\nconst chunkSizes = [1200, 800, 600, 400]; // raw JSON chars per chunk\nlet last = null;\nlet lastErr = null;\n\nfor(let attempt=0; attempt<chunkSizes.length; attempt++){\n  const maxChunk = chunkSizes[attempt];\n  last = null;\n  lastErr = null;\n\n  const partsTotal = Math.max(1, Math.ceil(json.length / maxChunk));\n\n  try{\n    for(let i=0;i<partsTotal;i++){\n      const chunk = json.slice(i*maxChunk, (i+1)*maxChunk);\n      const chunkB64 = utf8ToB64Web_(chunk);\n      cloudSetStatus_(\"Saving\u2026\" + viewNote + \" \" + (i+1) + \"/\" + partsTotal + (attempt ? (\" (retry \" + (attempt+1) + \")\") : \"\"));\n      last = await tywApi_(\"budgetPutParts\", Object.assign({}, baseArgs, {\n        partNo: i + 1,\n        partsTotal: partsTotal,\n        chunkB64: chunkB64,\n        v: v,\n        reset: (i === 0),\n        finalize: (i === partsTotal - 1)\n      }));\n    }\n    out = last || {};\n    lastErr = null;\n    break; // success\n  }catch(e){\n    lastErr = e;\n    const em = String(e && e.message ? e.message : e);\n    // If the server rejects the URL length (400) or the browser treats it as a network error,\n    // retry with a smaller chunk size.\n    if(em.toLowerCase().indexOf('bad request') >= 0 || em.toLowerCase().indexOf('network error') >= 0){\n      cloudSetMsg_(\"Save retry: chunk too large. Trying smaller\u2026\", \"warn\");\n      continue;\n    }\n    throw e;\n  }\n}\n\nif(lastErr){\n  throw lastErr;\n}\nCLOUD.lastSavedAt = num_(out && out.updatedAt ? out.updatedAt : Date.now()) || Date.now();\n      CLOUD.lastSavedJson = json;\n\n      META.dirty = false;\n      META.cloudSavedTs = CLOUD.lastSavedAt;\n      updateStatusStrip();\n\n      const pk = String(out && out.profileKey ? out.profileKey : (CLOUD.profileKey || \"\")) || \"\u2014\";\n      cloudSetStatus_(\"Saved. Profile: \" + pk + viewNote);\n      cloudSetMsg_(\"Cloud saved: \" + fmtDT(CLOUD.lastSavedAt), \"ok\");\n    }catch(e){\n      cloudSetStatus_(\"Save failed.\" + viewNote);\n      cloudSetMsg_(String(e && e.message ? e.message : e), \"bad\");\n    }finally{\n      CLOUD.saving = false;\n    }\n  }\n\n  async function cloudReload(){\n    if(META.dirty){\n      cloudSetMsg_(\"You have unsaved changes. Save first, then reload.\", \"warn\");\n      return;\n    }\n    await cloudLoadFromCloud_();\n  }\n\n  async function cloudViewAs(){\n    cloudReadSession_();\n    if(!CLOUD.isAdmin){\n      cloudSetMsg_(\"Admin only.\", \"warn\");\n      return;\n    }\n    const E = cloudEls_();\n    const t = String((E.viewCallsign && E.viewCallsign.value) ? E.viewCallsign.value : \"\").trim().toUpperCase();\n    if(!t){\n      cloudSetMsg_(\"Enter a callsign to view.\", \"warn\");\n      return;\n    }\n    try{ sessionStorage.setItem(\"tybh_admin_target_callsign\", t); }catch(_e){}\n    CLOUD.targetCallsign = t;\n    await cloudLoadFromCloud_();\n  }\n\n  async function cloudCreateTab(){\n    cloudReadSession_();\n    if(!CLOUD.isAdmin){\n      cloudSetMsg_(\"Admin only.\", \"warn\");\n      return;\n    }\n    const E = cloudEls_();\n    const t = String((E.viewCallsign && E.viewCallsign.value) ? E.viewCallsign.value : (CLOUD.targetCallsign||\"\"))\n      .trim().toUpperCase();\n    if(!t){\n      cloudSetMsg_(\"Enter a callsign in Admin: View callsign, then click Init Profile.\", \"warn\");\n      return;\n    }\n    cloudSetMsg_(\"Initializing profile\u2026\");\n    try{\n      const out = await tywApi_(\"budgetEnsureProfile\", { targetCallsign: t });\n      const pk = String(out && out.profileKey ? out.profileKey : \"\").trim() || \"\u2014\";\n      const sh = String(out && out.sheetName ? out.sheetName : \"\").trim() || \"\u2014\";\n      cloudSetMsg_(\"OK. Profile ready for \"+t+\". ProfileKey=\"+pk+\" | Store=\"+sh, \"ok\");\n    }catch(e){\n      cloudSetMsg_(String(e && e.message ? e.message : e), \"bad\");\n    }\n  }\n\n  async function cloudWipeProfile(){\n    cloudReadSession_();\n    if(!CLOUD.token){ cloudSetMsg_(\"Not logged in.\", \"warn\"); return; }\n\n    const E = cloudEls_();\n    let t = (CLOUD.callsign || \"\").toUpperCase();\n    if(CLOUD.isAdmin){\n      t = String((E.viewCallsign && E.viewCallsign.value) ? E.viewCallsign.value : (CLOUD.targetCallsign||CLOUD.callsign||\"\"))\n        .trim().toUpperCase();\n      if(!t){ cloudSetMsg_(\"Enter a callsign in Admin: View callsign, then click Wipe Cloud.\", \"warn\"); return; }\n    }\n\n    const who = (CLOUD.isAdmin && t && t !== (CLOUD.callsign||\"\").toUpperCase()) ? t : (CLOUD.callsign||\"\").toUpperCase();\n    if(!confirm(\"Wipe cloud data for \" + who + \"? This removes the saved cloud snapshot for this profile.\")) return;\n\n    const baseArgs = (CLOUD.isAdmin && t && t !== (CLOUD.callsign||\"\").toUpperCase()) ? { targetCallsign: t } : {};\n    const viewNote = (CLOUD.isAdmin && baseArgs.targetCallsign) ? (\" (viewing \" + baseArgs.targetCallsign + \")\") : \"\";\n\n    cloudSetStatus_(\"Wiping cloud\u2026\" + viewNote);\n    cloudSetMsg_(\"\");\n    try{\n      const out = await tywApi_(\"budgetWipeProfile\", baseArgs);\n      CLOUD.lastSavedJson = \"\";\n      CLOUD.lastSavedAt = 0;\n      META.cloudSavedTs = 0;\n      META.dirty = false;\n      updateStatusStrip();\n\n      const pk = String(out && out.profileKey ? out.profileKey : \"\").trim() || \"\u2014\";\n      cloudSetStatus_(\"Cloud wiped. Profile: \" + pk + viewNote);\n      cloudSetMsg_(\"Cloud wiped for \" + who + \".\", \"ok\");\n\n      // Refresh view (shows empty state)\n      try{ await cloudLoadFromCloud_(); }catch(_e){}\n    }catch(e){\n      cloudSetStatus_(\"Wipe failed.\" + viewNote);\n      cloudSetMsg_(String(e && e.message ? e.message : e), \"bad\");\n    }\n  }\n\n  async function cloudReplaceCloud(){\n    cloudReadSession_();\n    if(!CLOUD.token){ cloudSetMsg_(\"Not logged in.\", \"warn\"); return; }\n\n    const E = cloudEls_();\n    let t = (CLOUD.callsign || \"\").toUpperCase();\n    if(CLOUD.isAdmin){\n      t = String((E.viewCallsign && E.viewCallsign.value) ? E.viewCallsign.value : (CLOUD.targetCallsign||CLOUD.callsign||\"\"))\n        .trim().toUpperCase();\n      if(!t){ cloudSetMsg_(\"Enter a callsign in Admin: View callsign, then click Replace Cloud.\", \"warn\"); return; }\n    }\n\n    const who = (CLOUD.isAdmin && t && t !== (CLOUD.callsign||\"\").toUpperCase()) ? t : (CLOUD.callsign||\"\").toUpperCase();\n    if(!confirm(\"Replace cloud data for \" + who + \" with the CURRENT file? (Wipe cloud first, then save now)\")) return;\n\n    const baseArgs = (CLOUD.isAdmin && t && t !== (CLOUD.callsign||\"\").toUpperCase()) ? { targetCallsign: t } : {};\n    const viewNote = (CLOUD.isAdmin && baseArgs.targetCallsign) ? (\" (viewing \" + baseArgs.targetCallsign + \")\") : \"\";\n\n    try{\n      cloudSetStatus_(\"Replacing cloud\u2026\" + viewNote);\n      cloudSetMsg_(\"\");\n      await tywApi_(\"budgetWipeProfile\", baseArgs);\n      CLOUD.lastSavedJson = \"\"; // force next save\n      META.dirty = true;        // allow auto-save to proceed too\n      await cloudSaveNow(true);\n      cloudSetMsg_(\"Cloud replaced for \" + who + \".\", \"ok\");\n    }catch(e){\n      cloudSetStatus_(\"Replace failed.\" + viewNote);\n      cloudSetMsg_(String(e && e.message ? e.message : e), \"bad\");\n    }\n  }\n\n  async function cloudDiag(){\n    cloudReadSession_();\n    if(!CLOUD.isAdmin){\n      cloudSetMsg_(\"Admin only.\", \"warn\");\n      return;\n    }\n    const E = cloudEls_();\n    const t = String((E.viewCallsign && E.viewCallsign.value) ? E.viewCallsign.value : (CLOUD.targetCallsign||\"\"))\n      .trim().toUpperCase();\n    if(!t){\n      cloudSetMsg_(\"Enter a callsign in Admin: View callsign, then click Diag.\", \"warn\");\n      return;\n    }\n    cloudSetMsg_(\"Running diag\u2026\");\n    try{\n      const out = await tywApi_(\"budgetDiag\", { targetCallsign: t });\n      // show as a single line (safe for the small status area)\n      const parts = [];\n      for(const k of [\"ssId\",\"profileKey\",\"sheet\",\"exists\",\"maxRows\",\"metaUpdatedAt\",\"partsTotal\",\"accessRole\",\"accessPk\"]){\n        if(out && out[k] != null) parts.push(k+\"=\"+out[k]);\n      }\n      cloudSetMsg_(\"Diag: \"+parts.join(\" | \"), \"ok\");\n    }catch(e){\n      cloudSetMsg_(String(e && e.message ? e.message : e), \"bad\");\n    }\n  }\n\n  async function cloudSetShare(){\n    cloudReadSession_();\n    if(!CLOUD.isAdmin){\n      cloudSetMsg_(\"Admin only.\", \"warn\");\n      return;\n    }\n    const E = cloudEls_();\n    const pk = String((E.shareKey && E.shareKey.value) ? E.shareKey.value : \"\").trim().toUpperCase();\n    const csRaw = String((E.shareCallsigns && E.shareCallsigns.value) ? E.shareCallsigns.value : \"\").trim();\n    if(!pk || !csRaw){\n      cloudSetMsg_(\"Enter Share key + callsigns list.\", \"warn\");\n      return;\n    }\n    const list = csRaw.split(\",\").map(s=>String(s||\"\").trim().toUpperCase()).filter(Boolean);\n    if(!list.length){\n      cloudSetMsg_(\"No callsigns found.\", \"warn\");\n      return;\n    }\n    cloudSetMsg_(\"Setting share\u2026\");\n    try{\n      for(const cs of list){\n        await tywApi_(\"budgetAccessSet\", { callsign: cs, profileKey: pk, role: \"RW\" });\n      }\n      cloudSetMsg_(\"Share set: \" + pk + \" \u2190 \" + list.join(\", \"), \"ok\");\n    }catch(e){\n      cloudSetMsg_(String(e && e.message ? e.message : e), \"bad\");\n    }\n  }\n\n  function cloudAdoptSlbSession_(forceLoad){\n    const before = String(CLOUD.token || \"\");\n    cloudReadSession_();\n    cloudShowLogin_(false);\n    cloudShowAdmin_(!!CLOUD.isAdmin);\n    cloudEnableButtons_(!!CLOUD.token);\n\n    if(!CLOUD.token){\n      cloudSetStatus_(\"Waiting for SLB login\u2026\");\n      cloudSetMsg_(\"Open BB Budget after SLB finishes signing you in.\", \"warn\");\n      return Promise.resolve(false);\n    }\n\n    const changed = before !== CLOUD.token || _embeddedSessionToken !== CLOUD.token;\n    if(changed) CLOUD.loadedOnce = false;\n    _embeddedSessionToken = CLOUD.token;\n    cloudSetMsg_(\"Connected through SLB as \" + (CLOUD.callsign || \"disciple\") + \".\", \"ok\");\n    if(!forceLoad && !changed && CLOUD.loadedOnce) return Promise.resolve(true);\n    if(_embeddedLoadPromise) return _embeddedLoadPromise;\n    _embeddedLoadPromise = Promise.resolve(cloudLoadFromCloud_()).then(()=>true).finally(()=>{ _embeddedLoadPromise = null; });\n    return _embeddedLoadPromise;\n  }\n\n  function bindEmbeddedSlbSession_(){\n    if(!isSlbEmbedded_() || TYBH.ui._slbSessionBridgeBound) return;\n    TYBH.ui._slbSessionBridgeBound = true;\n    const fallbackTimers = [];\n    const clearFallbacks = ()=>{\n      while(fallbackTimers.length){\n        try{ clearTimeout(fallbackTimers.pop()); }catch(_e){}\n      }\n    };\n    const adopt = ()=>{\n      try{\n        const out = cloudAdoptSlbSession_(false);\n        if(CLOUD.token) clearFallbacks();\n        return out;\n      }catch(_e){}\n    };\n    try{ window.addEventListener(\"slb:auth-ready\", adopt); }catch(_e){}\n    try{ window.addEventListener(\"slb:dashboard-updated\", adopt); }catch(_e){}\n    try{ window.addEventListener(\"storage\", (e)=>{ if(e && e.key === \"slb_webapp_url\") CLOUD.url = slbResolveWebappUrl_(); }); }catch(_e){}\n    if(!CLOUD.token){\n      [2500, 8000, 18000].forEach((delay)=>{\n        fallbackTimers.push(setTimeout(adopt, delay));\n      });\n    }\n  }\n\n  function cloudInit(){\n    CLOUD.url = slbResolveWebappUrl_();\n    cloudSyncBackendUi_();\n    cloudReadSession_();\n\n    if(isSlbEmbedded_()){\n      bindEmbeddedSlbSession_();\n      cloudAdoptSlbSession_(true);\n      return;\n    }\n\n    cloudEnableButtons_(!!CLOUD.token);\n    cloudShowLogin_(!CLOUD.token);\n    cloudShowAdmin_(!!CLOUD.isAdmin);\n\n    // Prefill login callsign if known\n    try{\n      const E = cloudEls_();\n      if(E.callsign && !E.callsign.value && CLOUD.callsign) E.callsign.value = CLOUD.callsign;\n    }catch(_e){}\n\n    // Auto-login from SLB saved login (optional), then auto-load\n    if(!CLOUD.token){\n      Promise.resolve(cloudAutoLoginFromSLB_()).finally(()=>{ cloudLoadFromCloud_(); });\n    }else{\n      cloudLoadFromCloud_();\n    }\n  }\n\n  // Expose for inline HTML buttons\n  TYBH.ui.cloudInit = cloudInit;\n  TYBH.ui.cloudLogin = cloudLogin;\n  TYBH.ui.cloudLogout = cloudLogout;\n  TYBH.ui.cloudSetBackend = cloudSetBackend;\n  TYBH.ui.cloudPing = cloudPing;\n  TYBH.ui.cloudSaveNow = cloudSaveNow;\n  TYBH.ui.cloudReload = cloudReload;\n  TYBH.ui.cloudViewAs = cloudViewAs;\n  TYBH.ui.cloudSetShare = cloudSetShare;\n  TYBH.ui.cloudCreateTab = cloudCreateTab;\n  TYBH.ui.cloudDiag = cloudDiag;\n  TYBH.ui.cloudWipeProfile = cloudWipeProfile;\n  TYBH.ui.cloudReplaceCloud = cloudReplaceCloud;\n  TYBH.ui.openEmbedded = function(){\n    try{ init(); }catch(_e){}\n    if(!isSlbEmbedded_()) return Promise.resolve(false);\n    return cloudAdoptSlbSession_(false);\n  };\n  TYBH.ui.refreshFromSlbSession = function(){ return cloudAdoptSlbSession_(true); };\n\n\n  // Import preflight\n  let _pendingImportText = null;\n  let _pendingImportFileName = \"\";\n\n  // util locals\n  const {\n    escapeHtml, escapeAttr,\n    isoToday, ymToday, toMonth,\n    num, money, uid,\n    monthLabel, uniq\n  } = U;\n\n  function preprocessCsvText(text){\n    let t = String(text || \"\");\n    // strip UTF-8 BOM\n    if(t && t.charCodeAt(0) === 0xFEFF) t = t.slice(1);\n    // Excel sometimes adds \"sep=,\" on first line\n    t = t.replace(/^sep=.*,\\r?\\n/i, \"\");\n    // normalize line endings\n    t = t.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n    // trim trailing spaces on lines (doesn't touch commas)\n    t = t.split(\"\\n\").map((line)=>line.replace(/[ \\t]+$/g,\"\")).join(\"\\n\");\n    return t;\n  }\n\n\n\n  // core locals\n  const {\n    allMonths,\n    loadFromMaster,\n    monthTx,\n    sumTxWhere,\n    spentFor,\n    evalWarningsForTx,\n    applyFlagsForTx,\n    computedBalanceFor,\n    reconcileLedger,\n    mergeAccountsByName,\n    billsDueNext7Days,\n    downloadMaster: downloadMasterCore,\n    downloadTxOnly: downloadTxOnlyCore,\n    buildGptPack: buildGptPackCore,\n    loadDemo: loadDemoCore\n  } = C;\n\n  // state/constants\n  const state = TYBH.state;\n  const DEFAULT_HEADER_TX = TYBH.DEFAULT_HEADER_TX;\n\n  if (!state || !DEFAULT_HEADER_TX) {\n    console.error(\n      \"Budget Hub: state/DEFAULT_HEADER_TX missing. Did core export them? (TYBH.state, TYBH.DEFAULT_HEADER_TX)\"\n    );\n    return;\n  }\n\n\n  const DEMO_CSV_URL = \"https://cdn.shopify.com/s/files/1/1299/3411/files/bb_budget_sample_tin_meow_tin_crab_3mo.csv?v=1766569736\";\n\n\n  \n  /* ============================\n     v5: session meta + autosave snapshot (local only)\n  ============================ */\n  const LS_KEY = \"TYBH_AUTOSAVE_V1\";\n  const META = state._meta = state._meta || { fileName: \"\", dirty: false, lastExportTs: 0 };\n\n  function fmtDT(ts){\n    if(!ts) return \"\u2014\";\n    try{\n      const d = new Date(ts);\n      return d.toLocaleString();\n    }catch(e){ return \"\u2014\"; }\n  }\n\n  function updateStatusStrip(){\n    const fileEl = $(\"stFile\");\n    const rowsEl = $(\"stRows\");\n    const savedEl = $(\"stSaved\");\n    const dirtyEl = $(\"stDirty\");\n    if(fileEl) fileEl.textContent = META.fileName || (state._isDemo ? \"DEMO\" : \"\u2014\");\n    if(rowsEl) rowsEl.textContent = String((state.tx && state.tx.length) ? state.tx.length : 0);\n    if(savedEl) savedEl.textContent = fmtDT(META.lastExportTs);\n    if(dirtyEl) dirtyEl.classList.toggle(\"hidden\", !META.dirty);\n  }\n\n  let _snapTimer = null;\n  function scheduleSnapshot(){\n    if(_snapTimer) clearTimeout(_snapTimer);\n    _snapTimer = setTimeout(saveSnapshotNow, 1200);\n  }\n\n  function safeSnapshotPayload(){\n    // keep only the essential parts of state (serializable)\n    return {\n      v: 6,\n      ts: Date.now(),\n      meta: {\n        fileName: META.fileName || \"\",\n        dirty: !!META.dirty,\n        lastExportTs: META.lastExportTs || 0\n      },\n      data: {\n        settings: state.settings || {},\n        rules: state.rules || {},\n        accounts: state.accounts || [],\n        bills: state.bills || [],\n        budgets: state.budgets || [],\n        goals: state.goals || [],\n        categories: state.categories || [],\n        grow: state.grow || {},\n        move: state.move || {},\n        tx: state.tx || []\n      }\n    };\n  }\n\n  function saveSnapshotNow(){\n    try{\n      const payload = safeSnapshotPayload();\n      const json = JSON.stringify(payload);\n      // localStorage practical limit ~5MB; keep a buffer\n      if(json.length > 4_500_000) return;\n      localStorage.setItem(LS_KEY, json);\n    }catch(e){\n      // ignore storage errors (private mode, quota, etc.)\n    }\n  }\n\n  function loadSnapshot(){\n    try{\n      const raw = localStorage.getItem(LS_KEY);\n      if(!raw) return null;\n      const obj = JSON.parse(raw);\n      if(!obj || !obj.data || !obj.ts) return null;\n      return obj;\n    }catch(e){ return null; }\n  }\n\n  function showRestoreBannerIfNeeded(){\n    // Only prompt if nothing loaded yet (first open), and snapshot exists\n    if(state.loaded) return false;\n    const snap = loadSnapshot();\n    if(!snap) return false;\n    state._restoreOffered = true;\n    const el = $(\"restoreBanner\");\n    const when = $(\"restoreWhen\");\n    if(when) when.textContent = fmtDT(snap.ts);\n    if(el) el.classList.remove(\"hidden\");\n    return true;\n  }\n\n  function dismissRestore(){\n    state._restoreOffered = false;\n    const el = $(\"restoreBanner\");\n    if(el) el.classList.add(\"hidden\");\n    // If nothing is loaded yet, fall back to demo so page isn't empty\n    if(!state.loaded){\n      try{ loadDemoFromUrl(DEMO_CSV_URL, false); }catch(e){}\n    }\n  }\n\n  function restoreLastSession(){\n    const snap = loadSnapshot();\n    if(!snap || !snap.data) return dismissRestore();\n    try{\n      // restore state fields\n      state.settings = snap.data.settings || {};\n      state.rules = snap.data.rules || {};\n      state.accounts = snap.data.accounts || [];\n      state.bills = snap.data.bills || [];\n      state.budgets = snap.data.budgets || [];\n      state.goals = snap.data.goals || [];\n      state.categories = snap.data.categories || [];\n      state.grow = snap.data.grow || {};\n      state.move = snap.data.move || {};\n      state.tx = snap.data.tx || [];\n      state.loaded = true;\n      state._isDemo = false;\n\n      META.fileName = (snap.meta && snap.meta.fileName) ? snap.meta.fileName : (META.fileName || \"\");\n      META.dirty = true; // restored work should be treated as unsaved until exported\n      META.lastExportTs = (snap.meta && snap.meta.lastExportTs) ? snap.meta.lastExportTs : 0;\n\n      state._restoreOffered = false;\n      dismissRestore();\n      if($(\"stStatus\")) $(\"stStatus\").textContent = \"Loaded (restored)\";\n      setDemoMode(false);\n      afterLoad();\n      updateStatusStrip();\n      // go to overview for quick visibility\n      try{ showTab(\"overview\"); }catch(e){}\n    }catch(e){\n      console.error(e);\n      dismissRestore();\n    }\n  }\n\n  function markDirty(on=true){\n    META.dirty = !!on;\n    updateStatusStrip();\n    if(META.dirty){\n      scheduleSnapshot();\n      try{ scheduleCloudSave_(); }catch(_e){}\n    }\n  }\n\n  function markExported(){\n    META.lastExportTs = Date.now();\n    META.dirty = false;\n    updateStatusStrip();\n    saveSnapshotNow();\n  }\n\n  function setLoadedFileName(name){\n    META.fileName = (name || \"\").trim();\n    updateStatusStrip();\n    saveSnapshotNow();\n  }\n\n/* ============================\n     Small helpers\n  ============================ */\n  const on = (el, ev, fn) => el && el.addEventListener(ev, fn);\n  const onDelegate = (el, ev, selector, fn) => {\n    if (!el) return;\n    el.addEventListener(ev, (e) => {\n      const t = e.target && e.target.closest ? e.target.closest(selector) : null;\n      if (!t || !el.contains(t)) return;\n      fn(e, t);\n    });\n  };\n\n  /* ============================\n     Toast notifications (1.9a)\n     - non-blocking feedback for newbies\n  ============================ */\n  function toast(msg, kind=\"ok\", sub=\"\"){\n    try{\n      const host = $(\"tyToastHost\");\n      if(!host) return;\n      const t = document.createElement(\"div\");\n      t.className = \"tyToast \" + (kind || \"ok\");\n      const icon = (kind === \"err\") ? \"!\" : (kind === \"warn\") ? \"\u26A0\" : \"\u2713\";\n      t.innerHTML = `\n        <div class=\"tIcon\">${escapeHtml(icon)}</div>\n        <div class=\"tBody\">\n          <div class=\"tMsg\">${escapeHtml(String(msg||\"\"))}</div>\n          ${sub ? `<div class=\"tSub\">${escapeHtml(String(sub||\"\"))}</div>` : \"\"}\n        </div>\n      `;\n      host.appendChild(t);\n      // auto remove\n      const ttl = (kind === \"err\") ? 5200 : (kind === \"warn\") ? 4200 : 3200;\n      setTimeout(() => { try{ t.remove(); }catch(_){ } }, ttl);\n    }catch(_){\n      // ignore\n    }\n  }\n  TYBH.ui.toast = toast;\n\n  /* ============================\n     Undo stack (v2.0)\n     - simple, safe, last-action undo\n  ============================ */\n  const UNDO_MAX = 20;\n  const UNDO = TYBH.ui._undo = TYBH.ui._undo || { stack: [] };\n\n  function cloneDataForUndo(){\n    // keep it small + serializable\n    return {\n      settings: state.settings || {},\n      rules: state.rules || {},\n      accounts: state.accounts || [],\n      bills: state.bills || [],\n      budgets: state.budgets || [],\n      goals: state.goals || [],\n      categories: state.categories || [],\n      grow: state.grow || {},\n      move: state.move || {},\n      tx: state.tx || []\n    };\n  }\n\n  function pushUndo(label){\n    try{\n      const entry = {\n        ts: Date.now(),\n        label: String(label||\"Change\"),\n        data: JSON.parse(JSON.stringify(cloneDataForUndo()))\n      };\n      UNDO.stack.unshift(entry);\n      if(UNDO.stack.length > UNDO_MAX) UNDO.stack.length = UNDO_MAX;\n      syncUndoBtn();\n    }catch(e){\n      // ignore\n    }\n  }\n\n  function applyUndoPayload(payload){\n    if(!payload) return;\n    state.settings = payload.settings || state.settings || {};\n    state.rules = payload.rules || state.rules || {};\n    state.accounts = payload.accounts || [];\n    state.bills = payload.bills || [];\n    state.budgets = payload.budgets || [];\n    state.goals = payload.goals || [];\n    state.categories = payload.categories || [];\n    state.grow = payload.grow || state.grow || {};\n    state.move = payload.move || state.move || {};\n    state.tx = payload.tx || [];\n  }\n\n  function canUndo(){ return !!(UNDO.stack && UNDO.stack.length); }\n\n  function syncUndoBtn(){\n    const b = $(\"undoBtn\");\n    if(!b) return;\n    b.classList.toggle(\"hidden\", !canUndo());\n    if(canUndo()){\n      const top = UNDO.stack[0];\n      b.title = `Undo: ${top.label}`;\n    }\n  }\n\n  function undoLast(){\n    if(!canUndo()) return;\n    const top = UNDO.stack.shift();\n    applyUndoPayload(top.data);\n    markDirty(true);\n    try{ rebuildDropdowns(); }catch(_){ }\n    try{ afterLoad(); }catch(_){ }\n    toast(\"Undone\", \"ok\", top.label);\n    syncUndoBtn();\n  }\n\n  // expose for onclick if needed\n  TYBH.ui.pushUndo = pushUndo;\n  TYBH.ui.undoLast = undoLast;\n\n  /* ============================\n     UI helpers (month selectors)\n  ============================ */\n  function fillMonthSelect(sel, currentValue) {\n    if (!sel) return;\n    const months = typeof allMonths === \"function\" ? allMonths() : [];\n    const keep = (currentValue !== undefined ? currentValue : sel.value) || \"\";\n    sel.innerHTML =\n      `<option value=\"\">All</option>` +\n      months\n        .map(\n          (m) =>\n            `<option value=\"${escapeAttr(m)}\">${escapeHtml(\n              monthLabel(m)\n            )}</option>`\n        )\n        .join(\"\");\n    sel.value = keep;\n    if (sel.value === \"\" && keep !== \"\") sel.value = \"\";\n  }\n\n  function refreshMonthSelectors() {\n    fillMonthSelect($(\"monthPick\"));\n    fillMonthSelect($(\"txMonth\"));\n    fillMonthSelect($(\"gptMonth\"));\n    fillMonthSelect($(\"todayMonth\"));\n    fillMonthSelect($(\"budMonth\"));\n    fillMonthSelect($(\"moveMonth\"));\n  }\n\n  /* ============================\n     Init (safe to call multiple times)\n  ============================ */\n  function init() {\n    const root = document.getElementById(\"tyBudgetHub\");\n    if (!root) return;\n    if (TYBH.ui._initDone) return;\n    TYBH.ui._initDone = true;\n\n    // Hide BaseStation \"Enter special code\" unlock UI on BB Budget pages\n    try{\n      var locked = document.getElementById(\"tyCodeCardLocked\");\n      if(locked) locked.style.display = \"none\";\n      var codeInp = document.getElementById(\"tyAdminCode\");\n      if(codeInp && codeInp.closest) {\n        var card = codeInp.closest(\".tyCodeCard\");\n        if(card) card.style.display = \"none\";\n      }\n    }catch(_e){}\n\n    // grouped menu dropdowns\n    showRestoreBannerIfNeeded();\n    setupNavBar();\n    try{ localStorage.setItem(\"tybh_lastTab\",\"overview\"); }catch(_e){}\n    routeToTab(\"overview\");\n    updateStatusStrip();\n\n    // Cloud (optional)\n    try{ cloudInit(); }catch(_e){}\n\n    try{ initTopPolish_(); }catch(_e){}\n\n\n    // undo button\n    if ($(\"undoBtn\")) $(\"undoBtn\").onclick = () => undoLast();\n    syncUndoBtn();\n\n    initQuickStart();\n    initHelpAndWizard();\n    initCategoriesTab();\n    initTaxTab();\n\n\n    if ($(\"setCurrency\")) $(\"setCurrency\").value = state.settings.currency || \"USD\";\n    if ($(\"setPeople\")) $(\"setPeople\").value = (state.settings.people || []).join(\", \");\n    // auto-load demo CSV on first open (only if nothing loaded yet)\n    if (!state.loaded && !state._restoreOffered) loadDemoFromUrl(DEMO_CSV_URL, false);\n\n    // Import file handler (with preflight)\nfunction hidePreflight(){\n  _pendingImportText = null;\n  _pendingImportFileName = \"\";\n  if($(\"importPreflight\")) $(\"importPreflight\").style.display = \"none\";\n}\n\nfunction showPreflight(summary){\n  if(!$(\"importPreflight\")) return;\n  $(\"importPreflight\").style.display = \"block\";\n  if($(\"pfFileName\")) $(\"pfFileName\").textContent = _pendingImportFileName || \"\";\n  if($(\"pfType\")) $(\"pfType\").textContent = summary.isMaster ? \"MASTER CSV\" : \"TRANSACTIONS CSV\";\n  if($(\"pfTxCount\")) $(\"pfTxCount\").textContent = String(summary.counts?.tx ?? 0);\n  if($(\"pfTxDup\")) $(\"pfTxDup\").textContent = String(summary.txDup ?? 0);\n\n  const dup = Number(summary.txDup||0);\n  const hint = dup>0 ? (`${dup} duplicates found. If you enable removal, import will keep ${summary.txDedupIfEnabled} unique transactions.`)\n                     : \"No duplicates detected.\";\n  if($(\"pfDedupHint\")) $(\"pfDedupHint\").textContent = hint;\n}\n\nfunction commitPreflightImport(){\n  if(!_pendingImportText) return;\n  try{\n    const dedup = !!($(\"pfDedup\") && $(\"pfDedup\").checked);\n    setDemoMode(false);\n    loadFromMaster(_pendingImportText, {dedup});\n    afterLoad();\n    markDirty(false);\n    saveSnapshotNow();\n    if($(\"importMsg\")){\n      $(\"importMsg\").innerHTML = `<span class=\"ok\">Imported:</span> ${escapeHtml(_pendingImportFileName || \"CSV\")} ${dedup ? \"(duplicates removed if any)\" : \"\"}`;\n    }\n    hidePreflight();\n    // clear file input so user can re-import same file if needed\n    if($(\"fileInput\")) $(\"fileInput\").value = \"\";\n  }catch(err){\n    console.error(err);\n    state.loaded = false;\n    if ($(\"stStatus\")) $(\"stStatus\").textContent = \"Not loaded\";\n    if ($(\"importMsg\")) {\n      $(\"importMsg\").innerHTML = `<span class=\"err\">Import failed:</span> ${escapeHtml(err?.message || String(err))}`;\n    }\n    showTab(\"import\");\n    alert(\"Import failed. Open Console for details.\");\n  }\n}\n\nif($(\"pfCancelBtn\")) on($(\"pfCancelBtn\"), \"click\", hidePreflight);\nif($(\"pfCommitBtn\")) on($(\"pfCommitBtn\"), \"click\", commitPreflightImport);\n\nif ($(\"fileInput\")) {\n  $(\"fileInput\").addEventListener(\"change\", (e) => {\n    const f = e.target.files && e.target.files[0];\n    if (!f) return;\n    const reader = new FileReader();\n    reader.onload = () => {\n      try {\n        const txt = preprocessCsvText(String(reader.result || \"\"));\n        _pendingImportText = txt;\n        _pendingImportFileName = f && f.name ? f.name : \"import.csv\";\n        setLoadedFileName(_pendingImportFileName);\n\n        // Preflight summary\n        if(!C.preflightImport){\n          // fallback: import directly (older core)\n          loadFromMaster(txt);\n          afterLoad();\n          markDirty(false);\n          saveSnapshotNow();\n          if($(\"importMsg\")) $(\"importMsg\").innerHTML = `<span class=\"ok\">Imported:</span> ${escapeHtml(_pendingImportFileName)}`;\n          return;\n        }\n        const summary = C.preflightImport(txt);\n        showPreflight(summary);\n        if($(\"importMsg\")) $(\"importMsg\").innerHTML = `<span class=\"ok\">File ready.</span> Review preflight and click \u201CImport Now\u201D.`;\n      } catch (err) {\n        console.error(err);\n        hidePreflight();\n        state.loaded = false;\n        if ($(\"stStatus\")) $(\"stStatus\").textContent = \"Not loaded\";\n        if ($(\"importMsg\")) {\n          $(\"importMsg\").innerHTML = `<span class=\"err\">Import failed:</span> ${escapeHtml(\n            err && err.message ? err.message : String(err)\n          )}`;\n        }\n        showTab(\"import\");\n        alert(\"Import failed. Open Console for details.\");\n      }\n    };\n    reader.onerror = () => {\n      hidePreflight();\n      if ($(\"importMsg\"))\n        $(\"importMsg\").innerHTML = `<span class=\"err\">Could not read file.</span>`;\n    };\n    reader.readAsText(f);\n  });\n}\n\n    // TX delegated click handler (edit + sort)\n    onDelegate($(\"txRows\"), \"click\", '[data-action=\"edit\"]', (e, a) => {\n      openEditById(a.dataset.id);\n    });\n    onDelegate($(\"txRows\"), \"click\", \"th[data-sort]\", (e, th) => {\n      const key = th.dataset.sort;\n      if (!key) return;\n      if (txSort.key === key) {\n        txSort.dir = txSort.dir === \"asc\" ? \"desc\" : \"asc\";\n      } else {\n        txSort.key = key;\n        txSort.dir = key === \"Amount\" ? \"desc\" : \"asc\";\n        if (key === \"Date\") txSort.dir = \"desc\";\n      }\n      renderTx();\n    });\n\n    // TX filter auto-refresh\n    on($(\"txQ\"), \"input\", renderTx);\n    [\"txType\", \"txAccount\", \"txImpulse\", \"txMissingAcc\"].forEach((id) => {\n      on($(id), \"change\", renderTx);\n    });\n\n    // Accounts events (delegated)\n    if ($(\"accRows\")) {\n      $(\"accRows\").addEventListener(\"input\", (e) => {\n        const el = e.target;\n        if (!(el && el.dataset && el.dataset.accIdx)) return;\n\n        const idx = Number(el.dataset.accIdx);\n        const field = el.dataset.accField;\n        const a = state.accounts[idx];\n        if (!a) return;\n\n        if (field === \"StartBalance\") {\n          a.StartBalance = num(el.value);\n          updateAccountRow(idx);\n          return;\n        }\n        if (field === \"BankBalance\") {\n          a.BankBalance = String(el.value || \"\").trim() === \"\" ? \"\" : num(el.value);\n          updateAccountRow(idx);\n          return;\n        }\n        if (field === \"Owner\") { a.Owner = String(el.value || \"\"); return; }\n        if (field === \"Type\") { a.Type = String(el.value || \"\"); return; }\n        if (field === \"Active\") { a.Active = String(el.value || \"Y\"); return; }\n      });\n\n      $(\"accRows\").addEventListener(\"change\", (e) => {\n        const el = e.target;\n        if (!(el && el.dataset && el.dataset.accIdx)) return;\n        const idx = Number(el.dataset.accIdx);\n        const field = el.dataset.accField;\n        const a = state.accounts[idx];\n        if (!a) return;\n\n        if (field === \"Nature\") {\n          a.Nature = String(el.value || \"ASSET\").toUpperCase() === \"LIABILITY\" ? \"LIABILITY\" : \"ASSET\";\n          updateAccountRow(idx);\n        }\n        if (field === \"Active\") {\n          a.Active = String(el.value || \"Y\");\n        }\n      });\n\n      $(\"accRows\").addEventListener(\"click\", (e) => {\n        const btn = e.target.closest('button[data-action=\"remove-acc\"]');\n        if (!btn) return;\n        const idx = Number(btn.dataset.accIdx);\n        if (!isFinite(idx)) return;\n        if (!confirm(\"Remove this account from settings? (Transactions stay)\")) return;\n        state.accounts.splice(idx, 1);\n        mergeAccountsByName();\n        rebuildDropdowns();\n        renderAccounts();\n      });\n    }\n\n    // Budgets events\n    if ($(\"budTable\")) {\n      $(\"budTable\").addEventListener(\"input\", (e) => {\n        const row = e.target.closest(\"tr[data-bud-i]\");\n        if (!row) return;\n        const i = Number(row.dataset.budI);\n        const b = state.budgets[i];\n        if (!b) return;\n\n        const field = e.target.dataset.budField;\n        if (!field) return;\n\n        if (field === \"BudgetAmount\") b.BudgetAmount = num(e.target.value);\n        else if (field === \"Active\") b.Active = e.target.value;\n        else b[field] = String(e.target.value || \"\");\n\n        refreshToday();\n      });\n\n      $(\"budTable\").addEventListener(\"change\", (e) => {\n        const row = e.target.closest(\"tr[data-bud-i]\");\n        if (!row) return;\n        const i = Number(row.dataset.budI);\n        const b = state.budgets[i];\n        if (!b) return;\n        const field = e.target.dataset.budField;\n        if (field === \"Active\") {\n          b.Active = e.target.value;\n          refreshToday();\n        }\n      });\n\n      $(\"budTable\").addEventListener(\"click\", (e) => {\n        const btn = e.target.closest('button[data-action=\"del-bud\"]');\n        if (!btn) return;\n        if (!confirm(\"Remove this budget row?\")) return;\n\n        const i = Number(btn.dataset.budI);\n        if (isFinite(i) && i >= 0) state.budgets.splice(i, 1);\n\n        renderBudgets();\n        refreshToday();\n      });\n    }\n\n    on($(\"budMonth\"), \"change\", renderBudgets);\n    on($(\"budType\"), \"change\", renderBudgets);\n\n    // Bills events\n    if ($(\"billTable\")) {\n      $(\"billTable\").addEventListener(\"input\", (e) => {\n        const tr = e.target.closest(\"tr[data-bill-idx]\");\n        if (!tr) return;\n        const idx = Number(tr.dataset.billIdx);\n        const b = state.bills[idx];\n        if (!b) return;\n\n        const field = e.target.dataset.billField;\n        if (!field) return;\n\n        if (field === \"Amount\") b.Amount = num(e.target.value);\n        else if (field === \"DueDay\") b.DueDay = Math.max(1, Math.min(31, num(e.target.value)));\n        else b[field] = String(e.target.value || \"\");\n\n        refreshToday();\n      });\n\n      $(\"billTable\").addEventListener(\"change\", (e) => {\n        const tr = e.target.closest(\"tr[data-bill-idx]\");\n        if (!tr) return;\n        const idx = Number(tr.dataset.billIdx);\n        const b = state.bills[idx];\n        if (!b) return;\n\n        const field = e.target.dataset.billField;\n        if (!field) return;\n\n        if (field === \"AutoPay\" || field === \"Active\" || field === \"Account\") {\n          b[field] = String(e.target.value || \"\");\n          refreshToday();\n        }\n      });\n\n      $(\"billTable\").addEventListener(\"click\", (e) => {\n        const btn = e.target.closest('button[data-action=\"del-bill\"]');\n        if (!btn) return;\n        const idx = Number(btn.dataset.billIdx);\n        if (!isFinite(idx)) return;\n        if (!confirm(\"Remove this bill?\")) return;\n        state.bills.splice(idx, 1);\n        renderBills();\n      });\n    }\n\n    // Move events\n    if ($(\"moveTable\")) {\n      $(\"moveTable\").addEventListener(\"input\", (e) => {\n        const tr = e.target.closest(\"tr[data-move-idx]\");\n        if (!tr) return;\n        const idx = Number(tr.dataset.moveIdx);\n        const it = state.move[idx];\n        if (!it) return;\n\n        const field = e.target.dataset.moveField;\n        if (!field) return;\n\n        if (field === \"Amount\") it.Amount = num(e.target.value);\n        else it[field] = String(e.target.value || \"\");\n\n        renderMove();\n      });\n\n      $(\"moveTable\").addEventListener(\"change\", (e) => {\n        const tr = e.target.closest(\"tr[data-move-idx]\");\n        if (!tr) return;\n        const idx = Number(tr.dataset.moveIdx);\n        const it = state.move[idx];\n        if (!it) return;\n\n        const field = e.target.dataset.moveField;\n        if (!field) return;\n\n        if (field === \"Kind\" || field === \"Active\") {\n          it[field] = String(e.target.value || \"\");\n          renderMove();\n        }\n      });\n\n      $(\"moveTable\").addEventListener(\"click\", (e) => {\n        const btn = e.target.closest('button[data-action=\"del-move\"]');\n        if (!btn) return;\n        const idx = Number(btn.dataset.moveIdx);\n        if (!isFinite(idx)) return;\n        if (!confirm(\"Remove this move item?\")) return;\n        state.move.splice(idx, 1);\n        renderMove();\n      });\n    }\n\n    on($(\"moveMonth\"), \"change\", renderMove);\n\n    // Today month/focus\n    on($(\"todayMonth\"), \"change\", refreshToday);\n    on($(\"todayFocusCat\"), \"change\", refreshToday);\n\n    // Bulk watchers\n    [\"bkCatType\", \"bkOldCat\", \"bkSubType\", \"bkSubCat\", \"bkOldSub\", \"bkOldAcc\", \"bkOldPerson\"].forEach((id) => {\n      on($(id), \"change\", () => rebuildBulkUI(id === \"bkCatType\" || id === \"bkSubType\"));\n    });\n\n    // Goals events (delegation) \u2014 DO NOT re-render editor on input (prevents bounce)\n    if ($(\"goalsEditor\")) {\n      $(\"goalsEditor\").addEventListener(\"input\", (e) => {\n        const tr = e.target.closest(\"tr[data-goal-idx]\");\n        if (!tr) return;\n        const idx = Number(tr.dataset.goalIdx);\n        const g = state.goals[idx];\n        if (!g) return;\n        const field = e.target.dataset.goalField;\n        if (!field) return;\n\n        if (field === \"TargetAmount\" || field === \"CurrentAmount\") {\n          g[field] = num(e.target.value);\n        } else {\n          g[field] = String(e.target.value || \"\");\n        }\n\n        renderGoalsSummary(); // safe (different DOM area)\n      });\n\n      $(\"goalsEditor\").addEventListener(\"change\", (e) => {\n        const tr = e.target.closest(\"tr[data-goal-idx]\");\n        if (!tr) return;\n        const idx = Number(tr.dataset.goalIdx);\n        const g = state.goals[idx];\n        if (!g) return;\n        const field = e.target.dataset.goalField;\n        if (field === \"Active\") {\n          g.Active = String(e.target.value || \"Y\");\n          renderGoalsEditor();\n          renderGoalsSummary();\n        }\n      });\n\n      $(\"goalsEditor\").addEventListener(\"click\", (e) => {\n        const btn = e.target.closest('button[data-action=\"del-goal\"]');\n        if (!btn) return;\n        const idx = Number(btn.dataset.goalIdx);\n        if (!isFinite(idx)) return;\n        if (!confirm(\"Remove this goal?\")) return;\n        state.goals.splice(idx, 1);\n        renderGoalsEditor();\n        renderGoalsSummary();\n      });\n    }\n\n    // MonthPick -> overview refresh\n    on($(\"monthPick\"), \"change\", renderOverview);\n    on($(\"txMonth\"), \"change\", renderTx);\n\n    // If core already loaded data before init ran, render now\n    if (state.loaded) {\n      renderAll();\n      try {\n        const last = localStorage.getItem(\"tybh_lastTab\") || \"\";\n        if (last && last !== \"import\") {\n          routeToTab(last);\n        } else if (!state._isDemo && state.tx && state.tx.length) {\n          // Cleaner start: do not strand people on Import after data is already loaded\n          routeToTab(\"overview\");\n        }\n      } catch (e) {\n        routeToTab(\"today\");\n      }\n    }\n  }\n\n  /* ============================\n     afterLoad (UI hook)\n  ============================ */\n  function afterLoad() {\n    // Ensure DOM + init are ready (core might call afterLoad early)\n    if (document.readyState === \"loading\" || !document.getElementById(\"tyBudgetHub\")) {\n      document.addEventListener(\"DOMContentLoaded\", afterLoad, { once: true });\n      return;\n    }\n    init();\n\n    state.loaded = true;\n\n    if ($(\"stStatus\")) $(\"stStatus\").textContent = state._isDemo ? \"Loaded (DEMO)\" : \"Loaded\";\n    if ($(\"importMsg\")){\n      const demoNote = state._isDemo ? ' <span class=\"warn\">DEMO CSV LOADED</span>' : '';\n      $(\"importMsg\").innerHTML = `<span class=\"ok\">Loaded.</span> Transactions: <b>${state.tx.length}</b>${demoNote}`;\n    }\n\n    if ($(\"setCurrency\")) $(\"setCurrency\").value = state.settings.currency || \"USD\";\n    if ($(\"setPeople\")) $(\"setPeople\").value = (state.settings.people || []).join(\", \");\n\n    // bootstrap accounts if missing\n    if (!state.accounts.length) {\n      const accSet = new Set((state.tx || []).map((t) => t.Account).filter(Boolean));\n      state.accounts = Array.from(accSet)\n        .sort()\n        .map((a) => ({\n          Account: a,\n          Owner: \"\",\n          Type: \"\",\n          Nature: \"ASSET\",\n          StartBalance: 0,\n          BankBalance: \"\",\n          Active: \"Y\"\n        }));\n    }\n\n    if ($(\"exDate\")) $(\"exDate\").value = isoToday();\n    if ($(\"inDate\")) $(\"inDate\").value = isoToday();\n\n    mergeAccountsByName();\n    rebuildDropdowns();\n    refreshMonthSelectors();\n\n    // default months\n    const cur = ymToday();\n    [\"monthPick\", \"txMonth\", \"gptMonth\", \"todayMonth\", \"budMonth\", \"moveMonth\"].forEach((id) => {\n      const el = $(id);\n      if (el) el.value = cur;\n    });\n\n    loadRulesUI();\n    renderAll();\n\n    try{ autoCleanTopAfterLoad_(); }catch(_e){}\n\n\n    updateDemoUI();\n\n    // restore last tab\n    try {\n      const last = localStorage.getItem(\"tybh_lastTab\") || \"\";\n      if (last && last !== \"import\") routeToTab(last);\n    } catch (e) {}\n  }\n\n  // Make it visible for both modular + legacy calls\n  window.afterLoad = afterLoad;\n  TYBH.ui.afterLoad = afterLoad;\n\n  /* ============================\n     Dropdown builders\n  ============================ */\n  function fillSelect(sel, items) {\n    if (!sel) return;\n    sel.innerHTML = (items || [])\n      .map((x) => `<option value=\"${escapeAttr(x)}\">${escapeHtml(x)}</option>`)\n      .join(\"\");\n  }\n  function fillSelectWithBlank(sel, items, blank = \"(choose)\") {\n    if (!sel) return;\n    sel.innerHTML =\n      `<option value=\"\">${escapeHtml(blank)}</option>` +\n      (items || [])\n        .map((x) => `<option value=\"${escapeAttr(x)}\">${escapeHtml(x)}</option>`)\n        .join(\"\");\n  }\n\n  \n  \n  // Special option value for inline \"Add new\u2026\" in dropdowns\n  const TYBH_ADD_NEW_VALUE = \"__ADD_NEW__\";\n\n  function ensureAddNewOption(sel, label=\"+ Add new\u2026\"){\n    if(!sel) return;\n    // avoid duplicates\n    const has = Array.from(sel.options||[]).some(o => o && o.value === TYBH_ADD_NEW_VALUE);\n    if(has) return;\n    const opt = document.createElement(\"option\");\n    opt.value = TYBH_ADD_NEW_VALUE;\n    opt.textContent = label;\n    sel.appendChild(opt);\n  }\n\n  function bindAddNewDropdown(sel, kind, type, prefix){\n    if(!sel) return;\n    if(sel.dataset && sel.dataset.tybhAddNewBound===\"1\") return;\n    if(sel.dataset) sel.dataset.tybhAddNewBound=\"1\";\n\n    sel.addEventListener(\"change\", () => {\n      if(sel.value !== TYBH_ADD_NEW_VALUE) return;\n\n      // revert quickly so UI doesn't get stuck on the sentinel\n      const prev = sel.dataset ? (sel.dataset.tybhPrevValue || \"\") : \"\";\n      // run add flow\n      if(kind === \"cat\"){\n        const added = quickAddCategory(type, prefix);\n        if(added){\n          sel.value = added;\n          if(sel.dataset) sel.dataset.tybhPrevValue = added;\n          rebuildSub(prefix);\n          return;\n        }\n        // cancelled\n        sel.value = prev || \"\";\n        return;\n      }\n\n      if(kind === \"sub\"){\n        const added = quickAddSubcategory(type, prefix);\n        if(added){\n          sel.value = added;\n          if(sel.dataset) sel.dataset.tybhPrevValue = added;\n          return;\n        }\n        sel.value = prev || \"\";\n      }\n    });\n\n    // track previous value\n    sel.addEventListener(\"focus\", () => {\n      if(sel.dataset) sel.dataset.tybhPrevValue = String(sel.value||\"\");\n    });\n  }\nfunction rebuildSub(prefix) {\n    const catSel = $(prefix + \"Category\");\n    const subSel = $(prefix + \"Subcategory\");\n    if (!catSel || !subSel) return;\n\n    const cat = String(catSel.value || \"\").trim();\n    const wantType = (prefix === \"ex\" ? \"Expense\" : \"Income\");\n\n    const subs = uniq(\n      (state.categories || [])\n        .filter(c => String(c.Active || \"Y\").toUpperCase() !== \"N\")\n        .filter(c => (String(c.Type || wantType)).toLowerCase().startsWith(wantType.toLowerCase().slice(0,3)))\n        .filter(c => String(c.Category || \"\").trim() === cat)\n        .map(c => c.Subcategory)\n        .concat(\n          (state.tx || [])\n            .filter(t => String(t.Type || \"Expense\") === wantType && String(t.Category || \"\").trim() === cat)\n            .map(t => t.Subcategory)\n        )\n    ).map(s => String(s || \"\").trim()).filter(Boolean).sort();\n\n    if (!subs.length) subs.push(\"General\");\n\n    fillSelectWithBlank(subSel, subs, \"(none)\");\n\n    ensureAddNewOption(subSel);\n    bindAddNewDropdown(subSel, \"sub\", (prefix===\"ex\"?\"Expense\":\"Income\"), prefix);\n}\n\n\n\n  function applyTemplateFromHistory() {\n    const codeEl = $(\"exTemplate\");\n    if (!codeEl) return;\n    const code = codeEl.value;\n    if (!code) return;\n\n    const found = [...(state.tx || [])].reverse().find((t) => t.Item === code && t.Type === \"Expense\");\n    if (!found) return;\n\n    if (found.Account && $(\"exAccount\")) $(\"exAccount\").value = found.Account;\n    if (found.Category && $(\"exCategory\")) $(\"exCategory\").value = found.Category;\n    rebuildSub(\"ex\");\n    if (found.Subcategory && $(\"exSubcategory\")) $(\"exSubcategory\").value = found.Subcategory;\n\n    if ($(\"exPayee\")) $(\"exPayee\").value = found.Payee || $(\"exPayee\").value;\n    if ($(\"exAmount\")) $(\"exAmount\").value = found.Amount || $(\"exAmount\").value;\n  }\n\n  function rebuildDropdowns() {\n    // people: from settings + tx persons (filter empty)\n    let people = uniq((state.settings.people || []).concat((state.tx || []).map((t) => t.Person)))\n      .map((x) => String(x || \"\").trim())\n      .filter(Boolean);\n\n    if (!people.length) people = [\"Tin Lei\", \"Tin Wing\"];\n    state.settings.people = people;\n\n    const accounts = uniq((state.accounts || []).map((a) => a.Account).concat((state.tx || []).map((t) => t.Account)))\n      .map((x) => String(x || \"\").trim())\n      .filter(Boolean)\n      .sort();\n\n    const catRows = (state.categories || []).filter(c => String(c.Active||\"Y\").toUpperCase()!==\"N\");\n    const catsExp = uniq(\n      catRows.filter(c => String(c.Type||\"Expense\").toLowerCase().startsWith(\"exp\")).map(c=>c.Category)\n      .concat((state.budgets||[]).filter(b=>String(b.Type||\"Expense\").toLowerCase().startsWith(\"exp\")).map(b=>b.Category))\n      .concat((state.tx || []).filter((t) => t.Type === \"Expense\").map((t) => t.Category))\n    ).map(s=>String(s||\"\").trim()).filter(Boolean).sort();\n\n    const catsInc = uniq(\n      catRows.filter(c => String(c.Type||\"Income\").toLowerCase().startsWith(\"inc\")).map(c=>c.Category)\n      .concat((state.budgets||[]).filter(b=>String(b.Type||\"Expense\").toLowerCase().startsWith(\"inc\")).map(b=>b.Category))\n      .concat((state.tx || []).filter((t) => t.Type === \"Income\").map((t) => t.Category))\n    ).map(s=>String(s||\"\").trim()).filter(Boolean).sort();\n\n    if (!catsExp.length)\n      catsExp.push(\n        \"Grocery\",\n        \"Eat Out\",\n        \"Cats\",\n        \"Utility\",\n        \"Transportation\",\n        \"Subscriptions\",\n        \"Fun\",\n        \"Move Fund\",\n        \"Investing Deposit\",\n        \"Other\"\n      );\n    if (!catsInc.length) catsInc.push(\"Income\");\n\n    const payees = uniq((state.tx || []).map((t) => t.Payee)).slice(0, 400);\n    if ($(\"payeeList\"))\n      $(\"payeeList\").innerHTML = payees.map((p) => `<option value=\"${escapeAttr(p)}\"></option>`).join(\"\");\n\n    fillSelect($(\"exPerson\"), people);\n    fillSelect($(\"inPerson\"), people);\n\n    fillSelectWithBlank($(\"exAccount\"), accounts, \"(unassigned)\");\n    fillSelectWithBlank($(\"inAccount\"), accounts, \"(unassigned)\");\n\n    fillSelect($(\"exCategory\"), catsExp);\n    fillSelect($(\"inCategory\"), catsInc);\n\n    // inline \"Add new\u2026\" inside dropdowns (newbie-friendly)\n    ensureAddNewOption($(\"exCategory\"));\n    ensureAddNewOption($(\"inCategory\"));\n    bindAddNewDropdown($(\"exCategory\"), \"cat\", \"Expense\", \"ex\");\n    bindAddNewDropdown($(\"inCategory\"), \"cat\", \"Income\", \"in\");\n\n    // quick add category/subcategory\n    if ($(\"exAddCatBtn\")) $(\"exAddCatBtn\").onclick = () => quickAddCategory(\"Expense\", \"ex\");\n    if ($(\"exAddSubBtn\")) $(\"exAddSubBtn\").onclick = () => quickAddSubcategory(\"Expense\", \"ex\");\n    if ($(\"inAddCatBtn\")) $(\"inAddCatBtn\").onclick = () => quickAddCategory(\"Income\", \"in\");\n    if ($(\"inAddSubBtn\")) $(\"inAddSubBtn\").onclick = () => quickAddSubcategory(\"Income\", \"in\");\n\n    if ($(\"exCategory\")) $(\"exCategory\").onchange = () => rebuildSub(\"ex\");\n    if ($(\"inCategory\")) $(\"inCategory\").onchange = () => rebuildSub(\"in\");\n    rebuildSub(\"ex\");\n    rebuildSub(\"in\");\n\n    const itemCodes = uniq((state.tx || []).map((t) => t.Item)).sort();\n    const templ = [{ code: \"\", label: \"(none)\" }].concat(itemCodes.map((c) => ({ code: c, label: c })));\n    if ($(\"exTemplate\")) {\n      $(\"exTemplate\").innerHTML = templ\n        .map((t) => `<option value=\"${escapeAttr(t.code)}\">${escapeHtml(t.label)}</option>`)\n        .join(\"\");\n      $(\"exTemplate\").onchange = applyTemplateFromHistory;\n    }\n\n    fillSelectWithBlank($(\"txAccount\"), accounts, \"All\");\n    fillSelectWithBlank($(\"todayFocusCat\"), catsExp, \"(none)\");\n\n    refreshMonthSelectors();\n    rebuildBulkUI(true);\n  }\n\n  // Alias used by quick-add category/subcategory flows\n  function refreshTodaySelectors(){\n    rebuildDropdowns();\n  }\n\n\n\n  \n  /* ============================\n     Category quick-add helpers\n  ============================ */\n  function ensureCategory(type, category){\n    type = (type===\"Income\" ? \"Income\" : \"Expense\");\n    category = String(category||\"\").trim();\n    if(!category) return false;\n\n    const exists = (state.categories||[]).some(c =>\n      String(c.Active||\"Y\").toUpperCase()!==\"N\" &&\n      String(c.Type||\"Expense\").toLowerCase().startsWith(type.toLowerCase().slice(0,3)) &&\n      String(c.Category||\"\").trim().toLowerCase() === category.toLowerCase() &&\n      String(c.Subcategory||\"\").trim() === \"\"\n    );\n    if(exists) return true;\n\n    state.categories = state.categories || [];\n    state.categories.push({ Type:type, Category:category, Subcategory:\"\", Active:\"Y\" });\n    return true;\n  }\n\n  function ensureSubcategory(type, category, sub){\n    type = (type===\"Income\" ? \"Income\" : \"Expense\");\n    category = String(category||\"\").trim();\n    sub = String(sub||\"\").trim();\n    if(!category || !sub) return false;\n\n    const exists = (state.categories||[]).some(c =>\n      String(c.Active||\"Y\").toUpperCase()!==\"N\" &&\n      String(c.Type||\"Expense\").toLowerCase().startsWith(type.toLowerCase().slice(0,3)) &&\n      String(c.Category||\"\").trim().toLowerCase() === category.toLowerCase() &&\n      String(c.Subcategory||\"\").trim().toLowerCase() === sub.toLowerCase()\n    );\n    if(exists) return true;\n\n    state.categories = state.categories || [];\n    state.categories.push({ Type:type, Category:category, Subcategory:sub, Active:\"Y\" });\n    return true;\n  }\n\n  function quickAddCategory(type, prefix){\n    const label = (type===\"Income\" ? \"income\" : \"expense\");\n    const name = prompt(\"Add a new \" + label + \" category (name):\", \"\");\n    if(name==null) return null;\n    const cat = String(name||\"\").trim();\n    if(!cat) return toast(\"Category name cannot be empty.\", \"warn\");\n    ensureCategory(type, cat);\n    C.saveSnapshot && C.saveSnapshot(\"Category added\");\n    refreshTodaySelectors();\n    const sel = $(prefix+\"Category\");\n    if(sel) sel.value = cat;\n    rebuildSub(prefix);\n    toast(\"Added category: \" + cat, \"ok\");\n    return cat;\n  }\n\n  function quickAddSubcategory(type, prefix){\n    const catSel = $(prefix+\"Category\");\n    const cat = String(catSel ? catSel.value : \"\").trim();\n    if(!cat) return toast(\"Pick a category first.\", \"warn\");\n    const name = prompt(\"Add a subcategory under: \" + cat, \"\");\n    if(name==null) return null;\n    const sub = String(name||\"\").trim();\n    if(!sub) return toast(\"Subcategory name cannot be empty.\", \"warn\");\n    ensureSubcategory(type, cat, sub);\n    C.saveSnapshot && C.saveSnapshot(\"Subcategory added\");\n    refreshTodaySelectors();\n    const subSel = $(prefix+\"Subcategory\");\n    if(subSel) subSel.value = sub;\n    toast(\"Added subcategory: \" + cat + \" / \" + sub, \"ok\");\n    return sub;\n  }\n\n  /* ============================\n     Categories Manager tab (v2.0)\n  ============================ */\n  function normType(t){\n    return (String(t||\"Expense\").toLowerCase().startsWith(\"inc\") ? \"Income\" : \"Expense\");\n  }\n\n  function catKey(type, cat, sub){\n    return `${normType(type)}|${String(cat||\"\").trim().toLowerCase()}|${String(sub||\"\").trim().toLowerCase()}`;\n  }\n\n  function getCategoryRowsForManager(type){\n    const want = normType(type);\n    const map = new Map();\n\n    // seed from explicit category table (including inactive)\n    (state.categories||[]).forEach(c => {\n      const t = normType(c.Type);\n      if(t !== want) return;\n      const cat = String(c.Category||\"\").trim();\n      if(!cat) return;\n      const sub = String(c.Subcategory||\"\").trim();\n      const k = catKey(t, cat, sub);\n      if(!map.has(k)){\n        map.set(k, { Type:t, Category:cat, Subcategory:sub, Active:(String(c.Active||\"Y\").toUpperCase()===\"N\"?\"N\":\"Y\"), Tax:(String(c.Tax||\"\").toUpperCase()===\"Y\"?\"Y\":\"\"), TaxNote:(c.TaxNote||\"\"), used:0 });\n      }else{\n        const r = map.get(k);\n        if(String(c.Active||\"Y\").toUpperCase()===\"N\") r.Active = \"N\";\n        if(String(c.Tax||\"\").toUpperCase()===\"Y\") r.Tax = \"Y\";\n        if(String(c.TaxNote||\"\").trim()) r.TaxNote = String(c.TaxNote);\n      }\n    });\n\n    // seed from tx (implicit categories)\n    (state.tx||[]).forEach(t => {\n      const tt = normType(t.Type);\n      if(tt !== want) return;\n      const cat = String(t.Category||\"\").trim();\n      if(!cat) return;\n      const sub = String(t.Subcategory||\"\").trim();\n      const k = catKey(tt, cat, sub);\n      if(!map.has(k)) map.set(k, { Type:tt, Category:cat, Subcategory:sub, Active:\"Y\", Tax:\"\", TaxNote:\"\", used:0 });\n      map.get(k).used += 1;\n    });\n\n    const rows = Array.from(map.values());\n    rows.sort((a,b)=> (a.Category+a.Subcategory).localeCompare(b.Category+b.Subcategory));\n    return rows;\n  }\n\n  function fillCatManagerPicks(){\n    const type = normType($(\"catType\")?.value || \"Expense\");\n    const rows = getCategoryRowsForManager(type);\n    const cats = uniq(rows.map(r=>r.Category)).sort();\n    fillSelectWithBlank($(\"catPick\"), cats, \"(pick)\");\n\n    const chosenCat = String($(\"catPick\")?.value||\"\").trim();\n    const subs = uniq(rows.filter(r=>r.Category===chosenCat).map(r=>r.Subcategory).filter(Boolean)).sort();\n    fillSelectWithBlank($(\"subPick\"), subs, \"(all)\");\n  }\n\n  function renderCategories(){\n    if(!$(\"catRows\")) return;\n    const type = normType($(\"catType\")?.value || \"Expense\");\n    const q = String($(\"catSearch\")?.value||\"\").trim().toLowerCase();\n\n    const rows = getCategoryRowsForManager(type).filter(r => {\n      if(!q) return true;\n      return (r.Category||\"\").toLowerCase().includes(q) || (r.Subcategory||\"\").toLowerCase().includes(q);\n    });\n\n    $(\"catRows\").innerHTML = rows.map(r => {\n      const taxY = String(r.Tax||\"\").toUpperCase()===\"Y\";\n      const note = String(r.TaxNote||\"\");\n      const noteShort = note.length>60 ? (note.slice(0,57)+\"\u2026\") : note;\n      return `<tr>\n        <td>${escapeHtml(r.Type)}</td>\n        <td>${escapeHtml(r.Category)}</td>\n        <td>${escapeHtml(r.Subcategory || \"\")}</td>\n        <td class=\"num\">${escapeHtml(String(r.used||0))}</td>\n        <td>${r.Active===\"N\" ? \"N\" : \"Y\"}</td>\n        <td>\n          <label class=\"chk\">\n            <input class=\"taxFlag\" type=\"checkbox\"\n              data-type=\"${escapeAttr(r.Type)}\"\n              data-cat=\"${escapeAttr(r.Category)}\"\n              data-sub=\"${escapeAttr(r.Subcategory||\"\")}\"\n              ${taxY ? \"checked\" : \"\"}>\n            <span>Y</span>\n          </label>\n        </td>\n        <td>\n          <button class=\"ghost mini taxNoteBtn\" type=\"button\"\n            data-type=\"${escapeAttr(r.Type)}\"\n            data-cat=\"${escapeAttr(r.Category)}\"\n            data-sub=\"${escapeAttr(r.Subcategory||\"\")}\">Edit</button>\n          <span class=\"sub\" style=\"margin-left:8px\">${escapeHtml(noteShort||\"\")}</span>\n        </td>\n      </tr>`;\n    }).join(\"\") || `<tr><td colspan=\"7\" class=\"sub\">No categories yet.</td></tr>`;\n\n    fillCatManagerPicks();\n    $(\"catMsg\") && ($(\"catMsg\").textContent = `Showing ${rows.length} rows.`);\n  }\n\n  \n  function ensureCategoryRow(type, cat, sub){\n    const tnorm = normType(type);\n    const Type = (tnorm===\"income\") ? \"Income\" : \"Expense\";\n    const Category = String(cat||\"\").trim();\n    const Subcategory = String(sub||\"\").trim();\n    if(!Category) return null;\n    const key = catKey(tnorm, Category, Subcategory);\n    let row = (state.categories||[]).find(c => catKey(normType(c.Type), String(c.Category||\"\").trim(), String(c.Subcategory||\"\").trim()) === key);\n    if(!row){\n      row = { Type, Category, Subcategory, Active:\"Y\", Tax:\"\", TaxNote:\"\" };\n      state.categories.push(row);\n    }else{\n      // make sure new fields exist\n      if(row.Tax === undefined) row.Tax = \"\";\n      if(row.TaxNote === undefined) row.TaxNote = \"\";\n      if(!row.Type) row.Type = Type;\n    }\n    return row;\n  }\n\n  function setCategoryTaxFlag(type, cat, sub, on){\n    const row = ensureCategoryRow(type, cat, sub);\n    if(!row) return;\n    pushUndo(\"Tax flag\");\n    row.Tax = on ? \"Y\" : \"\";\n    toast(on ? \"Marked as Tax-related.\" : \"Removed Tax-related mark.\");\n    renderCategories();\n  }\n\n  function setCategoryTaxNote(type, cat, sub){\n    const row = ensureCategoryRow(type, cat, sub);\n    if(!row) return;\n    const current = String(row.TaxNote||\"\");\n    const note = prompt(\"Tax note (optional):\", current);\n    if(note === null) return;\n    pushUndo(\"Tax note\");\n    row.TaxNote = String(note||\"\").trim();\n    toast(\"Saved tax note.\");\n    renderCategories();\n  }\n\nfunction updateTxCategory(type, fromCat, fromSub, toCat, toSub){\n    const want = normType(type);\n    const fc = String(fromCat||\"\").trim();\n    const fs = String(fromSub||\"\").trim();\n    const tc = String(toCat||\"\").trim();\n    const ts = String(toSub||\"\").trim();\n    (state.tx||[]).forEach(t => {\n      if(normType(t.Type) !== want) return;\n      if(String(t.Category||\"\").trim() !== fc) return;\n      if(fs && String(t.Subcategory||\"\").trim() !== fs) return;\n      t.Category = tc;\n      if(fs) t.Subcategory = ts;\n      else if(ts) t.Subcategory = ts;\n    });\n    // budgets are category-level only\n    (state.budgets||[]).forEach(b => {\n      if(normType(b.Type) !== want) return;\n      if(String(b.Category||\"\").trim() !== fc) return;\n      b.Category = tc;\n    });\n  }\n\n  function deactivateCategoryRows(type, cat, sub){\n    const want = normType(type);\n    const C0 = String(cat||\"\").trim().toLowerCase();\n    const S0 = String(sub||\"\").trim().toLowerCase();\n    (state.categories||[]).forEach(c => {\n      if(normType(c.Type) !== want) return;\n      if(String(c.Category||\"\").trim().toLowerCase() !== C0) return;\n      if(S0){\n        if(String(c.Subcategory||\"\").trim().toLowerCase() !== S0) return;\n        c.Active = \"N\";\n      }else{\n        // deleting whole category: deactivate all rows under it\n        c.Active = \"N\";\n      }\n    });\n  }\n\n  function catAddFlow(){\n    const type = normType($(\"catType\")?.value || \"Expense\");\n    const name = prompt(`Add new ${type} category name:`, \"\");\n    if(name==null) return;\n    const cat = String(name||\"\").trim();\n    if(!cat) return toast(\"Category name cannot be empty.\", \"warn\");\n    pushUndo(\"Add category\");\n    ensureCategory(type, cat);\n    markDirty(true);\n    rebuildDropdowns();\n    renderCategories();\n    toast(\"Added category\", \"ok\", cat);\n  }\n\n  function subAddFlow(){\n    const type = normType($(\"catType\")?.value || \"Expense\");\n    const cat = String($(\"catPick\")?.value||\"\").trim();\n    if(!cat) return toast(\"Pick a category first.\", \"warn\");\n    const name = prompt(`Add subcategory under: ${cat}`, \"\");\n    if(name==null) return;\n    const sub = String(name||\"\").trim();\n    if(!sub) return toast(\"Subcategory name cannot be empty.\", \"warn\");\n    pushUndo(\"Add subcategory\");\n    ensureSubcategory(type, cat, sub);\n    markDirty(true);\n    rebuildDropdowns();\n    renderCategories();\n    toast(\"Added subcategory\", \"ok\", `${cat} / ${sub}`);\n  }\n\n  function renameFlow(){\n    const type = normType($(\"catType\")?.value || \"Expense\");\n    const cat = String($(\"catPick\")?.value||\"\").trim();\n    if(!cat) return toast(\"Pick a category first.\", \"warn\");\n    const sub = String($(\"subPick\")?.value||\"\").trim();\n    const isSub = !!sub;\n    const promptLabel = isSub ? `Rename subcategory: ${cat} / ${sub}` : `Rename category: ${cat}`;\n    const name = prompt(promptLabel, isSub ? sub : cat);\n    if(name==null) return;\n    const newName = String(name||\"\").trim();\n    if(!newName) return toast(\"Name cannot be empty.\", \"warn\");\n\n    pushUndo(isSub ? \"Rename subcategory\" : \"Rename category\");\n\n    if(isSub){\n      // update explicit categories\n      (state.categories||[]).forEach(c => {\n        if(normType(c.Type)!==type) return;\n        if(String(c.Category||\"\").trim()!==cat) return;\n        if(String(c.Subcategory||\"\").trim()!==sub) return;\n        c.Subcategory = newName;\n      });\n      // update tx\n      (state.tx||[]).forEach(t => {\n        if(normType(t.Type)!==type) return;\n        if(String(t.Category||\"\").trim()!==cat) return;\n        if(String(t.Subcategory||\"\").trim()!==sub) return;\n        t.Subcategory = newName;\n      });\n      ensureSubcategory(type, cat, newName);\n    }else{\n      (state.categories||[]).forEach(c => {\n        if(normType(c.Type)!==type) return;\n        if(String(c.Category||\"\").trim()!==cat) return;\n        c.Category = newName;\n      });\n      (state.tx||[]).forEach(t => {\n        if(normType(t.Type)!==type) return;\n        if(String(t.Category||\"\").trim()!==cat) return;\n        t.Category = newName;\n      });\n      (state.budgets||[]).forEach(b => {\n        if(normType(b.Type)!==type) return;\n        if(String(b.Category||\"\").trim()!==cat) return;\n        b.Category = newName;\n      });\n      ensureCategory(type, newName);\n    }\n\n    markDirty(true);\n    rebuildDropdowns();\n    renderCategories();\n    toast(\"Renamed\", \"ok\", isSub ? `${cat} / ${sub} \u2192 ${newName}` : `${cat} \u2192 ${newName}`);\n  }\n\n  function mergeMoveFlow(){\n    const type = normType($(\"catType\")?.value || \"Expense\");\n    const cat = String($(\"catPick\")?.value||\"\").trim();\n    if(!cat) return toast(\"Pick a category first.\", \"warn\");\n    const sub = String($(\"subPick\")?.value||\"\").trim();\n\n    const toCat = String(prompt(\"Move into category:\", cat) || \"\").trim();\n    if(!toCat) return toast(\"Target category cannot be empty.\", \"warn\");\n    const toSub = String(prompt(\"Move into subcategory (blank = keep):\", sub) || \"\").trim();\n\n    pushUndo(\"Merge / move\");\n    updateTxCategory(type, cat, sub, toCat, toSub);\n    ensureCategory(type, toCat);\n    if(sub && toSub) ensureSubcategory(type, toCat, toSub);\n    markDirty(true);\n    rebuildDropdowns();\n    renderCategories();\n    toast(\"Moved\", \"ok\", `${cat}${sub?\" / \"+sub:\"\"} \u2192 ${toCat}${toSub?\" / \"+toSub:\"\"}`);\n  }\n\n  function deleteFlow(){\n    const type = normType($(\"catType\")?.value || \"Expense\");\n    const cat = String($(\"catPick\")?.value||\"\").trim();\n    if(!cat) return toast(\"Pick a category first.\", \"warn\");\n    const sub = String($(\"subPick\")?.value||\"\").trim();\n\n    const rows = getCategoryRowsForManager(type);\n    const used = rows.filter(r => r.Category===cat && (sub? r.Subcategory===sub : true)).reduce((s,r)=>s+(r.used||0),0);\n\n    const msg = sub ? `Delete subcategory '${sub}' under '${cat}'?` : `Delete category '${cat}' (all subcategories)?`;\n    if(!confirm(`${msg}\\n\\nUsed by ${used} transaction(s).\\nYou MUST move existing transactions to another category.`)) return;\n\n    const toCat = String(prompt(\"Move transactions into category:\", \"\") || \"\").trim();\n    if(!toCat) return toast(\"Target category cannot be empty.\", \"warn\");\n    const toSub = String(prompt(\"Move into subcategory (optional):\", \"\") || \"\").trim();\n\n    pushUndo(\"Delete category/subcategory\");\n    updateTxCategory(type, cat, sub, toCat, toSub);\n    deactivateCategoryRows(type, cat, sub);\n    ensureCategory(type, toCat);\n    if(toSub) ensureSubcategory(type, toCat, toSub);\n    markDirty(true);\n    rebuildDropdowns();\n    renderCategories();\n    toast(\"Deleted (moved)\", \"ok\", `${cat}${sub?\" / \"+sub:\"\"} \u2192 ${toCat}${toSub?\" / \"+toSub:\"\"}`);\n  }\n\n  function initCategoriesTab(){\n    if(!$(\"catTable\")) return;\n    on($(\"catRefreshBtn\"), \"click\", () => renderCategories());\n    on($(\"catType\"), \"change\", () => renderCategories());\n    on($(\"catSearch\"), \"input\", () => renderCategories());\n    on($(\"catPick\"), \"change\", () => fillCatManagerPicks());\n    on($(\"catAddBtn\"), \"click\", () => catAddFlow());\n    on($(\"subAddBtn\"), \"click\", () => subAddFlow());\n    on($(\"catRenameBtn\"), \"click\", () => renameFlow());\n    on($(\"catMergeBtn\"), \"click\", () => mergeMoveFlow());\n    on($(\"catDeleteBtn\"), \"click\", () => deleteFlow());\n    // Tax flags + notes (in Categories Manager table)\n    on($(\"catTable\"), \"change\", (e) => {\n      const cb = e.target.closest(\"input.taxFlag\");\n      if(!cb) return;\n      setCategoryTaxFlag(cb.dataset.type, cb.dataset.cat, cb.dataset.sub, cb.checked);\n    });\n    on($(\"catTable\"), \"click\", (e) => {\n      const btn = e.target.closest(\"button.taxNoteBtn\");\n      if(!btn) return;\n      setCategoryTaxNote(btn.dataset.type, btn.dataset.cat, btn.dataset.sub);\n    });\n    renderCategories();\n  }\n\n  function initTaxTab(){\n    if(!$(\"taxYear\")) return;\n    on($(\"taxRefreshBtn\"), \"click\", () => renderTax());\n    on($(\"taxYear\"), \"change\", () => renderTax());\n    on($(\"taxOnlyTagged\"), \"change\", () => renderTax());\n    on($(\"taxIncludeIncome\"), \"change\", () => renderTax());\n    on($(\"taxIncludeExpense\"), \"change\", () => renderTax());\n    on($(\"taxScope\"), \"change\", () => renderTax());\n    on($(\"taxSearch\"), \"input\", () => {\n      if(TYBH.ui._taxSearchT) clearTimeout(TYBH.ui._taxSearchT);\n      TYBH.ui._taxSearchT = setTimeout(()=>renderTax(), 150);\n    });\n  }\n\n\n  // expose for template buttons\n  window.renderCategories = renderCategories;\n\n/* ============================\n     Grouped menu dropdowns\n  ============================ */\n  const NAV_GROUPS = [\n    { id: \"start\",    label: \"Start\",    tabs: [\n      { id: \"import\",   label: \"Import CSV\" },\n      { id: \"overview\", label: \"Overview\" }\n    ]},\n    { id: \"daily\",    label: \"Daily\",    tabs: [\n      { id: \"today\",    label: \"Today\" },\n      { id: \"expense\",  label: \"Add Expense\" },\n      { id: \"income\",   label: \"Add Income\" }\n    ]},\n    { id: \"manage\",   label: \"Manage\",   tabs: [\n      { id: \"tx\",       label: \"Transactions\" },\n      { id: \"accounts\", label: \"Accounts\" },\n      { id: \"categories\", label: \"Categories\" },\n      { id: \"reconcile\", label: \"Reconcile\" },\n      { id: \"tax\",      label: \"Tax View\" },\n      { id: \"budgets\",  label: \"Budgets\" },\n      { id: \"bills\",    label: \"Bills\" },\n      { id: \"bulk\",     label: \"Bulk Edit\" }\n    ]},\n    { id: \"planning\", label: \"Planning\", tabs: [\n      { id: \"goals\",    label: \"Goals\" },\n      { id: \"grow\",     label: \"Grow\" },\n      { id: \"gpt\",      label: \"GPT Pack\" },\n      { id: \"move\",     label: \"Moving\" }\n    ]},\n    { id: \"export\",   label: \"EXPORT\",   tabs: [\n      { id: \"export\",   label: \"Export\" }\n    ]},\n    { id: \"help\",     label: \"Help\",     tabs: [\n      { id: \"help\",     label: \"Quick Guide\" },\n      { id: \"wizard\",   label: \"Setup Wizard\" }\n    ]}\n  ];\n\n  function getTabLabel(tabId){\n    for (const g of NAV_GROUPS){\n      for (const t of (g.tabs || [])){\n        if (t.id === tabId) return t.label;\n      }\n    }\n    return tabId;\n  }\n\n  function setPageTitle(tabId){\n    const el = $(\"pageTitle\");\n    if (!el) return;\n    const label = getTabLabel(tabId || \"import\");\n    el.textContent = label;\n  }\n\n\n\n\n    /* ============================\n     Modern grouped nav (v4)\n  ============================ */\n  let _navOpen = false;\n  let _navGroupId = (NAV_GROUPS[0] && NAV_GROUPS[0].id) || \"start\";\n  let _navTab = \"import\";\n  let _navOutsideBound = false;\n\n  function setNavOpen(on){\n    _navOpen = !!on;\n    const drop = $(\"navDrop\");\n    if (drop) drop.classList.toggle(\"hidden\", !_navOpen);\n  }\n\n  function renderGroupButtons(activeGroupId){\n    const wrap = $(\"navGroups\");\n    if (!wrap) return;\n    wrap.innerHTML = NAV_GROUPS.map(g => {\n      const isActive = g.id === activeGroupId;\n      return `<a href=\"#\" class=\"navGroupLink${isActive ? \" active\" : \"\"}${g.id===\"export\" ? \" isExport\" : \"\"}\" data-group=\"${escapeAttr(g.id)}\" role=\"button\" aria-haspopup=\"true\" aria-expanded=\"${_navOpen && isActive ? \"true\" : \"false\"}\">\n        <span>${escapeHtml(g.label)}</span><span class=\"caret\">\u25BE</span>\n      </a>`;\n    }).join(\"\");\n  }\n\n  function renderPagesForGroup(groupId, activeTab){\n    const g = NAV_GROUPS.find(x => x.id === groupId) || NAV_GROUPS[0];\n    if (!g) return;\n\n    _navGroupId = g.id;\n\n    // update groups active state\n    document.querySelectorAll(\"#tyBudgetHub .navGroupLink\").forEach(btn => {\n      btn.classList.toggle(\"active\", btn.dataset.group === g.id);\n    });\n    const pagesEl = $(\"navPages\");\n    if (!pagesEl) return;\n    pagesEl.innerHTML = (g.tabs || []).map(t => {\n      const isActive = t.id === activeTab;\n      return `<a href=\"#\" class=\"navPageLink${isActive ? \" active\" : \"\"}\" data-tab=\"${escapeAttr(t.id)}\" role=\"button\">${escapeHtml(t.label)}</a>`;\n    }).join(\"\");\n  }\n\n  function findGroupForTab(tab){\n    for (const g of NAV_GROUPS){\n      if ((g.tabs || []).some(t => t.id === tab)) return g;\n    }\n    return NAV_GROUPS[0] || null;\n  }\n\n  function syncNavToTab(tab){\n    _navTab = tab || \"import\";\n    const g = findGroupForTab(_navTab);\n    if (!g) return;\n\n    // rebuild group buttons only once if missing\n    const ng = $(\"navGroups\");\n    if (!ng || !ng.children || !ng.children.length) renderGroupButtons(g.id);\n\n    renderPagesForGroup(g.id, _navTab);\n  }\n\n  function toggleGroup(groupId){\n    const g = NAV_GROUPS.find(x => x.id === groupId) || NAV_GROUPS[0];\n    if (!g) return;\n\n    // if clicking the same active group, toggle dropdown open/close\n    const same = (_navGroupId === g.id);\n    if (same && _navOpen){\n      setNavOpen(false);\n      return;\n    }\n\n    // open dropdown for this group\n    const inGroup = (g.tabs || []).some(t => t.id === _navTab);\n    const active = inGroup ? _navTab : ((g.tabs && g.tabs[0] && g.tabs[0].id) ? g.tabs[0].id : _navTab);\n    renderPagesForGroup(g.id, active);\n    setNavOpen(true);\n  }\n\n  function setupNavBar(){\n    renderGroupButtons(_navGroupId);\n    renderPagesForGroup(_navGroupId, _navTab);\n\n    // group click\n    onDelegate($(\"navGroups\"), \"click\", \"a[data-group]\", (e, b) => {\n      e.preventDefault();\n      toggleGroup(b.dataset.group);\n    });\n\n    // page click\n    onDelegate($(\"navPages\"), \"click\", \"a[data-tab]\", (e, b) => {\n      e.preventDefault();\n      const tab = b.dataset.tab;\n      setNavOpen(false);\n      if (tab) routeToTab(tab);\n    });\n\n    // click outside to close\n    if (!_navOutsideBound){\n      _navOutsideBound = true;\n      document.addEventListener(\"click\", (e) => {\n        if (!_navOpen) return;\n        const top = $(\"navTop\");\n        const drop = $(\"navDrop\");\n        const t = e.target;\n        if ((top && top.contains(t)) || (drop && drop.contains(t))) return;\n        setNavOpen(false);\n      }, { passive: true });\n    }\n  }\n\n\n\n\n  /* ============================\n     Top UI Polish (collapse + focus)\n  ============================ */\n  const UI_PREF_HIDE_CLOUD = \"tybh_hideCloudCard\";\n  const UI_PREF_FOCUS = \"tybh_focusMode_v1\";\n  let _autoCleanDone = false;\n\n  function applyCloudHidden_(hidden){\n    const card = $(\"cloudCard\");\n    const btn = $(\"cloudToggleBtn\");\n    if(card) card.classList.toggle(\"hidden\", !!hidden);\n    if(btn) btn.classList.toggle(\"active\", !hidden);\n    try{ localStorage.setItem(UI_PREF_HIDE_CLOUD, hidden ? \"1\" : \"0\"); }catch(_e){}\n  }\n\n  function toggleCloudPanel_(){\n    const card = $(\"cloudCard\");\n    const hidden = !!(card && card.classList.contains(\"hidden\"));\n    applyCloudHidden_(!hidden);\n    if(hidden){\n      try{ card && card.scrollIntoView({ behavior:\"smooth\", block:\"start\" }); }catch(_e){}\n    }\n  }\n\n  function applyFocusMode_(on){\n    const root = document.getElementById(\"tyBudgetHub\");\n    if(root) root.classList.toggle(\"tybhFocus\", !!on);\n    try{ localStorage.setItem(UI_PREF_FOCUS, on ? \"1\" : \"0\"); }catch(_e){}\n  }\n\n  function toggleFocusMode_(){\n    const root = document.getElementById(\"tyBudgetHub\");\n    const on = !!(root && root.classList.contains(\"tybhFocus\"));\n    applyFocusMode_(!on);\n  }\n\n  function initTopPolish_(){\n    // Wire top icon buttons (if present)\n    on($(\"cloudToggleBtn\"), \"click\", (e)=>{ e.preventDefault(); toggleCloudPanel_(); });\n    on($(\"cloudHideBtn\"), \"click\", (e)=>{ e.preventDefault(); applyCloudHidden_(true); });\n    on($(\"focusToggleBtn\"), \"click\", (e)=>{ e.preventDefault(); toggleFocusMode_(); });\n    on($(\"helpBtn\"), \"click\", (e)=>{ e.preventDefault(); try{ routeToTab(\"help\"); }catch(_e){} });\n\n    // Apply saved prefs\n    try{\n      const hideCloud = (localStorage.getItem(UI_PREF_HIDE_CLOUD)||\"0\") === \"1\";\n      if(hideCloud) applyCloudHidden_(true);\n    }catch(_e){}\n    try{\n      const focus = (localStorage.getItem(UI_PREF_FOCUS)||\"0\") === \"1\";\n      if(focus) applyFocusMode_(true);\n    }catch(_e){}\n  }\n\n  function autoCleanTopAfterLoad_(){\n    if(_autoCleanDone) return;\n    if(!state || !state.loaded) return;\n    if(state._isDemo) return;\n    if(!(state.tx && state.tx.length)) return;\n\n    _autoCleanDone = true;\n\n    // Hide Quick Start once real data is loaded (can re-open from Help tab)\n    try{ localStorage.setItem(\"tybh_hideQuickStart\", \"1\"); }catch(_e){}\n    try{ $(\"quickStartCard\")?.classList.add(\"hidden\"); $(\"qsShowRow\")?.classList.remove(\"hidden\"); }catch(_e){}\n\n    // Collapse Cloud panel (re-open via \u2601 button)\n    applyCloudHidden_(true);\n\n    // If user is still sitting on Import, jump to Overview for a cleaner start\n    try{\n      const active = document.querySelector(\"#tyBudgetHub .tabbtn.active\");\n      const activeTab = active ? String(active.dataset.tab||\"\") : \"\";\n      if(activeTab === \"import\"){\n        try{ localStorage.setItem(\"tybh_lastTab\", \"overview\"); }catch(_e){}\n        routeToTab(\"overview\");\n      }\n    }catch(_e){}\n  }\n\n  /* ============================\n     Quick Start + Help + Wizard\n  ============================ */\n  function initQuickStart(){\n    const card = $(\"quickStartCard\");\n    const showRow = $(\"qsShowRow\");\n    const hideKey = \"tybh_hideQuickStart\";\n\n    function apply(){\n      const hidden = localStorage.getItem(hideKey) === \"1\";\n      if (card) card.classList.toggle(\"hidden\", hidden);\n      if (showRow) showRow.classList.toggle(\"hidden\", !hidden);\n    }\n\n    // actions\n    on($(\"qsHide\"), \"click\", (e) => {\n      e.preventDefault();\n      try{ localStorage.setItem(hideKey, \"1\"); }catch(_){}\n      apply();\n    });\n    on($(\"qsShow\"), \"click\", (e) => {\n      e.preventDefault();\n      try{ localStorage.setItem(hideKey, \"0\"); }catch(_){}\n      apply();\n      routeToTab(\"import\");\n      setTimeout(() => { $(\"quickStartCard\")?.scrollIntoView({ behavior:\"smooth\", block:\"start\" }); }, 60);\n    });\n    on($(\"qsOpenHelp\"), \"click\", (e) => { e.preventDefault(); routeToTab(\"help\"); });\n    on($(\"qsOpenWizard\"), \"click\", (e) => { e.preventDefault(); routeToTab(\"wizard\"); setWizardStep(0); });\n\n    apply();\n  }\n\n  let _wizStep = 0;\n\n  function setWizardStep(step){\n    _wizStep = Math.max(0, Math.min(4, Number(step)||0));\n    document.querySelectorAll(\"#tyBudgetHub .wizStep\").forEach(b => {\n      b.classList.toggle(\"active\", String(b.dataset.step) === String(_wizStep));\n    });\n    document.querySelectorAll(\"#tyBudgetHub .wizPane\").forEach(p => {\n      p.classList.toggle(\"hidden\", String(p.dataset.step) !== String(_wizStep));\n    });\n    try{ localStorage.setItem(\"tybh_wizStep\", String(_wizStep)); }catch(_){}\n  }\n\n  function initHelpAndWizard(){\n    // HELP buttons\n    on($(\"helpOpenWizard\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"wizard\"); setWizardStep(0); });\n    on($(\"helpShowQuickStart\"), \"click\", (e)=>{\n      e.preventDefault();\n      try{ localStorage.setItem(\"tybh_hideQuickStart\", \"0\"); }catch(_){}\n      routeToTab(\"import\");\n      setTimeout(() => { $(\"quickStartCard\")?.scrollIntoView({ behavior:\"smooth\", block:\"start\" }); }, 80);\n      // quick start will unhide on next init/apply; also update instantly if available\n      $(\"quickStartCard\")?.classList.remove(\"hidden\");\n      $(\"qsShowRow\")?.classList.add(\"hidden\");\n    });\n\n    on($(\"helpGoImport\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"import\"); });\n    on($(\"helpGoAccounts\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"accounts\"); });\n    on($(\"helpGoToday\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"today\"); });\n    on($(\"helpGoExport\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"export\"); });\n\n    // Wizard navigation\n    on($(\"wizRestart\"), \"click\", (e)=>{ e.preventDefault(); setWizardStep(0); });\n    on($(\"wizGoHelp\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"help\"); });\n\n    // step list click\n    onDelegate($(\"tab-wizard\"), \"click\", \"button.wizStep\", (e, b) => {\n      e.preventDefault();\n      setWizardStep(b.dataset.step);\n    });\n\n    // step 0\n    on($(\"wizLoadDemo\"), \"click\", (e)=>{ e.preventDefault(); loadDemo(); routeToTab(\"overview\"); setWizardStep(2); });\n    on($(\"wizGoImport\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"import\"); setWizardStep(1); setTimeout(()=>{ $(\"fileInput\")?.focus(); }, 120); });\n    on($(\"wizNext0\"), \"click\", (e)=>{ e.preventDefault(); setWizardStep(1); });\n\n    // step 1\n    on($(\"wizJumpImport1\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"import\"); setTimeout(()=>{ $(\"fileInput\")?.focus(); }, 120); });\n    on($(\"wizBack1\"), \"click\", (e)=>{ e.preventDefault(); setWizardStep(0); });\n    on($(\"wizNext1\"), \"click\", (e)=>{ e.preventDefault(); setWizardStep(2); });\n\n    // step 2\n    on($(\"wizJumpAccounts2\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"accounts\"); });\n    on($(\"wizBack2\"), \"click\", (e)=>{ e.preventDefault(); setWizardStep(1); });\n    on($(\"wizNext2\"), \"click\", (e)=>{ e.preventDefault(); setWizardStep(3); });\n\n    // step 3\n    on($(\"wizJumpToday3\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"today\"); });\n    on($(\"wizBack3\"), \"click\", (e)=>{ e.preventDefault(); setWizardStep(2); });\n    on($(\"wizNext3\"), \"click\", (e)=>{ e.preventDefault(); setWizardStep(4); });\n\n    // step 4\n    on($(\"wizJumpExport4\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"export\"); });\n    on($(\"wizBack4\"), \"click\", (e)=>{ e.preventDefault(); setWizardStep(3); });\n    on($(\"wizDone4\"), \"click\", (e)=>{ e.preventDefault(); routeToTab(\"help\"); });\n\n    // restore last step\n    try{\n      const last = Number(localStorage.getItem(\"tybh_wizStep\")||\"0\");\n      if (!Number.isNaN(last)) setWizardStep(last);\n    }catch(_){}\n  }\n\n/* ============================\n     Demo banner\n  ============================ */\n  function updateDemoUI(){\n    updateStatusStrip();\n    const onDemo = !!state._isDemo;\n    const banner = $(\"demoBanner\");\n    const badge = $(\"demoBadge\");\n    if (banner) banner.classList.toggle(\"hidden\", !onDemo);\n    if (badge) badge.classList.toggle(\"hidden\", !onDemo);\n\n    if ($(\"stStatus\") && onDemo && state.loaded){\n      $(\"stStatus\").textContent = \"Loaded (DEMO)\";\n    }\n  }\n\n  function setDemoMode(on){\n    // keep status strip in sync\n\n    state._isDemo = !!on;\n    updateDemoUI();\n  }\n\n  async function loadDemoFromUrl(url, force){\n    if (state.loaded && !force) return;\n    const u = url || DEMO_CSV_URL;\n    try{\n      if ($(\"stStatus\")) $(\"stStatus\").textContent = \"Loading demo...\";\n      if ($(\"importMsg\")) $(\"importMsg\").textContent = \"\";\n      const res = await fetch(u, { cache: \"no-store\" });\n      if (!res.ok) throw new Error(\"HTTP \" + res.status);\n      const text = await res.text();\n      setDemoMode(true);\n      META.dirty = false;\n      loadFromMaster(preprocessCsvText(String(text || \"\")));\n      afterLoad();\n      updateStatusStrip();\n      saveSnapshotNow();\n    } catch(err){\n      console.error(err);\n      // fallback to core demo if available (works even if CDN blocked/offline)\n      try{\n        if (typeof loadDemoCore === \"function\"){\n          const maybe = loadDemoCore();\n          if (typeof maybe === \"string\" && maybe.trim()){\n            setDemoMode(true);\n            loadFromMaster(preprocessCsvText(String(maybe)));\n            afterLoad();\n            return;\n          }\n          if (state && state.loaded){\n            setDemoMode(true);\n            afterLoad();\n            return;\n          }\n        }\n      } catch(e2){\n        console.error(e2);\n      }\n      setDemoMode(false);\n      if ($(\"stStatus\")) $(\"stStatus\").textContent = \"Not loaded\";\n      if ($(\"importMsg\")){\n        $(\"importMsg\").innerHTML = `<span class=\"err\">Demo CSV auto-load failed.</span> ${escapeHtml(err?.message || String(err))}`;\n      }\n    }\n  }\n\n\n  /* ============================\n     Tabs\n  ============================ */\n  const TAB_LIST = [\n    \"import\",\n    \"overview\",\n    \"today\",\n    \"expense\",\n    \"income\",\n    \"tx\",\n    \"accounts\",\n    \"categories\",\n    \"reconcile\",\n    \"tax\",\n    \"budgets\",\n    \"bills\",\n    \"bulk\",\n    \"goals\",\n    \"grow\",\n    \"gpt\",\n    \"move\",\n    \"export\",\n    \"help\",\n    \"wizard\"\n  ];\n\n  function showTab(tab) {\n    document.querySelectorAll(\"#tyBudgetHub .tabbtn\").forEach((b) => {\n      b.classList.toggle(\"active\", b.dataset.tab === tab);\n    });\n    document.querySelectorAll(\"#tyBudgetHub .drawerBtn\").forEach((b) => {\n      b.classList.toggle(\"active\", b.dataset.tab === tab);\n    });\n\n    TAB_LIST.forEach((t) => {\n      const el = $(\"tab-\" + t);\n      if (el) el.classList.toggle(\"hidden\", t !== tab);\n    });\n\n    if ($(\"tabDrawer\")) $(\"tabDrawer\").classList.add(\"hidden\");\n\n    setPageTitle(tab);\n    syncNavToTab(tab);\n    updateDemoUI();\n\n    try {\n      localStorage.setItem(\"tybh_lastTab\", tab);\n    } catch (e) {}\n  }\n\n  function buildTabDrawer() {\n    const drawer = $(\"tabDrawer\");\n    if (!drawer) return;\n\n    drawer.innerHTML = TAB_LIST.map((t) => {\n      const btn = document.querySelector(`#tyBudgetHub .tabbtn[data-tab=\"${t}\"]`);\n      const label = btn ? btn.textContent.trim() : t;\n      return `<button type=\"button\" class=\"drawerBtn\" data-tab=\"${escapeAttr(t)}\">${escapeHtml(label)}</button>`;\n    }).join(\"\");\n\n    drawer.addEventListener(\"click\", (e) => {\n      const b = e.target.closest(\"a[data-tab]\");\n      if (!b) return;\n      routeToTab(b.dataset.tab);\n    });\n  }\n\n  function routeToTab(tab) {\n    if (!state.loaded && ![\"import\",\"help\",\"wizard\"].includes(tab)) {\n      if ($(\"importMsg\")) $(\"importMsg\").innerHTML = `<span class=\"err\">Import a CSV first.</span>`;\n      showTab(\"import\");\n      return;\n    }\n    showTab(tab);\n    if (tab === \"tx\") renderTx();\n    if (tab === \"accounts\") renderAccounts();\n    if (tab === \"categories\") renderCategories();\n    if (tab === \"reconcile\") renderReconcile();\n    if (tab === \"tax\") renderTax();\n    if (tab === \"bulk\") rebuildBulkUI(true);\n    if (tab === \"goals\") renderGoalsEditor();\n    if (tab === \"budgets\") renderBudgets();\n    if (tab === \"bills\") renderBills();\n    if (tab === \"move\") renderMove();\n    if (tab === \"grow\") renderGrow();\n    if (tab === \"today\") refreshToday();\n    if (tab === \"overview\") renderOverview();\n  }\n\n  /* ============================\n     Render All\n  ============================ */\n  function renderAll() {\n    if (!state.loaded) return;\n\n    if ($(\"setCurrency\")) state.settings.currency = $(\"setCurrency\").value || \"USD\";\n    if ($(\"setPeople\")) {\n      state.settings.people = ($(\"setPeople\").value || \"Tin Lei,Tin Wing\")\n        .split(\",\")\n        .map((s) => s.trim())\n        .filter(Boolean);\n    }\n\n    rebuildDropdowns();\n    renderOverview();\n    renderAccounts();\n    renderGoalsEditor();\n    renderBudgets();\n    renderBills();\n    renderMove();\n    renderGrow();\n    renderTx();\n    refreshToday();\n  }\n\n  /* ============================\n     Overview + Goals Summary\n  ============================ */\n  function renderGoalsSummary() {\n    const wrap = $(\"goalRows\");\n    if (!wrap) return;\n\n    const active = (state.goals || []).filter((g) => String(g.Active || \"Y\").trim().toUpperCase() !== \"N\");\n    if (!active.length) {\n      wrap.textContent = \"No goals yet.\";\n      return;\n    }\n\n    wrap.innerHTML = active\n      .map((g) => {\n        const pct =\n          g.TargetAmount > 0 ? Math.max(0, Math.min(1, (g.CurrentAmount || 0) / g.TargetAmount)) : 0;\n        const p = Math.round(pct * 100);\n        return `\n        <div style=\"margin:10px 0\">\n          <div style=\"display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap\">\n            <div style=\"font-weight:950\">${escapeHtml(g.GoalName)}</div>\n            <div class=\"sub\">${escapeHtml(money(g.CurrentAmount))} / ${escapeHtml(money(g.TargetAmount))} (${p}%)</div>\n          </div>\n          <div class=\"bar\"><div style=\"width:${p}%\"></div></div>\n          ${g.Notes ? `<div class=\"sub\" style=\"margin-top:6px\">${escapeHtml(g.Notes)}</div>` : ``}\n        </div>\n      `;\n      })\n      .join(\"\");\n  }\n\n  function renderOverview() {\n    if (!state.loaded) return;\n\n    const m = $(\"monthPick\") ? $(\"monthPick\").value : \"\";\n    const rows = monthTx(m);\n\n    let income = 0,\n      expense = 0;\n    for (const r of rows) {\n      if (r.Type === \"Income\") income += num(r.Amount);\n      if (r.Type === \"Expense\") expense += num(r.Amount);\n    }\n    const net = income - expense;\n\n    if ($(\"kIncome\")) $(\"kIncome\").textContent = money(income);\n    if ($(\"kExpense\")) $(\"kExpense\").textContent = money(expense);\n    if ($(\"kNet\")) $(\"kNet\").textContent = money(net);\n\n    if ($(\"ovNote\"))\n      $(\"ovNote\").textContent = net >= 0 ? \"Good. Net is positive this month.\" : \"Careful. Net is negative this month.\";\n\n    const map = new Map();\n    for (const r of rows) {\n      if (r.Type !== \"Expense\") continue;\n      const k = (r.Category || \"(uncat)\").trim() || \"(uncat)\";\n      map.set(k, (map.get(k) || 0) + num(r.Amount));\n    }\n    const list = Array.from(map.entries())\n      .map(([category, amount]) => ({ category, amount }))\n      .sort((a, b) => b.amount - a.amount);\n\n    if ($(\"catRows\")) {\n      $(\"catRows\").innerHTML = (list.length ? list : [{ category: \"(none)\", amount: 0 }])\n        .map((r) => `<tr><td>${escapeHtml(r.category)}</td><td class=\"num\">${escapeHtml(money(r.amount))}</td></tr>`)\n        .join(\"\");\n    }\n\n    const recent = [...(state.tx || [])].sort((a, b) => (b.Date || \"\").localeCompare(a.Date || \"\")).slice(0, 10);\n    if ($(\"recentRows\")) {\n      $(\"recentRows\").innerHTML = recent.length\n        ? recent\n            .map((r) => {\n              return `<div style=\"padding:8px 0;border-bottom:1px dashed var(--border)\">\n          <b>${escapeHtml(r.Type)}</b> ${escapeHtml(money(r.Amount))} \u2014 ${escapeHtml(r.Category)}${\n                r.Subcategory ? \" / \" + escapeHtml(r.Subcategory) : \"\"\n              }\n          <div class=\"sub\">${escapeHtml(r.Date)} \u2022 ${escapeHtml(r.Person)} \u2022 ${escapeHtml(r.Account || \"\u2014\")} ${\n                r.Payee ? \"\u2022 \" + escapeHtml(r.Payee) : \"\"\n              }</div>\n        </div>`;\n            })\n            .join(\"\")\n        : \"No transactions yet.\";\n    }\n\n    renderGoalsSummary();\n  }\n\n  /* ============================\n     Rules UI\n  ============================ */\n  function loadRulesUI() {\n    if ($(\"ruleMode\")) $(\"ruleMode\").value = String(state.rules.mode || \"BLOCK\").toUpperCase();\n    if ($(\"ruleEatCats\")) $(\"ruleEatCats\").value = state.rules.eatCats || \"\";\n    if ($(\"ruleEatWeekly\")) $(\"ruleEatWeekly\").value = num(state.rules.eatWeekly) || 0;\n    if ($(\"ruleImpulseWeekly\")) $(\"ruleImpulseWeekly\").value = num(state.rules.impulseWeekly) || 0;\n    if ($(\"ruleNonEssCats\")) $(\"ruleNonEssCats\").value = state.rules.nonEssCats || \"\";\n    if ($(\"ruleNonEssDaily\")) $(\"ruleNonEssDaily\").value = num(state.rules.nonEssDaily) || 0;\n\n    if ($(\"ruleMsg\")) $(\"ruleMsg\").textContent = \"\";\n    if ($(\"growInvestMonthly\")) $(\"growInvestMonthly\").value = num(state.grow.investMonthly) || 0;\n    if ($(\"growInvestAccount\")) $(\"growInvestAccount\").value = state.grow.investAccount || \"\";\n  }\n\n  function saveRules() {\n    state.rules.mode = String($(\"ruleMode\")?.value || \"BLOCK\").toUpperCase();\n    state.rules.eatCats = $(\"ruleEatCats\")?.value || \"\";\n    state.rules.eatWeekly = num($(\"ruleEatWeekly\")?.value);\n    state.rules.impulseWeekly = num($(\"ruleImpulseWeekly\")?.value);\n    state.rules.nonEssCats = $(\"ruleNonEssCats\")?.value || \"\";\n    state.rules.nonEssDaily = num($(\"ruleNonEssDaily\")?.value);\n\n    if ($(\"ruleMsg\")) $(\"ruleMsg\").innerHTML = `<span class=\"ok\">Saved.</span>`;\n    refreshToday();\n  }\n\n  /* ============================\n     Expense / Income forms\n  ============================ */\n  let pendingExpense = null;\n\n  function clearExpense(keepMsg = false) {\n    if ($(\"exAmount\")) $(\"exAmount\").value = \"\";\n    if ($(\"exPayee\")) $(\"exPayee\").value = \"\";\n    if ($(\"exNotes\")) $(\"exNotes\").value = \"\";\n    if ($(\"exTemplate\")) $(\"exTemplate\").value = \"\";\n    if ($(\"exDate\")) $(\"exDate\").value = isoToday();\n    if ($(\"exImpulse\")) $(\"exImpulse\").value = \"N\";\n    if ($(\"exImpulseReason\")) $(\"exImpulseReason\").value = \"\";\n    if ($(\"exWarnBox\")) $(\"exWarnBox\").classList.add(\"hidden\");\n    pendingExpense = null;\n    if (!keepMsg && $(\"exMsg\")) $(\"exMsg\").textContent = \"\";\n  }\n\n  function clearIncome(keepMsg = false) {\n    if ($(\"inAmount\")) $(\"inAmount\").value = \"\";\n    if ($(\"inNotes\")) $(\"inNotes\").value = \"\";\n    if ($(\"inDate\")) $(\"inDate\").value = isoToday();\n    if (!keepMsg && $(\"inMsg\")) $(\"inMsg\").textContent = \"\";\n  }\n\n  function cancelPendingExpense() {\n    pendingExpense = null;\n    if ($(\"exWarnBox\")) $(\"exWarnBox\").classList.add(\"hidden\");\n    if ($(\"exMsg\")) $(\"exMsg\").innerHTML = `<span class=\"sub\">Okay.</span>`;\n  }\n\n  function overridePendingExpense() {\n    if (!pendingExpense) return;\n    const tx = pendingExpense.tx;\n    const warnings = pendingExpense.warnings || [];\n    applyFlagsForTx(tx, warnings, true);\n    state.tx.push(tx);\n\n    refreshMonthSelectors();\n    if ($(\"txMonth\") && $(\"txMonth\").value && $(\"txMonth\").value !== tx.Month) {\n      $(\"txMonth\").value = tx.Month;\n    }\n\n    pendingExpense = null;\n    if ($(\"exWarnBox\")) $(\"exWarnBox\").classList.add(\"hidden\");\n\n    clearExpense(true);\n    if ($(\"exMsg\")) $(\"exMsg\").innerHTML = `<span class=\"ok\">Saved (override).</span>`;\n\n    rebuildDropdowns();\n    renderOverview();\n    renderAccounts();\n    renderBudgets();\n    refreshToday();\n    renderTx();\n  }\n\n  function submitExpense() {\n    if (!state.loaded) {\n      if ($(\"exMsg\")) $(\"exMsg\").innerHTML = `<span class=\"err\">Import first.</span>`;\n      return;\n    }\n    const amount = num($(\"exAmount\")?.value);\n    if (amount <= 0) {\n      if ($(\"exMsg\")) $(\"exMsg\").innerHTML = `<span class=\"err\">Enter an amount.</span>`;\n      return;\n    }\n\n    const date = ($(\"exDate\")?.value || isoToday()).slice(0, 10);\n\n    const tx = {\n      ID: uid(),\n      Date: date,\n      Month: toMonth(date),\n      Type: \"Expense\",\n      Person: $(\"exPerson\")?.value || \"\",\n      Account: $(\"exAccount\")?.value || \"\",\n      Category: $(\"exCategory\")?.value || \"\",\n      Subcategory: $(\"exSubcategory\")?.value || \"\",\n      Item: $(\"exTemplate\")?.value || \"\",\n      Payee: $(\"exPayee\")?.value || \"\",\n      Amount: amount,\n      Notes: $(\"exNotes\")?.value || \"\",\n      Impulse: $(\"exImpulse\")?.value === \"Y\" ? \"Y\" : \"N\",\n      ImpulseReason: $(\"exImpulseReason\")?.value || \"\",\n      Flags: \"\"\n    };\n\n    const warnings = evalWarningsForTx(tx, true);\n    const mode = String(state.rules.mode || \"BLOCK\").toUpperCase();\n\n    if (warnings.length && mode === \"BLOCK\") {\n      pendingExpense = { tx, warnings };\n      if ($(\"exWarnList\"))\n        $(\"exWarnList\").innerHTML = warnings.map((w) => `<div style=\"margin:6px 0\">\u2022 ${escapeHtml(w)}</div>`).join(\"\");\n      if ($(\"exWarnBox\")) $(\"exWarnBox\").classList.remove(\"hidden\");\n      if ($(\"exMsg\"))\n        $(\"exMsg\").innerHTML = `<span class=\"warn\">Blocked by guardrails.</span> You can override if unavoidable.`;\n      return;\n    }\n\n    if (warnings.length && mode === \"WARN\") {\n      applyFlagsForTx(tx, warnings, false);\n      if ($(\"exMsg\")) $(\"exMsg\").innerHTML = `<span class=\"warn\">Saved with warning.</span>`;\n    } else {\n      if ($(\"exMsg\")) $(\"exMsg\").innerHTML = `<span class=\"ok\">Saved.</span>`;\n    }\n\n    state.tx.push(tx);\n\n    refreshMonthSelectors();\n    if ($(\"txMonth\") && $(\"txMonth\").value && $(\"txMonth\").value !== tx.Month) {\n      $(\"txMonth\").value = tx.Month;\n    }\n\n    clearExpense(true);\n    rebuildDropdowns();\n    renderOverview();\n    renderAccounts();\n    renderBudgets();\n    refreshToday();\n    renderTx();\n  }\n\n  function submitIncome() {\n    if (!state.loaded) {\n      if ($(\"inMsg\")) $(\"inMsg\").innerHTML = `<span class=\"err\">Import first.</span>`;\n      return;\n    }\n    const amount = num($(\"inAmount\")?.value);\n    if (amount <= 0) {\n      if ($(\"inMsg\")) $(\"inMsg\").innerHTML = `<span class=\"err\">Enter an amount.</span>`;\n      return;\n    }\n\n    const date = ($(\"inDate\")?.value || isoToday()).slice(0, 10);\n\n    const tx = {\n      ID: uid(),\n      Date: date,\n      Month: toMonth(date),\n      Type: \"Income\",\n      Person: $(\"inPerson\")?.value || \"\",\n      Account: $(\"inAccount\")?.value || \"\",\n      Category: $(\"inCategory\")?.value || \"Income\",\n      Subcategory: $(\"inSubcategory\")?.value || \"General\",\n      Item: \"\",\n      Payee: \"\",\n      Amount: amount,\n      Notes: $(\"inNotes\")?.value || \"\",\n      Impulse: \"N\",\n      ImpulseReason: \"\",\n      Flags: \"\"\n    };\n\n    state.tx.push(tx);\n\n    refreshMonthSelectors();\n    if ($(\"txMonth\") && $(\"txMonth\").value && $(\"txMonth\").value !== tx.Month) {\n      $(\"txMonth\").value = tx.Month;\n    }\n\n    clearIncome(true);\n    if ($(\"inMsg\")) $(\"inMsg\").innerHTML = `<span class=\"ok\">Saved.</span>`;\n    rebuildDropdowns();\n    renderOverview();\n    renderAccounts();\n    renderBudgets();\n    refreshToday();\n    renderTx();\n  }\n\n  /* ============================\n     Transactions list + editor\n  ============================ */\n  let editIndex = -1;\n  let pendingEditOverride = null;\n\n  const txSort = { key: \"Date\", dir: \"desc\" };\n\n  function sortIcon(key) {\n    if (txSort.key !== key) return \"\";\n    return txSort.dir === \"asc\" ? \"\u25B2\" : \"\u25BC\";\n  }\n\n  function applyTxSort(rows) {\n    const key = txSort.key;\n    const dir = txSort.dir === \"asc\" ? 1 : -1;\n\n    const getVal = (r) => {\n      if (key === \"Amount\") return num(r.Amount);\n      return String(r[key] ?? \"\").toLowerCase();\n    };\n\n    rows.sort((a, b) => {\n      const av = getVal(a);\n      const bv = getVal(b);\n      if (typeof av === \"number\" && typeof bv === \"number\") {\n        return (av - bv) * dir;\n      }\n      return String(av).localeCompare(String(bv)) * dir;\n    });\n\n    return rows;\n  }\n\n  function openEditById(id) {\n    const tid = String(id || \"\").trim();\n    if (!tid) return;\n    const i = (state.tx || []).findIndex((t) => String(t.ID || \"\").trim() === tid);\n    if (i < 0) return;\n    openEdit(i);\n  }\n\n  function clearTxFilters() {\n    if ($(\"txQ\")) $(\"txQ\").value = \"\";\n    if ($(\"txType\")) $(\"txType\").value = \"\";\n    if ($(\"txAccount\")) $(\"txAccount\").value = \"\";\n    if ($(\"txImpulse\")) $(\"txImpulse\").value = \"\";\n    const missEl = $(\"txMissingAcc\");\n    if (missEl) missEl.value = \"\";\n    renderTx();\n  }\n\n  function renderTx() {\n    if (!state.loaded) return;\n    if (!$(\"txRows\")) return;\n\n    const m = $(\"txMonth\") ? $(\"txMonth\").value : \"\";\n    const q = ($(\"txQ\")?.value || \"\").trim().toLowerCase();\n    const type = ($(\"txType\")?.value || \"\").trim();\n    const acc = ($(\"txAccount\")?.value || \"\").trim();\n    const imp = ($(\"txImpulse\")?.value || \"\").trim();\n    const missAcc = $(\"txMissingAcc\") ? ($(\"txMissingAcc\").value || \"\").trim() : \"\";\n\n    let rows = [...(state.tx || [])];\n    if (m) rows = rows.filter((r) => r.Month === m);\n    if (type) rows = rows.filter((r) => r.Type === type);\n    if (acc) rows = rows.filter((r) => String(r.Account || \"\").trim() === acc);\n    if (imp) rows = rows.filter((r) => String(r.Impulse || \"N\").toUpperCase() === imp);\n    if (missAcc === \"Y\") rows = rows.filter((r) => !String(r.Account || \"\").trim());\n\n    if (q) {\n      rows = rows.filter((r) => {\n        const hay = `${r.Date} ${r.Type} ${r.Person} ${r.Account} ${r.Category} ${r.Subcategory} ${r.Item} ${r.Payee} ${r.Notes} ${r.Impulse} ${r.ImpulseReason} ${r.Flags}`.toLowerCase();\n        return hay.includes(q);\n      });\n    }\n\n    applyTxSort(rows);\n\n    if ($(\"txMeta\"))\n      $(\"txMeta\").textContent =\n        `Showing ${rows.length} row(s)` + (m ? ` \u2022 Month ${m}` : ` \u2022 All months`);\n\n    if (!rows.length) {\n      $(\"txRows\").textContent = \"No data for current filters.\";\n      closeEdit();\n      return;\n    }\n\n    $(\"txRows\").innerHTML = `\n      <div class=\"tableWrap\">\n        <table class=\"tytbl\" id=\"txTable\">\n          <thead>\n            <tr>\n              <th class=\"sortTh\" data-sort=\"Date\">Date <span class=\"sortIcon\">${escapeHtml(sortIcon(\"Date\"))}</span></th>\n              <th class=\"sortTh\" data-sort=\"Type\">Type <span class=\"sortIcon\">${escapeHtml(sortIcon(\"Type\"))}</span></th>\n              <th class=\"sortTh\" data-sort=\"Category\">Category <span class=\"sortIcon\">${escapeHtml(sortIcon(\"Category\"))}</span></th>\n              <th class=\"sortTh\" data-sort=\"Person\">Person <span class=\"sortIcon\">${escapeHtml(sortIcon(\"Person\"))}</span></th>\n              <th class=\"sortTh\" data-sort=\"Account\">Account <span class=\"sortIcon\">${escapeHtml(sortIcon(\"Account\"))}</span></th>\n              <th class=\"sortTh num\" data-sort=\"Amount\">Amount <span class=\"sortIcon\">${escapeHtml(sortIcon(\"Amount\"))}</span></th>\n              <th>Payee / Notes</th>\n              <th>Flags</th>\n              <th></th>\n            </tr>\n          </thead>\n          <tbody>\n            ${rows\n              .map((r) => {\n                const flags = String(r.Flags || \"\").trim();\n                const impPill =\n                  String(r.Impulse || \"N\").toUpperCase() === \"Y\" ? `<span class=\"pill orange\">Impulse</span>` : ``;\n                const noAccPill = !String(r.Account || \"\").trim() ? `<span class=\"pill soft\">No Acc</span>` : ``;\n                const overPill = flags.includes(\"overbudget\") ? `<span class=\"pill red\">Over</span>` : ``;\n                const ovPill = flags.includes(\"override\") ? `<span class=\"pill soft\">Override</span>` : ``;\n                const scopePill = String(r.Scope||\"Personal\").toLowerCase()===\"business\" ? `<span class=\"pill blue\">Business</span>` : ``;\n\n                return `\n                <tr>\n                  <td>${escapeHtml(r.Date)}</td>\n                  <td>${escapeHtml(r.Type)}</td>\n                  <td class=\"wrap\">${escapeHtml(r.Category)}${r.Subcategory ? \" / \" + escapeHtml(r.Subcategory) : \"\"}</td>\n                  <td>${escapeHtml(r.Person)}</td>\n                  <td>${escapeHtml(r.Account || \"\u2014\")}</td>\n                  <td class=\"num\">${escapeHtml(money(r.Amount))}</td>\n                  <td class=\"wrap\">${escapeHtml(r.Payee || \"\")}${r.Notes ? \" \u2014 \" + escapeHtml(r.Notes) : \"\"} ${r.Receipt ? ` <a class=\"miniLink\" href=\"${escapeAttr(r.Receipt)}\" target=\"_blank\" rel=\"noopener\">receipt</a>` : \"\"} ${\n                  r.ImpulseReason\n                    ? `<div class=\"sub\">Impulse reason: ${escapeHtml(r.ImpulseReason)}</div>`\n                    : \"\"\n                }</td>\n                  <td class=\"wrap\">${noAccPill} ${impPill} ${overPill} ${ovPill} ${scopePill}</td>\n                  <td><a class=\"editLink\" href=\"javascript:void(0)\" data-action=\"edit\" data-id=\"${escapeAttr(\n                    r.ID\n                  )}\">edit</a></td>\n                </tr>\n              `;\n              })\n              .join(\"\")}\n          </tbody>\n        </table>\n      </div>\n    `;\n  }\n\n  function openEdit(i) {\n    editIndex = i;\n    const r = state.tx[i];\n    if (!r) return;\n\n    fillSelect($(\"edPerson\"), state.settings.people || []);\n    fillSelectWithBlank(\n      $(\"edAccount\"),\n      uniq((state.accounts || []).map((a) => a.Account)).sort(),\n      \"(unassigned)\"\n    );\n\n    function catsFor(type) {\n      const cats = uniq((state.tx || []).filter((t) => t.Type === type).map((t) => t.Category)).sort();\n      if (cats.length) return cats;\n      return [type === \"Income\" ? \"Income\" : \"Other\"];\n    }\n\n    if ($(\"edType\")) {\n      $(\"edType\").onchange = () => {\n        const t = $(\"edType\").value;\n        fillSelect($(\"edCategory\"), catsFor(t));\n        rebuildEditSub();\n      };\n    }\n    if ($(\"edCategory\")) $(\"edCategory\").onchange = () => rebuildEditSub();\n\n    if ($(\"edId\")) $(\"edId\").value = r.ID;\n    if ($(\"edIdPill\")) $(\"edIdPill\").textContent = r.ID;\n\n    if ($(\"edDate\")) $(\"edDate\").value = r.Date;\n    if ($(\"edType\")) $(\"edType\").value = r.Type;\n\n    fillSelect($(\"edCategory\"), catsFor(r.Type));\n    if ($(\"edCategory\")) $(\"edCategory\").value = r.Category || $(\"edCategory\").value;\n\n    if ($(\"edPerson\")) $(\"edPerson\").value = r.Person || (state.settings.people || [])[0] || \"\";\n    if ($(\"edAccount\")) $(\"edAccount\").value = r.Account || \"\";\n    if ($(\"edAmount\")) $(\"edAmount\").value = num(r.Amount);\n\n    rebuildEditSub();\n    if ($(\"edSubcategory\")) $(\"edSubcategory\").value = r.Subcategory || $(\"edSubcategory\").value;\n\n    if ($(\"edPayee\")) $(\"edPayee\").value = r.Payee || \"\";\n    if ($(\"edNotes\")) $(\"edNotes\").value = r.Notes || \"\";\n    if ($(\"edScope\")) $(\"edScope\").value = r.Scope || \"Personal\";\n    if ($(\"edReceipt\")) $(\"edReceipt\").value = r.Receipt || \"\";\n\n    if ($(\"edImpulse\")) $(\"edImpulse\").value = String(r.Impulse || \"N\").toUpperCase() === \"Y\" ? \"Y\" : \"N\";\n    if ($(\"edImpulseReason\")) $(\"edImpulseReason\").value = r.ImpulseReason || \"\";\n\n    const flags = String(r.Flags || \"\").trim();\n    if ($(\"edFlagPills\")) {\n      if (flags) {\n        $(\"edFlagPills\").textContent = \"Flags: \" + flags;\n        $(\"edFlagPills\").classList.remove(\"hidden\");\n      } else {\n        $(\"edFlagPills\").classList.add(\"hidden\");\n      }\n    }\n\n    if ($(\"editMsg\")) $(\"editMsg\").textContent = \"\";\n    if ($(\"edOverrideBtn\")) $(\"edOverrideBtn\").classList.add(\"hidden\");\n    pendingEditOverride = null;\n\n    if ($(\"txEditorCard\")) $(\"txEditorCard\").classList.remove(\"hidden\");\n    try {\n      $(\"txEditorCard\")?.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n    } catch (e) {}\n  }\n\n  function rebuildEditSub() {\n    const r = state.tx[editIndex];\n    if (!$(\"edCategory\") || !$(\"edSubcategory\")) return;\n\n    const cat = $(\"edCategory\").value;\n    const typ = $(\"edType\") ? $(\"edType\").value || (r ? r.Type : \"Expense\") : r ? r.Type : \"Expense\";\n    const subs = uniq((state.tx || []).filter((t) => t.Type === typ && t.Category === cat).map((t) => t.Subcategory)).sort();\n    fillSelect($(\"edSubcategory\"), subs.length ? subs : [\"General\"]);\n  }\n\n  function closeEdit() {\n    if ($(\"txEditorCard\")) $(\"txEditorCard\").classList.add(\"hidden\");\n    if ($(\"editMsg\")) $(\"editMsg\").textContent = \"\";\n    if ($(\"edIdPill\")) $(\"edIdPill\").textContent = \"\u2014\";\n    if ($(\"edOverrideBtn\")) $(\"edOverrideBtn\").classList.add(\"hidden\");\n    pendingEditOverride = null;\n    editIndex = -1;\n  }\n\n  function saveEdit() {\n    const i = editIndex;\n    if (i < 0) return;\n    const r = state.tx[i];\n    if (!r) return;\n\n    const amt = num($(\"edAmount\")?.value);\n    if (amt <= 0) {\n      if ($(\"editMsg\")) $(\"editMsg\").innerHTML = `<span class=\"err\">Amount must be &gt; 0</span>`;\n      return;\n    }\n\n    const updated = { ...r };\n\n    updated.Date = ($(\"edDate\")?.value || isoToday()).slice(0, 10);\n    updated.Month = toMonth(updated.Date);\n    updated.Type = $(\"edType\")?.value || updated.Type;\n    updated.Person = $(\"edPerson\")?.value || \"\";\n    updated.Account = $(\"edAccount\")?.value || \"\";\n    updated.Amount = amt;\n    updated.Category = $(\"edCategory\")?.value || \"\";\n    updated.Subcategory = $(\"edSubcategory\")?.value || \"\";\n    updated.Payee = $(\"edPayee\")?.value || \"\";\n    updated.Notes = $(\"edNotes\")?.value || \"\";\n    updated.Impulse = $(\"edImpulse\")?.value === \"Y\" ? \"Y\" : \"N\";\n    updated.ImpulseReason = $(\"edImpulseReason\")?.value || \"\";\n\n    const warnings = evalWarningsForTx(updated, true);\n    const mode = String(state.rules.mode || \"BLOCK\").toUpperCase();\n\n    if (warnings.length && mode === \"BLOCK\") {\n      pendingEditOverride = { updated, warnings };\n      if ($(\"editMsg\")) {\n        $(\"editMsg\").innerHTML =\n          `<span class=\"warn\">Blocked by guardrails.</span><div style=\"margin-top:6px\">${warnings\n            .map((w) => `\u2022 ${escapeHtml(w)}`)\n            .join(\"<br>\")}</div>`;\n      }\n      if ($(\"edOverrideBtn\")) $(\"edOverrideBtn\").classList.remove(\"hidden\");\n      return;\n    }\n\n    if (warnings.length && mode === \"WARN\") {\n      applyFlagsForTx(updated, warnings, false);\n      if ($(\"editMsg\")) $(\"editMsg\").innerHTML = `<span class=\"warn\">Saved with warning.</span>`;\n    } else {\n      updated.Flags = String(updated.Flags || \"\")\n        .split(\",\")\n        .map((x) => x.trim())\n        .filter(Boolean)\n        .filter((f) => f !== \"overbudget\")\n        .join(\",\");\n      if ($(\"editMsg\")) $(\"editMsg\").innerHTML = `<span class=\"ok\">Saved.</span>`;\n    }\n\n    state.tx[i] = updated;\n\n    rebuildDropdowns();\n    refreshMonthSelectors();\n    renderOverview();\n    markDirty(true);\n    renderTx();\n    renderAccounts();\n    renderBudgets();\n    refreshToday();\n\n    const id = updated.ID;\n    const newIdx = state.tx.findIndex((t) => t.ID === id);\n    if (newIdx >= 0) {\n      editIndex = newIdx;\n      setTimeout(() => openEdit(newIdx), 0);\n    } else {\n      closeEdit();\n    }\n  }\n\n  function overrideSaveEdit() {\n    if (!pendingEditOverride) return;\n    const i = editIndex;\n    if (i < 0) return;\n\n    const updated = pendingEditOverride.updated;\n    const warnings = pendingEditOverride.warnings || [];\n    applyFlagsForTx(updated, warnings, true);\n\n    state.tx[i] = updated;\n    pendingEditOverride = null;\n\n    if ($(\"edOverrideBtn\")) $(\"edOverrideBtn\").classList.add(\"hidden\");\n    if ($(\"editMsg\")) $(\"editMsg\").innerHTML = `<span class=\"ok\">Saved (override).</span>`;\n\n    rebuildDropdowns();\n    refreshMonthSelectors();\n    renderOverview();\n    renderTx();\n    renderAccounts();\n    renderBudgets();\n    refreshToday();\n\n    const id = updated.ID;\n    const newIdx = state.tx.findIndex((t) => t.ID === id);\n    if (newIdx >= 0) {\n      editIndex = newIdx;\n      setTimeout(() => openEdit(newIdx), 0);\n    }\n  }\n\n  function deleteEdit() {\n    const i = editIndex;\n    if (i < 0) return;\n    const r = state.tx[i];\n    if (!r) return;\n    if (!confirm(\"Delete this transaction?\")) return;\n\n    state.tx.splice(i, 1);\n    rebuildDropdowns();\n    refreshMonthSelectors();\n    renderOverview();\n    markDirty(true);\n    renderTx();\n    renderAccounts();\n    renderBudgets();\n    refreshToday();\n    closeEdit();\n  }\n\n  /* ============================\n     Accounts UI\n  ============================ */\n  function renderAccounts() {\n    if (!state.loaded) return;\n    if (!$(\"accRows\")) return;\n\n    mergeAccountsByName();\n\n    if (!state.accounts.length) {\n      $(\"accRows\").innerHTML = `<div class=\"sub\">No accounts yet.</div>`;\n      return;\n    }\n\n    const rows = state.accounts.map((a, i) => ({ ...a, _i: i }));\n    $(\"accRows\").innerHTML = `\n      <div class=\"tableWrap\">\n        <table class=\"tytbl\">\n          <thead>\n            <tr>\n              <th style=\"min-width:220px\">Account</th>\n              <th style=\"min-width:160px\">Owner</th>\n              <th style=\"min-width:160px\">Type</th>\n              <th style=\"min-width:150px\">Nature</th>\n              <th class=\"num\" style=\"min-width:150px\">Start</th>\n              <th class=\"num\" style=\"min-width:150px\">Computed</th>\n              <th class=\"num\" style=\"min-width:170px\">Bank (manual)</th>\n              <th class=\"num\" style=\"min-width:160px\">Diff</th>\n              <th style=\"min-width:110px\">Active</th>\n              <th style=\"min-width:110px\"></th>\n            </tr>\n          </thead>\n          <tbody>\n            ${rows\n              .map((a) => {\n                const computed = computedBalanceFor(a.Account);\n                const bank = String(a.BankBalance ?? \"\").trim() === \"\" ? \"\" : num(a.BankBalance);\n                const diff = bank === \"\" ? \"\" : num(bank) - computed;\n                const dim = String(a.Active || \"Y\").toUpperCase() === \"N\" ? \"dim\" : \"\";\n                return `\n                <tr class=\"${dim}\">\n                  <td class=\"wrap\"><b>${escapeHtml(a.Account)}</b></td>\n                  <td class=\"wrap\"><input data-acc-idx=\"${a._i}\" data-acc-field=\"Owner\" value=\"${escapeAttr(\n                  a.Owner || \"\"\n                )}\" style=\"width:100%\"></td>\n                  <td class=\"wrap\"><input data-acc-idx=\"${a._i}\" data-acc-field=\"Type\" value=\"${escapeAttr(\n                  a.Type || \"\"\n                )}\" style=\"width:100%\"></td>\n                  <td>\n                    <select data-acc-idx=\"${a._i}\" data-acc-field=\"Nature\">\n                      <option value=\"ASSET\" ${\n                        String(a.Nature || \"ASSET\").toUpperCase() === \"ASSET\" ? \"selected\" : \"\"\n                      }>ASSET</option>\n                      <option value=\"LIABILITY\" ${\n                        String(a.Nature || \"ASSET\").toUpperCase() === \"LIABILITY\" ? \"selected\" : \"\"\n                      }>LIABILITY</option>\n                    </select>\n                  </td>\n                  <td class=\"num\"><input data-acc-idx=\"${a._i}\" data-acc-field=\"StartBalance\" type=\"number\" step=\"0.01\" value=\"${escapeAttr(\n                  num(a.StartBalance)\n                )}\" style=\"width:140px;text-align:right\"></td>\n                  <td class=\"num\"><span data-acc-computed=\"${a._i}\">${escapeHtml(money(computed))}</span></td>\n                  <td class=\"num\"><input data-acc-idx=\"${a._i}\" data-acc-field=\"BankBalance\" type=\"number\" step=\"0.01\" value=\"${escapeAttr(\n                  bank\n                )}\" style=\"width:160px;text-align:right\"></td>\n                  <td class=\"num\"><span data-acc-diff=\"${a._i}\">${diff === \"\" ? \"\" : escapeHtml(money(diff))}</span></td>\n                  <td>\n                    <select data-acc-idx=\"${a._i}\" data-acc-field=\"Active\">\n                      <option value=\"Y\" ${String(a.Active || \"Y\").toUpperCase() === \"Y\" ? \"selected\" : \"\"}>Y</option>\n                      <option value=\"N\" ${String(a.Active || \"Y\").toUpperCase() === \"N\" ? \"selected\" : \"\"}>N</option>\n                    </select>\n                  </td>\n                  <td><button class=\"danger mini\" type=\"button\" data-action=\"remove-acc\" data-acc-idx=\"${a._i}\">Remove</button></td>\n                </tr>\n              `;\n              })\n              .join(\"\")}\n          </tbody>\n        </table>\n      </div>\n    `;\n\n    if ($(\"accMsg\")) $(\"accMsg\").textContent = \"\";\n    rebuildBulkUI(true);\n  }\n\n  function updateAccountRow(i) {\n    const a = state.accounts[i];\n    if (!a) return;\n    const computed = computedBalanceFor(a.Account);\n    const bank = String(a.BankBalance ?? \"\").trim() === \"\" ? \"\" : num(a.BankBalance);\n    const diff = bank === \"\" ? \"\" : num(bank) - computed;\n\n    const cEl = document.querySelector(`[data-acc-computed=\"${i}\"]`);\n    const dEl = document.querySelector(`[data-acc-diff=\"${i}\"]`);\n    if (cEl) cEl.textContent = money(computed);\n    if (dEl) dEl.textContent = diff === \"\" ? \"\" : money(diff);\n  }\n\n  /* ============================\n     Reconcile (statement check)\n  ============================ */\n  function _firstDayOfMonthISO(iso){\n    const d = new Date(String(iso||\"\").slice(0,10) + \"T00:00:00\");\n    if(!isFinite(d.getTime())) return \"\";\n    const y = d.getFullYear();\n    const m = String(d.getMonth()+1).padStart(2,\"0\");\n    return `${y}-${m}-01`;\n  }\n\n  \n  function getTaxYears(){\n    const ys = new Set();\n    (state.tx||[]).forEach(t=>{\n      const d = String(t.Date||\"\").trim();\n      if(/^(\\d{4})-\\d{2}-\\d{2}$/.test(d)) ys.add(d.slice(0,4));\n      else if(/^(\\d{4})\\//.test(d)) ys.add(d.slice(0,4));\n    });\n    return Array.from(ys).sort((a,b)=>b.localeCompare(a));\n  }\n\n  function categoryIsTaxRelated(type, cat, sub){\n    const want = normType(type);\n    cat = String(cat||\"\").trim();\n    sub = String(sub||\"\").trim();\n    if(!cat) return false;\n    const key = catKey(want, cat, sub);\n    const row = (state.categories||[]).find(c => catKey(normType(c.Type), String(c.Category||\"\").trim(), String(c.Subcategory||\"\").trim()) === key);\n    return row && String(row.Tax||\"\").toUpperCase()===\"Y\";\n  }\n\n  function buildTaxSummary(year, opts){\n    opts = opts || {};\n    const onlyTagged = !!opts.onlyTagged;\n    const includeIncome = opts.includeIncome!==false;\n    const includeExpense = opts.includeExpense!==false;\n    const q = String(opts.q||\"\").trim().toLowerCase();\n    const scope = String(opts.scope||\"all\").toLowerCase();\n\n    const incomeMap = new Map();\n    const expenseMap = new Map();\n    const monthly = {}; // {YYYY-MM: {inc, exp}}\n\n    function addTo(map, cat, sub, amt){\n      const k = (cat+\"|\"+sub).toLowerCase();\n      const it = map.get(k) || {Category:cat, Subcategory:sub, Total:0, Count:0};\n      it.Total += amt;\n      it.Count += 1;\n      map.set(k, it);\n    }\n\n    (state.tx||[]).forEach(t=>{\n      const d = String(t.Date||\"\").trim();\n      if(!d || d.slice(0,4) !== String(year)) return;\n      const type = normType(t.Type||\"Expense\");\n      const txScope = String(t.Scope||\"Personal\").trim().toLowerCase();\n      if(scope!==\"all\"){\n        if(scope===\"business\" && txScope!==\"business\") return;\n        if(scope===\"personal\" && txScope!==\"personal\") return;\n      }\n      if(type===\"income\" && !includeIncome) return;\n      if(type===\"expense\" && !includeExpense) return;\n\n      const cat = String(t.Category||\"\").trim() || \"(Uncategorized)\";\n      const sub = String(t.Subcategory||\"\").trim();\n\n      if(onlyTagged){\n        if(!(categoryIsTaxRelated(type, cat, sub))) return;\n      }\n\n      if(q){\n        const hay = [\n          t.Payee, t.Notes, t.Item, t.Account, t.Person, t.Category, t.Subcategory, t.Type, t.Amount, t.Date\n        ].map(x=>String(x||\"\").toLowerCase()).join(\" | \");\n        if(!hay.includes(q)) return;\n      }\n\n      const amt = num(t.Amount);\n      const month = (t.Month && String(t.Month).trim()) ? String(t.Month).trim() : toMonth(d);\n      const mkey = String(month||\"\").slice(0,7) || (String(year)+\"-??\");\n\n      if(!monthly[mkey]) monthly[mkey] = {inc:0, exp:0};\n\n      if(type===\"income\"){\n        addTo(incomeMap, cat, sub, amt);\n        monthly[mkey].inc += amt;\n      }else{\n        addTo(expenseMap, cat, sub, amt);\n        monthly[mkey].exp += amt;\n      }\n    });\n\n    const income = Array.from(incomeMap.values()).sort((a,b)=>(b.Total-a.Total)||((a.Category+a.Subcategory).localeCompare(b.Category+b.Subcategory)));\n    const expense = Array.from(expenseMap.values()).sort((a,b)=>(b.Total-a.Total)||((a.Category+a.Subcategory).localeCompare(b.Category+b.Subcategory)));\n\n    const months = Object.keys(monthly).sort((a,b)=>a.localeCompare(b)).filter(k=>k.startsWith(String(year)));\n\n    const incTotal = income.reduce((s,x)=>s+x.Total,0);\n    const expTotal = expense.reduce((s,x)=>s+x.Total,0);\n\n    return {\n      year:String(year),\n      income,\n      expense,\n      monthlyRows: months.map(m=>{\n        const inc = monthly[m].inc || 0;\n        const exp = monthly[m].exp || 0;\n        return {Month:m, Income:inc, Expense:exp, Net:(inc-exp)};\n      }),\n      incTotal, expTotal, net:(incTotal-expTotal)\n    };\n  }\n\n  function downloadTaxSummaryCsv(summary, opts){\n    opts = opts || {};\n    const onlyTagged = !!opts.onlyTagged;\n    const rows = [];\n    rows.push([\"Year\",\"Mode\",\"ScopeFilter\",\"Type\",\"Category\",\"Subcategory\",\"Total\",\"TxCount\",\"TaxRelated\",\"TaxNote\"]);\n    function pushType(type, arr){\n      arr.forEach(r=>{\n        const rel = categoryIsTaxRelated(type, r.Category, r.Subcategory) ? \"Y\" : \"\";\n        const noteRow = (state.categories||[]).find(c => catKey(normType(c.Type), String(c.Category||\"\").trim(), String(c.Subcategory||\"\").trim()) === catKey(normType(type), r.Category, r.Subcategory));\n        const note = noteRow ? String(noteRow.TaxNote||\"\") : \"\";\n        rows.push([summary.year, (onlyTagged?\"ONLY_TAGGED\":\"ALL\"), String(opts.scope||\"all\"), type, r.Category, r.Subcategory, fmtMoney(r.Total), String(r.Count), rel, note]);\n      });\n    }\n    pushType(\"Income\", summary.income);\n    pushType(\"Expense\", summary.expense);\n\n    const csv = toCsv(rows);\n    const filename = `bb-budget_tax-summary_${summary.year}${onlyTagged ? \"_tagged\" : \"\"}.csv`;\n    downloadText(filename, csv);\n  }\n\n  function downloadTaxTypeCsv(typeWanted, summary, opts){\n    opts = opts || {};\n    const onlyTagged = !!opts.onlyTagged;\n    const scopeFilter = String(opts.scope||\"all\");\n    const rows = [];\n    rows.push([\"Year\",\"Mode\",\"ScopeFilter\",\"Type\",\"Category\",\"Subcategory\",\"Total\",\"TxCount\",\"TaxRelated\",\"TaxNote\"]);\n    const arr = (String(typeWanted).toLowerCase()===\"income\") ? (summary.income||[]) : (summary.expense||[]);\n    const typeLabel = (String(typeWanted).toLowerCase()===\"income\") ? \"Income\" : \"Expense\";\n    arr.forEach(r=>{\n      const rel = categoryIsTaxRelated(typeLabel, r.Category, r.Subcategory) ? \"Y\" : \"\";\n      const noteRow = (state.categories||[]).find(c => catKey(normType(c.Type), String(c.Category||\"\").trim(), String(c.Subcategory||\"\").trim()) === catKey(normType(typeLabel), r.Category, r.Subcategory));\n      const note = noteRow ? String(noteRow.TaxNote||\"\") : \"\";\n      rows.push([summary.year, (onlyTagged?\"ONLY_TAGGED\":\"ALL\"), scopeFilter, typeLabel, r.Category, r.Subcategory, fmtMoney(r.Total), String(r.Count), rel, note]);\n    });\n    const csv = toCsv(rows);\n    const filename = `bb-budget_tax-${typeLabel.toLowerCase()}_${summary.year}${onlyTagged ? \"_tagged\" : \"\"}${scopeFilter!==\"all\" ? \"_\"+scopeFilter : \"\"}.csv`;\n    downloadText(filename, csv);\n  }\n\n\n  \n  function ensureTaxDom(){\n    const host = $(\"tab-tax\");\n    if(!host) return;\n\n    // If key controls are missing, inject a full Tax View UI so user never sees a blank tab.\n    if($(\"taxYear\") && $(\"taxIncomeRows\") && $(\"taxExpenseRows\") && $(\"taxMonthlyRows\")) return;\n\n    host.innerHTML = `\n      <div style=\"display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;align-items:center\">\n        <div style=\"font-weight:950\">Tax View (Year Summary)</div>\n        <div style=\"display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end\">\n          <button class=\"ghost mini\" type=\"button\" id=\"taxRefreshBtn\">Refresh</button>\n          <button class=\"ghost mini\" type=\"button\" id=\"taxExportIncomeBtn\">Export Income CSV</button>\n          <button class=\"ghost mini\" type=\"button\" id=\"taxExportExpenseBtn\">Export Expense CSV</button>\n          <button class=\"mini\" type=\"button\" id=\"taxExportBtn\">Export Full Summary CSV</button>\n        </div>\n      </div>\n\n      <div class=\"note\" style=\"margin-top:8px\">\n        This does <b>not</b> file taxes. It prepares clean yearly totals you can give to an accountant or tax software.\n        Use <b>Categories Manager</b> to mark categories as <b>Tax-related</b> if you want a clean filtered view.\n      </div>\n\n      <div class=\"row\" style=\"margin-top:10px;gap:10px;flex-wrap:wrap;align-items:flex-end\">\n        <div class=\"field\" style=\"min-width:220px\">\n          <label>Year</label>\n          <select id=\"taxYear\"></select>\n        </div>\n\n        <div class=\"field\" style=\"min-width:220px\">\n          <label>Scope</label>\n          <select id=\"taxScope\">\n            <option value=\"all\">All</option>\n            <option value=\"personal\">Personal</option>\n            <option value=\"business\">Business</option>\n          </select>\n        </div>\n\n        <div class=\"field\" style=\"min-width:220px\">\n          <label>Filters</label>\n          <div style=\"display:flex;gap:10px;flex-wrap:wrap;align-items:center;padding:8px 10px;border:1px solid var(--border);border-radius:12px;background:var(--soft)\">\n            <label style=\"display:flex;gap:8px;align-items:center;margin:0\">\n              <input type=\"checkbox\" id=\"taxOnlyTagged\">\n              <span>Only Tax-related</span>\n            </label>\n            <label style=\"display:flex;gap:8px;align-items:center;margin:0\">\n              <input type=\"checkbox\" id=\"taxInc\" checked>\n              <span>Include Income</span>\n            </label>\n            <label style=\"display:flex;gap:8px;align-items:center;margin:0\">\n              <input type=\"checkbox\" id=\"taxExp\" checked>\n              <span>Include Expense</span>\n            </label>\n          </div>\n        </div>\n\n        <div class=\"field\" style=\"min-width:240px\">\n          <label>Search</label>\n          <input id=\"taxSearch\" placeholder=\"search payee / notes / category / account\">\n        </div>\n      </div>\n\n      <div id=\"taxMsg\" class=\"sub\" style=\"margin-top:10px\"></div>\n      <div id=\"taxSummaryCards\" class=\"row\" style=\"margin-top:12px;gap:10px;flex-wrap:wrap\"></div>\n\n      <div class=\"row\" style=\"margin-top:12px;gap:10px;flex-wrap:wrap\">\n        <div class=\"card\" style=\"flex:1;min-width:320px\">\n          <div style=\"font-weight:900;margin-bottom:8px\">Income Totals</div>\n          <div class=\"tableWrap\">\n            <table class=\"tbl\">\n              <thead><tr><th>Category</th><th>Subcategory</th><th class=\"right\">Total</th><th class=\"right\">Count</th></tr></thead>\n              <tbody id=\"taxIncomeRows\"></tbody>\n            </table>\n          </div>\n        </div>\n\n        <div class=\"card\" style=\"flex:1;min-width:320px\">\n          <div style=\"font-weight:900;margin-bottom:8px\">Expense Totals</div>\n          <div class=\"tableWrap\">\n            <table class=\"tbl\">\n              <thead><tr><th>Category</th><th>Subcategory</th><th class=\"right\">Total</th><th class=\"right\">Count</th><th>Receipt</th></tr></thead>\n              <tbody id=\"taxExpenseRows\"></tbody>\n            </table>\n          </div>\n        </div>\n      </div>\n\n      <div class=\"card\" style=\"margin-top:12px\">\n        <div style=\"font-weight:900;margin-bottom:8px\">Monthly Breakdown</div>\n        <div class=\"tableWrap\">\n          <table class=\"tbl\">\n            <thead><tr><th>Month</th><th class=\"right\">Income</th><th class=\"right\">Expense</th><th class=\"right\">Net</th></tr></thead>\n            <tbody id=\"taxMonthlyRows\"></tbody>\n          </table>\n        </div>\n      </div>\n    `;\n  }\n\nfunction renderTax(){\n    if(!state.loaded) return;\n    ensureTaxDom();\n    const yearSel = $(\"taxYear\");\n    if(!yearSel){\n      const host = $(\"tab-tax\");\n      if(host) host.innerHTML = `<div class=\"note\"><b>Tax View failed to load.</b> Please refresh the page.</div>`;\n      return;\n    }\n\n    const years = getTaxYears();\n    if(!years.length){\n      yearSel.innerHTML = `<option value=\"\">(no dated transactions)</option>`;\n      if($(\"taxMsg\")) $(\"taxMsg\").innerHTML = `<span class=\"err\">No transactions found with a valid date.</span>`;\n      $(\"taxIncomeRows\").innerHTML = \"\";\n      $(\"taxExpenseRows\").innerHTML = \"\";\n      $(\"taxMonthlyRows\").innerHTML = \"\";\n      $(\"taxSummaryCards\").innerHTML = \"\";\n      return;\n    }\n\n    const cur = yearSel.value && years.includes(yearSel.value) ? yearSel.value : years[0];\n    yearSel.innerHTML = years.map(y=>`<option value=\"${escapeAttr(y)}\"${y===cur?' selected':''}>${escapeHtml(y)}</option>`).join(\"\");\n\n    // show/hide onlyTagged option based on whether there are any tagged categories\n    const anyTagged = (state.categories||[]).some(c=>String(c.Tax||\"\").toUpperCase()===\"Y\");\n    const onlyTaggedEl = $(\"taxOnlyTagged\");\n    if(onlyTaggedEl){\n      onlyTaggedEl.disabled = !anyTagged;\n      if(!anyTagged) onlyTaggedEl.checked = false;\n    }\n\n    const opts = {\n      onlyTagged: !!$(\"taxOnlyTagged\")?.checked,\n      includeIncome: !!$(\"taxIncludeIncome\")?.checked,\n      includeExpense: !!$(\"taxIncludeExpense\")?.checked,\n      q: $(\"taxSearch\")?.value || \"\",\n          scope: $(\"taxScope\")?.value || \"all\"\n    };\n\n    const sum = buildTaxSummary(cur, opts);\n\n    // summary cards\n    const cardsWrap = $(\"taxSummaryCards\");\n    if(cardsWrap){\n      cardsWrap.innerHTML = [\n        `<div class=\"statCard\"><div class=\"k\">Income</div><div class=\"v\">${fmtMoney(sum.incTotal)}</div></div>`,\n        `<div class=\"statCard\"><div class=\"k\">Expense</div><div class=\"v\">${fmtMoney(sum.expTotal)}</div></div>`,\n        `<div class=\"statCard\"><div class=\"k\">Net</div><div class=\"v\">${fmtMoney(sum.net)}</div></div>`\n      ].join(\"\");\n    }\n\n    // tables\n    $(\"taxIncomeRows\").innerHTML = sum.income.length ? sum.income.map(r=>(\n      `<tr><td>${escapeHtml(r.Category)}</td><td>${escapeHtml(r.Subcategory||\"\")}</td><td class=\"num\">${fmtMoney(r.Total)}</td><td class=\"num\">${r.Count}</td></tr>`\n    )).join(\"\") : `<tr><td colspan=\"4\" class=\"sub\">No income rows.</td></tr>`;\n\n    $(\"taxExpenseRows\").innerHTML = sum.expense.length ? sum.expense.map(r=>(\n      `<tr><td>${escapeHtml(r.Category)}</td><td>${escapeHtml(r.Subcategory||\"\")}</td><td class=\"num\">${fmtMoney(r.Total)}</td><td class=\"num\">${r.Count}</td></tr>`\n    )).join(\"\") : `<tr><td colspan=\"4\" class=\"sub\">No expense rows.</td></tr>`;\n\n    $(\"taxMonthlyRows\").innerHTML = sum.monthlyRows.length ? sum.monthlyRows.map(r=>(\n      `<tr><td>${escapeHtml(r.Month)}</td><td class=\"num\">${fmtMoney(r.Income)}</td><td class=\"num\">${fmtMoney(r.Expense)}</td><td class=\"num\">${fmtMoney(r.Net)}</td></tr>`\n    )).join(\"\") : `<tr><td colspan=\"4\" class=\"sub\">No months.</td></tr>`;\n\n    if($(\"taxMsg\")){\n      $(\"taxMsg\").textContent = (opts.onlyTagged ? \"Showing only Tax-related categories.\" : \"Showing all categories.\")\n        + \" Use Export to download a clean summary CSV.\";\n    }\n\n    // wire export\n    const exBtn = $(\"taxExportBtn\");\n    if(exBtn && !exBtn._bound){\n      exBtn._bound = true;\n      exBtn.addEventListener(\"click\", ()=>{\n        const sum2 = buildTaxSummary($(\"taxYear\").value, {\n          onlyTagged: !!$(\"taxOnlyTagged\")?.checked,\n          includeIncome: !!$(\"taxIncludeIncome\")?.checked,\n          includeExpense: !!$(\"taxIncludeExpense\")?.checked,\n          q: $(\"taxSearch\")?.value || \"\"\n        });\n        downloadTaxSummaryCsv(sum2, { onlyTagged: !!$(\"taxOnlyTagged\")?.checked });\n        toast(\"Exported tax summary CSV.\");\n      });\n    }\n\n    const exIncBtn = $(\"taxExportIncomeBtn\");\n    if(exIncBtn && !exIncBtn._bound){\n      exIncBtn._bound = true;\n      exIncBtn.addEventListener(\"click\", ()=>{\n        const sum2 = buildTaxSummary($(\"taxYear\").value, {\n          onlyTagged: !!$(\"taxOnlyTagged\")?.checked,\n          includeIncome: true,\n          includeExpense: false,\n          q: $(\"taxSearch\")?.value || \"\",\n          scope: $(\"taxScope\")?.value || \"all\"\n        });\n        downloadTaxTypeCsv(\"Income\", sum2, { onlyTagged: !!$(\"taxOnlyTagged\")?.checked, scope: $(\"taxScope\")?.value || \"all\" });\n        toast(\"Exported income CSV.\");\n      });\n    }\n\n    const exExpBtn = $(\"taxExportExpenseBtn\");\n    if(exExpBtn && !exExpBtn._bound){\n      exExpBtn._bound = true;\n      exExpBtn.addEventListener(\"click\", ()=>{\n        const sum2 = buildTaxSummary($(\"taxYear\").value, {\n          onlyTagged: !!$(\"taxOnlyTagged\")?.checked,\n          includeIncome: false,\n          includeExpense: true,\n          q: $(\"taxSearch\")?.value || \"\",\n          scope: $(\"taxScope\")?.value || \"all\"\n        });\n        downloadTaxTypeCsv(\"Expense\", sum2, { onlyTagged: !!$(\"taxOnlyTagged\")?.checked, scope: $(\"taxScope\")?.value || \"all\" });\n        toast(\"Exported expense CSV.\");\n      });\n    }\n\n  }\n\nfunction renderReconcile(){\n    if(!state.loaded) return;\n    const sel = $(\"recAccount\");\n    if(!sel) return;\n\n    mergeAccountsByName();\n    const names = (state.accounts||[])\n      .filter(a=>String(a.Active||\"Y\").toUpperCase()!==\"N\")\n      .map(a=>a.Account)\n      .filter(Boolean)\n      .sort((a,b)=>a.localeCompare(b));\n\n    sel.innerHTML = names.map(n=>`<option value=\"${escapeAttr(n)}\">${escapeHtml(n)}</option>`).join(\"\");\n\n    // defaults\n    const today = new Date();\n    const endISO = today.toISOString().slice(0,10);\n    if($(\"recEnd\") && !$(\"recEnd\").value) $(\"recEnd\").value = endISO;\n    const sISO = _firstDayOfMonthISO($(\"recEnd\") ? $(\"recEnd\").value : endISO);\n    if($(\"recStart\") && !$(\"recStart\").value) $(\"recStart\").value = sISO;\n\n    // clear outputs\n    if($(\"recOpen\")) $(\"recOpen\").textContent = \"\u2014\";\n    if($(\"recIncome\")) $(\"recIncome\").textContent = \"\u2014\";\n    if($(\"recExpense\")) $(\"recExpense\").textContent = \"\u2014\";\n    if($(\"recNet\")) $(\"recNet\").textContent = \"\u2014\";\n    if($(\"recExpected\")) $(\"recExpected\").textContent = \"\u2014\";\n    if($(\"recDiff\")) $(\"recDiff\").textContent = \"\u2014\";\n    if($(\"recRows\")) $(\"recRows\").innerHTML = \"\";\n    if($(\"recTxHint\")) $(\"recTxHint\").textContent = \"\u2014\";\n    if($(\"recMsg\")) $(\"recMsg\").textContent = \"\";\n\n    // filters\n    if($(\"recFilter\")) $(\"recFilter\").value = \"all\";\n    if($(\"recSearch\")) $(\"recSearch\").value = \"\";\n    TYBH.ui._recLast = null;\n  }\n\n  function resetReconcile(){\n    if($(\"recBankBal\")) $(\"recBankBal\").value = \"\";\n    if($(\"recStart\")) $(\"recStart\").value = \"\";\n    if($(\"recEnd\")) $(\"recEnd\").value = \"\";\n    renderReconcile();\n  }\n\n  function runReconcile(){\n    if(!state.loaded) return;\n    const account = $(\"recAccount\") ? $(\"recAccount\").value : \"\";\n    const s = $(\"recStart\") ? $(\"recStart\").value : \"\";\n    const e = $(\"recEnd\") ? $(\"recEnd\").value : \"\";\n    const bankRaw = $(\"recBankBal\") ? $(\"recBankBal\").value : \"\";\n    const bank = String(bankRaw||\"\").trim()===\"\" ? null : num(bankRaw);\n\n    if(!account){\n      if($(\"recMsg\")) $(\"recMsg\").innerHTML = `<span class=\"err\">Pick an account.</span>`;\n      return;\n    }\n    if(!s || !e){\n      if($(\"recMsg\")) $(\"recMsg\").innerHTML = `<span class=\"err\">Pick a statement start and end date.</span>`;\n      return;\n    }\n    if(bank===null){\n      if($(\"recMsg\")) $(\"recMsg\").innerHTML = `<span class=\"err\">Enter statement ending balance.</span>`;\n      return;\n    }\n\n    const led = reconcileLedger(account, s, e);\n    const open = led.openBal;\n    const expected = led.expectedEnd;\n    const diff = num(bank) - num(expected);\n\n    // keep last reconcile in memory for filters\n    TYBH.ui._recLast = {\n      account,\n      startISO: s,\n      endISO: e,\n      bank,\n      diff,\n      led\n    };\n\n    if($(\"recOpen\")) $(\"recOpen\").textContent = money(open);\n    if($(\"recIncome\")) $(\"recIncome\").textContent = money(led.incomeTotal || 0);\n    if($(\"recExpense\")) $(\"recExpense\").textContent = money(led.expenseTotal || 0);\n    if($(\"recNet\")) $(\"recNet\").textContent = money(led.netEffect || 0);\n    if($(\"recExpected\")) $(\"recExpected\").textContent = money(expected);\n    if($(\"recDiff\")) $(\"recDiff\").textContent = money(diff);\n\n    const abs = Math.abs(diff);\n    if($(\"recMsg\")){\n      if(abs < 0.005){\n        $(\"recMsg\").innerHTML = `<span class=\"ok\"><b>Matched.</b></span> Your statement ending balance matches the computed balance.`;\n      }else{\n        $(\"recMsg\").innerHTML = `<span class=\"err\"><b>Not matched.</b></span> Difference is ${escapeHtml(money(diff))}. Usually this means: missing transaction, wrong amount, wrong date, or wrong Start Balance.`;\n      }\n    }\n\n    recRenderRows(led.rows);\n\n    // if not matched, gently hint the quick filters\n    if(abs >= 0.005){\n      const f = $(\"recFilter\");\n      if(f && f.value === \"all\"){\n        // leave user choice, but show a helpful hint\n        if($(\"recMsg\")){\n          $(\"recMsg\").innerHTML += `<div class=\"sub\" style=\"margin-top:6px\">Try: <b>Uncategorized</b>, <b>Last 10</b>, or <b>Round amounts</b> using Quick Filter above.</div>`;\n        }\n      }\n    }\n  }\n\n  function recRowMatchesSearch(r, q){\n    if(!q) return true;\n    const s = String(q||\"\").trim().toLowerCase();\n    if(!s) return true;\n    const hay = [r.Date, r.Type, r.Category, r.Payee, money(r.Amount), money(r.Effect), money(r.Running)]\n      .join(\" |\")\n      .toLowerCase();\n    return hay.includes(s);\n  }\n\n  function recApplyFilters(){\n    if(!TYBH.ui._recLast || !TYBH.ui._recLast.led) return;\n    const led = TYBH.ui._recLast.led;\n    const mode = $(\"recFilter\") ? $(\"recFilter\").value : \"all\";\n    const q = $(\"recSearch\") ? $(\"recSearch\").value : \"\";\n\n    let rows = [...(led.rows||[])];\n    if(mode === \"uncat\"){\n      rows = rows.filter(r=>{\n        const c = String(r.Category||\"\").trim();\n        return !c || c.toLowerCase()===\"uncategorized\";\n      });\n    }else if(mode === \"last10\"){\n      rows = rows.slice(-10);\n    }else if(mode === \"round\"){\n      rows = rows.filter(r=>{\n        const a = num(r.Amount);\n        return Math.abs(a - Math.round(a)) < 0.00001;\n      });\n    }\n\n    rows = rows.filter(r=>recRowMatchesSearch(r, q));\n    recRenderRows(rows);\n  }\n\n  function recClearFilters(){\n    if($(\"recFilter\")) $(\"recFilter\").value = \"all\";\n    if($(\"recSearch\")) $(\"recSearch\").value = \"\";\n    if(!TYBH.ui._recLast || !TYBH.ui._recLast.led) return;\n    recRenderRows(TYBH.ui._recLast.led.rows);\n  }\n\n  function recRenderRows(rows){\n    const list = rows || [];\n    if($(\"recTxHint\")) $(\"recTxHint\").textContent = `${list.length} tx`;\n    const body = $(\"recRows\");\n    if(!body) return;\n    body.innerHTML = list.map(r=>{\n      const eff = num(r.Effect);\n      const effTxt = money(eff);\n      const runTxt = money(r.Running);\n      return `<tr>\n        <td>${escapeHtml(r.Date)}</td>\n        <td>${escapeHtml(r.Type)}</td>\n        <td class=\"wrap\">${escapeHtml(r.Category)}</td>\n        <td class=\"wrap\">${escapeHtml(r.Payee)}</td>\n        <td class=\"num\">${escapeHtml(money(r.Amount))}</td>\n        <td class=\"num\">${escapeHtml(effTxt)}</td>\n        <td class=\"num\">${escapeHtml(runTxt)}</td>\n      </tr>`;\n    }).join(\"\") || `<tr><td colspan=\"7\" class=\"sub\">No transactions in range.</td></tr>`;\n  }\n\n  function toggleAddAccountForm(force) {\n    if (!state.loaded) return;\n    const card = $(\"accAddCard\");\n    if (!card) return;\n    const want = typeof force === \"boolean\" ? force : card.classList.contains(\"hidden\");\n    card.classList.toggle(\"hidden\", !want);\n    if ($(\"accAddMsg\")) $(\"accAddMsg\").textContent = \"\";\n    if (want) {\n      setTimeout(() => {\n        try {\n          $(\"accNewName\")?.focus();\n        } catch (e) {}\n      }, 0);\n    }\n  }\n\n  function confirmAddAccount() {\n    if (!state.loaded) return;\n    const name = String($(\"accNewName\")?.value || \"\").trim();\n    if (!name) {\n      if ($(\"accAddMsg\")) $(\"accAddMsg\").innerHTML = `<span class=\"err\">Account name is required.</span>`;\n      return;\n    }\n\n    const owner = String($(\"accNewOwner\")?.value || \"\").trim();\n    const type = String($(\"accNewType\")?.value || \"\").trim();\n    const nature = String($(\"accNewNature\")?.value || \"ASSET\").toUpperCase() === \"LIABILITY\" ? \"LIABILITY\" : \"ASSET\";\n    const start = num($(\"accNewStart\")?.value);\n\n    state.accounts.push({ Account: name, Owner: owner, Type: type, Nature: nature, StartBalance: start, BankBalance: \"\", Active: \"Y\" });\n    mergeAccountsByName();\n    rebuildDropdowns();\n    renderAccounts();\n\n    if ($(\"accNewName\")) $(\"accNewName\").value = \"\";\n    if ($(\"accNewOwner\")) $(\"accNewOwner\").value = \"\";\n    if ($(\"accNewType\")) $(\"accNewType\").value = \"\";\n    if ($(\"accNewStart\")) $(\"accNewStart\").value = \"\";\n    if ($(\"accAddMsg\")) $(\"accAddMsg\").innerHTML = `<span class=\"ok\">Added.</span>`;\n  }\n\n  /* ============================\n     Budgets UI\n  ============================ */\n  function budgetsFor(month, type) {\n    const m = String(month || \"\").trim();\n    const t = String(type || \"Expense\").trim();\n    return (state.budgets || [])\n      .map((b, i) => ({ ...b, _i: i }))\n      .filter((b) => b.Month === m && b.Type === t && String(b.Category || \"\").trim());\n  }\n\n  function renderBudgets() {\n    if (!state.loaded) return;\n    if (!$(\"budRows\")) return;\n\n    const m = $(\"budMonth\") ? $(\"budMonth\").value || ymToday() : ymToday();\n    const t = $(\"budType\") ? $(\"budType\").value || \"Expense\" : \"Expense\";\n\n    const rows = budgetsFor(m, t);\n    const cats = uniq((state.tx || []).filter((x) => x.Type === t).map((x) => x.Category)).sort();\n\n    if (!rows.length) {\n      $(\"budRows\").innerHTML = `\n        <tr>\n          <td colspan=\"7\" class=\"wrap\">\n            <div class=\"note\">\n              No budgets for ${escapeHtml(m)} yet.\n              <br>Click <b>Add Budget Row</b> and set budgets for categories like Eat Out, Grocery, Cats, Move Fund.\n            </div>\n          </td>\n        </tr>\n      `;\n      if ($(\"budMsg\")) $(\"budMsg\").textContent = \"\";\n      refreshToday();\n      return;\n    }\n\n    $(\"budRows\").innerHTML = rows\n      .map((b) => {\n        const isActive = String(b.Active || \"Y\").toUpperCase() !== \"N\";\n        const spent =\n          t === \"Expense\"\n            ? spentFor(m, t, b.Category)\n            : sumTxWhere((x) => x.Month === m && x.Type === t && x.Category === b.Category);\n        const remain = num(b.BudgetAmount) - spent;\n        const pct = num(b.BudgetAmount) > 0 ? Math.max(0, Math.min(1, spent / num(b.BudgetAmount))) : 0;\n        const p = Math.round(pct * 100);\n        const dim = isActive ? \"\" : \"dim\";\n\n        return `\n        <tr data-bud-i=\"${b._i}\" class=\"${dim}\">\n          <td class=\"wrap\"><input data-bud-field=\"Category\" list=\"catList\" value=\"${escapeAttr(b.Category)}\" style=\"width:100%\"></td>\n          <td class=\"num\"><input data-bud-field=\"BudgetAmount\" type=\"number\" step=\"0.01\" value=\"${escapeAttr(num(b.BudgetAmount))}\" style=\"width:140px;text-align:right\"></td>\n          <td class=\"num\">${escapeHtml(money(spent))}</td>\n          <td class=\"num\">${escapeHtml(money(remain))}</td>\n          <td class=\"wrap\"><input data-bud-field=\"Notes\" value=\"${escapeAttr(b.Notes || \"\")}\" style=\"width:100%\"></td>\n          <td>\n            <select data-bud-field=\"Active\">\n              <option value=\"Y\" ${String(b.Active || \"Y\").toUpperCase() === \"Y\" ? \"selected\" : \"\"}>Y</option>\n              <option value=\"N\" ${String(b.Active || \"Y\").toUpperCase() === \"N\" ? \"selected\" : \"\"}>N</option>\n            </select>\n          </td>\n          <td>\n            <button class=\"danger mini\" type=\"button\" data-action=\"del-bud\" data-bud-i=\"${b._i}\">Remove</button>\n            <div class=\"sub\" style=\"margin-top:6px\">\n              <div class=\"bar\"><div style=\"width:${p}%\"></div></div>\n              <div class=\"sub\">${p}% used</div>\n            </div>\n          </td>\n        </tr>\n      `;\n      })\n      .join(\"\");\n\n    let dl = document.getElementById(\"catList\");\n    if (!dl) {\n      dl = document.createElement(\"datalist\");\n      dl.id = \"catList\";\n      document.body.appendChild(dl);\n    }\n    dl.innerHTML = cats.map((c) => `<option value=\"${escapeAttr(c)}\"></option>`).join(\"\");\n\n    if ($(\"budMsg\")) $(\"budMsg\").textContent = \"\";\n    refreshToday();\n  }\n\n  function addBudgetRow() {\n    if (!state.loaded) return;\n    const m = $(\"budMonth\") ? $(\"budMonth\").value || ymToday() : ymToday();\n    const t = $(\"budType\") ? $(\"budType\").value || \"Expense\" : \"Expense\";\n    const guess = t === \"Expense\" ? \"Eat Out\" : \"Income\";\n    state.budgets.push({ Month: m, Type: t, Category: guess, BudgetAmount: 0, Notes: \"\", Active: \"Y\" });\n    renderBudgets();\n    if ($(\"budMsg\")) $(\"budMsg\").innerHTML = `<span class=\"ok\">Added.</span> Set the budget amount and category.`;\n    refreshToday();\n  }\n\n  /* ============================\n     Bills UI\n  ============================ */\n  function renderBills() {\n    if (!state.loaded) return;\n    if (!$(\"billRows\")) return;\n\n    const rows = state.bills || [];\n    const accounts = uniq((state.accounts || []).map((a) => a.Account).concat((state.tx || []).map((t) => t.Account))).sort();\n\n    if (!rows.length) {\n      $(\"billRows\").innerHTML = `\n        <tr><td colspan=\"8\" class=\"wrap\">\n          <div class=\"note\">No bills yet. Add recurring bills like rent, phone, internet, insurance.</div>\n        </td></tr>\n      `;\n      if ($(\"billMsg\")) $(\"billMsg\").textContent = \"\";\n      refreshToday();\n      return;\n    }\n\n    $(\"billRows\").innerHTML = rows\n      .map(\n        (b, idx) => `\n      <tr data-bill-idx=\"${idx}\" class=\"${String(b.Active || \"Y\").toUpperCase() === \"N\" ? \"dim\" : \"\"}\">\n        <td class=\"wrap\"><input data-bill-field=\"BillName\" value=\"${escapeAttr(b.BillName || \"\")}\" style=\"width:100%\"></td>\n        <td class=\"num\"><input data-bill-field=\"Amount\" type=\"number\" step=\"0.01\" value=\"${escapeAttr(num(b.Amount))}\" style=\"width:140px;text-align:right\"></td>\n        <td><input data-bill-field=\"DueDay\" type=\"number\" min=\"1\" max=\"31\" value=\"${escapeAttr(num(b.DueDay) || 1)}\" style=\"width:100px\"></td>\n        <td class=\"wrap\">\n          <select data-bill-field=\"Account\" style=\"width:100%\">\n            <option value=\"\">(none)</option>\n            ${accounts\n              .map((a) => `<option value=\"${escapeAttr(a)}\" ${a === b.Account ? \"selected\" : \"\"}>${escapeHtml(a)}</option>`)\n              .join(\"\")}\n          </select>\n        </td>\n        <td>\n          <select data-bill-field=\"AutoPay\">\n            <option value=\"Y\" ${String(b.AutoPay || \"N\").toUpperCase() === \"Y\" ? \"selected\" : \"\"}>Y</option>\n            <option value=\"N\" ${String(b.AutoPay || \"N\").toUpperCase() === \"N\" ? \"selected\" : \"\"}>N</option>\n          </select>\n        </td>\n        <td class=\"wrap\"><input data-bill-field=\"Notes\" value=\"${escapeAttr(b.Notes || \"\")}\" style=\"width:100%\"></td>\n        <td>\n          <select data-bill-field=\"Active\">\n            <option value=\"Y\" ${String(b.Active || \"Y\").toUpperCase() === \"Y\" ? \"selected\" : \"\"}>Y</option>\n            <option value=\"N\" ${String(b.Active || \"Y\").toUpperCase() === \"N\" ? \"selected\" : \"\"}>N</option>\n          </select>\n        </td>\n        <td><button class=\"danger mini\" type=\"button\" data-action=\"del-bill\" data-bill-idx=\"${idx}\">Remove</button></td>\n      </tr>\n    `\n      )\n      .join(\"\");\n\n    if ($(\"billMsg\")) $(\"billMsg\").textContent = \"\";\n    refreshToday();\n  }\n\n  function addBill() {\n    if (!state.loaded) return;\n    state.bills.push({ BillName: \"New Bill\", Amount: 0, DueDay: 1, Account: \"\", AutoPay: \"N\", Notes: \"\", Active: \"Y\" });\n    renderBills();\n    if ($(\"billMsg\")) $(\"billMsg\").innerHTML = `<span class=\"ok\">Added.</span>`;\n  }\n\n  /* ============================\n     Move UI\n  ============================ */\n  function addMoveItem() {\n    if (!state.loaded) return;\n    state.move.push({ Item: \"New Item\", Kind: \"One-time\", Amount: 0, Notes: \"\", Active: \"Y\" });\n    renderMove();\n    if ($(\"moveMsg\")) $(\"moveMsg\").innerHTML = `<span class=\"ok\">Added.</span>`;\n  }\n\n  function renderMove() {\n    if (!state.loaded) return;\n    if (!$(\"moveRows\")) return;\n\n    const rows = state.move || [];\n    const m = $(\"moveMonth\") ? $(\"moveMonth\").value || ymToday() : ymToday();\n\n    const baseRows = monthTx(m);\n    const inc = baseRows.filter((x) => x.Type === \"Income\").reduce((a, x) => a + num(x.Amount), 0);\n    const exp = baseRows.filter((x) => x.Type === \"Expense\").reduce((a, x) => a + num(x.Amount), 0);\n    const net = inc - exp;\n\n    const active = rows.filter((x) => String(x.Active || \"Y\").toUpperCase() !== \"N\");\n    const oneTime = active.filter((x) => String(x.Kind || \"One-time\") !== \"Monthly\").reduce((a, x) => a + num(x.Amount), 0);\n    const monthly = active.filter((x) => String(x.Kind || \"One-time\") === \"Monthly\").reduce((a, x) => a + num(x.Amount), 0);\n\n    const netAfter = net - monthly;\n    let msg = `Base net (${m}): ${money(net)} \u2022 Move monthly change: ${money(monthly)} \u2022 Net after: ${money(netAfter)} \u2022 One-time total: ${money(oneTime)}`;\n\n    if (oneTime > 0) {\n      if (netAfter > 0) {\n        const months = Math.ceil(oneTime / netAfter);\n        msg += ` \u2022 Months to save (rough): ${months}`;\n      } else {\n        msg += ` \u2022 Months to save: not possible (net after \u2264 0)`;\n      }\n    }\n\n    if ($(\"moveSummary\")) $(\"moveSummary\").textContent = msg;\n\n    if (!rows.length) {\n      $(\"moveRows\").innerHTML = `\n        <tr><td colspan=\"6\" class=\"wrap\">\n          <div class=\"note\">No move items yet. Add one-time costs (deposit, truck) and monthly changes (rent difference).</div>\n        </td></tr>\n      `;\n      return;\n    }\n\n    $(\"moveRows\").innerHTML = rows\n      .map(\n        (it, idx) => `\n      <tr data-move-idx=\"${idx}\" class=\"${String(it.Active || \"Y\").toUpperCase() === \"N\" ? \"dim\" : \"\"}\">\n        <td class=\"wrap\"><input data-move-field=\"Item\" value=\"${escapeAttr(it.Item || \"\")}\" style=\"width:100%\"></td>\n        <td>\n          <select data-move-field=\"Kind\">\n            <option value=\"One-time\" ${String(it.Kind || \"One-time\") === \"One-time\" ? \"selected\" : \"\"}>One-time</option>\n            <option value=\"Monthly\" ${String(it.Kind || \"One-time\") === \"Monthly\" ? \"selected\" : \"\"}>Monthly</option>\n          </select>\n        </td>\n        <td class=\"num\"><input data-move-field=\"Amount\" type=\"number\" step=\"0.01\" value=\"${escapeAttr(num(it.Amount))}\" style=\"width:140px;text-align:right\"></td>\n        <td class=\"wrap\"><input data-move-field=\"Notes\" value=\"${escapeAttr(it.Notes || \"\")}\" style=\"width:100%\"></td>\n        <td>\n          <select data-move-field=\"Active\">\n            <option value=\"Y\" ${String(it.Active || \"Y\").toUpperCase() === \"Y\" ? \"selected\" : \"\"}>Y</option>\n            <option value=\"N\" ${String(it.Active || \"Y\").toUpperCase() === \"N\" ? \"selected\" : \"\"}>N</option>\n          </select>\n        </td>\n        <td><button class=\"danger mini\" type=\"button\" data-action=\"del-move\" data-move-idx=\"${idx}\">Remove</button></td>\n      </tr>\n    `\n      )\n      .join(\"\");\n\n    if ($(\"moveMsg\")) $(\"moveMsg\").textContent = \"\";\n  }\n\n  /* ============================\n     Grow UI\n  ============================ */\n  function saveGrow() {\n    state.grow.investMonthly = num($(\"growInvestMonthly\")?.value);\n    state.grow.investAccount = String($(\"growInvestAccount\")?.value || \"\").trim();\n    if ($(\"growMsg\")) $(\"growMsg\").innerHTML = `<span class=\"ok\">Saved.</span>`;\n    renderGrow();\n  }\n\n  function renderGrow() {\n    if (!state.loaded) return;\n    if ($(\"growInvestMonthly\")) $(\"growInvestMonthly\").value = num(state.grow.investMonthly) || 0;\n    if ($(\"growInvestAccount\")) $(\"growInvestAccount\").value = state.grow.investAccount || \"\";\n\n    const m = ymToday();\n    const dep = (state.tx || [])\n      .filter((t) => t.Month === m && t.Type === \"Expense\" && String(t.Category || \"\").trim().toLowerCase() === \"investing deposit\")\n      .reduce((a, t) => a + num(t.Amount), 0);\n\n    const target = num(state.grow.investMonthly) || 0;\n    const remain = Math.max(0, target - dep);\n\n    if ($(\"growThisMonth\")) {\n      $(\"growThisMonth\").innerHTML = `\n        Target: <b>${escapeHtml(money(target))}</b> \u2022 Logged: <b>${escapeHtml(money(dep))}</b> \u2022 Remaining: <b>${escapeHtml(money(remain))}</b>\n        <div class=\"sub\" style=\"margin-top:6px\">Month: ${escapeHtml(m)} \u2022 Account: ${escapeHtml(state.grow.investAccount || \"\u2014\")}</div>\n      `;\n    }\n  }\n\n  function quickAddInvestDeposit() {\n    if (!state.loaded) return;\n    routeToTab(\"expense\");\n    if ($(\"exDate\")) $(\"exDate\").value = isoToday();\n    if ($(\"exImpulse\")) $(\"exImpulse\").value = \"N\";\n    if ($(\"exImpulseReason\")) $(\"exImpulseReason\").value = \"\";\n\n    const cats = $(\"exCategory\") ? Array.from($(\"exCategory\").options).map((o) => o.value) : [];\n    const want = cats.find((c) => String(c).toLowerCase() === \"investing deposit\") || \"Investing Deposit\";\n    if ($(\"exCategory\")) $(\"exCategory\").value = want;\n    rebuildSub(\"ex\");\n\n    if ($(\"exPayee\")) $(\"exPayee\").value = state.grow.investAccount || $(\"exPayee\").value;\n    if (num(state.grow.investMonthly) > 0 && $(\"exAmount\")) $(\"exAmount\").value = num(state.grow.investMonthly);\n    if ($(\"exNotes\")) $(\"exNotes\").value = \"\";\n    try { $(\"exAmount\")?.focus(); } catch (e) {}\n  }\n\n  function quickGoBudgets() { routeToTab(\"budgets\"); }\n  function quickGoExpense() { routeToTab(\"expense\"); }\n\n  /* ============================\n     Expense quick buttons (v2.2.4)\n     - Fix inline button handlers: Eat Out / Grocery / Copy Last / Today\n     - These are called by snippet inline onclick=\"...\" so MUST be global.\n  ============================ */\n\n  function _setSelectByTextContains(sel, needle){\n    if(!sel) return \"\";\n    const want = String(needle||\"\").trim().toLowerCase();\n    if(!want) return \"\";\n    let best = \"\";\n    const opts = Array.from(sel.options || []);\n    // exact match first\n    for(const o of opts){\n      const v = String(o.value||\"\").trim();\n      if(v && v.toLowerCase() === want){ best = v; break; }\n    }\n    // contains match\n    if(!best){\n      for(const o of opts){\n        const v = String(o.value||\"\").trim();\n        if(v && v.toLowerCase().includes(want)){ best = v; break; }\n      }\n    }\n    if(best) sel.value = best;\n    return best;\n  }\n\n  function _focusExpenseAmount(){\n    try{ $(\"exAmount\")?.focus(); }catch(_){ }\n  }\n\n  function quickPresetEatOut(){\n    try{\n      routeToTab(\"expense\");\n      const cat = _setSelectByTextContains($(\"exCategory\"), \"eat out\") || _setSelectByTextContains($(\"exCategory\"), \"dining\") || _setSelectByTextContains($(\"exCategory\"), \"restaurant\");\n      if(cat){\n        rebuildSub(\"ex\");\n        if($(\"exSubcategory\") && !$(\"exSubcategory\").value) $(\"exSubcategory\").value = \"General\";\n        toast(\"Preset: Eat Out\", \"ok\");\n      }else{\n        toast(\"Preset failed\", \"warn\", \"No 'Eat Out' category found. Add it in Manage \u2192 Categories.\");\n      }\n      _focusExpenseAmount();\n    }catch(e){ toast(\"Preset failed\", \"err\"); }\n  }\n\n  function quickPresetGrocery(){\n    try{\n      routeToTab(\"expense\");\n      const cat = _setSelectByTextContains($(\"exCategory\"), \"grocery\") || _setSelectByTextContains($(\"exCategory\"), \"groceries\");\n      if(cat){\n        rebuildSub(\"ex\");\n        if($(\"exSubcategory\") && !$(\"exSubcategory\").value) $(\"exSubcategory\").value = \"General\";\n        toast(\"Preset: Grocery\", \"ok\");\n      }else{\n        toast(\"Preset failed\", \"warn\", \"No 'Grocery' category found. Add it in Manage \u2192 Categories.\");\n      }\n      _focusExpenseAmount();\n    }catch(e){ toast(\"Preset failed\", \"err\"); }\n  }\n\n  function setExpenseToday(){\n    try{\n      if($(\"exDate\")) $(\"exDate\").value = isoToday();\n      toast(\"Date set to today\", \"ok\");\n    }catch(_){ }\n  }\n\n  function copyLastSimilar(){\n    try{\n      if(!state.loaded){ toast(\"Import first\", \"warn\"); return; }\n      routeToTab(\"expense\");\n      const cat = String($(\"exCategory\")?.value || \"\").trim();\n      if(!cat){\n        toast(\"Pick a category first\", \"warn\", \"Then use Copy Last.\");\n        return;\n      }\n      const found = [...(state.tx||[])].reverse().find(t => String(t.Type||\"\") === \"Expense\" && String(t.Category||\"\").trim() === cat);\n      if(!found){\n        toast(\"Nothing to copy\", \"warn\", \"No previous expense found in this category.\");\n        return;\n      }\n\n      // keep today's date by default\n      if($(\"exAccount\") && found.Account) $(\"exAccount\").value = found.Account;\n      if($(\"exSubcategory\") && found.Subcategory){\n        rebuildSub(\"ex\");\n        $(\"exSubcategory\").value = found.Subcategory;\n      }\n      if($(\"exTemplate\") && found.Item) $(\"exTemplate\").value = found.Item;\n      if($(\"exPayee\")) $(\"exPayee\").value = found.Payee || \"\";\n      if($(\"exNotes\")) $(\"exNotes\").value = found.Notes || \"\";\n      if($(\"exAmount\") && num(found.Amount)>0) $(\"exAmount\").value = num(found.Amount);\n\n      toast(\"Copied last expense\", \"ok\", \"You can edit amount/date then Save.\");\n      _focusExpenseAmount();\n    }catch(e){ toast(\"Copy failed\", \"err\"); }\n  }\n\n  /* ============================\n     Today UI\n  ============================ */\n  function plannedRemainForMonth(month) {\n    const m = String(month || \"\").trim();\n    const buds = (state.budgets || []).filter((b) => b.Month === m && b.Type === \"Expense\" && String(b.Active || \"Y\").toUpperCase() !== \"N\");\n    if (!buds.length) return 0;\n    let remain = 0;\n    for (const b of buds) {\n      const spent = spentFor(m, \"Expense\", b.Category);\n      remain += num(b.BudgetAmount) - spent;\n    }\n    return remain;\n  }\n\n  function refreshToday() {\n    if (!state.loaded) return;\n\n    const m = $(\"todayMonth\") ? $(\"todayMonth\").value || ymToday() : ymToday();\n    const focus = $(\"todayFocusCat\") ? $(\"todayFocusCat\").value || \"\" : \"\";\n\n    const now = new Date();\n    const plannedRemain = plannedRemainForMonth(m);\n    if ($(\"kPlannedRemain\")) $(\"kPlannedRemain\").textContent = money(plannedRemain);\n\n    // safe-to-spend\n    const dlm = Math.max(1, (U.daysLeftInMonth ? U.daysLeftInMonth(now) : 1));\n    const safeToday = plannedRemain > 0 ? plannedRemain / dlm : 0;\n    const weeksLeft = Math.max(1, Math.ceil(dlm / 7));\n    const safeWeek = plannedRemain > 0 ? plannedRemain / weeksLeft : 0;\n\n    if ($(\"kSafeToday\")) $(\"kSafeToday\").textContent = money(safeToday);\n    if ($(\"kSafeWeek\")) $(\"kSafeWeek\").textContent = money(safeWeek);\n\n    const budRows = (state.budgets || [])\n      .filter((b) => b.Month === m && b.Type === \"Expense\" && String(b.Active || \"Y\").toUpperCase() !== \"N\")\n      .filter((b) => !focus || String(b.Category || \"\") === focus);\n\n    if ($(\"todayBudgetRows\")) {\n      if (!budRows.length) {\n        $(\"todayBudgetRows\").innerHTML = `<tr><td colspan=\"5\" class=\"wrap\"><div class=\"note\">No active budgets for ${escapeHtml(m)}${focus ? \" / \" + escapeHtml(focus) : \"\"}. Go to <b>Budgets</b> tab and add a few.</div></td></tr>`;\n        if ($(\"todayBudgetHint\")) $(\"todayBudgetHint\").textContent = \"\";\n      } else {\n        $(\"todayBudgetRows\").innerHTML = budRows\n          .map((b) => {\n            const bud = num(b.BudgetAmount);\n            const spent = spentFor(m, \"Expense\", b.Category);\n            const rem = bud - spent;\n            const pct = bud > 0 ? Math.max(0, Math.min(1, spent / bud)) : 0;\n            const p = Math.round(pct * 100);\n            return `\n            <tr>\n              <td class=\"wrap\"><b>${escapeHtml(b.Category)}</b></td>\n              <td class=\"num\">${escapeHtml(money(bud))}</td>\n              <td class=\"num\">${escapeHtml(money(spent))}</td>\n              <td class=\"num\">${escapeHtml(money(rem))}</td>\n              <td>\n                <div class=\"bar\"><div style=\"width:${p}%\"></div></div>\n                <div class=\"sub\" style=\"margin-top:6px\">${p}% used</div>\n              </td>\n            </tr>\n          `;\n          })\n          .join(\"\");\n        if ($(\"todayBudgetHint\"))\n          $(\"todayBudgetHint\").textContent = focus ? `Showing focus category: ${focus}` : `Showing all active budgets for ${m}`;\n      }\n    }\n\n    const impRows = (state.tx || []).filter((t) => t.Month === m && t.Type === \"Expense\" && String(t.Impulse || \"N\").toUpperCase() === \"Y\");\n    const impSum = impRows.reduce((a, t) => a + num(t.Amount), 0);\n\n    const impByCat = new Map();\n    for (const t of impRows) {\n      const k = String(t.Category || \"(uncat)\");\n      impByCat.set(k, (impByCat.get(k) || 0) + num(t.Amount));\n    }\n    const topImp = Array.from(impByCat.entries()).sort((a, b) => b[1] - a[1]).slice(0, 6);\n\n    if ($(\"todayImpulse\")) {\n      $(\"todayImpulse\").innerHTML = impRows.length\n        ? `Count: <b>${impRows.length}</b> \u2022 Total: <b>${escapeHtml(money(impSum))}</b>` +\n          (topImp.length\n            ? `<div class=\"sub\" style=\"margin-top:6px\">Top: ${topImp\n                .map(([k, v]) => `${escapeHtml(k)} (${escapeHtml(money(v))})`)\n                .join(\" \u2022 \")}</div>`\n            : ``)\n        : `No impulse spending recorded for ${escapeHtml(m)}.`;\n    }\n\n    const upcoming = billsDueNext7Days();\n    if ($(\"todayBills\")) {\n      $(\"todayBills\").innerHTML = upcoming.length\n        ? upcoming\n            .map(\n              (x) => `<div style=\"padding:8px 0;border-bottom:1px dashed var(--border)\">\n            <b>${escapeHtml(x.BillName)}</b> \u2014 ${escapeHtml(money(x.Amount))} \u2022 due <b>${escapeHtml(x.DueISO)}</b>${x.Account ? \" \u2022 \" + escapeHtml(x.Account) : \"\"}${String(x.AutoPay || \"N\").toUpperCase() === \"Y\" ? \" \u2022 Autopay\" : \"\"}\n            ${x.Notes ? `<div class=\"sub\">${escapeHtml(x.Notes)}</div>` : \"\"}\n          </div>`\n            )\n            .join(\"\")\n        : `No bills due in the next 7 days.`;\n    }\n\n    const hasBud = (state.budgets || []).some((b) => b.Month === m && b.Type === \"Expense\" && String(b.Active || \"Y\").toUpperCase() !== \"N\");\n    if ($(\"todayNote\"))\n      $(\"todayNote\").textContent = hasBud\n        ? `Budgets loaded for ${m}. Planned remaining helps control daily spending.`\n        : `No budgets for ${m}. Add budgets to enable safe-to-spend guidance.`;\n  }\n\n  /* ============================\n     Bulk UI\n  ============================ */\n  function rebuildBulkUI(force) {\n    if (!state.loaded) return;\n\n    const catType = $(\"bkCatType\") ? $(\"bkCatType\").value || \"\" : \"\";\n    const subType = $(\"bkSubType\") ? $(\"bkSubType\").value || \"\" : \"\";\n\n    const catsAll = uniq((state.tx || []).filter((t) => !catType || t.Type === catType).map((t) => t.Category)).sort();\n    const people = uniq((state.tx || []).map((t) => t.Person).concat(state.settings.people || [])).sort();\n    const accounts = uniq((state.accounts || []).map((a) => a.Account).concat((state.tx || []).map((t) => t.Account)).concat((state.bills || []).map((b) => b.Account))).sort();\n\n    if ($(\"bkOldCat\") && (force || !$(\"bkOldCat\").options.length)) fillSelectWithBlank($(\"bkOldCat\"), catsAll, \"(choose)\");\n\n    const oldCat = $(\"bkOldCat\") ? $(\"bkOldCat\").value || \"\" : \"\";\n    const catMatchesCount = (state.tx || []).filter((t) => (!catType || t.Type === catType) && String(t.Category || \"\") === oldCat).length;\n    if ($(\"bkCatCount\")) $(\"bkCatCount\").textContent = String(catMatchesCount);\n\n    const catsForSub = uniq((state.tx || []).filter((t) => !subType || t.Type === subType).map((t) => t.Category)).sort();\n    if ($(\"bkSubCat\") && (force || !$(\"bkSubCat\").options.length)) fillSelectWithBlank($(\"bkSubCat\"), catsForSub, \"(choose)\");\n\n    const subCat = $(\"bkSubCat\") ? $(\"bkSubCat\").value || \"\" : \"\";\n    const subs = uniq((state.tx || []).filter((t) => (!subType || t.Type === subType) && String(t.Category || \"\") === subCat).map((t) => t.Subcategory)).sort();\n    if ($(\"bkOldSub\")) fillSelectWithBlank($(\"bkOldSub\"), subs, \"(choose)\");\n\n    const oldSub = $(\"bkOldSub\") ? $(\"bkOldSub\").value || \"\" : \"\";\n    const subMatchesCount = (state.tx || []).filter((t) => (!subType || t.Type === subType) && String(t.Category || \"\") === subCat && String(t.Subcategory || \"\") === oldSub).length;\n    if ($(\"bkSubCount\")) $(\"bkSubCount\").textContent = String(subMatchesCount);\n\n    if ($(\"bkOldAcc\") && (force || !$(\"bkOldAcc\").options.length)) fillSelectWithBlank($(\"bkOldAcc\"), accounts, \"(choose)\");\n    if ($(\"bkOldPerson\") && (force || !$(\"bkOldPerson\").options.length)) fillSelectWithBlank($(\"bkOldPerson\"), people, \"(choose)\");\n\n    const oldAcc = $(\"bkOldAcc\") ? $(\"bkOldAcc\").value || \"\" : \"\";\n    const accCount = (state.tx || []).filter((t) => String(t.Account || \"\") === oldAcc).length + (state.bills || []).filter((b) => String(b.Account || \"\") === oldAcc).length;\n    if ($(\"bkAccCount\")) $(\"bkAccCount\").textContent = String(accCount);\n\n    const oldPerson = $(\"bkOldPerson\") ? $(\"bkOldPerson\").value || \"\" : \"\";\n    const personCount = (state.tx || []).filter((t) => String(t.Person || \"\") === oldPerson).length;\n    if ($(\"bkPersonCount\")) $(\"bkPersonCount\").textContent = String(personCount);\n\n    if ($(\"bulkMsg\")) $(\"bulkMsg\").textContent = \"\";\n  }\n\n  function applyRenameCategory() {\n    const type = $(\"bkCatType\") ? $(\"bkCatType\").value || \"\" : \"\";\n    const oldCat = $(\"bkOldCat\") ? $(\"bkOldCat\").value || \"\" : \"\";\n    const newCat = String($(\"bkNewCat\")?.value || \"\").trim();\n    if (!oldCat) { if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"err\">Pick an old category.</span>`; return; }\n    if (!newCat) { if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"err\">Type a new category.</span>`; return; }\n\n    let n = 0;\n    for (const t of state.tx || []) {\n      if (type && t.Type !== type) continue;\n      if (String(t.Category || \"\") === oldCat) { t.Category = newCat; n++; }\n    }\n    for (const b of state.budgets || []) {\n      if (type && b.Type !== type) continue;\n      if (String(b.Category || \"\") === oldCat) b.Category = newCat;\n    }\n\n    if ($(\"bkNewCat\")) $(\"bkNewCat\").value = \"\";\n    rebuildDropdowns();\n    renderBudgets();\n    renderOverview();\n    markDirty(true);\n    renderTx();\n    refreshToday();\n    if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"ok\">Renamed.</span> Updated ${n} transaction(s).`;\n  }\n\n  function applyRenameSubcategory() {\n    const type = $(\"bkSubType\") ? $(\"bkSubType\").value || \"\" : \"\";\n    const cat = $(\"bkSubCat\") ? $(\"bkSubCat\").value || \"\" : \"\";\n    const oldSub = $(\"bkOldSub\") ? $(\"bkOldSub\").value || \"\" : \"\";\n    const newSub = String($(\"bkNewSub\")?.value || \"\").trim();\n    if (!cat) { if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"err\">Pick a category.</span>`; return; }\n    if (!oldSub) { if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"err\">Pick an old subcategory.</span>`; return; }\n    if (!newSub) { if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"err\">Type a new subcategory.</span>`; return; }\n\n    let n = 0;\n    for (const t of state.tx || []) {\n      if (type && t.Type !== type) continue;\n      if (String(t.Category || \"\") === cat && String(t.Subcategory || \"\") === oldSub) { t.Subcategory = newSub; n++; }\n    }\n\n    if ($(\"bkNewSub\")) $(\"bkNewSub\").value = \"\";\n    rebuildDropdowns();\n    renderOverview();\n    renderTx();\n    refreshToday();\n    if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"ok\">Renamed.</span> Updated ${n} transaction(s).`;\n  }\n\n  function applyRenameAccount() {\n    const oldAcc = $(\"bkOldAcc\") ? $(\"bkOldAcc\").value || \"\" : \"\";\n    const newAcc = String($(\"bkNewAcc\")?.value || \"\").trim();\n    if (!oldAcc) { if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"err\">Pick an old account.</span>`; return; }\n    if (!newAcc) { if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"err\">Type a new account name.</span>`; return; }\n\n    let n = 0;\n    for (const t of state.tx || []) {\n      if (String(t.Account || \"\") === oldAcc) { t.Account = newAcc; n++; }\n    }\n    for (const b of state.bills || []) {\n      if (String(b.Account || \"\") === oldAcc) b.Account = newAcc;\n    }\n    for (const a of state.accounts || []) {\n      if (String(a.Account || \"\") === oldAcc) a.Account = newAcc;\n    }\n\n    if ($(\"bkNewAcc\")) $(\"bkNewAcc\").value = \"\";\n    mergeAccountsByName();\n    rebuildDropdowns();\n    renderBills();\n    renderAccounts();\n    renderTx();\n    refreshToday();\n    if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"ok\">Renamed.</span> Updated ${n} transaction(s) + settings.`;\n  }\n\n  function applyRenamePerson() {\n    const oldP = $(\"bkOldPerson\") ? $(\"bkOldPerson\").value || \"\" : \"\";\n    const newP = String($(\"bkNewPerson\")?.value || \"\").trim();\n    if (!oldP) { if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"err\">Pick an old person.</span>`; return; }\n    if (!newP) { if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"err\">Type a new person name.</span>`; return; }\n\n    let n = 0;\n    for (const t of state.tx || []) {\n      if (String(t.Person || \"\") === oldP) { t.Person = newP; n++; }\n    }\n\n    const ppl = uniq((state.settings.people || []).map((x) => (x === oldP ? newP : x)).concat([newP]));\n    state.settings.people = ppl;\n\n    if ($(\"bkNewPerson\")) $(\"bkNewPerson\").value = \"\";\n    rebuildDropdowns();\n    renderTx();\n    if ($(\"bulkMsg\")) $(\"bulkMsg\").innerHTML = `<span class=\"ok\">Renamed.</span> Updated ${n} transaction(s).`;\n  }\n\n  /* ============================\n     Goals UI\n  ============================ */\n  function addGoal() {\n    if (!state.loaded) return;\n    state.goals.push({ GoalName: \"New Goal\", TargetAmount: 0, CurrentAmount: 0, Notes: \"\", Active: \"Y\" });\n    renderGoalsEditor();\n    if ($(\"goalsMsg\")) $(\"goalsMsg\").innerHTML = `<span class=\"ok\">Added.</span>`;\n  }\n\n  function renderGoalsEditor() {\n    if (!state.loaded) return;\n    const el = $(\"goalsEditor\");\n    if (!el) return;\n\n    if (!(state.goals || []).length) {\n      el.innerHTML = `<div class=\"note\">No goals yet. Add one like Emergency Fund, Move Fund, Investing Target.</div>`;\n      return;\n    }\n\n    el.innerHTML = `\n      <div class=\"tableWrap\">\n        <table class=\"tytbl\">\n          <thead>\n            <tr>\n              <th style=\"min-width:220px\">Goal</th>\n              <th class=\"num\" style=\"min-width:160px\">Target</th>\n              <th class=\"num\" style=\"min-width:160px\">Current</th>\n              <th style=\"min-width:260px\">Notes</th>\n              <th style=\"min-width:110px\">Active</th>\n              <th style=\"min-width:110px\"></th>\n            </tr>\n          </thead>\n          <tbody>\n            ${(state.goals || [])\n              .map((g, idx) => {\n                const pct = g.TargetAmount > 0 ? Math.max(0, Math.min(1, num(g.CurrentAmount) / num(g.TargetAmount))) : 0;\n                const p = Math.round(pct * 100);\n                return `\n                <tr data-goal-idx=\"${idx}\" class=\"${String(g.Active || \"Y\").toUpperCase() === \"N\" ? \"dim\" : \"\"}\">\n                  <td class=\"wrap\">\n                    <input data-goal-field=\"GoalName\" value=\"${escapeAttr(g.GoalName || \"\")}\" style=\"width:100%\">\n                    <div class=\"sub\" style=\"margin-top:6px\">\n                      <div class=\"bar\"><div style=\"width:${p}%\"></div></div>\n                      <div class=\"sub\">${p}%</div>\n                    </div>\n                  </td>\n                  <td class=\"num\"><input data-goal-field=\"TargetAmount\" type=\"number\" step=\"0.01\" value=\"${escapeAttr(num(g.TargetAmount))}\" style=\"width:140px;text-align:right\"></td>\n                  <td class=\"num\"><input data-goal-field=\"CurrentAmount\" type=\"number\" step=\"0.01\" value=\"${escapeAttr(num(g.CurrentAmount))}\" style=\"width:140px;text-align:right\"></td>\n                  <td class=\"wrap\"><input data-goal-field=\"Notes\" value=\"${escapeAttr(g.Notes || \"\")}\" style=\"width:100%\"></td>\n                  <td>\n                    <select data-goal-field=\"Active\">\n                      <option value=\"Y\" ${String(g.Active || \"Y\").toUpperCase() === \"Y\" ? \"selected\" : \"\"}>Y</option>\n                      <option value=\"N\" ${String(g.Active || \"Y\").toUpperCase() === \"N\" ? \"selected\" : \"\"}>N</option>\n                    </select>\n                  </td>\n                  <td><button class=\"danger mini\" type=\"button\" data-action=\"del-goal\" data-goal-idx=\"${idx}\">Remove</button></td>\n                </tr>\n              `;\n              })\n              .join(\"\")}\n          </tbody>\n        </table>\n      </div>\n    `;\n    if ($(\"goalsMsg\")) $(\"goalsMsg\").textContent = \"\";\n  }\n\n  /* ============================\n     GPT UI\n  ============================ */\n  function buildGptPack() {\n    if (typeof buildGptPackCore === \"function\") {\n      const res = buildGptPackCore();\n      if (typeof res === \"string\" && $(\"gptOut\")) $(\"gptOut\").value = res;\n      return;\n    }\n    if ($(\"gptOut\")) $(\"gptOut\").value = \"buildGptPack is not available (core missing).\";\n  }\n\n  async function copyGptPack() {\n    const txt = $(\"gptOut\") ? $(\"gptOut\").value || \"\" : \"\";\n    if (!txt.trim()) return;\n    try {\n      await navigator.clipboard.writeText(txt);\n    } catch (e) {\n      try {\n        $(\"gptOut\")?.focus();\n        $(\"gptOut\")?.select();\n        document.execCommand(\"copy\");\n      } catch (e2) {}\n    }\n  }\n\n  function loadDemo() {\n    // prefer remote demo CSV so it's always the same as your published sample\n    loadDemoFromUrl(DEMO_CSV_URL, true);\n  }\n\n  /* ============================\n     Legacy inline hooks (kept)\n  ============================ */\n  function importCsvFile(input) {\n    try {\n      const f = input && input.files && input.files[0];\n      if (!f) return;\n      const r = new FileReader();\n      r.onload = () => {\n        try {\n          setDemoMode(false);\n          loadFromMaster(String(r.result || \"\"));\n          markDirty(true);\n    markDirty(true);\n    markDirty(true);\n    markDirty(true);\n    markDirty(true);\n    markDirty(true);\n    afterLoad();\n        } catch (err) {\n          console.error(err);\n          if ($(\"importMsg\")) $(\"importMsg\").innerHTML = `<span class=\"err\">Import failed:</span> ${escapeHtml(err?.message || String(err))}`;\n          showTab(\"import\");\n          alert(\"Import failed. Open Console for details.\");\n        }\n      };\n      r.onerror = () => {\n        if ($(\"importMsg\")) $(\"importMsg\").innerHTML = `<span class=\"err\">Could not read file.</span>`;\n      };\n      r.readAsText(f);\n    } catch (err) {\n      console.error(err);\n      if ($(\"importMsg\")) $(\"importMsg\").innerHTML = `<span class=\"err\">${escapeHtml(err?.message || String(err))}</span>`;\n    }\n  }\n\n  /* ============================\n     Expose functions for inline onclick\n  ============================ */\n  \n  /* ============================\n     v5: export wrappers (mark exported)\n  ============================ */\n  function downloadMaster(){\n    try{\n      downloadMasterCore();\n      markExported();\n    }catch(e){\n      console.error(e);\n    }\n  }\n  function downloadTxOnly(){\n    try{\n      downloadTxOnlyCore();\n      markExported();\n    }catch(e){\n      console.error(e);\n    }\n  }\n\nObject.assign(window, {\n    routeToTab,\n    showTab,\n\n    renderAll,\n    afterLoad,\n    restoreLastSession,\n    dismissRestore,\n\n    saveRules,\n\n    submitExpense,\n    submitIncome,\n    clearExpense,\n    clearIncome,\n    cancelPendingExpense,\n    overridePendingExpense,\n\n    renderTx,\n    clearTxFilters,\n    openEditById,\n    closeEdit,\n    saveEdit,\n    overrideSaveEdit,\n    deleteEdit,\n\n    renderAccounts,\n    toggleAddAccountForm,\n    confirmAddAccount,\n\n    renderReconcile,\n    runReconcile,\n    resetReconcile,\n\n    recApplyFilters,\n    recClearFilters,\n\n    renderBudgets,\n    addBudgetRow,\n\n    renderBills,\n    addBill,\n\n    renderMove,\n    addMoveItem,\n\n    renderGrow,\n    saveGrow,\n    quickAddInvestDeposit,\n    quickGoBudgets,\n    quickGoExpense,\n\n    refreshToday,\n\n    rebuildBulkUI,\n    applyRenameCategory,\n    applyRenameSubcategory,\n    applyRenameAccount,\n    applyRenamePerson,\n\n    renderGoalsEditor,\n    addGoal,\n\n    downloadMaster: downloadMasterCore,\n    downloadTxOnly: downloadTxOnlyCore,\n\n    buildGptPack,\n    copyGptPack,\n\n    loadDemo,\n\n    // legacy\n    importCsvFile\n  });\n\n  // extra legacy aliases commonly used in old inline buttons\n  window.goTab = window.goTab || window.routeToTab;\n  window.openTab = window.openTab || window.routeToTab;\n  window.switchTab = window.switchTab || window.routeToTab;\n\n  // inline expense quick buttons (Add Expense header)\n  window.quickPresetEatOut = window.quickPresetEatOut || quickPresetEatOut;\n  window.quickPresetGrocery = window.quickPresetGrocery || quickPresetGrocery;\n  window.copyLastSimilar = window.copyLastSimilar || copyLastSimilar;\n  window.setExpenseToday = window.setExpenseToday || setExpenseToday;\n\n  // Boot: be resilient even if other scripts interfere with DOMContentLoaded.\n  // init() is idempotent (guarded by TYBH.ui._initDone), so it is safe to call multiple times.\n  function boot_(){\n    try{ init(); }catch(e){ try{ console.error(\"TYBH boot failed\", e); }catch(_e){} }\n  }\n\n  // Always try once ASAP (covers edge cases where DOMContentLoaded listeners don't run)\n  try{ setTimeout(boot_, 0); }catch(_e){}\n\n  // Standard hooks\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", boot_, { once: true });\n  } else {\n    boot_();\n  }\n  try{ window.addEventListener(\"load\", boot_, { once: true }); }catch(_e){}\n})();\n"],
  "mappings": "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",
  "names": ["state", "on"]
}
