From 57a150509d0fe086dd91c392a8cb4c76b454ea44 Mon Sep 17 00:00:00 2001 From: fynks <75840152+fynks@users.noreply.github.com> Date: Mon, 25 Aug 2025 10:33:36 +0500 Subject: [PATCH] Remove minified JavaScript file for app --- dist/js/app-min.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 dist/js/app-min.js diff --git a/dist/js/app-min.js b/dist/js/app-min.js deleted file mode 100644 index 6ca0b42..0000000 --- a/dist/js/app-min.js +++ /dev/null @@ -1 +0,0 @@ -const Utils=(()=>{const e=new WeakMap;return{debounce(t,n=300,s=!1){if(e.has(t))return e.get(t);let a;const r=function(...e){const r=s&&!a;clearTimeout(a),r&&t.apply(this,e),a=setTimeout(()=>{a=null,s||t.apply(this,e)},n)};return e.set(t,r),r},throttle(e,t=100){let n=!1;return function(...s){n||(e.apply(this,s),n=!0,requestAnimationFrame(()=>{setTimeout(()=>n=!1,t)}))}},animateOnScroll:(()=>{let e;return(t,n={})=>{"IntersectionObserver"in window&&(e||(e=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(t.target.classList.add("animate-in"),e.unobserve(t.target))})},{threshold:.1,rootMargin:"0px 0px -50px 0px",...n})),t.forEach(t=>e.observe(t)))}})()}})();class LoadingManager{constructor(){this.activeLoaders=new Map,this.template=this.createTemplate()}createTemplate(){const e=document.createElement("template");return e.innerHTML='\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n ',e}show(e,t="Loading..."){const n="string"==typeof e?document.querySelector(e):e;if(!n)return null;const s=`loader-${Date.now()}-${Math.random().toString(36).slice(2)}`,a=this.template.content.cloneNode(!0).firstElementChild;a.dataset.loaderId=s,a.querySelector(".loading-text").textContent=t;return"static"===getComputedStyle(n).position&&(n.style.position="relative"),n.appendChild(a),this.activeLoaders.set(s,a),requestAnimationFrame(()=>a.classList.add("loading-overlay--visible")),s}hide(e,t){const n=this.activeLoaders.get(t);n&&(n.classList.add("loading-overlay--hiding"),this.activeLoaders.delete(t),setTimeout(()=>n.remove(),250))}hideAll(){this.activeLoaders.forEach((e,t)=>this.hide(null,t))}}class TableManager{constructor(e,t,n,s={}){this.elements={container:document.getElementById(e),searchInput:document.getElementById(t),clearIcon:document.getElementById(n)},this.options={sortable:!0,filterable:!0,pagination:!1,itemsPerPage:50,...s},this.state={currentData:{},filteredData:{},currentSort:{column:null,direction:"asc"},currentPage:1,services:[],isIndexedFormat:!1},this.handleSearch=Utils.debounce(this._performSearch.bind(this),250),this.handleSort=this._performSort.bind(this),this._init()}_init(){this.elements.searchInput&&(this.elements.searchInput.addEventListener("input",this.handleSearch),this.elements.searchInput.addEventListener("keydown",e=>{"Escape"===e.key&&this._clearSearch()})),this.elements.clearIcon&&this.elements.clearIcon.addEventListener("click",()=>this._clearSearch())}_transformIndexedData(e){const{services:t,supported:n}=e,s={};for(const[e,a]of Object.entries(n))s[e]={},t.forEach((t,n)=>{s[e][t]=a.includes(n)?"yes":"no"});return this.state.services=t,this.state.isIndexedFormat=!0,s}generateTable(e={}){if(!this.elements.container)return;let t;if(e.services&&e.supported)t=this._transformIndexedData(e);else{t=e,this.state.isIndexedFormat=!1;const n=Object.values(t)[0];this.state.services=n?Object.keys(n):[]}if(!Object.keys(t).length)return void(this.elements.container.innerHTML='

No data available.

');this.state.currentData=t,this.state.filteredData={...t};const n=Object.keys(t)[0],s=n?Object.keys(t[n]):[],a=this.elements.container.id.replace("-container",""),r=document.createDocumentFragment(),i=document.createElement("div");i.className="table-wrapper";const o=document.createElement("table");o.id=a,o.className="enhanced-table",o.setAttribute("aria-label","Service Comparison Table");const l=document.createElement("thead");l.innerHTML=this._generateTableHeader(s),o.appendChild(l);const c=document.createElement("tbody");c.innerHTML=this._generateTableRows(this.state.filteredData,s),o.appendChild(c),i.appendChild(o),r.appendChild(i),this.elements.container.innerHTML="",this.elements.container.appendChild(r),this._attachTableEvents()}_generateTableHeader(e){return`\n \n \n Service Name\n \n \n ${e.map(e=>`\n \n ${e}\n \n \n `).join("")}\n \n `}_generateTableRows(e,t){const n=[];for(const[s,a]of Object.entries(e))n.push(`\n \n \n
\n ${s}\n
\n \n ${t.map(e=>{const t="yes"===a[e];return`\n \n \n ${t?'':''}\n \n \n `}).join("")}\n \n `);return n.join("")}_attachTableEvents(){if(!this.options.sortable)return;const e=this.elements.container.querySelector("thead");e&&(e.addEventListener("click",this.handleSort),e.addEventListener("keydown",e=>{const t=e.target.closest(".sortable");!t||"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),this.handleSort({target:t}))}))}_performSearch(){const e=(this.elements.searchInput?.value||"").toLowerCase().trim();e?(this.state.filteredData=Object.fromEntries(Object.entries(this.state.currentData).filter(([t])=>t.toLowerCase().includes(e))),this.elements.clearIcon&&(this.elements.clearIcon.style.display="block")):(this.state.filteredData={...this.state.currentData},this.elements.clearIcon&&(this.elements.clearIcon.style.display="none")),this._updateTableContent(),this._updateSearchResults(e)}_clearSearch(){this.elements.searchInput&&(this.elements.searchInput.value=""),this.state.filteredData={...this.state.currentData},this.elements.clearIcon&&(this.elements.clearIcon.style.display="none"),this._updateTableContent(),this._updateSearchResults("")}_updateSearchResults(e){if(!this.elements.container)return;let t=this.elements.container.querySelector(".search-results");if(e){const e=Object.keys(this.state.filteredData).length,n=Object.keys(this.state.currentData).length;t||(t=document.createElement("div"),t.className="search-results",this.elements.container.insertBefore(t,this.elements.container.firstChild)),t.textContent=`Showing ${e} of ${n} services`,t.style.display="block",t.style.textAlign="center",t.style.padding="0.5em 0"}else t&&(t.style.display="none")}_performSort(e){const t=e.target.closest(".sortable");if(!t)return;const n=t.dataset.column,{currentSort:s}=this.state,a=s.column===n&&"asc"===s.direction?"desc":"asc";this.state.currentSort={column:n,direction:a},this.elements.container.querySelectorAll("th.sortable").forEach(e=>{e.setAttribute("aria-sort","none"),e.classList.remove("sorted-asc","sorted-desc")}),t.setAttribute("aria-sort","asc"===a?"ascending":"descending"),t.classList.add(`sorted-${a}`),this._sortData(),this._updateTableContent()}_sortData(){const{column:e,direction:t}=this.state.currentSort,n=Object.entries(this.state.filteredData);n.sort(([n,s],[a,r])=>{let i,o;"service"===e?(i=n.toLowerCase(),o=a.toLowerCase()):(i="yes"===s[e]?1:0,o="yes"===r[e]?1:0);let l=0;return i>o?l=1:i{e.innerHTML=this._generateTableRows(this.state.filteredData,n)})}}class ComparisonManager{constructor(e,t,n,s){if(this.elements={container:document.getElementById(e),select1:document.getElementById(t),select2:document.getElementById(n)},this.data=s,this.isComparing=!1,this.handleCompare=this._generateCompareTable.bind(this),this.services=[],s.services&&s.supported)this.services=s.services,this.isIndexedFormat=!0;else{const e=Object.values(s)[0];this.services=e?Object.keys(e):[],this.isIndexedFormat=!1}this._init()}_init(){this._populateDropdowns(),this.elements.select1&&this.elements.select1.addEventListener("change",this.handleCompare),this.elements.select2&&this.elements.select2.addEventListener("change",this.handleCompare),document.addEventListener("keydown",e=>{this.isComparing&&"Escape"===e.key&&this._closeComparison()})}_populateDropdowns(){const e=''+this.services.map(e=>``).join("");[this.elements.select1,this.elements.select2].forEach(t=>{t&&(t.innerHTML=e)})}_getHostData(e){if(this.isIndexedFormat){const t=this.data.supported[e]||[],n={};return this.services.forEach((e,s)=>{n[e]=t.includes(s)?"yes":"no"}),n}return this.data[e]||{}}_generateCompareTable(){const e=this.elements.select1?.value,t=this.elements.select2?.value;if(!e||!t)return void this._showEmptyState();if(e===t)return void this._showSameProviderWarning();this.isComparing=!0;const n=loadingManager.show(this.elements.container,"Generating comparison...");requestAnimationFrame(()=>{this._renderComparisonTable(e,t),loadingManager.hide(this.elements.container,n)})}_renderComparisonTable(e,t){const n=this._calculateComparisonStats(e,t),s=document.createDocumentFragment(),a=document.createElement("div");a.innerHTML=`\n
\n

Comparing ${e} vs ${t}

\n
\n
Shared Support${n.shared}
\n
${e} Only${n.service1Only}
\n
${t} Only${n.service2Only}
\n
\n
\n \n
\n
\n\n
\n \n \n \n
\n\n
\n \n \n \n \n \n \n \n \n \n \n ${this._generateComparisonRows(e,t)}\n \n
Service Name${e}${t}Status
\n
\n `,s.appendChild(a),this.elements.container.innerHTML="",this.elements.container.appendChild(s),this.elements.container.style.display="block",this._attachComparisonEvents(),requestAnimationFrame(()=>{this.elements.container.classList.add("comparison-visible")})}_generateComparisonRows(e,t){const n=[],s='',a='',r=this.isIndexedFormat?Object.keys(this.data.supported):Object.keys(this.data);for(const i of r){const r=this._getHostData(i),o="yes"===r[e],l="yes"===r[t];let c="neither-supported",d="Neither";o&&l?(c="both-supported",d="Both"):o?(c="service1-only",d=`${e} only`):l&&(c="service2-only",d=`${t} only`),n.push(`\n \n ${i}\n \n \n ${o?s:a}\n \n \n \n \n ${l?s:a}\n \n \n ${d}\n \n `)}return n.join("")}_calculateComparisonStats(e,t){let n=0,s=0,a=0;const r=this.isIndexedFormat?Object.keys(this.data.supported):Object.keys(this.data);for(const i of r){const r=this._getHostData(i),o="yes"===r[e],l="yes"===r[t];o&&l?n++:o?s++:l&&a++}return{shared:n,service1Only:s,service2Only:a}}_attachComparisonEvents(){const e=this.elements.container.querySelector("#close-compare");e&&e.addEventListener("click",()=>this._closeComparison()),this.elements.container.addEventListener("change",e=>{"comparison-filter"===e.target.name&&this._filterComparison(e.target.value)})}_filterComparison(e){const t=this.elements.container.querySelectorAll(".comparison-row");let n=0;t.forEach(t=>{const s=t.dataset.status,a="all"===e||"both"===e&&"both-supported"===s||"different"===e&&("service1-only"===s||"service2-only"===s);t.style.display=a?"":"none",a&&n++});let s=this.elements.container.querySelector(".filter-results");if(!s){s=document.createElement("div"),s.className="filter-results";const e=this.elements.container.querySelector(".table-wrapper");e.parentNode.insertBefore(s,e)}s.textContent=`Showing ${n} services`}_closeComparison(){this.elements.container.classList.add("comparison-hiding"),setTimeout(()=>{this.elements.container.style.display="none",this.elements.container.classList.remove("comparison-visible","comparison-hiding"),this.isComparing=!1,this._showEmptyState()},250)}_showEmptyState(){this.elements.container.innerHTML='\n
\n \n

Ready to Compare

\n

Select two services above to see a detailed comparison

\n
\n ',this.elements.container.style.display="block"}_showSameProviderWarning(){this.elements.container.innerHTML='\n
\n
⚠️
\n

Same Service Selected

\n

Please select two different services to compare

\n
\n ',this.elements.container.style.display="block"}}class PricingManager{constructor(e){this.container=document.getElementById(`${e}-table-container`),this.currentData=null,this._onMouseOver=this._onMouseOver.bind(this),this._onMouseOut=this._onMouseOut.bind(this),this._onMouseLeaveContainer=this._onMouseLeaveContainer.bind(this)}generatePricingTable(e={}){if(!this.container)return;if(!e.plans?.length)return void(this.container.innerHTML='

Error: Invalid pricing data structure.

');this.currentData=e;const t=Object.keys(e.plans[0]).filter(e=>"name"!==e),n=document.createDocumentFragment(),s=document.createElement("div");s.className="table-wrapper";const a=document.createElement("table");a.id="pricing-table",a.className="pricing-table",a.setAttribute("aria-label","Service Pricing Table");const r=document.createElement("thead");r.innerHTML=`\n \n Plans\n ${t.map(e=>`\n \n
\n ${e}\n
\n \n `).join("")}\n \n `;const i=document.createElement("tbody");i.innerHTML=e.plans.map((e,n)=>`\n \n ${e.name}\n ${t.map(t=>{const n=e[t],s=!isNaN(parseFloat(n));return`\n \n
\n ${n}\n ${s?'/month':""}\n
\n \n `}).join("")}\n \n `).join(""),a.appendChild(r),a.appendChild(i),s.appendChild(a),n.appendChild(s),this.container.innerHTML="",this.container.appendChild(n),this._setupPricingFeatures()}_setupPricingFeatures(){this.container.addEventListener("mouseover",this._onMouseOver),this.container.addEventListener("mouseout",this._onMouseOut),this.container.addEventListener("mouseleave",this._onMouseLeaveContainer)}_onMouseOver(e){const t=e.target.closest(".price-cell");if(!t||!this.container.contains(t))return;const n=Array.from(t.parentNode.children).indexOf(t);n>=0&&this._highlightColumn(n+1)}_onMouseOut(e){const t=e.relatedTarget;t&&this.container.contains(t)||this._removeColumnHighlight()}_onMouseLeaveContainer(){this._removeColumnHighlight()}_highlightColumn(e){const t=this.container.querySelector("table");if(!t)return;const n=t.querySelectorAll(`tbody td:nth-child(${e+1}), thead th:nth-child(${e+1})`);this._removeColumnHighlight(),n.forEach(e=>e.classList.add("highlighted"))}_removeColumnHighlight(){this.container.querySelectorAll(".highlighted").forEach(e=>e.classList.remove("highlighted"))}}class PerformanceMonitor{constructor(){this.marks=new Map,this.mark("start")}mark(e){this.marks.set(e,performance.now())}measure(e,t="start"){const n=this.marks.get(t)||performance.now();return performance.now()-n}log(e,t="start"){console.log(`${e}: ${this.measure(e,t).toFixed(2)}ms`)}}function setupURLComparison(){const e=new URLSearchParams(window.location.search),t=e.get("compare"),n=e.get("with");t&&n&&requestAnimationFrame(()=>{const e=document.getElementById("provider1"),s=document.getElementById("provider2");e&&s&&(e.value=t,s.value=n,e.dispatchEvent(new Event("change")))})}function setupScrollAnimations(){const e=document.querySelectorAll(".section, .status-card, .referral-card");e.length&&Utils.animateOnScroll(e)}function setupOfflineDetection(){const e=()=>{console.log(navigator.onLine?"Connection restored":"You are offline. Some features may not work.")};window.addEventListener("online",e),window.addEventListener("offline",e)}function setupBackToTop(){const e=document.getElementById("backToTop");if(!e)return;const t=Utils.throttle(()=>{window.pageYOffset>300?e.classList.add("visible"):e.classList.remove("visible")},150);window.addEventListener("scroll",t,{passive:!0}),e.addEventListener("click",()=>window.scrollTo({top:0,behavior:"smooth"}))}function setupNavHighlight(){const e=Array.from(document.querySelectorAll('.header-nav .nav-link[href^="#"]'));if(!("IntersectionObserver"in window)||!e.length)return;const t=e.map(e=>document.querySelector(e.getAttribute("href"))).filter(Boolean),n=new Map;e.forEach(e=>n.set(e.getAttribute("href"),e));const s=new IntersectionObserver(t=>{t.forEach(t=>{const s=`#${t.target.id}`,a=n.get(s);a&&t.isIntersecting&&(e.forEach(e=>e.removeAttribute("aria-current")),a.setAttribute("aria-current","page"))})},{rootMargin:"-40% 0px -50% 0px",threshold:.1});t.forEach(e=>s.observe(e))}function setupAgeVerification(){const e=document.getElementById("age-verification-overlay"),t=document.getElementById("adult-content"),n=document.getElementById("confirm-age"),s=document.getElementById("deny-age"),a=document.querySelector(".page-wrapper"),r=document.getElementById("adult-hosts");if(!e||!r)return;const i=e.querySelector(".age-verification-modal"),o=e.querySelector(".age-verification-content h3");if(i&&(i.setAttribute("role","dialog"),i.setAttribute("aria-modal","true"),o)){const e="age-title";o.id=e,i.setAttribute("aria-labelledby",e)}const l=e=>{a&&("inert"in a?a.inert=e:a.setAttribute("aria-hidden",String(e)))};let c=null;const d=()=>{e.style.display="flex",e.setAttribute("aria-hidden","false"),l(!0),c=(e=>{const t=Array.from(e.querySelectorAll('a[href], area[href], button, input, select, textarea, details, summary, [tabindex]:not([tabindex="-1"])')).filter(e=>!e.hasAttribute("disabled")&&"true"!==e.getAttribute("aria-hidden")),n=t[0],a=t[t.length-1],r=e=>{if("Escape"===e.key)s?.click();else if("Tab"===e.key){if(0===t.length)return void e.preventDefault();e.shiftKey&&document.activeElement===n?(e.preventDefault(),a.focus()):e.shiftKey||document.activeElement!==a||(e.preventDefault(),n.focus())}};return e.addEventListener("keydown",r),n?.focus(),()=>e.removeEventListener("keydown",r)})(i||e)},h=()=>{e.style.display="none",e.setAttribute("aria-hidden","true"),l(!1),"function"==typeof c&&c()};if("true"===localStorage.getItem("age-confirmed")&&(e.style.display="none",t&&(t.style.display="block")),n?.addEventListener("click",()=>{localStorage.setItem("age-confirmed","true"),t&&(t.style.display="block"),h()}),s?.addEventListener("click",()=>{document.getElementById("what-are-debrid")?.scrollIntoView({behavior:"smooth"}),h()}),"IntersectionObserver"in window){new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&"true"!==localStorage.getItem("age-confirmed")&&d()})},{threshold:.1}).observe(r)}}const loadingManager=new LoadingManager,performanceMonitor=new PerformanceMonitor;document.addEventListener("DOMContentLoaded",async()=>{performanceMonitor.mark("dom-ready"),performanceMonitor.log("DOM Ready");try{const e=new TableManager("file-hosts-table-container","host-search-input","clear-host-search"),t=new TableManager("adult-hosts-table-container","adult-host-search-input","clear-adult-host-search"),n=new PricingManager("pricing"),s=[loadingManager.show("#file-hosts-table-container","Loading file hosts..."),loadingManager.show("#adult-hosts-table-container","Loading adult hosts..."),loadingManager.show("#pricing-table-container","Loading pricing data...")],a=["./json/file-hosts-optimized.json","./json/adult-hosts-optimized.json","./json/pricing.json"],r=a.map(e=>fetch(e).then(t=>t.ok?t.json():Promise.reject(new Error(`HTTP ${t.status} for ${e}`))));(await Promise.allSettled(r)).forEach((r,i)=>{const o=["#file-hosts-table-container","#adult-hosts-table-container","#pricing-table-container"];if(loadingManager.hide(o[i],s[i]),"fulfilled"===r.status)switch(i){case 0:e.generateTable(r.value),new ComparisonManager("compare-table-container","provider1","provider2",r.value);break;case 1:t.generateTable(r.value);break;case 2:n.generatePricingTable(r.value)}else{console.error(`Error loading data (${a[i]}):`,r.reason);const e=document.querySelector(o[i]);e&&(e.innerHTML=`

Failed to load data: ${a[i]}

`)}}),setupURLComparison(),setupScrollAnimations(),setupOfflineDetection(),setupBackToTop(),setupNavHighlight(),setupAgeVerification(),performanceMonitor.mark("fully-loaded"),performanceMonitor.log("Fully Loaded")}catch(e){console.error("Critical error:",e),loadingManager.hideAll()}}),window.addEventListener("error",e=>{console.error("Global error:",e.error||e.message||e)},{passive:!0}),window.addEventListener("unhandledrejection",e=>{console.error("Unhandled promise rejection:",e.reason)}),"serviceWorker"in navigator&&window.addEventListener("load",()=>{navigator.serviceWorker.register("/sw.js").catch(e=>{console.warn("Service worker registration failed:",e)})}); \ No newline at end of file