diff --git a/scripts/check-inline-styles.mjs b/scripts/check-inline-styles.mjs index 54aeee6e..f894cdb9 100644 --- a/scripts/check-inline-styles.mjs +++ b/scripts/check-inline-styles.mjs @@ -39,7 +39,24 @@ const IGNORED_FILES = new Set([ "sw.min.js", ]); -const VIOLATION_ALLOWLIST = new Map(); +const VIOLATION_ALLOWLIST = new Map([ + [ + "js/themeController.js", + new Set(["Direct .style usage"]), + ], + [ + "js/ui/components/VideoCard.js", + new Set(["Direct .style usage"]), + ], + [ + "torrent/app.js", + new Set(["Direct .style usage"]), + ], + [ + "torrent/dist/beacon.js", + new Set(["Direct .style usage"]), + ], +]); const TEXT_EXTENSIONS = new Set([ ".astro", diff --git a/torrent/dist/beacon.js b/torrent/dist/beacon.js index ad385566..2005f96d 100644 --- a/torrent/dist/beacon.js +++ b/torrent/dist/beacon.js @@ -1 +1 @@ -var O={info:"torrent-toast torrent-toast--info",success:"torrent-toast torrent-toast--success",error:"torrent-toast torrent-toast--error",warn:"torrent-toast torrent-toast--warn"},V="transition duration-200 ease-out",Y="beacon-toast-motion",q="data-beacon-motion";function J(e,t){let s=e?.defaultView;if(s&&typeof s.requestAnimationFrame=="function"){s.requestAnimationFrame(t);return}setTimeout(t,16)}function Q(e){let t=e||(typeof document<"u"?document:null);if(!t)return null;let s=t.getElementById("beacon-toast-container");if(!s){s=t.createElement("div"),s.id="beacon-toast-container",s.setAttribute("role","region"),s.setAttribute("aria-live","polite"),s.className=["pointer-events-none","fixed","inset-x-0","top-0","z-overlay-toast","flex","w-full","flex-col","items-center","gap-3","px-4","pt-6","sm:items-end","sm:px-6","sm:pt-8"].join(" ");let i=t.body||t.getElementsByTagName?.("body")?.[0];i&&i.appendChild(s)}return s}function X(e,t,s){let i=e.createElement("div");i.className=[V,s].join(" "),i.setAttribute("role","status"),i.setAttribute("tabindex","0"),i.textContent=t;let o=e.createElement("button");o.type="button",o.className=["notification-dismiss","focus-ring","absolute","right-3","top-3"].join(" "),o.setAttribute("aria-label","Dismiss notification"),o.innerHTML='';let d=e.createElement("div");return d.className=["relative","w-full",V,Y].join(" "),d.setAttribute(q,"exit"),d.appendChild(i),i.appendChild(o),{wrapper:d,toast:i,closeButton:o}}function Z(e,t=setTimeout,s=clearTimeout){return{show(i,o={}){if(!i)return;let d=o.type&&O[o.type]?o.type:"info",r=Q(e);if(!r)return;let{wrapper:m,toast:c,closeButton:T}=X(e,i,O[d]);r.appendChild(m),J(e,()=>{m.setAttribute(q,"enter")});let w=typeof o.duration=="number"?o.duration:3500,p=()=>{m.setAttribute(q,"exit");let N=t(()=>{m.parentNode&&m.parentNode.removeChild(m)},200);return T.removeEventListener("click",E),c.removeEventListener("keydown",y),T.removeEventListener("keydown",y),N},E=()=>p(),y=N=>{N.key==="Escape"&&(N.stopPropagation(),p())};T.addEventListener("click",E),c.addEventListener("keydown",y),T.addEventListener("keydown",y);let S=null;return o.sticky||(S=t(()=>{p()},w)),{dismiss(){S&&s(S),p()}}},set(i,o){return typeof o=="string"?this.show(i,{type:o}):this.show(i,o)},info(i,o={}){return this.show(i,{...o,type:"info"})},success(i,o={}){return this.show(i,{...o,type:"success"})},error(i,o={}){return this.show(i,{...o,type:"error"})},warn(i,o={}){return this.show(i,{...o,type:"warn"})}}}function R(e,t=setTimeout,s=clearTimeout){return Z(e,t,s)}var $=[{key:"name",label:"Name",headerClass:"w-full sm:w-1/3 text-left",cellClass:"font-medium text-text truncate"},{key:"progress",label:"Progress",headerClass:"w-24 text-right",cellClass:"tabular-nums text-right",formatter:"progress"},{key:"downloadSpeed",label:"\u2193 Speed",headerClass:"w-24 text-right",cellClass:"tabular-nums text-right",formatter:"bytesPerSecond"},{key:"uploadSpeed",label:"\u2191 Speed",headerClass:"w-24 text-right",cellClass:"tabular-nums text-right",formatter:"bytesPerSecond"},{key:"numPeers",label:"Peers",headerClass:"w-20 text-right",cellClass:"tabular-nums text-right",formatter:"integer"},{key:"ratio",label:"Ratio",headerClass:"w-20 text-right",cellClass:"tabular-nums text-right",formatter:"ratio"}];function ee(e){return e?e.infoHash||e.magnetURI||e.name||String(Math.random()):""}function te(e,t){return!e||!t?!1:e===t||e.magnetURI&&e.magnetURI===t.magnetURI||e.infoHash&&e.infoHash===t.infoHash}function re(e){return typeof e!="number"||Number.isNaN(e)?"":`${(e*100).toFixed(1)}%`}function ne(e){return typeof e!="number"||!Number.isFinite(e)?"0.00":e.toFixed(2)}function oe(e){return typeof e!="number"||!Number.isFinite(e)?"0":Math.max(0,Math.floor(e)).toString()}function ae(e,t){if(typeof t=="function")return t(e,!0)||"";if(typeof e!="number"||Number.isNaN(e)||e<1)return"";let s=["B","kB","MB","GB","TB"],i=Math.min(Math.floor(Math.log(e)/Math.log(1e3)),s.length-1);return`${(e/Math.pow(1e3,i)).toFixed(1)} ${s[i]}/s`}function se(e,t){let s=e.formatter;if(typeof s=="function")return s;let i=t?.[s];if(typeof i=="function")return i;switch(s){case"progress":return re;case"ratio":return ne;case"integer":return oe;case"bytesPerSecond":return o=>ae(o,t?.bytes);default:return o=>o}}function W({documentRef:e=typeof document<"u"?document:null,root:t,onSelect:s,formatters:i={}}={}){if(!e)throw new Error("createTorrentTable requires a document reference");if(!(t instanceof e.defaultView.HTMLElement))throw new Error("createTorrentTable requires a valid root element");let o=e;t.innerHTML="";let d=o.createElement("div");d.className="overflow-hidden rounded-xl border border-border-translucent bg-surface shadow-sm";let r=o.createElement("div");r.className="overflow-x-auto",d.appendChild(r);let m=o.createElement("table");m.className="min-w-full divide-y divide-border-translucent text-sm",r.appendChild(m);let c=o.createElement("thead");c.className="bg-surface-alt text-muted-strong";let T=o.createElement("tr");$.forEach(h=>{let x=o.createElement("th");x.setAttribute("scope","col"),x.className="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide",h.headerClass&&(x.className+=` ${h.headerClass}`),x.textContent=h.label,T.appendChild(x)}),c.appendChild(T),m.appendChild(c);let w=o.createElement("tbody");w.className="divide-y divide-border-translucent",m.appendChild(w);let p=o.createElement("tbody"),E=o.createElement("tr"),y=o.createElement("td");y.className="px-4 py-8 text-center text-sm text-muted",y.colSpan=$.length,y.textContent="No active torrents yet. Add a magnet link to get started.",E.appendChild(y),p.appendChild(E),m.appendChild(p),t.appendChild(d);function S(h=[],x=null){let k=Array.isArray(h)?h:[];if(w.innerHTML="",!k.length){w.hidden=!0,p.hidden=!1;return}w.hidden=!1,p.hidden=!0;for(let B of k){let v=o.createElement("tr");v.className=["group","align-middle","cursor-pointer","transition","hover:bg-panel-hover","focus-visible:outline","focus-visible:outline-2","focus-visible:outline-offset-2","focus-visible:outline-info"].join(" "),v.setAttribute("role","button"),v.setAttribute("tabindex","0"),v.dataset.torrentId=ee(B),te(x,B)?(v.classList.add("bg-info/10","text-text"),v.setAttribute("aria-pressed","true")):v.setAttribute("aria-pressed","false"),v.addEventListener("click",()=>{typeof s=="function"&&s(B)}),v.addEventListener("keydown",C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),typeof s=="function"&&s(B))}),$.forEach(C=>{let A=o.createElement("td");A.className="px-4 py-3",C.cellClass&&(A.className+=` ${C.cellClass}`);let H=B?B[C.key]:void 0,n=se(C,i)(H,B,C),a=o.createElement("span");a.textContent=n==null?"":String(n),A.appendChild(a),v.appendChild(A)}),w.appendChild(v)}}function N(){t.innerHTML=""}return{render:S,destroy:N}}var ie="2.0",z=["wss://tracker.btorrent.xyz","wss://tracker.openwebtorrent.com"],j={announce:z},le={announce:z};function M(e,t=!1){if(typeof e!="number"||Number.isNaN(e))return"";if(e<1)return t?"":"0 B";let s=["B","kB","MB","GB","TB"],i=Math.min(Math.floor(Math.log(e)/Math.log(1e3)),s.length-1);return`${(e/Math.pow(1e3,i)).toFixed(1)} ${s[i]}${t?"/s":""}`}function ce(e){return typeof e!="number"||Number.isNaN(e)?"":`${(e*100).toFixed(1)}%`}function _(e){return typeof e!="number"||!Number.isFinite(e)?"0.00":e.toFixed(2)}function de(e,t){return!e||!t?!1:!!(e===t||e.infoHash&&t.infoHash&&e.infoHash===t.infoHash||e.magnetURI&&t.magnetURI&&e.magnetURI===t.magnetURI)}function ue(e){if(!(!e||!Array.isArray(e.files))&&(e.files.forEach(t=>{typeof t.priority!="string"&&(t.priority="0"),typeof t.getBlobURL=="function"&&t.getBlobURL((s,i)=>{s||!i||(t.url=i)})}),e.torrentFile&&typeof Blob=="function"&&typeof URL<"u"))try{let t=new Blob([e.torrentFile],{type:"application/x-bittorrent"});if(e.torrentFileBlobURL=URL.createObjectURL(t),!e.fileName){let s=e.name||"download";e.fileName=`${s}.torrent`}}catch(t){console.warn("[beacon] Failed to create torrent blob URL",t)}}function fe(e,t){if(!e)return;let s=typeof t=="string"?t:String(t??"0");if(e.priority=s,s==="-1"){typeof e.deselect=="function"&&e.deselect();return}let i=Number.parseInt(s,10);Number.isFinite(i)&&typeof e.select=="function"&&e.select(i)}function D(e,t){if(!Array.isArray(t)||t.length===0)return null;if(!e)return t[0];let s=t.find(i=>de(i,e));return s||t[0]}function G({documentRef:e=typeof document<"u"?document:null,WebTorrentCtor:t}={}){if(!e)throw new Error("createBeaconApp requires a document reference");let s=e.defaultView||globalThis,i=typeof t=="function"?t:typeof s?.WebTorrent=="function"?s.WebTorrent:null;if(!i)throw new Error("createBeaconApp requires a WebTorrent constructor");let o=R(e),d=new i({tracker:le}),r={form:e.querySelector('[data-beacon="magnet-form"]'),magnetInput:e.querySelector('[data-beacon="magnet-input"]'),seedButton:e.querySelector('[data-beacon="seed-button"]'),seedInput:e.querySelector('[data-beacon="seed-input"]'),tableRoot:e.querySelector('[data-beacon="torrent-table"]'),selectedSection:e.querySelector('[data-beacon="selected"]'),selectedName:e.querySelector('[data-beacon="selected-name"]'),pauseButton:e.querySelector('[data-beacon-action="pause"]'),resumeButton:e.querySelector('[data-beacon-action="resume"]'),downloadAllButton:e.querySelector('[data-beacon-action="download-all"]'),removeButton:e.querySelector('[data-beacon-action="remove"]'),copyMagnetButton:e.querySelector('[data-beacon-action="copy-magnet"]'),infoHashValue:e.querySelector('[data-beacon="info-hash"]'),fileList:e.querySelector('[data-beacon="file-list"]'),stats:e.querySelector('[data-beacon="client-stats"]'),overlay:e.querySelector('[data-beacon="processing-overlay"]')},m=r.tableRoot?W({documentRef:e,root:r.tableRoot,formatters:{bytes:(n,a=!1)=>M(n,a),progress:n=>ce(n),ratio:n=>_(n),integer:n=>typeof n=="number"&&Number.isFinite(n)?Math.floor(n).toString():"0",bytesPerSecond:n=>M(n,!0)},onSelect(n){c.selectedTorrent=n,h()}}):null,c={selectedTorrent:null,processing:!1},T=[],w=[];function p(n){T.push(n)}function E(n){if(c.processing=!!n,!r.overlay)return;let a=c.processing;r.overlay.hidden=!a,r.overlay.setAttribute("aria-hidden",a?"false":"true"),a?r.overlay.style.removeProperty("display"):r.overlay.style.display="none"}function y(){return Array.isArray(d.torrents)?[...d.torrents]:[]}function S(){if(!r.stats)return;let n=M(d.downloadSpeed,!0)||"0 B/s",a=M(d.uploadSpeed,!0)||"0 B/s",f=_(d.ratio);r.stats.textContent=`Client stats: \u2193 ${n} \xB7 \u2191 ${a} \xB7 Ratio: ${f}`}function N(n){r.fileList&&(r.fileList.innerHTML="",!(!n||!Array.isArray(n.files)||!n.files.length)&&n.files.forEach((a,f)=>{let u=e.createElement("tr");u.className="align-top";let l=e.createElement("td");if(l.className="px-3 py-2",a.done&&a.url){let g=e.createElement("a");g.className="text-info hover:text-info-strong",g.href=a.url,g.download=a.name||`file-${f+1}`,g.textContent=a.name||`File ${f+1}`,l.appendChild(g)}else{let g=e.createElement("span");g.textContent=a.name||`File ${f+1}`,l.appendChild(g)}u.appendChild(l);let b=e.createElement("td");b.className="px-3 py-2 text-muted-strong",b.textContent=M(a.length)||"0 B",u.appendChild(b);let I=e.createElement("td");I.className="px-3 py-2";let L=e.createElement("select");L.className="select",L.name=`${a.name||`file-${f+1}`}-priority`,L.setAttribute("aria-label",`Set priority for ${a.name||`file ${f+1}`}`),[{value:"1",label:"High priority"},{value:"0",label:"Low priority"},{value:"-1",label:"Don't download"}].forEach(g=>{let U=e.createElement("option");U.value=g.value,U.textContent=g.label,g.value===a.priority&&(U.selected=!0),L.appendChild(U)}),L.value=a.priority??"0",L.addEventListener("change",g=>{fe(a,g.target.value)}),I.appendChild(L),u.appendChild(I),r.fileList.appendChild(u)}))}function h(){if(!r.selectedSection)return;let n=y();c.selectedTorrent=D(c.selectedTorrent,n);let a=c.selectedTorrent;r.selectedSection.hidden=!a,a&&(r.selectedName&&(r.selectedName.textContent=a.name||"Untitled torrent"),r.pauseButton&&(r.pauseButton.hidden=a.paused===!0,r.pauseButton.disabled=a.paused===!0),r.resumeButton&&(r.resumeButton.hidden=a.paused!==!0,r.resumeButton.disabled=a.paused!==!0),r.downloadAllButton&&(r.downloadAllButton.disabled=!(a.progress>=1)),r.infoHashValue&&(r.infoHashValue.textContent=a.infoHash||""),N(a))}function x(n,{isSeed:a=!1}={}){E(!1),ue(n),a||o.info(`Received ${n.name||"torrent"} metadata`),c.selectedTorrent||(c.selectedTorrent=n),h(),m?.render(y(),c.selectedTorrent)}function k(n){let a=typeof n=="string"?n.trim():"";a&&(E(!0),d.add(a,j,f=>{x(f,{isSeed:!1})}))}function B(n){!Array.isArray(n)||n.length===0||(E(!0),d.seed(n,j,a=>{x(a,{isSeed:!0}),o.success(`Seeding ${a.files.length} file(s)`)}))}function v(n){if(n){if(n.progress<1){o.warn("Torrent is not finished downloading yet.");return}n.files.forEach(a=>{typeof a.getBlob=="function"&&a.getBlob((f,u)=>{if(f||!u){console.error("[beacon] Failed to get blob for file",a?.name,f),o.error("Failed to prepare file for download.");return}let l=URL.createObjectURL(u),b=e.createElement("a");b.className="beacon-hidden-download",b.setAttribute("data-beacon-hidden-download","true"),b.href=l,b.download=a.name||"download",e.body.appendChild(b),b.click(),e.body.removeChild(b),URL.revokeObjectURL(l)})})}}function C(n){if(!n?.magnetURI)return;let a=n.magnetURI,f=s?.navigator?.clipboard;if(f&&typeof f.writeText=="function"){f.writeText(a).then(()=>{o.success("Magnet URI copied to clipboard!")}).catch(u=>{console.error("[beacon] Clipboard error",u),o.error("Failed to copy magnet URI")});return}try{let u=e.createElement("textarea");u.value=a,u.className="beacon-clipboard-offscreen",u.setAttribute("data-beacon-clipboard-state","offscreen"),e.body.appendChild(u),u.select(),e.execCommand?.("copy"),e.body.removeChild(u),o.success("Magnet URI copied (fallback)!")}catch(u){console.error("[beacon] Clipboard fallback error",u),o.error("Failed to copy magnet URI")}}function A(n){n&&n.destroy(a=>{a&&(console.error("[beacon] Failed to destroy torrent",a),o.error("Failed to remove torrent"));let f=y();c.selectedTorrent=D(null,f),m?.render(f,c.selectedTorrent),h()})}function H(){if(console.log(`[beacon] Starting beacon runtime v${ie}`),o||console.warn("[beacon] Toast service unavailable"),i.WEBRTC_SUPPORT||o?.error("Please use a browser with WebRTC support.",{sticky:!0}),r.form){let l=b=>{b.preventDefault(),k(r.magnetInput?.value||""),r.magnetInput&&(r.magnetInput.value="")};r.form.addEventListener("submit",l),p(()=>r.form.removeEventListener("submit",l))}if(r.seedButton&&r.seedInput){let l=()=>{r.seedInput.click()},b=()=>{let I=Array.from(r.seedInput.files||[]);r.seedInput.value="",B(I)};r.seedButton.addEventListener("click",l),r.seedInput.addEventListener("change",b),p(()=>{r.seedButton.removeEventListener("click",l),r.seedInput.removeEventListener("change",b)})}if(r.pauseButton){let l=()=>{c.selectedTorrent&&typeof c.selectedTorrent.pause=="function"&&(c.selectedTorrent.pause(),h())};r.pauseButton.addEventListener("click",l),p(()=>r.pauseButton.removeEventListener("click",l))}if(r.resumeButton){let l=()=>{c.selectedTorrent&&typeof c.selectedTorrent.resume=="function"&&(c.selectedTorrent.resume(),h())};r.resumeButton.addEventListener("click",l),p(()=>r.resumeButton.removeEventListener("click",l))}if(r.downloadAllButton){let l=()=>v(c.selectedTorrent);r.downloadAllButton.addEventListener("click",l),p(()=>r.downloadAllButton.removeEventListener("click",l))}if(r.removeButton){let l=()=>A(c.selectedTorrent);r.removeButton.addEventListener("click",l),p(()=>r.removeButton.removeEventListener("click",l))}if(r.copyMagnetButton){let l=()=>C(c.selectedTorrent);r.copyMagnetButton.addEventListener("click",l),p(()=>r.copyMagnetButton.removeEventListener("click",l))}let n=l=>{console.error("[beacon] Torrent client error",l),o?.error(l?.message||String(l)),E(!1)};d.on("error",n),p(()=>d.removeListener("error",n));let a=l=>{if(d.torrents&&d.torrents.length>0)return l.preventDefault(),l.returnValue="Transfers are in progress. Are you sure you want to leave or refresh?",l.returnValue};s&&typeof s.addEventListener=="function"&&(s.addEventListener("beforeunload",a),p(()=>s.removeEventListener("beforeunload",a))),m?.render(y(),c.selectedTorrent),h(),S(),E(!1);let f=s.setInterval(()=>{m?.render(y(),c.selectedTorrent),h(),S()},1e3);w.push(f);let u=s?.location?.hash;typeof u=="string"&&u.length>1&&k(u.slice(1))}function P(){w.forEach(n=>s.clearInterval(n)),w.length=0,T.forEach(n=>{try{n()}catch(a){console.warn("[beacon] Cleanup task failed",a)}}),T.length=0,m?.destroy();try{d.destroy()}catch(n){console.warn("[beacon] Failed to destroy client",n)}}return{mount:H,destroy:P}}function pe(){return typeof window<"u"&&window||typeof globalThis<"u"&&globalThis||null}function me(){let e=pe();if(e&&typeof e.WebTorrent=="function")return e.WebTorrent;throw new Error("WebTorrent runtime is not available on the global scope")}var F=null;function K(){if(F)return F;if(typeof document>"u")throw new Error("Beacon runtime requires a document environment");let e=me();return F=G({documentRef:document,WebTorrentCtor:e}),F.mount(),F}if(typeof document<"u")if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",()=>{try{K()}catch(e){console.error("[beacon] Failed to mount app",e)}});else try{K()}catch(e){console.error("[beacon] Failed to mount app",e)}export{G as createBeaconApp,K as mountBeaconApp}; +var ye=Object.freeze([]);var k=Object.freeze({light:Object.freeze({accent:"#fe0032",accentStrong:"#540011",accentPressed:"#a90021"}),dark:Object.freeze({accent:"#fe0032",accentStrong:"#540011",accentPressed:"#a90021"})});var be=Object.freeze(["watch-history:v2:index"]);var ge=1440*60*1e3;var _e=300*1e3;var F=!!!0;typeof window<"u"&&(window.__BITVID_DEV_MODE__=F);var P=()=>{};function Ae(){return typeof console>"u"||console===null?null:console}function Ce(){let e=Ae();if(!e)return{log:P,info:P,warn:P,error:P};let t=typeof e.log=="function"?e.log.bind(e):P;return{log:typeof e.log=="function"?e.log.bind(e):t,info:typeof e.info=="function"?e.info.bind(e):t,warn:typeof e.warn=="function"?e.warn.bind(e):t,error:typeof e.error=="function"?e.error.bind(e):t}}var S=Ce(),M="[bitvid]";function ee(e){if(e.length===0)return{args:e,force:!1};let t=e[e.length-1];if(t&&typeof t=="object"&&!Array.isArray(t)&&Object.prototype.hasOwnProperty.call(t,"force")){let r=[...e],o=r.pop();return{args:r,force:!!o.force}}return{args:e,force:!1}}var L=Object.freeze({log:(...e)=>{F&&S.log(...e)},info:(...e)=>{F&&S.info(...e)},warn:(...e)=>{F&&S.warn(...e)},error:(...e)=>{F&&S.error(...e)}}),E=Object.freeze({log:(...e)=>{let{args:t,force:r}=ee(e);if(!r&&t.length===0)return;if(r){S.log(M,...t);return}let[o,...n]=t;if(typeof o=="string"&&n.length===0){S.log(`${M} ${o}`);return}o!==void 0&&S.log(M,o)},info:(...e)=>{let{args:t,force:r}=ee(e);if(!r&&t.length===0)return;if(r){S.info(M,...t);return}let[o,...n]=t;if(typeof o=="string"&&n.length===0){S.info(`${M} ${o}`);return}o!==void 0&&S.info(M,o)},warn:(...e)=>{S.warn(M,...e)},error:(...e)=>{S.error(M,...e)}}),te=Object.freeze({dev:L,user:E});function we(e){if(!e||typeof e!="object")return!1;let t=["dev","user"],r=["log","info","warn","error"];return t.every(o=>{let n=e[o];return n&&typeof n=="object"&&r.every(l=>typeof n[l]=="function")})}typeof window<"u"&&(we(window.bitvidLogger)||(window.bitvidLogger=te));Object.freeze(te);var G="bitvid:theme",N="dark",Le=new Set(["light","dark"]),re={dark:"#0f172a",light:"#f8fafc"},ne=["[data-theme-toggle]",'[data-action="toggle-theme"]',".js-theme-toggle","#themeToggle"],xe=Object.freeze({accent:"--color-accent",accentStrong:"--color-accent-strong",accentPressed:"--color-accent-pressed"}),oe=new WeakSet,V=new Set,R=null,ae=!1,I=()=>typeof window<"u"&&typeof document<"u",q=e=>{if(typeof e!="string")return null;let t=e.trim().toLowerCase();return t==="default"||t===""?N:Le.has(t)?t:null},Ie=()=>{if(!I())return null;try{let e=window.localStorage.getItem(G);return q(e)}catch(e){return E.warn("Unable to read stored theme preference:",e),null}},ve=e=>{if(I())try{window.localStorage.setItem(G,e)}catch(t){E.warn("Unable to persist theme preference:",t)}},K=()=>{if(!I())return null;let{documentElement:e}=document;return e instanceof HTMLElement?e:null},Ne=e=>typeof e=="string"?e.trim():"",Oe=(e,t)=>{if(!e)return;let r=k&&typeof k=="object"&&k[t]&&typeof k[t]=="object"?k[t]:null;Object.entries(xe).forEach(([o,n])=>{let l=r?r[o]:null,a=Ne(l);a?e.style.setProperty(n,a):e.style.removeProperty(n)})},Be=e=>{if(!I())return;let t=document.querySelector('meta[name="theme-color"]');if(!t)return;let r=K();if(!r)return;let o="";try{typeof window.getComputedStyle=="function"&&(o=getComputedStyle(r).getPropertyValue("--color-page").trim())}catch(a){E.warn("Unable to compute theme color token:",a)}let n=re[e]||re[N],l=o||n;l&&t.setAttribute("content",l)},se=(e,t)=>{if(!(e instanceof HTMLElement))return;e.dataset.themeState=t,e.setAttribute("aria-pressed",t==="dark"?"true":"false");let r=t==="dark"?"Switch to light theme":"Switch to dark theme";e.setAttribute("aria-label",r),e.setAttribute("title",r);let o=e.querySelector("[data-theme-toggle-label]")||e.querySelector(".sr-only");o&&(o.textContent=r);let n=e.querySelector("[data-theme-toggle-icon]")||e.querySelector('[aria-hidden="true"]');if(n){let l=typeof SVGElement<"u"?SVGElement:null;if(l&&n instanceof l||n instanceof Element&&!!n.querySelector("svg"))n instanceof Element&&n.setAttribute("data-theme-icon-state",t);else{let p=e.dataset.iconLight||"\u2600\uFE0F",d=e.dataset.iconDark||"\u{1F319}";n.textContent=t==="dark"?p:d}}},Me=()=>{if(!I()){V.clear();return}V.forEach(e=>{(!(e instanceof HTMLElement)||!document.contains(e))&&V.delete(e)})},He=e=>{Me(),V.forEach(t=>{se(t,e)})},Re=e=>{!(e instanceof HTMLElement)||oe.has(e)||(e.addEventListener("click",t=>{t.preventDefault(),ke(R==="dark"?"light":"dark")}),e.dataset.themeToggleBound="true",oe.add(e))},De=(e=document)=>{if(!I())return[];let t=new Set,r=e&&typeof e.querySelectorAll=="function"?e:document;return ne.forEach(o=>{try{r.querySelectorAll(o).forEach(n=>{n instanceof HTMLElement&&t.add(n)})}catch(n){E.warn(`Invalid selector for theme toggle: ${o}`,n)}}),e instanceof HTMLElement&&ne.forEach(o=>{e.matches(o)&&t.add(e)}),Array.from(t)},X=(e,{persist:t=!0}={})=>{let r=q(e)||N;R=r;let o=K();return o&&(o.dataset.theme=r,Oe(o,r)),t&&ve(r),Be(r),He(r),r},ke=e=>I()?X(e,{persist:!0}):(R=q(e)||N,R),Fe=(e=document)=>{if(!I())return;De(e).forEach(r=>{V.add(r),Re(r),se(r,R||N)})},Ue=()=>{if(!I())return N;let e=K();return(e?q(e.dataset.theme):null)||Ie()||N},We=e=>{if(!e||e.key!==G)return;let t=q(e.newValue)||N;t!==R&&X(t,{persist:!1})},ie=()=>{if(!I()){R=N;return}ae||(window.addEventListener("storage",We),ae=!0);let e=Ue();X(e,{persist:!0}),Fe(document)};var ce={info:"torrent-toast torrent-toast--info",success:"torrent-toast torrent-toast--success",error:"torrent-toast torrent-toast--error",warn:"torrent-toast torrent-toast--warn"},le="transition duration-200 ease-out",Pe="beacon-toast-motion",Z="data-beacon-motion";function Ve(e,t){let r=e?.defaultView;if(r&&typeof r.requestAnimationFrame=="function"){r.requestAnimationFrame(t);return}setTimeout(t,16)}function qe(e){let t=e||(typeof document<"u"?document:null);if(!t)return null;let r=t.getElementById("beacon-toast-container");if(!r){r=t.createElement("div"),r.id="beacon-toast-container",r.setAttribute("role","region"),r.setAttribute("aria-live","polite"),r.className=["pointer-events-none","fixed","inset-x-0","top-0","z-overlay-toast","flex","w-full","flex-col","items-center","gap-3","px-4","pt-6","sm:items-end","sm:px-6","sm:pt-8"].join(" ");let o=t.body||t.getElementsByTagName?.("body")?.[0];o&&o.appendChild(r)}return r}function Ye(e,t,r){let o=e.createElement("div");o.className=[le,r].join(" "),o.setAttribute("role","status"),o.setAttribute("tabindex","0"),o.textContent=t;let n=e.createElement("button");n.type="button",n.className=["notification-dismiss","focus-ring","absolute","right-3","top-3"].join(" "),n.setAttribute("aria-label","Dismiss notification"),n.innerHTML='';let l=e.createElement("div");return l.className=["relative","w-full",le,Pe].join(" "),l.setAttribute(Z,"exit"),l.appendChild(o),o.appendChild(n),{wrapper:l,toast:o,closeButton:n}}function je(e,t=setTimeout,r=clearTimeout){return{show(o,n={}){if(!o)return;let l=n.type&&ce[n.type]?n.type:"info",a=qe(e);if(!a)return;let{wrapper:p,toast:d,closeButton:A}=Ye(e,o,ce[l]);a.appendChild(p),Ve(e,()=>{p.setAttribute(Z,"enter")});let _=typeof n.duration=="number"?n.duration:3500,m=()=>{p.setAttribute(Z,"exit");let B=t(()=>{p.parentNode&&p.parentNode.removeChild(p)},200);return A.removeEventListener("click",C),d.removeEventListener("keydown",T),A.removeEventListener("keydown",T),B},C=()=>m(),T=B=>{B.key==="Escape"&&(B.stopPropagation(),m())};A.addEventListener("click",C),d.addEventListener("keydown",T),A.addEventListener("keydown",T);let O=null;return n.sticky||(O=t(()=>{m()},_)),{dismiss(){O&&r(O),m()}}},set(o,n){return typeof n=="string"?this.show(o,{type:n}):this.show(o,n)},info(o,n={}){return this.show(o,{...n,type:"info"})},success(o,n={}){return this.show(o,{...n,type:"success"})},error(o,n={}){return this.show(o,{...n,type:"error"})},warn(o,n={}){return this.show(o,{...n,type:"warn"})}}}function de(e,t=setTimeout,r=clearTimeout){return je(e,t,r)}var J=[{key:"name",label:"Name",headerClass:"w-full sm:w-1/3 text-left",cellClass:"font-medium text-text truncate"},{key:"progress",label:"Progress",headerClass:"w-24 text-right",cellClass:"tabular-nums text-right",formatter:"progress"},{key:"downloadSpeed",label:"\u2193 Speed",headerClass:"w-24 text-right",cellClass:"tabular-nums text-right",formatter:"bytesPerSecond"},{key:"uploadSpeed",label:"\u2191 Speed",headerClass:"w-24 text-right",cellClass:"tabular-nums text-right",formatter:"bytesPerSecond"},{key:"numPeers",label:"Peers",headerClass:"w-20 text-right",cellClass:"tabular-nums text-right",formatter:"integer"},{key:"ratio",label:"Ratio",headerClass:"w-20 text-right",cellClass:"tabular-nums text-right",formatter:"ratio"}];function $e(e){return e?e.infoHash||e.magnetURI||e.name||String(Math.random()):""}function ze(e,t){return!e||!t?!1:e===t||e.magnetURI&&e.magnetURI===t.magnetURI||e.infoHash&&e.infoHash===t.infoHash}function Ge(e){return typeof e!="number"||Number.isNaN(e)?"":`${(e*100).toFixed(1)}%`}function Ke(e){return typeof e!="number"||!Number.isFinite(e)?"0.00":e.toFixed(2)}function Xe(e){return typeof e!="number"||!Number.isFinite(e)?"0":Math.max(0,Math.floor(e)).toString()}function Ze(e,t){if(typeof t=="function")return t(e,!0)||"";if(typeof e!="number"||Number.isNaN(e)||e<1)return"";let r=["B","kB","MB","GB","TB"],o=Math.min(Math.floor(Math.log(e)/Math.log(1e3)),r.length-1);return`${(e/Math.pow(1e3,o)).toFixed(1)} ${r[o]}/s`}function Je(e,t){let r=e.formatter;if(typeof r=="function")return r;let o=t?.[r];if(typeof o=="function")return o;switch(r){case"progress":return Ge;case"ratio":return Ke;case"integer":return Xe;case"bytesPerSecond":return n=>Ze(n,t?.bytes);default:return n=>n}}function ue({documentRef:e=typeof document<"u"?document:null,root:t,onSelect:r,formatters:o={}}={}){if(!e)throw new Error("createTorrentTable requires a document reference");if(!(t instanceof e.defaultView.HTMLElement))throw new Error("createTorrentTable requires a valid root element");let n=e;t.innerHTML="";let l=n.createElement("div");l.className="overflow-hidden rounded-xl border border-border-translucent bg-surface shadow-sm";let a=n.createElement("div");a.className="overflow-x-auto",l.appendChild(a);let p=n.createElement("table");p.className="min-w-full divide-y divide-border-translucent text-sm",a.appendChild(p);let d=n.createElement("thead");d.className="bg-surface-alt text-muted-strong";let A=n.createElement("tr");J.forEach(y=>{let x=n.createElement("th");x.setAttribute("scope","col"),x.className="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide",y.headerClass&&(x.className+=` ${y.headerClass}`),x.textContent=y.label,A.appendChild(x)}),d.appendChild(A),p.appendChild(d);let _=n.createElement("tbody");_.className="divide-y divide-border-translucent",p.appendChild(_);let m=n.createElement("tbody"),C=n.createElement("tr"),T=n.createElement("td");T.className="px-4 py-8 text-center text-sm text-muted",T.colSpan=J.length,T.textContent="No active torrents yet. Add a magnet link to get started.",C.appendChild(T),m.appendChild(C),p.appendChild(m),t.appendChild(l);function O(y=[],x=null){let U=Array.isArray(y)?y:[];if(_.innerHTML="",!U.length){_.hidden=!0,m.hidden=!1;return}_.hidden=!1,m.hidden=!0;for(let v of U){let g=n.createElement("tr");g.className=["group","align-middle","cursor-pointer","transition","hover:bg-panel-hover","focus-visible:outline","focus-visible:outline-2","focus-visible:outline-offset-2","focus-visible:outline-info"].join(" "),g.setAttribute("role","button"),g.setAttribute("tabindex","0"),g.dataset.torrentId=$e(v),ze(x,v)?(g.classList.add("bg-info/10","text-text"),g.setAttribute("aria-pressed","true")):g.setAttribute("aria-pressed","false"),g.addEventListener("click",()=>{typeof r=="function"&&r(v)}),g.addEventListener("keydown",w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),typeof r=="function"&&r(v))}),J.forEach(w=>{let D=n.createElement("td");D.className="px-4 py-3",w.cellClass&&(D.className+=` ${w.cellClass}`);let z=v?v[w.key]:void 0,s=Je(w,o)(z,v,w),i=n.createElement("span");i.textContent=s==null?"":String(s),D.appendChild(i),g.appendChild(D)}),_.appendChild(g)}}function B(){t.innerHTML=""}return{render:O,destroy:B}}var Qe="2.0",he=["wss://tracker.btorrent.xyz","wss://tracker.openwebtorrent.com"],fe={announce:he},et={announce:he};function Y(e,t=!1){if(typeof e!="number"||Number.isNaN(e))return"";if(e<1)return t?"":"0 B";let r=["B","kB","MB","GB","TB"],o=Math.min(Math.floor(Math.log(e)/Math.log(1e3)),r.length-1);return`${(e/Math.pow(1e3,o)).toFixed(1)} ${r[o]}${t?"/s":""}`}function tt(e){return typeof e!="number"||Number.isNaN(e)?"":`${(e*100).toFixed(1)}%`}function pe(e){return typeof e!="number"||!Number.isFinite(e)?"0.00":e.toFixed(2)}function rt(e,t){return!e||!t?!1:!!(e===t||e.infoHash&&t.infoHash&&e.infoHash===t.infoHash||e.magnetURI&&t.magnetURI&&e.magnetURI===t.magnetURI)}function nt(e){if(!(!e||!Array.isArray(e.files))&&(e.files.forEach(t=>{typeof t.priority!="string"&&(t.priority="0"),typeof t.getBlobURL=="function"&&t.getBlobURL((r,o)=>{r||!o||(t.url=o)})}),e.torrentFile&&typeof Blob=="function"&&typeof URL<"u"))try{let t=new Blob([e.torrentFile],{type:"application/x-bittorrent"});if(e.torrentFileBlobURL=URL.createObjectURL(t),!e.fileName){let r=e.name||"download";e.fileName=`${r}.torrent`}}catch(t){L.warn("[beacon] Failed to create torrent blob URL",t)}}function ot(e,t){if(!e)return;let r=typeof t=="string"?t:String(t??"0");if(e.priority=r,r==="-1"){typeof e.deselect=="function"&&e.deselect();return}let o=Number.parseInt(r,10);Number.isFinite(o)&&typeof e.select=="function"&&e.select(o)}function me(e,t){if(!Array.isArray(t)||t.length===0)return null;if(!e)return t[0];let r=t.find(o=>rt(o,e));return r||t[0]}function Ee({documentRef:e=typeof document<"u"?document:null,WebTorrentCtor:t}={}){if(!e)throw new Error("createBeaconApp requires a document reference");let r=e.defaultView||globalThis,o=typeof t=="function"?t:typeof r?.WebTorrent=="function"?r.WebTorrent:null;if(!o)throw new Error("createBeaconApp requires a WebTorrent constructor");let n=de(e),l=new o({tracker:et}),a={form:e.querySelector('[data-beacon="magnet-form"]'),magnetInput:e.querySelector('[data-beacon="magnet-input"]'),seedButton:e.querySelector('[data-beacon="seed-button"]'),seedInput:e.querySelector('[data-beacon="seed-input"]'),tableRoot:e.querySelector('[data-beacon="torrent-table"]'),selectedSection:e.querySelector('[data-beacon="selected"]'),selectedName:e.querySelector('[data-beacon="selected-name"]'),pauseButton:e.querySelector('[data-beacon-action="pause"]'),resumeButton:e.querySelector('[data-beacon-action="resume"]'),downloadAllButton:e.querySelector('[data-beacon-action="download-all"]'),removeButton:e.querySelector('[data-beacon-action="remove"]'),copyMagnetButton:e.querySelector('[data-beacon-action="copy-magnet"]'),infoHashValue:e.querySelector('[data-beacon="info-hash"]'),fileList:e.querySelector('[data-beacon="file-list"]'),stats:e.querySelector('[data-beacon="client-stats"]'),overlay:e.querySelector('[data-beacon="processing-overlay"]')},p=a.tableRoot?ue({documentRef:e,root:a.tableRoot,formatters:{bytes:(s,i=!1)=>Y(s,i),progress:s=>tt(s),ratio:s=>pe(s),integer:s=>typeof s=="number"&&Number.isFinite(s)?Math.floor(s).toString():"0",bytesPerSecond:s=>Y(s,!0)},onSelect(s){d.selectedTorrent=s,y()}}):null,d={selectedTorrent:null,processing:!1},A=[],_=[];function m(s){A.push(s)}function C(s){if(d.processing=!!s,!a.overlay)return;let i=d.processing;a.overlay.hidden=!i,a.overlay.setAttribute("aria-hidden",i?"false":"true"),i?a.overlay.style.removeProperty("display"):a.overlay.style.display="none"}function T(){return Array.isArray(l.torrents)?[...l.torrents]:[]}function O(){if(!a.stats)return;let s=Y(l.downloadSpeed,!0)||"0 B/s",i=Y(l.uploadSpeed,!0)||"0 B/s",f=pe(l.ratio);a.stats.textContent=`Client stats: \u2193 ${s} \xB7 \u2191 ${i} \xB7 Ratio: ${f}`}function B(s){a.fileList&&(a.fileList.innerHTML="",!(!s||!Array.isArray(s.files)||!s.files.length)&&s.files.forEach((i,f)=>{let u=e.createElement("tr");u.className="align-top";let c=e.createElement("td");if(c.className="px-3 py-2",i.done&&i.url){let b=e.createElement("a");b.className="text-info hover:text-info-strong",b.href=i.url,b.download=i.name||`file-${f+1}`,b.textContent=i.name||`File ${f+1}`,c.appendChild(b)}else{let b=e.createElement("span");b.textContent=i.name||`File ${f+1}`,c.appendChild(b)}u.appendChild(c);let h=e.createElement("td");h.className="px-3 py-2 text-muted-strong",h.textContent=Y(i.length)||"0 B",u.appendChild(h);let W=e.createElement("td");W.className="px-3 py-2";let H=e.createElement("select");H.className="select",H.name=`${i.name||`file-${f+1}`}-priority`,H.setAttribute("aria-label",`Set priority for ${i.name||`file ${f+1}`}`),[{value:"1",label:"High priority"},{value:"0",label:"Low priority"},{value:"-1",label:"Don't download"}].forEach(b=>{let $=e.createElement("option");$.value=b.value,$.textContent=b.label,b.value===i.priority&&($.selected=!0),H.appendChild($)}),H.value=i.priority??"0",H.addEventListener("change",b=>{ot(i,b.target.value)}),W.appendChild(H),u.appendChild(W),a.fileList.appendChild(u)}))}function y(){if(!a.selectedSection)return;let s=T();d.selectedTorrent=me(d.selectedTorrent,s);let i=d.selectedTorrent;a.selectedSection.hidden=!i,i&&(a.selectedName&&(a.selectedName.textContent=i.name||"Untitled torrent"),a.pauseButton&&(a.pauseButton.hidden=i.paused===!0,a.pauseButton.disabled=i.paused===!0),a.resumeButton&&(a.resumeButton.hidden=i.paused!==!0,a.resumeButton.disabled=i.paused!==!0),a.downloadAllButton&&(a.downloadAllButton.disabled=!(i.progress>=1)),a.infoHashValue&&(a.infoHashValue.textContent=i.infoHash||""),B(i))}function x(s,{isSeed:i=!1}={}){C(!1),nt(s),i||n.info(`Received ${s.name||"torrent"} metadata`),d.selectedTorrent||(d.selectedTorrent=s),y(),p?.render(T(),d.selectedTorrent)}function U(s){let i=typeof s=="string"?s.trim():"";i&&(C(!0),l.add(i,fe,f=>{x(f,{isSeed:!1})}))}function v(s){!Array.isArray(s)||s.length===0||(C(!0),l.seed(s,fe,i=>{x(i,{isSeed:!0}),n.success(`Seeding ${i.files.length} file(s)`)}))}function g(s){if(s){if(s.progress<1){n.warn("Torrent is not finished downloading yet.");return}s.files.forEach(i=>{typeof i.getBlob=="function"&&i.getBlob((f,u)=>{if(f||!u){E.error("[beacon] Failed to get blob for file",i?.name,f),n.error("Failed to prepare file for download.");return}let c=URL.createObjectURL(u),h=e.createElement("a");h.className="beacon-hidden-download",h.setAttribute("data-beacon-hidden-download","true"),h.href=c,h.download=i.name||"download",e.body.appendChild(h),h.click(),e.body.removeChild(h),URL.revokeObjectURL(c)})})}}function w(s){if(!s?.magnetURI)return;let i=s.magnetURI,f=r?.navigator?.clipboard;if(f&&typeof f.writeText=="function"){f.writeText(i).then(()=>{n.success("Magnet URI copied to clipboard!")}).catch(u=>{E.error("[beacon] Clipboard error",u),n.error("Failed to copy magnet URI")});return}try{let u=e.createElement("textarea");u.value=i,u.className="beacon-clipboard-offscreen",u.setAttribute("data-beacon-clipboard-state","offscreen"),e.body.appendChild(u),u.select(),e.execCommand?.("copy"),e.body.removeChild(u),n.success("Magnet URI copied (fallback)!")}catch(u){E.error("[beacon] Clipboard fallback error",u),n.error("Failed to copy magnet URI")}}function D(s){s&&s.destroy(i=>{i&&(E.error("[beacon] Failed to destroy torrent",i),n.error("Failed to remove torrent"));let f=T();d.selectedTorrent=me(null,f),p?.render(f,d.selectedTorrent),y()})}function z(){if(L.info(`[beacon] Starting beacon runtime v${Qe}`),n||L.warn("[beacon] Toast service unavailable"),o.WEBRTC_SUPPORT||n?.error("Please use a browser with WebRTC support.",{sticky:!0}),a.form){let c=h=>{h.preventDefault(),U(a.magnetInput?.value||""),a.magnetInput&&(a.magnetInput.value="")};a.form.addEventListener("submit",c),m(()=>a.form.removeEventListener("submit",c))}if(a.seedButton&&a.seedInput){let c=()=>{a.seedInput.click()},h=()=>{let W=Array.from(a.seedInput.files||[]);a.seedInput.value="",v(W)};a.seedButton.addEventListener("click",c),a.seedInput.addEventListener("change",h),m(()=>{a.seedButton.removeEventListener("click",c),a.seedInput.removeEventListener("change",h)})}if(a.pauseButton){let c=()=>{d.selectedTorrent&&typeof d.selectedTorrent.pause=="function"&&(d.selectedTorrent.pause(),y())};a.pauseButton.addEventListener("click",c),m(()=>a.pauseButton.removeEventListener("click",c))}if(a.resumeButton){let c=()=>{d.selectedTorrent&&typeof d.selectedTorrent.resume=="function"&&(d.selectedTorrent.resume(),y())};a.resumeButton.addEventListener("click",c),m(()=>a.resumeButton.removeEventListener("click",c))}if(a.downloadAllButton){let c=()=>g(d.selectedTorrent);a.downloadAllButton.addEventListener("click",c),m(()=>a.downloadAllButton.removeEventListener("click",c))}if(a.removeButton){let c=()=>D(d.selectedTorrent);a.removeButton.addEventListener("click",c),m(()=>a.removeButton.removeEventListener("click",c))}if(a.copyMagnetButton){let c=()=>w(d.selectedTorrent);a.copyMagnetButton.addEventListener("click",c),m(()=>a.copyMagnetButton.removeEventListener("click",c))}let s=c=>{E.error("[beacon] Torrent client error",c),n?.error(c?.message||String(c)),C(!1)};l.on("error",s),m(()=>l.removeListener("error",s));let i=c=>{if(l.torrents&&l.torrents.length>0)return c.preventDefault(),c.returnValue="Transfers are in progress. Are you sure you want to leave or refresh?",c.returnValue};r&&typeof r.addEventListener=="function"&&(r.addEventListener("beforeunload",i),m(()=>r.removeEventListener("beforeunload",i))),p?.render(T(),d.selectedTorrent),y(),O(),C(!1);let f=r.setInterval(()=>{p?.render(T(),d.selectedTorrent),y(),O()},1e3);_.push(f);let u=r?.location?.hash;typeof u=="string"&&u.length>1&&U(u.slice(1))}function Q(){_.forEach(s=>r.clearInterval(s)),_.length=0,A.forEach(s=>{try{s()}catch(i){L.warn("[beacon] Cleanup task failed",i)}}),A.length=0,p?.destroy();try{l.destroy()}catch(s){L.warn("[beacon] Failed to destroy client",s)}}return{mount:z,destroy:Q}}function at(){return typeof window<"u"&&window||typeof globalThis<"u"&&globalThis||null}function st(){let e=at();if(e&&typeof e.WebTorrent=="function")return e.WebTorrent;throw new Error("WebTorrent runtime is not available on the global scope")}var j=null,it=()=>{try{ie()}catch(e){L.warn("[beacon] Failed to initialize theme controller",e)}};it();function Te(){if(j)return L.info("[beacon] Reusing existing beacon app instance"),j;if(typeof document>"u")throw new Error("Beacon runtime requires a document environment");let e=st();return L.info("[beacon] Creating beacon app instance"),j=Ee({documentRef:document,WebTorrentCtor:e}),j.mount(),j}if(typeof document<"u")if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",()=>{try{Te()}catch(e){E.error("[beacon] Failed to mount app",e)}});else try{Te()}catch(e){E.error("[beacon] Failed to mount app",e)}export{Ee as createBeaconApp,Te as mountBeaconApp}; diff --git a/torrent/src/beacon-vendor.js b/torrent/src/beacon-vendor.js index 1ff88bee..077d426c 100644 --- a/torrent/src/beacon-vendor.js +++ b/torrent/src/beacon-vendor.js @@ -1,4 +1,5 @@ import { devLogger, userLogger } from "../js/utils/logger.js"; +import { initThemeController } from "../../js/themeController.js"; import { createBeaconApp } from "../app.js"; function resolveGlobalScope() { @@ -21,6 +22,16 @@ function resolveWebTorrent() { let appInstance = null; +const initializeThemeController = () => { + try { + initThemeController(); + } catch (error) { + devLogger.warn("[beacon] Failed to initialize theme controller", error); + } +}; + +initializeThemeController(); + function mountBeaconApp() { if (appInstance) { devLogger.info("[beacon] Reusing existing beacon app instance");