diff --git a/site/assets/css/docs.css b/site/assets/css/docs.css
index 904c7de..00569ae 100644
--- a/site/assets/css/docs.css
+++ b/site/assets/css/docs.css
@@ -470,3 +470,99 @@ transition:var(--tr-ui)}
clip: rect(0 0 0 0);
white-space: nowrap;
}
+
+/* == slim home: 3-step strip == */
+
+/* == landing: premium hero + choreography == */
+.lp{position:relative;overflow:hidden;isolation:isolate}
+.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}
+.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}}
+
+/* == 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))}}
+
+/* == 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/assets/css/nav.css b/site/assets/css/nav.css
index 3e27f1e..19d0062 100644
--- a/site/assets/css/nav.css
+++ b/site/assets/css/nav.css
@@ -710,3 +710,29 @@ 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)}
+
+/* == 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 9c8d1ab..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
' +
'Docs Changelog Evidence ' +
-'© ' + year + ' Noushad Mostafa
' +
+'Created by Noushad M. © ' + year + ' HyperAudio
' +
'';
B.appendChild(foot);
function themeSync() {
@@ -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/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/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.
The release list could not be loaded.
-
+
diff --git a/site/index.html b/site/index.html
index 79f9fa0..aef323e 100644
--- a/site/index.html
+++ b/site/index.html
@@ -167,391 +167,51 @@
-Skip to content
-
+Skip to content
-
+
+
-
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 profile
-
- Browse 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
-
-
-
-
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.
-
-
-
-
-This page needs JavaScript to list the profiles. The files are in
-the downloads folder of the repository.
-
-
-The profile data could not be loaded. If you opened this file
-directly from disk, serve the folder over http (for example
-python3 -m http.server) or use the hosted site.
-
-
-
-
-
1
-
-
Choose your output
-
-Each output has its own correction and its own script.
-
-
-
-
-
-
-
-
2
-
-
Choose your profile
-
-The curve under each name is the correction it applies.
-
-
-
-
-
-
-
-
3
-
-
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
-
-
-
-
-
-
+
-
-
-
-
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
-
-Taken from the app with an earlier speaker profile, so its file names differ from yours.
-
-
-
-
-
-
-
-
-Done. Enjoy the music. Your setup is applied. If anything
-sounds off, go back through the steps above.
-
-
-
-
-
-
-
Files
-
-Every file of release v6.1.0 , with its SHA-256. Files for
-your active profile are marked Recommended .
-
-
-
-
-
-
- Recommended for
-profile
-
-
-No files match that search.
-
-
-
-
-
-
-
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.
-
-
-
-
Test results Automated checks run on every build
-
-
Test matrix
Checks by profile Automated and device checks for each profile
-✓ Pass! Warning✕ Fail– Not run, or no record
-
-
-
-
-
-
-
-
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
-
-
-
-Signature V-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
-
-
-
-Signature Thin low end and limited
-headroom, tuned for clarity rather than loudness.
-
-
-
-
-
-
-
-DSP app
-
RootlessJamesDSP
-
-
-
-
- Order: VDC → Convolver → Liveprog
-
-
-
-
-
-
-
-
-
-
FAQ
-
The concepts behind the files in this release.
-
-
-
-
+
+
+
+
1 VDC A ViPER-DDC file. It carries the tonal correction, including a 44.1 kHz bank.
+
2 Impulse response For the Convolver. The app resamples it, so nothing else needs choosing.
+
3 Liveprog script Handles limiting and protection for the output it was built for.
+
+
+
+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 5a0ad64..3e1e86b 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 + '-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;
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 = [];
diff --git a/tests/ui-behavior.js b/tests/ui-behavior.js
index 8380929..da2cfbc 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,12 @@ 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.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" });
await page.waitForSelector("#b option", { state: "attached" });
await page.selectOption("#a", "spk-v8");