{"version":3,"file":"theme.js","names":["preference","root","axis","fallback","resolvedTheme","site","theater","system","resolvedSite","theaterPage","authed","pop","apply","persist","value","body","syncRadios","radio","next","popBtn","event"],"sources":["src/theme-preferences.ts","src/theme.ts"],"sourcesContent":["export type ThemeAxis = 'site' | 'theater';\n\nexport function preference(root: HTMLElement, axis: ThemeAxis, fallback: string): string {\n  return root.getAttribute('data-bs-' + axis) || localStorage.getItem('bs-' + axis) || fallback;\n}\n\nexport function resolvedTheme(root: HTMLElement): string {\n  const site = preference(root, 'site', 'system');\n  const theater = preference(root, 'theater', 'dark');\n  const system = matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n  const resolvedSite = site === 'system' ? system : site;\n  return root.hasAttribute('data-theater-page')\n    ? (theater === 'match' ? resolvedSite : theater)\n    : resolvedSite;\n}\n","import { preference, resolvedTheme, type ThemeAxis } from './theme-preferences';\n\n(() => {\n  const root = document.documentElement;\n  const theaterPage = root.hasAttribute('data-theater-page');\n  const authed = root.hasAttribute('data-authed');\n  const pop = document.getElementById('appearance');\n\n  function apply(): void {\n    root.setAttribute('data-app-theme', resolvedTheme(root));\n  }\n\n  function persist(axis: ThemeAxis, value: string): void {\n    localStorage.setItem('bs-' + axis, value);\n    root.setAttribute('data-bs-' + axis, value);\n    if (authed) {\n      const body = 'site=' + encodeURIComponent(preference(root, 'site', 'system')) +\n        '&theater=' + encodeURIComponent(preference(root, 'theater', 'dark'));\n      fetch('/settings/appearance', {\n        method: 'POST',\n        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n        body,\n      }).catch(() => { /* offline / transient — localStorage still holds the choice */ });\n    }\n  }\n\n  function syncRadios(): void {\n    if (!pop) return;\n    const site = preference(root, 'site', 'system');\n    const theater = preference(root, 'theater', 'dark');\n    pop.querySelectorAll<HTMLInputElement>('input[name=site]').forEach((radio) => {\n      radio.checked = radio.value === site;\n    });\n    pop.querySelectorAll<HTMLInputElement>('input[name=theater]').forEach((radio) => {\n      radio.checked = radio.value === theater;\n    });\n  }\n\n  const toggle = document.getElementById('theme-toggle');\n  toggle?.addEventListener('click', () => {\n    const next = resolvedTheme(root) === 'dark' ? 'light' : 'dark';\n    persist(theaterPage ? 'theater' : 'site', next);\n    apply();\n    syncRadios();\n  });\n\n  const popBtn = document.getElementById('appearance-btn');\n  if (popBtn && pop) {\n    popBtn.addEventListener('click', (event) => {\n      event.stopPropagation();\n      pop.hidden = !pop.hidden;\n    });\n    pop.addEventListener('change', (event) => {\n      if (!(event.target instanceof HTMLInputElement)) return;\n      persist(event.target.name === 'site' ? 'site' : 'theater', event.target.value);\n      apply();\n    });\n    document.addEventListener('click', (event) => {\n      if (!pop.hidden && event.target instanceof Node && !pop.contains(event.target) && event.target !== popBtn) {\n        pop.hidden = true;\n      }\n    });\n    document.addEventListener('keydown', (event) => {\n      if (event.key === 'Escape') pop.hidden = true;\n    });\n  }\n\n  matchMedia('(prefers-color-scheme: dark)').addEventListener('change', apply);\n  syncRadios();\n  apply();\n})();\n"],"mappings":"C,WAEA,SAAgBA,EAAW,EAAmB,EAAiB,EAA0B,CACvF,OAAOC,EAAK,aAAa,WAAaC,CAAI,GAAK,aAAa,QAAQ,MAAQA,CAAI,GAAKC,CACvF,CAEA,SAAgBC,EAAc,EAA2B,CACvD,IAAMC,EAAOL,EAAWC,EAAM,OAAQ,QAAQ,EACxCK,EAAUN,EAAWC,EAAM,UAAW,MAAM,EAC5CM,EAAS,WAAW,8BAA8B,CAAC,CAAC,QAAU,OAAS,QACvEC,EAAeH,IAAS,SAAWE,EAASF,EAClD,OAAOJ,EAAK,aAAa,mBAAmB,EACvCK,IAAY,QAAUE,EAAeF,EACtCE,CACN,MCZO,CACL,IAAMP,EAAO,SAAS,gBAChBQ,EAAcR,EAAK,aAAa,mBAAmB,EACnDS,EAAST,EAAK,aAAa,aAAa,EACxCU,EAAM,SAAS,eAAe,YAAY,EAEhD,SAASC,GAAc,CACrBX,EAAK,aAAa,iBAAkBG,EAAcH,CAAI,CAAC,CACzD,CAEA,SAASY,EAAQ,EAAiB,EAAqB,CAGrD,GAFA,aAAa,QAAQ,MAAQX,EAAMY,CAAK,EACxCb,EAAK,aAAa,WAAaC,EAAMY,CAAK,EACtCJ,EAAQ,CACV,IAAMK,EAAO,QAAU,mBAAmBf,EAAWC,EAAM,OAAQ,QAAQ,CAAC,EAC1E,YAAc,mBAAmBD,EAAWC,EAAM,UAAW,MAAM,CAAC,EACtE,MAAM,uBAAwB,CAC5B,OAAQ,OACR,QAAS,CAAE,eAAgB,mCAAoC,EAC/D,MACF,CAAC,CAAC,CAAC,UAAY,CAAkE,CAAC,CACpF,CACF,CAEA,SAASe,GAAmB,CAC1B,GAAI,CAACL,EAAK,OACV,IAAMN,EAAOL,EAAWC,EAAM,OAAQ,QAAQ,EACxCK,EAAUN,EAAWC,EAAM,UAAW,MAAM,EAClDU,EAAI,iBAAmC,kBAAkB,CAAC,CAAC,QAAS,GAAU,CAC5E,EAAM,QAAUM,EAAM,QAAUZ,CAClC,CAAC,EACDM,EAAI,iBAAmC,qBAAqB,CAAC,CAAC,QAAS,GAAU,CAC/E,EAAM,QAAUM,EAAM,QAAUX,CAClC,CAAC,CACH,CAGA,SADwB,eAAe,cAClC,CAAC,EAAE,iBAAiB,YAAe,CACtC,IAAMY,EAAOd,EAAcH,CAAI,IAAM,OAAS,QAAU,OACxDY,EAAQJ,EAAc,UAAY,OAAQS,CAAI,EAC9CN,EAAM,EACNI,EAAW,CACb,CAAC,EAED,IAAMG,EAAS,SAAS,eAAe,gBAAgB,EACnDA,GAAUR,IACZQ,EAAO,iBAAiB,QAAU,GAAU,CAC1CC,EAAM,gBAAgB,EACtB,EAAI,OAAS,CAACT,EAAI,MACpB,CAAC,EACDA,EAAI,iBAAiB,SAAW,GAAU,CAClCS,EAAM,kBAAkB,mBAC9BP,EAAQO,EAAM,OAAO,OAAS,OAAS,OAAS,UAAWA,EAAM,OAAO,KAAK,EAC7ER,EAAM,EACR,CAAC,EACD,SAAS,iBAAiB,QAAU,GAAU,CACxC,CAACD,EAAI,QAAUS,EAAM,kBAAkB,MAAQ,CAACT,EAAI,SAASS,EAAM,MAAM,GAAKA,EAAM,SAAWD,IACjG,EAAI,OAAS,GAEjB,CAAC,EACD,SAAS,iBAAiB,UAAY,GAAU,CAC1CC,EAAM,MAAQ,WAAU,EAAI,OAAS,GAC3C,CAAC,GAGH,WAAW,8BAA8B,CAAC,CAAC,iBAAiB,SAAUR,CAAK,EAC3EI,EAAW,EACXJ,EAAM,CACR,EAAA,CAAG,C"}