{"id":2504,"date":"2025-11-02T00:55:29","date_gmt":"2025-11-02T00:55:29","guid":{"rendered":"https:\/\/pury.fi\/site\/?page_id=2504"},"modified":"2026-02-17T22:00:38","modified_gmt":"2026-02-17T22:00:38","slug":"download-purevision","status":"publish","type":"page","link":"https:\/\/pury.fi\/site\/download-purevision","title":{"rendered":"Download PureVision"},"content":{"rendered":"\n<style>\n.download-box {\n  background: #ffffff;\n  padding: 22px;\n  border-radius: 10px;\n  border: 1px solid #ddd;\n  max-width: 520px;\n  margin: 0 auto;\n}\n\n.option {\n  padding: 14px;\n  border-radius: 6px;\n  border: 1px solid #ccc;\n  margin-top: 12px;\n  cursor: pointer;\n  user-select: none;\n  transition: background 0.2s, opacity 0.2s;\n}\n\n.option.selected {\n  border-color: var(--theme-selection-background-color);\n  background: color-mix(in srgb, var(--theme-selection-background-color) 25%, white);\n}\n\n.option.disabled {\n  opacity: 0.4;\n  cursor: not-allowed;\n}\n\n.option.error {\n  border-color: #c62828 !important;\n  background: rgba(198, 40, 40, 0.15);\n}\n\nbutton {\n  width: 100%;\n  padding: 14px;\n  border-radius: 6px;\n  background: var(--theme-selection-background-color);\n  color: white;\n  border: none;\n  cursor: pointer;\n  font-size: 1rem;\n  margin-top: 12px;\n}\n\nbutton:disabled {\n  background: #aaa;\n  cursor: not-allowed;\n}\n\n#recommendation,\n#compatInfo {\n  margin-top: 14px;\n  padding: 10px 12px;\n  font-size: 0.92rem;\n  border-left: 3px solid var(--theme-selection-background-color);\n  background: color-mix(in srgb, var(--theme-selection-background-color) 12%, white);\n  border-radius: 4px;\n  line-height: 1.45;\n}\n\noption:disabled {\n  color: #999;\n}\n\n\/* \u2705 Fade + Slide Effect *\/\n#downloadInfoImage {\n  max-height: 0;\n  opacity: 0;\n  overflow: hidden;\n  margin-top: 15px;\n  text-align: center;\n  transition: all 0.6s ease;\n}\n\n#downloadInfoImage.show {\n  max-height: 600px;\n  opacity: 1;\n}\n\n#downloadInfoImage img {\n  max-width: 100%;\n  border-radius: 8px;\n  border: 1px solid #ccc;\n  margin-top: 10px;\n  border-color: #c62828 !important;\n}\n\n#downloadInfoText {\n  font-size: 0.95rem;\n  line-height: 1.4;\n  color: #c62828;\n  font-weight: bold;\n}\n\n<\/style>\n\n\n\n<script>\nlet apiData = {};\nlet selectedGPU = null;\nlet currentCompatMin = null;\nlet currentCompatMax = null;\n\nasync function loadFullApi() {\n  try {\n    const res = await fetch(\"https:\/\/pury.fi\/site\/wp-json\/purevision\/version\/info\", {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application\/json\" },\n      body: JSON.stringify({ version: \"0\" })\n    });\n\n    apiData = await res.json();\n\n    populatePuryFiSelect();\n    populatePureVisionSelect(true);\n  } catch (err) {}\n}\n\nfunction populatePuryFiSelect() {\n  const sel = document.getElementById(\"puryfiVersion\");\n  sel.innerHTML = \"<option value=''>No PuryFi version selected<\/option>\";\n\n  Object.keys(apiData.puryfi).forEach(v => {\n    const opt = document.createElement(\"option\");\n    opt.value = v;\n    opt.textContent = v;\n    sel.appendChild(opt);\n  });\n}\n\nfunction loadCompatibility(puryfiVersion) {\n  const compatBox = document.getElementById(\"compatInfo\");\n\n  if (!puryfiVersion) {\n    currentCompatMin = null;\n    currentCompatMax = null;\n    compatBox.innerHTML = \"<strong>All PureVision versions available.<\/strong>\";\n    populatePureVisionSelect(true);\n    return;\n  }\n\n  const data = apiData.puryfi[puryfiVersion];\n\n  if (!data) {\n    compatBox.innerHTML = \"<strong>This PuryFi version has no compatibility info.<\/strong>\";\n    return;\n  }\n\n  currentCompatMin = data.min_compat_version;\n  currentCompatMax = data.max_compat_version;\n\n  compatBox.innerHTML =\n    `<strong>Compatible with PureVision ${currentCompatMin}${\n      currentCompatMin !== currentCompatMax ? \" \u2192 \" + currentCompatMax : \"\"\n    }<\/strong>`;\n\n  populatePureVisionSelect(false);\n}\n\nfunction populatePureVisionSelect(fullMode = false) {\n  const sel = document.getElementById(\"purevisionVersion\");\n  sel.innerHTML = \"<option value=''>Select PureVision version\u2026<\/option>\";\n\n  Object.keys(apiData.pure_vision).forEach(v => {\n    const opt = document.createElement(\"option\");\n    opt.value = v;\n    opt.textContent = v;\n\n    if (!fullMode) {\n      const valid = (v === currentCompatMin || v === currentCompatMax);\n      if (!valid) opt.disabled = true;\n    }\n\n    sel.appendChild(opt);\n  });\n\n  updateGpuButtonStates();\n  updateDownloadLink();\n}\n\nfunction updateGpuButtonStates() {\n  const pv = document.getElementById(\"purevisionVersion\").value;\n\n  const btnN = document.getElementById(\"opt-nvidia\");\n  const btnA = document.getElementById(\"opt-amd\");\n  const btnI = document.getElementById(\"opt-intel\");\n\n  [btnN, btnA, btnI].forEach(b => b.classList.remove(\"disabled\", \"error\"));\n\n  if (!pv || !apiData.pure_vision[pv]) {\n    [btnN, btnA, btnI].forEach(b => b.classList.add(\"disabled\"));\n    return;\n  }\n\n  const pvData = apiData.pure_vision[pv];\n\n  if (!pvData.nvidia) btnN.classList.add(\"disabled\");\n  else if (!pvData.nvidia.source) btnN.classList.add(\"error\");\n\n  if (!pvData.amd) btnA.classList.add(\"disabled\");\n  else if (!pvData.amd.source) btnA.classList.add(\"error\");\n\n  if (!pvData.intel) btnI.classList.add(\"disabled\");\n  else if (!pvData.intel.source) btnI.classList.add(\"error\");\n}\n\nfunction selectOption(type, auto = false) {\n  const btn = document.getElementById(\"opt-\" + type);\n\n  if (btn.classList.contains(\"disabled\") || btn.classList.contains(\"error\"))\n    return;\n\n  selectedGPU = type;\n\n  clearVisualSelection();\n  btn.classList.add(\"selected\");\n\n  updateDownloadLink();\n\n  if (auto) {\n    document.getElementById(\"recommendation\").innerHTML =\n      `Detected GPU: <strong>${type.toUpperCase()}<\/strong>`;\n  }\n}\n\nfunction clearVisualSelection() {\n  document.querySelectorAll(\".option\").forEach(opt => opt.classList.remove(\"selected\"));\n}\n\nfunction updateDownloadLink() {\n  const pv = document.getElementById(\"purevisionVersion\").value;\n  const btn = document.getElementById(\"downloadBtn\");\n\n  if (!pv || !selectedGPU) {\n    btn.disabled = true;\n    return;\n  }\n\n  const versionData = apiData.pure_vision[pv];\n\n  if (!versionData || !versionData[selectedGPU] || !versionData[selectedGPU].source) {\n    btn.disabled = true;\n    btn.textContent = \"Not supported\";\n    return;\n  }\n\n  btn.disabled = false;\n  btn.textContent = \"Download\";\n  btn.dataset.link = versionData[selectedGPU].source;\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n  loadFullApi();\n\n  const gpuString = (() => {\n    try {\n      const canvas = document.createElement(\"canvas\");\n      const gl = canvas.getContext(\"webgl\");\n      const debug = gl.getExtension(\"WEBGL_debug_renderer_info\");\n      return debug ? gl.getParameter(debug.UNMASKED_RENDERER_WEBGL) : gl.getParameter(gl.RENDERER);\n    } catch {\n      return \"unknown\";\n    }\n  })();\n\n  const type = (() => {\n    const s = gpuString.toLowerCase();\n    if (s.includes(\"nvidia\")) return \"nvidia\";\n    if (s.includes(\"radeon\") || s.includes(\"amd\")) return \"amd\";\n    if (s.includes(\"intel\") || s.includes(\"iris\") || s.includes(\"uhd\")) return \"intel\";\n    return \"unknown\";\n  })();\n\n  if (type !== \"unknown\") selectOption(type, true);\n\n  document.getElementById(\"puryfiVersion\").addEventListener(\"change\", e => loadCompatibility(e.target.value));\n\n  document.getElementById(\"purevisionVersion\").addEventListener(\"change\", () => {\n    updateGpuButtonStates();\n    updateDownloadLink();\n  });\n\n  document.getElementById(\"downloadBtn\").addEventListener(\"click\", () => {\n  const link = document.getElementById(\"downloadBtn\").dataset.link;\n  if (!link) return;\n\n  const infoBox = document.getElementById(\"downloadInfoImage\");\n\n  infoBox.classList.add(\"show\");\n\n  setTimeout(() => {\n    infoBox.scrollIntoView({\n      behavior: \"smooth\",\n      block: \"center\"\n    });\n  }, 200);\n\n  setTimeout(() => {\n    window.location.href = link;\n  }, 1000);\n});\n});\n<\/script>\n\n\n\n<div class=\"download-box\">\n\n  <label for=\"puryfiVersion\"><strong>Select your PuryFi version:<\/strong><\/label>\n  <select id=\"puryfiVersion\">\n    <option value=\"\">Loading\u2026<\/option>\n  <\/select>\n\n  <div id=\"compatInfo\"><\/div>\n\n  <label for=\"purevisionVersion\" style=\"margin-top:12px; display:block;\">\n    <strong>Select PureVision version:<\/strong>\n  <\/label>\n\n  <select id=\"purevisionVersion\">\n    <option value=\"\">Loading versions\u2026<\/option>\n  <\/select>\n\n  <div class=\"option\" id=\"opt-nvidia\" onclick=\"selectOption('nvidia')\">\n    <strong>NVIDIA GPU Version<\/strong><br>\n    <small>Optimized for RTX \/ GTX GPUs<\/small>\n  <\/div>\n\n  <div class=\"option\" id=\"opt-amd\" onclick=\"selectOption('amd')\">\n    <strong>AMD GPU Version<\/strong><br>\n    <small>Optimized for Radeon GPUs<\/small>\n  <\/div>\n\n  <div class=\"option\" id=\"opt-intel\" onclick=\"selectOption('intel')\">\n    <strong>Intel GPU Version<\/strong><br>\n    <small>Optimized for Iris \/ UHD GPUs<\/small>\n  <\/div>\n\n  <button id=\"downloadBtn\" disabled>Download<\/button>\n\n  <div id=\"downloadInfoImage\">\n    <div id=\"downloadInfoText\">\n      To run PureVision please connect it to your PuryFi-Extension as seen below:\n    <\/div>\n\n    <img decoding=\"async\" src=\"https:\/\/pury.fi\/site\/wp-content\/uploads\/2026\/02\/purevision_connect_info-scaled.png\"\n         alt=\"PureVision Connect Info\">\n  <\/div>\n\n  <div id=\"recommendation\"><\/div>\n<\/div>\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Select your PuryFi version: Loading\u2026 Select PureVision version: Loading versions\u2026 NVIDIA GPU Version Optimized for RTX \/ GTX GPUs AMD GPU Version Optimized for Radeon GPUs Intel GPU Version Optimized for Iris \/ UHD GPUs Download To run PureVision please connect it to your PuryFi-Extension as seen below:<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"pmpro_default_level":"","footnotes":""},"class_list":["post-2504","page","type-page","status-publish","hentry","pmpro-has-access"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/pury.fi\/site\/wp-json\/wp\/v2\/pages\/2504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pury.fi\/site\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pury.fi\/site\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pury.fi\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pury.fi\/site\/wp-json\/wp\/v2\/comments?post=2504"}],"version-history":[{"count":55,"href":"https:\/\/pury.fi\/site\/wp-json\/wp\/v2\/pages\/2504\/revisions"}],"predecessor-version":[{"id":2694,"href":"https:\/\/pury.fi\/site\/wp-json\/wp\/v2\/pages\/2504\/revisions\/2694"}],"wp:attachment":[{"href":"https:\/\/pury.fi\/site\/wp-json\/wp\/v2\/media?parent=2504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}