From 8efa0e1281786706cc534981efa159eca3896d84 Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Thu, 12 Nov 2026 02:36:51 +0600 Subject: [PATCH 1/9] site: slim homepage (hero + 3-step strip), hash redirects --- site/assets/css/docs.css | 5 + site/assets/js/theme-init.js | 2 + site/index.html | 347 +---------------------------------- site/sw.js | 2 +- tests/ui-behavior.js | 7 +- 5 files changed, 18 insertions(+), 345 deletions(-) diff --git a/site/assets/css/docs.css b/site/assets/css/docs.css index 904c7de..d970c65 100644 --- a/site/assets/css/docs.css +++ b/site/assets/css/docs.css @@ -470,3 +470,8 @@ transition:var(--tr-ui)} clip: rect(0 0 0 0); white-space: nowrap; } + +/* == slim home: 3-step strip == */ +.steps{list-style:none;margin:0;padding:0;display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))} +.steps .step{display:flex;align-items:center;gap:12px;padding:16px;text-decoration:none;color:inherit} +.steps .step b{font-family:var(--mono,monospace);opacity:.6} diff --git a/site/assets/js/theme-init.js b/site/assets/js/theme-init.js index 764ccc1..1d9bcb4 100644 --- a/site/assets/js/theme-init.js +++ b/site/assets/js/theme-init.js @@ -2,3 +2,5 @@ try { var t = localStorage.getItem("ha-theme"); if (t === "light" || t === "dark") document.documentElement.dataset.theme = t; } catch (e) {} + +;(function(){var m={"setup": "setup.html", "apply": "apply.html", "files": "files.html", "evidence": "evidence.html", "faq": "faq.html", "releases": "files.html#releases", "status": "evidence.html#status", "hardware": "setup.html#hardware"},h=location.hash.slice(1);if(h&&m[h]&&!/\/docs\//.test(location.pathname)&&/(^|\/)(index\.html)?$/.test(location.pathname))location.replace(m[h]);})(); diff --git a/site/index.html b/site/index.html index 79f9fa0..c37bf44 100644 --- a/site/index.html +++ b/site/index.html @@ -167,11 +167,7 @@ - - +
@@ -185,8 +181,8 @@

Matched RootlessJamesDSP profiles for the KZ EDX Pro and Redmi 12 speaker. Choose your output, select a sound profile, then download the three files that belong together.

@@ -216,342 +212,7 @@

-
-
-
-

Choose your setup.

-

-Pick your output and profile. Each profile ships as one VDC, one -impulse response and one script, and they are meant to be used -together. -

-
-
- - -
    -
  1. -
    - -
    -

    Choose your output

    -

    -Each output has its own correction and its own script. -

    -
    -
    -
    -
  2. -
  3. -
    - -
    -

    Choose your profile

    -

    -The curve under each name is the correction it applies. -

    -
    -
    -
    -
  4. -
  5. -
    - -
    -

    Your files

    -

    -A VDC for ViPER-DDC, an impulse response for the Convolver -and a script for Liveprog. -

    -
    -
    -
    -
    -
    -Built at 48 kHz. The VDC carries a 44.1 kHz bank and the -app resamples the impulse response, so nothing else needs -choosing. -Download the 3 files (.zip) -
    -

    - -

    -

    -
    -How to verify the download -

    -Compare each file with -SHA256SUMS.txt. If your browser renames a file (for example adds .txt), -rename it back before loading it. -

    -
    -
    Linux, Termux
    -
    sha256sum -c SHA256SUMS.txt
    -
    macOS
    -
    shasum -a 256 -c SHA256SUMS.txt
    -
    Windows
    -
    certutil -hashfile FILE SHA256
    -
    -
    -
    -Next: apply in RootlessJamesDSP → -
    -
    -
    -
  6. -
-
-
-

Predicted response

-Tap a curve name to hide it · hover, drag or use the arrow keys to read values -
-
-
-
- -
- -
-
-

- -

-

-
-
-
-
-
-

Apply in RootlessJamesDSP

-

-
-
-
- - -
-
-
-
-
-A schematic of the RootlessJamesDSP main screen, filled in with the -files for your profile. Cards 1 to 3 follow the first three steps. The app lists -files without their extension, and the script by its title. -
See a real screenshot -Screenshot of the RootlessJamesDSP main screen with ViPER-DDC, Convolver and Live programmable DSP switched on, showing example file names -Taken from the app with an earlier speaker profile, so its file names differ from yours. -
-
-
-
    -
    - -
    -
    -
    -
    -

    Files

    -

    -Every file of release v6.1.0, with its SHA-256. Files for -your active profile are marked Recommended. -

    -
    - -
    -
    - -
    - -
    -
    -

    - Recommended for -profile -

    -
    - - -
    -
    -
    -
    -
    -

    Evidence

    -

    What was checked, and what was not.

    -
    -Offline checks · device records pending -
    -
    -
    Reading guide

    What these numbers mean

      -
    • -Target error is the RMS difference between raw response -plus this profile and the target, in dB (IEM 30 Hz to 16 kHz, -speaker 100 Hz to 16 kHz). Computed from the raw and target -files, not measured acoustically. -
    • -
    • -Speaker profiles cap the total boost at +8 dB to protect -the micro-speaker, so against the uncapped target they sit about 2 dB -low on average between 100 and 2000 Hz (up to 12 dB near 500 Hz) by design. -
    • -
    • -Device verification: no build-specific device results are recorded for the current release. Acoustic verification: no microphone measurements have been recorded. Worst-case device CPU, speaker excursion and thermal limits also remain unverified. -
    • -
    - -
    -
    -
    -
    -

    Status

    -

    Captured with this suite. Static, nothing updates live.

    -
    -Captured data -
    -
    -
    -
    -
    -
    -

    Hardware

    -

    The transducers and the app these profiles target.

    -
    -Reference hardware -
    -
    -
    -
    - -
    -IEM · Wired -

    KZ EDX Pro

    -
    -
    -
    -
    -
    Driver
    -
    10 mm DD
    -
    -
    -
    Impedance
    -
    24 Ω
    -
    -
    -
    Sensitivity
    -
    112 dB/mW
    -
    -
    -
    Source
    -
    3.5 mm jack
    -
    -
    -

    -SignatureV-shaped: mid-bass bump, -recessed upper-mids, sibilance peaks near 4.5 and 8 kHz. -

    -
    -
    -
    - -
    -Speaker · Internal -

    Xiaomi Redmi 12

    -
    -
    -
    -
    -
    Layout
    -
    Mono · bottom
    -
    -
    -
    Chamber
    -
    Compact
    -
    -
    -
    Power
    -
    Limited
    -
    -
    -
    Protection
    -
    110 Hz high-pass
    -
    -
    -

    -SignatureThin low end and limited -headroom, tuned for clarity rather than loudness. -

    -
    - -
    -
    -
    -
    -
    -
    -

    FAQ

    -

    The concepts behind the files in this release.

    -
    - -
    -
    -
    +
    1. 1Pick device
    2. 2Download
    3. 3Apply
    diff --git a/site/sw.js b/site/sw.js index 5a0ad64..af309d5 100644 --- a/site/sw.js +++ b/site/sw.js @@ -1,4 +1,4 @@ -const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-62fadb21'; +const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-4ceea407'; const SHELL = ['./', 'apply.html', 'archive.html', 'assets/css/base.css', 'assets/css/docs.css', 'assets/css/fonts.css', 'assets/css/nav.css', 'assets/css/tokens.css', 'assets/fonts/jetbrains-mono-latin-400-normal.woff2', 'assets/fonts/jetbrains-mono-latin-700-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-400-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-600-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-800-normal.woff2', 'assets/icons/favicon.svg', 'assets/js/app.js', 'assets/js/chart.js', 'assets/js/docs.js', 'assets/js/nav.js', 'assets/js/pages.js', 'assets/js/theme-init.js', 'changelog.html', 'compare.html', 'data/choose.json', 'data/evidence.json', 'data/profiles.json', 'data/versions.json', 'docs/index.html', 'evidence.html', 'faq.html', 'files.html', 'finder.html', 'index.html', 'manifest.webmanifest', 'setup.html']; const MAX_RUNTIME = 60; diff --git a/tests/ui-behavior.js b/tests/ui-behavior.js index 8380929..975e5c0 100644 --- a/tests/ui-behavior.js +++ b/tests/ui-behavior.js @@ -18,7 +18,7 @@ const errors = []; page.on("pageerror", (e) => errors.push("pageerror: " + e.message)); page.on("console", (m) => { if (m.type() === "error") errors.push("console: " + m.text()); }); await page.addInitScript(() => document.addEventListener("securitypolicyviolation", (e) => console.error("CSP violation: " + e.violatedDirective + " " + e.blockedURI))); -await page.goto(base + "index.html", { waitUntil: "networkidle" }); +await page.goto(base + "setup.html", { waitUntil: "networkidle" }); await page.waitForSelector("#snd .snd-c"); for (const dev of ["iem", "spk"]) { await page.click(`[data-out="${dev}"]`); @@ -66,6 +66,11 @@ ok(await page.evaluate(() => document.fonts.check('600 16px "Plus Jakarta Sans"' } } ok(!errors.length, `${name}: page errors/CSP violations:\n ` + errors.slice(0, 5).join("\n ")); +await page.goto(base + "index.html", { waitUntil: "networkidle" }); +ok((await page.$$eval("#steps a.step", (a) => a.length)) === 3, `${name}: home needs 3 step links`); +ok((await page.$$eval("#snd", (a) => a.length)) === 0, `${name}: picker must not be on home`); +await page.goto(base + "index.html#setup"); +await page.waitForURL(/setup\.html/); await page.goto(base + "compare.html", { waitUntil: "networkidle" }); await page.waitForSelector("#b option", { state: "attached" }); await page.selectOption("#a", "spk-v8"); From 5bab8dcf5bbabbfd66824834fc1fc1d12db624c5 Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Thu, 12 Nov 2026 03:17:32 +0600 Subject: [PATCH 2/9] fix: files page undefined date for legacy releases --- site/files.html | 2 +- site/sw.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/files.html b/site/files.html index d6d1f1e..153b360 100644 --- a/site/files.html +++ b/site/files.html @@ -200,7 +200,7 @@

    All releases

    Older versions are kept for reference, newest first, each with its checksums.

      - +
      diff --git a/site/sw.js b/site/sw.js index af309d5..4a8d621 100644 --- a/site/sw.js +++ b/site/sw.js @@ -1,4 +1,4 @@ -const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-4ceea407'; +const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-148d9f3f'; const SHELL = ['./', 'apply.html', 'archive.html', 'assets/css/base.css', 'assets/css/docs.css', 'assets/css/fonts.css', 'assets/css/nav.css', 'assets/css/tokens.css', 'assets/fonts/jetbrains-mono-latin-400-normal.woff2', 'assets/fonts/jetbrains-mono-latin-700-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-400-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-600-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-800-normal.woff2', 'assets/icons/favicon.svg', 'assets/js/app.js', 'assets/js/chart.js', 'assets/js/docs.js', 'assets/js/nav.js', 'assets/js/pages.js', 'assets/js/theme-init.js', 'changelog.html', 'compare.html', 'data/choose.json', 'data/evidence.json', 'data/profiles.json', 'data/versions.json', 'docs/index.html', 'evidence.html', 'faq.html', 'files.html', 'finder.html', 'index.html', 'manifest.webmanifest', 'setup.html']; const MAX_RUNTIME = 60; From 5b3fa87a070e3d677eba298addde38e7017af6fc Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Thu, 12 Nov 2026 03:31:33 +0600 Subject: [PATCH 3/9] site: landing v2, svg steps, lighter sidebar icons --- site/assets/css/docs.css | 59 ++++++++++++++++++++++++++++++++++++++-- site/assets/css/nav.css | 8 ++++++ site/assets/js/nav.js | 10 +++++++ site/index.html | 54 ++++++++++++------------------------ site/sw.js | 2 +- 5 files changed, 92 insertions(+), 41 deletions(-) diff --git a/site/assets/css/docs.css b/site/assets/css/docs.css index d970c65..29a0dea 100644 --- a/site/assets/css/docs.css +++ b/site/assets/css/docs.css @@ -472,6 +472,59 @@ transition:var(--tr-ui)} } /* == slim home: 3-step strip == */ -.steps{list-style:none;margin:0;padding:0;display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))} -.steps .step{display:flex;align-items:center;gap:12px;padding:16px;text-decoration:none;color:inherit} -.steps .step b{font-family:var(--mono,monospace);opacity:.6} + +/* == landing: premium hero + choreography == */ +.lp{position:relative;overflow:hidden;isolation:isolate} +.lp-aura{position:absolute;inset:-30%;z-index:-1;pointer-events:none;background:radial-gradient(40% 35% at 25% 30%,rgba(176,122,42,.22),transparent 70%),radial-gradient(35% 30% at 78% 20%,rgba(176,122,42,.14),transparent 70%),radial-gradient(45% 40% at 60% 85%,rgba(120,120,160,.12),transparent 70%);animation:lp-drift 18s ease-in-out infinite alternate;filter:blur(10px)} +@keyframes lp-drift{to{transform:translate3d(4%,3%,0) scale(1.08) rotate(3deg)}} +.lp h1{overflow:hidden;padding-bottom:.08em} +.lp-w{display:block;opacity:0;transform:translateY(105%) rotate(2deg);animation:lp-up .9s cubic-bezier(.2,.8,.2,1) forwards} +.lp-w:nth-child(2){animation-delay:.12s} +.lp-r{opacity:0;transform:translateY(14px);animation:lp-fade .8s cubic-bezier(.2,.8,.2,1) forwards} +.tag.lp-r{animation-delay:0s}.lead.lp-r{animation-delay:.28s}.hero-cta.lp-r{animation-delay:.4s}.hero-facts.lp-r{animation-delay:.52s} +@keyframes lp-up{to{opacity:1;transform:none}} +@keyframes lp-fade{to{opacity:1;transform:none}} +.lp-tilt{position:relative;opacity:0;transform:perspective(900px) translateY(24px) scale(.97);animation:lp-card 1.1s .35s cubic-bezier(.2,.8,.2,1) forwards;transition:transform .25s ease-out;will-change:transform} +@keyframes lp-card{to{opacity:1;transform:perspective(900px) none}} +.lp-tilt.on{animation:none;opacity:1;transform:perspective(900px) rotateX(var(--rx,0deg)) rotateY(var(--ry,0deg))} +.lp-shine{position:absolute;inset:0;border-radius:inherit;pointer-events:none;z-index:2;background:radial-gradient(260px circle at var(--mx,50%) var(--my,0%),rgba(255,255,255,.28),transparent 60%);opacity:0;transition:opacity .3s} +.lp-tilt.on .lp-shine{opacity:.7} +.lp-band{display:flex;flex-wrap:wrap;gap:14px;align-items:center;justify-content:space-between;margin-top:14px;padding:18px 20px;border:1px solid rgba(128,128,128,.2);border-radius:16px;background:linear-gradient(100deg,rgba(176,122,42,.12),transparent 70%)} +.lp-band div{display:flex;flex-direction:column;gap:2px}.lp-band span{opacity:.7;font-size:.88rem} +.lp-on .lp-s{opacity:0;transform:translateY(26px);transition:opacity .8s cubic-bezier(.2,.8,.2,1),transform .8s cubic-bezier(.2,.8,.2,1)} +.lp-on .lp-s.in{opacity:1;transform:none} +.lp-on .lp-s:nth-child(2){transition-delay:.1s}.lp-on .lp-s:nth-child(3){transition-delay:.2s} +@media (prefers-reduced-motion:reduce){.lp-aura,.lp-w,.lp-r,.lp-tilt{animation:none!important;opacity:1!important;transform:none!important}.lp-on .lp-s{opacity:1;transform:none;transition:none}} + + +/* == landing v2: layout + svg steps == */ +.lp-steps{margin-top:clamp(20px,4vw,48px)} +.lp-flow{list-style:none;margin:0;padding:0;display:grid;gap:18px;grid-template-columns:1fr} +.lp-flow li{position:relative;list-style:none;margin:0;padding:0} +.lp-flow li::before{content:none!important} +.lp-flow li:not(:last-child)::after{content:"";position:absolute;left:50%;bottom:-17px;height:16px;border-left:2px dashed rgba(128,128,128,.4)} +.lp-card{position:relative;display:grid;grid-template-columns:64px minmax(0,1fr);column-gap:16px;row-gap:2px;align-items:center;padding:18px 44px 18px 18px;overflow:hidden;text-decoration:none!important;color:inherit;transition:transform .35s cubic-bezier(.2,.8,.2,1),box-shadow .35s} +.lp-card *{text-decoration:none!important;font-style:normal} +.lp-card .lp-ic{grid-row:1/4;grid-column:1;width:64px;height:64px;color:inherit;--a:var(--acc,#b07a2a)} +.lp-card .lp-ic .a{stroke:var(--a)} +.lp-card b,.lp-card span{grid-column:2} +.lp-card b{font-size:1.1rem;letter-spacing:-.01em} +.lp-card span{opacity:.7;font-size:.88rem;line-height:1.45} +.lp-n{position:absolute;top:14px;right:16px;font-family:var(--mono,monospace);font-size:.72rem;letter-spacing:.08em;opacity:.45} +.lp-card em{position:absolute;right:16px;bottom:14px;opacity:.35;transition:transform .35s,opacity .35s} +.lp-card:hover,.lp-card:focus-visible{transform:translateY(-4px);box-shadow:0 18px 40px -18px rgba(0,0,0,.3)} +.lp-card:hover em,.lp-card:focus-visible em{transform:translateX(6px);opacity:1} +.lp-on .lp-s:not(.in) .lp-ic *{stroke-dasharray:1;stroke-dashoffset:1} +.lp-on .lp-s.in .lp-ic *{stroke-dasharray:1;stroke-dashoffset:0;transition:stroke-dashoffset 1.3s cubic-bezier(.2,.8,.2,1) .25s} +@media (min-width:720px){ +.lp-flow{grid-template-columns:repeat(3,minmax(0,1fr))} +.lp-flow li:not(:last-child)::after{left:100%;bottom:auto;top:50%;width:18px;height:0;border-left:0;border-top:2px dashed rgba(128,128,128,.4)} +.lp-card{grid-template-columns:1fr;row-gap:6px;padding:24px 22px 40px} +.lp-card .lp-ic{grid-row:auto;grid-column:1;width:84px;height:84px;margin-bottom:12px} +.lp-card b,.lp-card span{grid-column:1} +} +@media (min-width:900px){ +.lp .hero{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:clamp(24px,4vw,56px);align-items:center} +.lp .hero-viz{margin:0} +} +@media (prefers-reduced-motion:reduce){.lp-on .lp-s .lp-ic *{stroke-dasharray:none!important;stroke-dashoffset:0!important;transition:none!important}} diff --git a/site/assets/css/nav.css b/site/assets/css/nav.css index 3e27f1e..e97c287 100644 --- a/site/assets/css/nav.css +++ b/site/assets/css/nav.css @@ -710,3 +710,11 @@ text-overflow:ellipsis} } :root .btn.pri{background:var(--tx)!important;color:var(--bg)!important;border-color:var(--tx)!important} + +/* == sidebar icons: light tint, not solid blobs == */ +.ni [fill="currentColor"]{fill-opacity:.12} +.nl:hover .ni [fill="currentColor"],.nb:hover .ni [fill="currentColor"]{fill-opacity:.2} +a[aria-current] > .ni [fill="currentColor"],.nl[aria-current] .ni [fill="currentColor"]{fill-opacity:.3} +.nl .ni{color:var(--tx2)} +.nl:hover .ni{color:var(--tx)} +.nl[aria-current] .ni{color:var(--acc)} diff --git a/site/assets/js/nav.js b/site/assets/js/nav.js index 9c8d1ab..f5f02ec 100644 --- a/site/assets/js/nav.js +++ b/site/assets/js/nav.js @@ -370,3 +370,13 @@ n.setAttribute("aria-label", "Active profile: " + p.name); ;(function(){try{if("serviceWorker"in navigator&&location.protocol!=="file:"){var s=document.currentScript&&document.currentScript.src;if(s)navigator.serviceWorker.register(new URL("../../sw.js",s).href).catch(function(){})}}catch(e){}})(); ;(function(){try{var f=(location.pathname.split("/").pop()||"").replace(/\.html$/,"");document.querySelectorAll("[data-k]").forEach(function(a){if(a.dataset.k===f)a.setAttribute("aria-current","page")})}catch(e){}})(); + +;(function(){if(!document.querySelector(".lp"))return;var d=document.documentElement,rm=matchMedia("(prefers-reduced-motion:reduce)").matches; +var els=[].slice.call(document.querySelectorAll(".lp-s")); +if(rm||!("IntersectionObserver"in window)){els.forEach(function(e){e.classList.add("in")});}else{d.classList.add("lp-on"); +var io=new IntersectionObserver(function(l){l.forEach(function(x){if(x.isIntersecting){x.target.classList.add("in");io.unobserve(x.target)}})},{threshold:.15,rootMargin:"0px 0px -6% 0px"});els.forEach(function(e){io.observe(e)});} +var t=document.querySelector(".lp-tilt");if(!t||rm||!matchMedia("(hover:hover)").matches)return; +t.addEventListener("animationend",function(){t.classList.add("on")},{once:true}); +t.addEventListener("pointermove",function(e){var r=t.getBoundingClientRect(),x=(e.clientX-r.left)/r.width,y=(e.clientY-r.top)/r.height;t.style.setProperty("--ry",((x-.5)*8).toFixed(2)+"deg");t.style.setProperty("--rx",((.5-y)*6).toFixed(2)+"deg");t.style.setProperty("--mx",(x*100)+"%");t.style.setProperty("--my",(y*100)+"%")}); +t.addEventListener("pointerleave",function(){t.style.setProperty("--rx","0deg");t.style.setProperty("--ry","0deg")}); +})(); diff --git a/site/index.html b/site/index.html index c37bf44..b58d35c 100644 --- a/site/index.html +++ b/site/index.html @@ -170,49 +170,29 @@
      -
      +
      +
      -v7.0.0 · Stable release · calculated response -

      -HyperAudio.Calibrated. -

      -

      -Matched RootlessJamesDSP profiles for the KZ EDX Pro and Redmi 12 speaker. Choose your output, select a sound profile, then download the three files that belong together. -

      -
      -Choose a profileBrowse files +v7.0.0 · Stable release · calculated response +

      HyperAudio.Calibrated.

      +

      Matched RootlessJamesDSP profiles for the KZ EDX Pro and Redmi 12 speaker. Choose your output, select a sound profile, then download the three files that belong together.

      + +
      Output
      —
      Sample rate
      48 kHz
      Preamp
      0 dB
      Profiles
      6
      -
      -
      -
      Output
      -
      —
      -
      -
      -
      Sample rate
      -
      48 kHz
      -
      -
      -
      Preamp
      -
      0 dB
      -
      -
      -
      Profiles
      -
      6
      -
      -
      -
      -
      +
      -
      -Correction applied by the VDC and impulse response -
      -
      +
      Correction applied by the VDC and impulse response
      -
      1. 1Pick device
      2. 2Download
      3. 3Apply
      +
      +
        +
      1. Pick deviceIEM or speaker, then a matched profile.
      2. +
      3. DownloadVDC, impulse response and script, checksummed.
      4. +
      5. ApplyLoad them in RootlessJamesDSP, one tick at a time.
      6. +
      +
      Order matters.VDC → Convolver → Liveprog
      Start with setup
      +
      diff --git a/site/sw.js b/site/sw.js index 4a8d621..bdbd890 100644 --- a/site/sw.js +++ b/site/sw.js @@ -1,4 +1,4 @@ -const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-148d9f3f'; +const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-21adf8e0'; const SHELL = ['./', 'apply.html', 'archive.html', 'assets/css/base.css', 'assets/css/docs.css', 'assets/css/fonts.css', 'assets/css/nav.css', 'assets/css/tokens.css', 'assets/fonts/jetbrains-mono-latin-400-normal.woff2', 'assets/fonts/jetbrains-mono-latin-700-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-400-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-600-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-800-normal.woff2', 'assets/icons/favicon.svg', 'assets/js/app.js', 'assets/js/chart.js', 'assets/js/docs.js', 'assets/js/nav.js', 'assets/js/pages.js', 'assets/js/theme-init.js', 'changelog.html', 'compare.html', 'data/choose.json', 'data/evidence.json', 'data/profiles.json', 'data/versions.json', 'docs/index.html', 'evidence.html', 'faq.html', 'files.html', 'finder.html', 'index.html', 'manifest.webmanifest', 'setup.html']; const MAX_RUNTIME = 60; From b7b07158897be1c40cf579588ce8ce895d59414a Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Thu, 12 Nov 2026 03:36:40 +0600 Subject: [PATCH 4/9] site: landing v3, bundle, outputs, trust strip, CTA --- site/assets/css/docs.css | 28 ++++++++++++++++++++++++++++ site/index.html | 19 +++++++++++++++++++ site/sw.js | 2 +- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/site/assets/css/docs.css b/site/assets/css/docs.css index 29a0dea..88a1720 100644 --- a/site/assets/css/docs.css +++ b/site/assets/css/docs.css @@ -528,3 +528,31 @@ transition:var(--tr-ui)} .lp .hero-viz{margin:0} } @media (prefers-reduced-motion:reduce){.lp-on .lp-s .lp-ic *{stroke-dasharray:none!important;stroke-dashoffset:0!important;transition:none!important}} + +/* == landing v3: content sections == */ +.lp-more{display:grid;gap:clamp(40px,7vw,88px);margin-top:clamp(40px,7vw,88px);padding-bottom:clamp(24px,5vw,56px)} +.lp-h{max-width:56ch;margin-bottom:20px} +.lp-h h2{margin:6px 0 6px;font-size:clamp(1.5rem,4.5vw,2.3rem);letter-spacing:-.025em;line-height:1.1} +.lp-h p{margin:0;opacity:.7} +.lp-k{font:600 10.5px/1 var(--mono,monospace);letter-spacing:.16em;text-transform:uppercase;color:var(--acc,#b07a2a)} +.lp-grid{display:grid;gap:14px;grid-template-columns:1fr} +.lp-f,.lp-d{position:relative;padding:22px;overflow:hidden;color:inherit;text-decoration:none} +.lp-f h3,.lp-d h3{margin:10px 0 6px;font-size:1.1rem;letter-spacing:-.01em} +.lp-f p,.lp-d p{margin:0;opacity:.7;font-size:.9rem;line-height:1.5} +.lp-mi{width:34px;height:34px;padding:8px;border-radius:10px;color:var(--acc,#b07a2a);background:color-mix(in srgb,var(--acc,#b07a2a) 13%,transparent);box-sizing:content-box;width:18px;height:18px} +.lp-o{position:absolute;top:10px;right:16px;font:700 3.4rem/1 var(--mono,monospace);font-style:normal;color:transparent;-webkit-text-stroke:1px currentColor;opacity:.14} +.lp-d ul{display:flex;flex-wrap:wrap;gap:8px;margin:16px 0 0;padding:0;list-style:none} +.lp-d li{padding:5px 10px;border:1px solid rgba(128,128,128,.25);border-radius:999px;font:500 11px var(--mono,monospace);letter-spacing:.04em} +.lp-d em{position:absolute;right:18px;top:18px;font-style:normal;opacity:.35;transition:transform .35s,opacity .35s} +.lp-d:hover,.lp-f:hover{transform:translateY(-3px);box-shadow:0 18px 40px -20px rgba(0,0,0,.3)} +.lp-d:hover em{transform:translateX(6px);opacity:1} +.lp-f,.lp-d{transition:transform .35s cubic-bezier(.2,.8,.2,1),box-shadow .35s} +.lp-g4{grid-template-columns:1fr 1fr} +.lp-t{display:flex;flex-direction:column;gap:4px;padding:16px 4px 4px 14px;border-left:2px solid color-mix(in srgb,var(--acc,#b07a2a) 55%,transparent);color:inherit;text-decoration:none} +.lp-t b{font-size:1.02rem}.lp-t span{opacity:.7;font-size:.86rem;line-height:1.45} +.lp-t:hover b{color:var(--acc,#b07a2a)} +.lp-end{position:relative;overflow:hidden;text-align:center;padding:clamp(32px,7vw,72px) 20px;border:1px solid rgba(128,128,128,.2);border-radius:24px;background:radial-gradient(60% 90% at 50% 0%,rgba(176,122,42,.2),transparent 70%),linear-gradient(180deg,rgba(128,128,128,.05),transparent)} +.lp-end h2{margin:0 0 8px;font-size:clamp(1.6rem,5vw,2.6rem);letter-spacing:-.03em} +.lp-end p{margin:0 auto 22px;opacity:.7;max-width:44ch} +.lp-end .hero-cta{justify-content:center} +@media (min-width:720px){.lp-g3{grid-template-columns:repeat(3,minmax(0,1fr))}.lp-g2{grid-template-columns:repeat(2,minmax(0,1fr))}.lp-g4{grid-template-columns:repeat(4,minmax(0,1fr))}} diff --git a/site/index.html b/site/index.html index b58d35c..aef323e 100644 --- a/site/index.html +++ b/site/index.html @@ -193,6 +193,25 @@

      HyperAudio.Cali
      Order matters.VDC → Convolver → Liveprog
      Start with setup
      +
      The bundle

      Three files that belong together.

      Each profile ships as a matched set, loaded in this order.

      +
      +

      VDC

      A ViPER-DDC file. It carries the tonal correction, including a 44.1 kHz bank.

      +

      Impulse response

      For the Convolver. The app resamples it, so nothing else needs choosing.

      +

      Liveprog script

      Handles limiting and protection for the output it was built for.

      +
      +
      Two outputs

      Built for the hardware in front of you.

      Three profiles each, tuned and checked per device.

      + +
      Honest by design

      Calculated, checksummed, and clear about its limits.

      + +

      Ready when you are.

      Pick your output, take the three files, apply them in order.

      diff --git a/site/sw.js b/site/sw.js index bdbd890..b7261f8 100644 --- a/site/sw.js +++ b/site/sw.js @@ -1,4 +1,4 @@ -const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-21adf8e0'; +const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-74c0d460'; const SHELL = ['./', 'apply.html', 'archive.html', 'assets/css/base.css', 'assets/css/docs.css', 'assets/css/fonts.css', 'assets/css/nav.css', 'assets/css/tokens.css', 'assets/fonts/jetbrains-mono-latin-400-normal.woff2', 'assets/fonts/jetbrains-mono-latin-700-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-400-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-600-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-800-normal.woff2', 'assets/icons/favicon.svg', 'assets/js/app.js', 'assets/js/chart.js', 'assets/js/docs.js', 'assets/js/nav.js', 'assets/js/pages.js', 'assets/js/theme-init.js', 'changelog.html', 'compare.html', 'data/choose.json', 'data/evidence.json', 'data/profiles.json', 'data/versions.json', 'docs/index.html', 'evidence.html', 'faq.html', 'files.html', 'finder.html', 'index.html', 'manifest.webmanifest', 'setup.html']; const MAX_RUNTIME = 60; From 8aee650544a1afad9455eb856fe29048b66e4204 Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Thu, 12 Nov 2026 03:55:11 +0600 Subject: [PATCH 5/9] fix: footer copyright wraps instead of clipping --- site/assets/css/nav.css | 4 ++++ site/sw.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/site/assets/css/nav.css b/site/assets/css/nav.css index e97c287..7bf0f33 100644 --- a/site/assets/css/nav.css +++ b/site/assets/css/nav.css @@ -718,3 +718,7 @@ a[aria-current] > .ni [fill="currentColor"],.nl[aria-current] .ni [fill="current .nl .ni{color:var(--tx2)} .nl:hover .ni{color:var(--tx)} .nl[aria-current] .ni{color:var(--acc)} + +/* == footer: copyright wraps instead of clipping == */ +.sf .sf-in{min-width:0} +.sf .sf-in .sf-cp{box-sizing:border-box;width:100%;max-width:100%;min-width:0;padding-inline:12px;white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;text-align:center} diff --git a/site/sw.js b/site/sw.js index b7261f8..a85bd2b 100644 --- a/site/sw.js +++ b/site/sw.js @@ -1,4 +1,4 @@ -const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-74c0d460'; +const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-5d5fc8f8'; const SHELL = ['./', 'apply.html', 'archive.html', 'assets/css/base.css', 'assets/css/docs.css', 'assets/css/fonts.css', 'assets/css/nav.css', 'assets/css/tokens.css', 'assets/fonts/jetbrains-mono-latin-400-normal.woff2', 'assets/fonts/jetbrains-mono-latin-700-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-400-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-600-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-800-normal.woff2', 'assets/icons/favicon.svg', 'assets/js/app.js', 'assets/js/chart.js', 'assets/js/docs.js', 'assets/js/nav.js', 'assets/js/pages.js', 'assets/js/theme-init.js', 'changelog.html', 'compare.html', 'data/choose.json', 'data/evidence.json', 'data/profiles.json', 'data/versions.json', 'docs/index.html', 'evidence.html', 'faq.html', 'files.html', 'finder.html', 'index.html', 'manifest.webmanifest', 'setup.html']; const MAX_RUNTIME = 60; From 6556dc5205b90e992db742e9f4c49ec2c128a40e Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Thu, 12 Nov 2026 04:01:41 +0600 Subject: [PATCH 6/9] site: mobile drawer scale, footer copyright text --- site/assets/css/nav.css | 14 ++++++++++++++ site/assets/js/nav.js | 2 +- site/sw.js | 2 +- tests/footer.js | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/site/assets/css/nav.css b/site/assets/css/nav.css index 7bf0f33..19d0062 100644 --- a/site/assets/css/nav.css +++ b/site/assets/css/nav.css @@ -722,3 +722,17 @@ a[aria-current] > .ni [fill="currentColor"],.nl[aria-current] .ni [fill="current /* == footer: copyright wraps instead of clipping == */ .sf .sf-in{min-width:0} .sf .sf-in .sf-cp{box-sizing:border-box;width:100%;max-width:100%;min-width:0;padding-inline:12px;white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;text-align:center} + +/* == mobile drawer matches desktop sidebar scale == */ +@media (max-width:767px){ +.sb{width:min(80vw,300px);gap:12px} +.sb .sb-bt b{font-size:14px!important} +.sb .sb-bt small,.sb .sb-badge,.sb .n-chip-b small{font-size:10px!important;letter-spacing:.12em} +.sb .sb-h{font:600 10px var(--mono)!important;letter-spacing:.16em;padding:0 12px;margin:8px 0 4px} +.sb .nl{min-height:44px;gap:12px;padding:0 12px;font:500 13.5px var(--sans)!important} +.sb .nl .nt{font-size:13.5px!important} +.sb .nl .ni{width:18px!important;height:18px!important} +.sb .n-chip{padding:8px 10px;gap:10px} +.sb .n-chip-t{font-size:12.5px!important} +.sb .sb-ctl .nb{width:40px;height:40px} +} diff --git a/site/assets/js/nav.js b/site/assets/js/nav.js index f5f02ec..dd8ace4 100644 --- a/site/assets/js/nav.js +++ b/site/assets/js/nav.js @@ -185,7 +185,7 @@ foot.innerHTML = '
      ' + '
      ' + '

      Offline checks No acoustic measurement recorded Tested by Noushad Mostafa

      ' + '' + -'

      © ' + year + ' Noushad Mostafa

      ' + +'

      Created by Noushad M. © ' + year + ' HyperAudio

      ' + ''; B.appendChild(foot); function themeSync() { diff --git a/site/sw.js b/site/sw.js index a85bd2b..81ee5a9 100644 --- a/site/sw.js +++ b/site/sw.js @@ -1,4 +1,4 @@ -const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-5d5fc8f8'; +const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-1efbe39a'; const SHELL = ['./', 'apply.html', 'archive.html', 'assets/css/base.css', 'assets/css/docs.css', 'assets/css/fonts.css', 'assets/css/nav.css', 'assets/css/tokens.css', 'assets/fonts/jetbrains-mono-latin-400-normal.woff2', 'assets/fonts/jetbrains-mono-latin-700-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-400-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-600-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-800-normal.woff2', 'assets/icons/favicon.svg', 'assets/js/app.js', 'assets/js/chart.js', 'assets/js/docs.js', 'assets/js/nav.js', 'assets/js/pages.js', 'assets/js/theme-init.js', 'changelog.html', 'compare.html', 'data/choose.json', 'data/evidence.json', 'data/profiles.json', 'data/versions.json', 'docs/index.html', 'evidence.html', 'faq.html', 'files.html', 'finder.html', 'index.html', 'manifest.webmanifest', 'setup.html']; const MAX_RUNTIME = 60; diff --git a/tests/footer.js b/tests/footer.js index 8377f69..2cd7c4e 100644 --- a/tests/footer.js +++ b/tests/footer.js @@ -40,7 +40,7 @@ const drawerThemeHidden = innerWidth >= 768 || !drawerTheme || getComputedStyle(drawerTheme).display === "none"; const headerThemeVisible = innerWidth >= 768 || (!!headerTheme && getComputedStyle(headerTheme).display !== "none"); -const copyrightOk = copyText === "© " + new Date().getFullYear() + " Noushad Mostafa"; +const copyrightOk = copyText === "Created by Noushad M. © " + new Date().getFullYear() + " HyperAudio"; const sr = document.querySelector(".sf").getBoundingClientRect(), mid = sr.left + sr.width / 2, off = []; From a62e4238acea71e6474a3ecaf42090a04f947e56 Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Thu, 12 Nov 2026 04:09:07 +0600 Subject: [PATCH 7/9] fix: contain landing aura (no overflow) --- site/assets/css/docs.css | 4 ++-- site/sw.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/site/assets/css/docs.css b/site/assets/css/docs.css index 88a1720..61f8549 100644 --- a/site/assets/css/docs.css +++ b/site/assets/css/docs.css @@ -475,8 +475,8 @@ transition:var(--tr-ui)} /* == landing: premium hero + choreography == */ .lp{position:relative;overflow:hidden;isolation:isolate} -.lp-aura{position:absolute;inset:-30%;z-index:-1;pointer-events:none;background:radial-gradient(40% 35% at 25% 30%,rgba(176,122,42,.22),transparent 70%),radial-gradient(35% 30% at 78% 20%,rgba(176,122,42,.14),transparent 70%),radial-gradient(45% 40% at 60% 85%,rgba(120,120,160,.12),transparent 70%);animation:lp-drift 18s ease-in-out infinite alternate;filter:blur(10px)} -@keyframes lp-drift{to{transform:translate3d(4%,3%,0) scale(1.08) rotate(3deg)}} +.lp-aura{position:absolute;inset:0;z-index:-1;pointer-events:none;background-size:100% 100%,100% 100%,100% 100%;background-repeat:no-repeat;background-image:radial-gradient(40% 35% at 25% 30%,rgba(176,122,42,.22),transparent 70%),radial-gradient(35% 30% at 78% 20%,rgba(176,122,42,.14),transparent 70%),radial-gradient(45% 40% at 60% 85%,rgba(120,120,160,.12),transparent 70%);animation:lp-drift 18s ease-in-out infinite alternate} +@keyframes lp-drift{to{background-position:6% 4%,-5% 6%,3% -4%;background-size:115% 115%,110% 110%,120% 120%}} .lp h1{overflow:hidden;padding-bottom:.08em} .lp-w{display:block;opacity:0;transform:translateY(105%) rotate(2deg);animation:lp-up .9s cubic-bezier(.2,.8,.2,1) forwards} .lp-w:nth-child(2){animation-delay:.12s} diff --git a/site/sw.js b/site/sw.js index 81ee5a9..d4d8f4f 100644 --- a/site/sw.js +++ b/site/sw.js @@ -1,4 +1,4 @@ -const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-1efbe39a'; +const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-65079288'; const SHELL = ['./', 'apply.html', 'archive.html', 'assets/css/base.css', 'assets/css/docs.css', 'assets/css/fonts.css', 'assets/css/nav.css', 'assets/css/tokens.css', 'assets/fonts/jetbrains-mono-latin-400-normal.woff2', 'assets/fonts/jetbrains-mono-latin-700-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-400-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-600-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-800-normal.woff2', 'assets/icons/favicon.svg', 'assets/js/app.js', 'assets/js/chart.js', 'assets/js/docs.js', 'assets/js/nav.js', 'assets/js/pages.js', 'assets/js/theme-init.js', 'changelog.html', 'compare.html', 'data/choose.json', 'data/evidence.json', 'data/profiles.json', 'data/versions.json', 'docs/index.html', 'evidence.html', 'faq.html', 'files.html', 'finder.html', 'index.html', 'manifest.webmanifest', 'setup.html']; const MAX_RUNTIME = 60; From 1eb3162225f711687c416388b557089c61d5763b Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Thu, 12 Nov 2026 04:16:20 +0600 Subject: [PATCH 8/9] fix: landing step-card contrast --- site/assets/css/docs.css | 10 ++++++++++ site/sw.js | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/site/assets/css/docs.css b/site/assets/css/docs.css index 61f8549..00569ae 100644 --- a/site/assets/css/docs.css +++ b/site/assets/css/docs.css @@ -556,3 +556,13 @@ transition:var(--tr-ui)} .lp-end p{margin:0 auto 22px;opacity:.7;max-width:44ch} .lp-end .hero-cta{justify-content:center} @media (min-width:720px){.lp-g3{grid-template-columns:repeat(3,minmax(0,1fr))}.lp-g2{grid-template-columns:repeat(2,minmax(0,1fr))}.lp-g4{grid-template-columns:repeat(4,minmax(0,1fr))}} + +/* == landing: contrast-safe step cards == */ +.lp-card .lp-n{opacity:1;color:var(--tx2)} +.lp-card span{opacity:1;color:var(--tx2)} +.lp-card em{opacity:1;color:var(--mut)} +.lp-card b{color:var(--tx)} +.lp-more .lp-h p,.lp-f p,.lp-d p,.lp-t span,.lp-end p,.lp-band span{opacity:1;color:var(--tx2)} +.lp-o{opacity:1;color:color-mix(in srgb,var(--tx) 14%,transparent)} +.lp-on .lp-flow .lp-s{transition-delay:0s!important} +.lp-on .lp-flow .lp-s{transition-duration:.35s} diff --git a/site/sw.js b/site/sw.js index d4d8f4f..3e1e86b 100644 --- a/site/sw.js +++ b/site/sw.js @@ -1,4 +1,4 @@ -const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-65079288'; +const VERSION = '7.0.0', CACHE = 'hyperaudio-' + VERSION + '-faf97919'; const SHELL = ['./', 'apply.html', 'archive.html', 'assets/css/base.css', 'assets/css/docs.css', 'assets/css/fonts.css', 'assets/css/nav.css', 'assets/css/tokens.css', 'assets/fonts/jetbrains-mono-latin-400-normal.woff2', 'assets/fonts/jetbrains-mono-latin-700-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-400-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-600-normal.woff2', 'assets/fonts/plus-jakarta-sans-latin-800-normal.woff2', 'assets/icons/favicon.svg', 'assets/js/app.js', 'assets/js/chart.js', 'assets/js/docs.js', 'assets/js/nav.js', 'assets/js/pages.js', 'assets/js/theme-init.js', 'changelog.html', 'compare.html', 'data/choose.json', 'data/evidence.json', 'data/profiles.json', 'data/versions.json', 'docs/index.html', 'evidence.html', 'faq.html', 'files.html', 'finder.html', 'index.html', 'manifest.webmanifest', 'setup.html']; const MAX_RUNTIME = 60; From 2820ffb5b9e63857e6dee9cafbc7cf6e7ec32819 Mon Sep 17 00:00:00 2001 From: nmstudioo Date: Thu, 12 Nov 2026 04:23:17 +0600 Subject: [PATCH 9/9] test: update home step selector, redirect check --- tests/ui-behavior.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/ui-behavior.js b/tests/ui-behavior.js index 975e5c0..da2cfbc 100644 --- a/tests/ui-behavior.js +++ b/tests/ui-behavior.js @@ -67,8 +67,9 @@ ok(await page.evaluate(() => document.fonts.check('600 16px "Plus Jakarta Sans"' } ok(!errors.length, `${name}: page errors/CSP violations:\n ` + errors.slice(0, 5).join("\n ")); await page.goto(base + "index.html", { waitUntil: "networkidle" }); -ok((await page.$$eval("#steps a.step", (a) => a.length)) === 3, `${name}: home needs 3 step links`); +ok((await page.$$eval("#steps a.lp-card", (a) => a.length)) === 3, `${name}: home needs 3 step links`); ok((await page.$$eval("#snd", (a) => a.length)) === 0, `${name}: picker must not be on home`); +await page.goto(base + "faq.html", { waitUntil: "networkidle" }); await page.goto(base + "index.html#setup"); await page.waitForURL(/setup\.html/); await page.goto(base + "compare.html", { waitUntil: "networkidle" });