"use strict"; // Set FAQ fragment IDs for (const faq of document.querySelectorAll(".faq")) { const summary = faq.querySelector(".faq__summary"); const formattedSummary = summary.textContent.trim().replace(/ /g, "_"); faq.id = formattedSummary; if (window.location.hash) { faq.open = decodeURIComponent( window.location.hash.slice(1)) === formattedSummary; } } function updateThemeClass (mediaQuery) { if (mediaQuery.matches) { document.documentElement.classList.remove("theme-dark"); document.documentElement.classList.add("theme-light"); } else { document.documentElement.classList.remove("theme-light"); document.documentElement.classList.add("theme-dark"); } } const prefersLightScheme = window.matchMedia("(prefers-color-scheme: light)"); updateThemeClass(prefersLightScheme); prefersLightScheme.addListener(updateThemeClass); const downloadAppBtn = document.querySelector(".download__app"); const downloadAppOther = document.querySelector(".download__app-other"); const downloadAppOtherSummary = downloadAppOther.querySelector(":scope > summary"); // Ext download button const downloadExtBtn = document.querySelector(".download__ext"); // App download buttons const appList = document.querySelector(".app-list"); const appListWin64Btn = document.querySelector(".app-list__win64"); const appListWin32Btn = document.querySelector(".app-list__win32"); const appListMacBtn = document.querySelector(".app-list__mac"); const appListDebBtn = document.querySelector(".app-list__deb"); const appListRpmBtn = document.querySelector(".app-list__rpm"); let platform; switch (navigator.platform) { case "Win32": case "Win64": platform = "win"; downloadAppBtn.textContent = "Windows Bridge"; appListWin64Btn.hidden = true; break; case "MacIntel": platform = "mac"; downloadAppBtn.textContent = "macOS Bridge"; appListMacBtn.hidden = true; break; default: /** * Hide default download button and display other downloads * without details summary. */ downloadAppBtn.remove(); downloadAppOther.open = true; downloadAppOtherSummary.hidden = true; appList.classList.add("app-list--buttons"); appListWin32Btn.classList.add("button"); appListWin64Btn.classList.add("button"); appListMacBtn.classList.add("button"); appListDebBtn.classList.add("button"); appListRpmBtn.classList.add("button"); } function populateAppListApp (element, fileUrl, fileName, fileSize, version) { element.href = fileUrl; element.title = `${fileName} (${fileSize})`; element.dataset.fileSize = fileSize; element.dataset.version = version; element.removeAttribute("disabled"); } const ENDPOINT_URL = "https://api.github.com/repos/hensm/fx_cast/releases"; fetch(ENDPOINT_URL) .then(res => res.json()) .then(onResponse) .catch(onError); function onResponse (res) { for (const release of res.reverse()) { for (const asset of release.assets) { const formattedSize = formatSize(asset.size); const { tag_name } = release; const REGEX_EXT = /.*\.(.*)$/; const REGEX_ARCH = /.*(x(?:86|64))\..*$/; switch (asset.name.match(REGEX_EXT).pop()) { case "xpi": downloadExtBtn.href = asset.browser_download_url; downloadExtBtn.title = `${asset.name} (${formattedSize})`; downloadExtBtn.dataset.version = tag_name; downloadExtBtn.removeAttribute("disabled"); break; case "exe": switch (asset.name.match(REGEX_ARCH).pop()) { case "x86": populateAppListApp( appListWin32Btn, asset.browser_download_url , asset.name, formattedSize, tag_name); break; case "x64": populateAppListApp( appListWin64Btn, asset.browser_download_url , asset.name, formattedSize, tag_name); break; } break; case "pkg": populateAppListApp( appListMacBtn, asset.browser_download_url , asset.name, formattedSize, tag_name); break; case "deb": populateAppListApp( appListDebBtn, asset.browser_download_url , asset.name, formattedSize, tag_name); break; case "rpm": populateAppListApp( appListRpmBtn, asset.browser_download_url , asset.name, formattedSize, tag_name); break; } } } if (platform) { switch (platform) { case "win": downloadAppBtn.href = appListWin64Btn.href; downloadAppBtn.title = appListWin64Btn.title; downloadAppBtn.dataset.version = appListWin64Btn.dataset.version; break; case "mac": downloadAppBtn.href = appListMacBtn.href; downloadAppBtn.title = appListMacBtn.title; downloadAppBtn.dataset.version = appListMacBtn.dataset.version; break; default: { return; } } downloadAppBtn.removeAttribute("disabled"); } } function onError (err) { console.error("Failed to fetch download links", err); } function formatSize (bytes, precision = 1, useMetric = false) { const factor = useMetric ? 1000 : 1024; // Sizes in bytes const kxbyte = factor; const mxbyte = kxbyte * factor; const gxbyte = mxbyte * factor; const txbyte = gxbyte * factor; const pxbyte = txbyte * factor; if (bytes >= 0 && bytes < kxbyte) { return `${bytes} B`; } else if (bytes >= kxbyte && bytes < mxbyte) { return `${(bytes / kxbyte).toFixed(precision)} ${ useMetric ? "KB" : "KiB"}`; } else if (bytes >= mxbyte && bytes < gxbyte) { return `${(bytes / mxbyte).toFixed(precision)} ${ useMetric ? "MB" : "MiB"}`; } else if (bytes >= gxbyte && bytes < txbyte) { return `${(bytes / gxbyte).toFixed(precision)} ${ useMetric ? "GB" : "GiB"}`; } else if (bytes >= txbyte && bytes < pxbyte) { return `${(bytes / txbyte).toFixed(precision)} ${ useMetric ? "TB" : "TiB"}`; } else if (bytes >= pxbyte) { return `${(bytes / pxbyte).toFixed(precision)} ${ useMetric ? "PB" : "PiB"}`; } }