Files
boc/design-audit-quixzoom-landvex.md
T
Bernt bae705aa97 ARCHITECTURE: NFC roadmap, edge AI, audit logging
- Add NFC ePassport roadmap (ICAO 9303, eIDAS)
- Add TensorFlow.js edge face detection (BlazeFace)
- Add structured audit logger (GDPR-compliant)
- Risk scoring support

Part of KYC Apple Native UX v1.1.0
2026-06-29 16:24:48 +00:00

282 lines
16 KiB
Markdown

# 🔍 Designaudit: quixzoom.com & landvex.com
**Datum:** 2026-06-29
**Auditor:** OpenClaw Subagent
**Omfattning:** Visuell design, UX, SEO, innehÄll, teknisk struktur
---
## 📊 Sammanfattning
| Aspekt | quixzoom.com | landvex.com |
|--------|-------------|-------------|
| **Visuell design** | Stark, modern, Apple-influerad | Mörk, sofistikerad, enterprise-fokus |
| **UX/AnvÀndbarhet** | Bra flows, nÄgra tillgÀnglighetsluckor | Bra navigering, komplex information |
| **SEO** | UtmÀrkt strukturerad data | Bra men saknar vissa element |
| **InnehÄll** | Omfattande, tydlig CTA | Stark copy, tydligt vÀrdeerbjudande |
| **Tekniskt** | Stora filer, inline allt | Mörkt tema, viss inkonsekvens |
---
## 🔮 KRITISKA PROBLEM
### quixzoom.com
1. **Inga `<label>`-element för formulÀr**
Waitlist-formulÀren (rader 779, 1348) har `<input type="email">` utan associerade `<label>`-element. Endast placeholder anvÀnds. Detta bryter mot WCAG 2.1 AA (krav 3.3.2) och pÄverkar skÀrmlÀsaranvÀndare.
2. **Inga `<img>`-taggar alls pÄ startsidan**
All visuell media Àr antingen SVG-inline, CSS-backgrounds, eller helt frÄnvarande. Detta innebÀr: ingen `alt`-text för bilder, ingen lazy loading-möjlighet, och potentiella SEO-förluster för bildsök.
3. **Ingen `loading="lazy"` implementerad**
Trots att inga `<img>`-taggar finns, saknas strategi för lazy loading av tungt innehÄll (SVG:er, overlay-panel).
4. **Stor filstorlek: 224 KB HTML**
`index.html` Àr 224 KB (2016 rader) med all CSS och JS inline. Ingen cachebar extern CSS/JS. Detta pÄverkar TTFB och Äterbesökares prestanda.
5. **Ingen `<header>`-tagg**
Navigationen (rad 696) anvÀnder `<nav>` men saknar omslutande `<header>`. Semantisk HTML Àr ofullstÀndig.
6. **32 st `<a href="#">`-ankare**
MÄnga interna navigeringslÀnkar anvÀnder hash-lÀnkar utan korrekt hantering. Risk för scroll-problem och tillgÀnglighetsproblem.
7. **Ingen bildoptimering (WebP/AVIF)**
`<picture>`-element eller moderna format saknas helt. OG-bilder Àr JPEG (~88 KB).
8. **Ingen `robots.txt` för landvex.com?**
Landvex robots.txt returnerar HTML (160 bytes) — kan vara felkonfigurerad. Quixzoom robots.txt Ă€r korrekt.
9. **Landvex sitemap.xml returnerar 403**
`curl -sI https://www.landvex.com/sitemap.xml` ger HTTP 403. Detta blockerar sökmotorer frÄn att hitta sidor.
10. **Ingen breadcrumb-strukturerad data pÄ quixzoom**
Landvex har BreadcrumbList (rad 661), men quixzoom saknar detta helt.
### landvex.com
1. **Ingen `<main>`-tagg**
Startsidan anvÀnder `<section>`-element men saknar `<main>` som primÀrt innehÄllsomrÄde. PÄverkar skÀrmlÀsares navigering.
2. **Ingen skip-to-content-lÀnk**
Quixzoom har en (rad 694), men landvex saknar helt en "Skip to main content"-lÀnk. Allvarligt tillgÀnglighetsproblem.
3. **MÄnga sidor saknar unika titlar**
Alla verticals-sidor har identisk struktur: `<title>LandveX — [Vertical] </title>` — trailing space och inkonsekvent varumĂ€rkesstavning (LandveX vs Landvex).
4. **Inkonsekvent varumÀrkesstavning**
`Landvex`, `LandveX`, `LandveX AB` anvÀnds omvÀxlande. I JSON-LD: `"name": "Landvex"`, men i footern: `"LandveX AB"`. I titlar: `LandveX`.
5. **Inga `<label>`-element explicit kopplade**
KontaktformulÀret (rader 1506-1520) har `<label>`-element men de Àr inline-stylade och potentiellt svÄra att associera för vissa skÀrmlÀsare.
6. **Ingen `<header>`-tagg**
Samma problem som quixzoom — navigationen saknar semantisk `<header>`-omsling.
7. **Saknad sitemap.xml (403)**
Kritiskt SEO-problem. Sökmotorer kan inte upptÀcka alla under sidor.
---
## 🟡 REKOMMENDATIONER
### Visuell Design
| # | Problem | Plats | Rekommendation |
|---|---------|-------|----------------|
| 1 | Quixzoom: Hero-telefonen Ă€r ren CSS/SVG | `#hero` | ÖvervĂ€g att anvĂ€nda en riktig bild eller optimerad SVG för bĂ€ttre LCP |
| 2 | Landvex: Mörkt tema kan vara för kontrastsvagt | `--text-dim: #888` pÄ `--bg-dark: #0a0a0a` | Testa kontrastförhÄllandet; #888 pÄ #0a0a0a ger ~5.2:1 (OK men grÀnsfall) |
| 3 | Quixzoom: `--text-muted: #6B6B6B` pÄ `--bg-off: #F7F7F5` | Footer, metadata | Kontrast ~4.5:1, grÀnsfall för WCAG AA |
| 4 | Landvex: Inline-stilar överallt | Rader 740-1540 | Flytta till CSS-klasser för bÀttre underhÄll och caching |
| 5 | Quixzoom: `font-family` med 'Inter' men ingen `@font-face` | Rad 118 | Inter laddas aldrig om inte installerat lokalt; anvÀnd Google Fonts eller self-host |
| 6 | BĂ„da: Ingen systematisk typografisk skala | — | Definiera tydligare typografisk skala med fler steg (display, h1-h6, body, caption) |
| 7 | Quixzoom: `--radius-full: 100px` anvÀnds inkonsekvent | Knappar, badges | Vissa element anvÀnder 100px, andra 24px; standardisera |
### UX / AnvÀndbarhet
| # | Problem | Plats | Rekommendation |
|---|---------|-------|----------------|
| 1 | Quixzoom: Overlay-panel (drill-down) saknar fokusfÀlla | `#overlay-panel` | LÀgg till focus-trap sÄ tabbning stannar i panelen nÀr den Àr öppen |
| 2 | Quixzoom: `role="button"` pÄ `<article>`-element | `.drill-card` | AnvÀnd `<button>` istÀllet eller lÀgg till `keydown`-hantering för Enter/Space |
| 3 | Landvex: Dropdown-menyer med `:hover` | `.nav-dropdown` | LÀgg till `:focus-within` stöd för tangentbordsnavigering (delvis gjort, verifiera) |
| 4 | Quixzoom: Mobile menu stÀngs inte med Escape-tangenten | `.mobile-menu` | LÀgg till `keydown`-lyssnare för Escape |
| 5 | Landvex: KontaktformulÀr saknar success/error-tillstÄnd visuellt | `#contact-form` | Tydligare visuell feedback vid submit |
| 6 | Quixzoom: Ingen progress-indicator vid formulÀrsubmit | `submitWaitlist` | LÀgg till spinner eller "Submitting..."-tillstÄnd |
| 7 | BĂ„da: Ingen cookie-consent-banner | — | GDPR krĂ€ver samtycke för cookies (om ni anvĂ€nder nĂ„gra) |
| 8 | Quixzoom: Ingen 404-sida konfigurerad | — | Skapa en anpassad 404-sida |
| 9 | Landvex: Footer-lÀnkar Àr extremt mÄnga och oorganiserade | `.footer-links` | Gruppera i kolumner som quixzoom gör |
### SEO
| # | Problem | Plats | Rekommendation |
|---|---------|-------|----------------|
| 1 | Quixzoom: Dubbla `<meta name="keywords">` | Rad 24-25 | Sammanfoga eller ta bort (Google ignorerar keywords) |
| 2 | Quixzoom: `og:image` pekar pĂ„ `/images/hero-zoomer-city.jpg` men filen finns i `/images/hero-zoomer-city.jpg` | — | Verifiera att filen faktiskt finns pĂ„ servern |
| 3 | Landvex: `og:image` Ă€r `/og-image.jpg` — verifiera existens | — | Kontrollera att OG-bilden finns |
| 4 | Quixzoom: Ingen `WebPage` schema-typ | — | LĂ€gg till `@type: "WebPage"` för startsidan |
| 5 | Landvex: `BreadcrumbList` endast pĂ„ index | — | LĂ€gg till pĂ„ alla sidor |
| 6 | Quixzoom: Ingen `Article` eller `BlogPosting` schema | — | Om ni har blogg/innehĂ„ll, lĂ€gg till |
| 7 | BĂ„da: Ingen `Person` schema för grundare/team | — | LĂ€gg till för E-E-A-T-signaler |
| 8 | Quixzoom: `alternateName` innehÄller 15+ varianter | JSON-LD | Minska till 3-5 mest relevanta; för mÄnga kan ses som keyword stuffing |
| 9 | Landvex: `disambiguatingDescription` Ă€r mycket lĂ„ng | — | Kortfatta; Google trunkerar lĂ„nga beskrivningar |
| 10 | Quixzoom: `speakable` schema pekar pÄ `.hero-tagline` som inte finns | Rad 52 | Klassen `.hero-tagline` saknas i HTML; rÀtta selektorn |
### Prestanda
| # | Problem | Plats | Rekommendation |
|---|---------|-------|----------------|
| 1 | Quixzoom: 224 KB inline HTML | `index.html` | Extrahera CSS till extern fil för caching; mÄl: <100 KB |
| 2 | Landvex: 104 KB inline HTML | `index.html` | Extrahera CSS; mindre kritisk men fortfarande bra |
| 3 | Quixzoom: 41 SVG:er inline | — | ÖvervĂ€g SVG-sprite eller externalisera Ă„teranvĂ€ndbara |
| 4 | Landvex: 69 SVG:er inline | — | Samma som ovan |
| 5 | BĂ„da: Ingen `preconnect` för externa resurser | — | Quixzoom har en (`api.quixzoom.com`); landvex saknar helt |
| 6 | Quixzoom: Ingen `dns-prefetch` eller `preconnect` för fonts | — | Om ni börjar anvĂ€nda Google Fonts, lĂ€gg till preconnect |
| 7 | BĂ„da: Ingen Service Worker | — | ÖvervĂ€g PWA-kapacitet för offline/Ă„terbesök |
| 8 | Quixzoom: `locale-data.js` laddas synkront | Rad 690 | LĂ€gg till `defer` eller flytta till `</body>` |
### InnehÄll / Copy
| # | Problem | Plats | Rekommendation |
|---|---------|-------|----------------|
| 1 | Quixzoom: "1 Credit = €1" nĂ€mns pĂ„ flera stĂ€llen men Ă€r inte juridiskt bindande | Footer, hero | LĂ€gg till asterisk eller förklaring om att vĂ€xelkursen kan variera |
| 2 | Landvex: "Bloomberg for the physical world" — potentiellt varumĂ€rkesintrĂ„ng | Rad 742 | ÖvervĂ€g att formulera om för att undvika juridiska problem |
| 3 | Quixzoom: "Launching August 2026" — datum passerar snart | Hela sidan | Uppdatera copy nĂ€r produkten Ă€r live |
| 4 | Landvex: "Live intelligence from August 2026" — framtidsdatum | Rad 1109 | Samma som ovan; uppdatera vid launch |
| 5 | Quixzoom: "1240" reviews i `aggregateRating` | JSON-LD | Om detta Àr uppdiktat, ta bort eller markera som "beta-testdata" för att undvika missvisande |
| 6 | Landvex: "20+ countries at launch" — verifierbart? | Hero-stats | Se till att pĂ„stĂ„enden kan backas upp |
### Tekniskt / SĂ€kerhet
| # | Problem | Plats | Rekommendation |
|---|---------|-------|----------------|
| 1 | Quixzoom: CSP tillÄter `'unsafe-inline'` för scripts | HTTP-header | Inline scripts bryter mot CSP; flytta till externa filer eller anvÀnd nonce |
| 2 | Quixzoom: `script-src 'self' 'unsafe-inline'` | CSP-header | FörsvÄrar XSS-skydd; ÄtgÀrda |
| 3 | Landvex: Inga sÀkerhetsheaders synliga | HTTP-response | LÀgg till X-Frame-Options, X-XSS-Protection, HSTS, CSP |
| 4 | Quixzoom: `fetch()` till API utan error-hantering för nÀtverk | `submitWaitlist` | LÀgg till `catch` för nÀtverksfel |
| 5 | Landvex: KontaktformulÀr skickar till `api.quixzoom.com` | Rad 1604 | Korrekt, men lÀgg till rate-limiting och spam-skydd |
| 6 | BĂ„da: Ingen CSRF-token i formulĂ€r | — | LĂ€gg till CSRF-skydd om formulĂ€ren hanteras server-side |
| 7 | Quixzoom: `kyc-verify.html` Ă€r nĂ€stan tom | — | Antingen bygg ut eller ta bort frĂ„n indexering |
---
## 🟱 BRA SAKER
### quixzoom.com
✅ **UtmĂ€rkt strukturerad data** — 5+ JSON-LD-block: Organization, WebSite, SoftwareApplication, FAQPage, Product, ImageObject, Speakable
✅ **Skip-to-content-lĂ€nk** — Bra tillgĂ€nglighet (rad 694)
✅ **Semantisk HTML** — AnvĂ€nder `<main>`, `<section>`, `<article>`, `<footer>`, `<nav>`
✅ **ARIA-attribut** — `aria-label`, `aria-haspopup`, `role="listbox"`, `role="option"`, `role="dialog"`, `aria-modal="true"`
✅ **Responsiv design** — Bra media queries (768px, 960px, 600px, 480px)
✅ **Modern CSS** — CSS custom properties, clamp() för typografi, grid och flexbox
✅ **Favicon-komplett** — SVG, PNG 16/32/192/512, ICO, Apple touch icon, manifest
✅ **hreflang** — x-default, en, sv, nl, th, ng, ke
✅ **Canonical URL** — Korrekt implementerad
✅ **OG-tags kompletta** — title, description, url, image, image:width, image:height, image:alt
✅ **Twitter Cards** — summary_large_image
✅ **SĂ€kerhetsheaders** — X-Frame-Options, XSS-Protection, Referrer-Policy, CSP, HSTS
✅ **Robots.txt korrekt** — Allow all, disallow /markets/ke/ och /markets/ng/
✅ **Sitemap.xml tillgĂ€nglig** — Korrekt format
✅ **Drill-down overlay** — Bra UX-mönster för detaljerad information utan sidladdning
✅ **Glossary tooltip engine** — Bra för anvĂ€ndarutbildning
✅ **Scroll fade-in observer** — Modern Intersection Observer-anvĂ€ndning
✅ **Brand disambiguation** — Tydlig signal till Google om att inte förvĂ€xla med Zoom
✅ **Trust badges** — GDPR, EU data residency, Stripe payouts
### landvex.com
✅ **Mörkt tema vĂ€lutfört** — Konsekvent fĂ€rgpalett, bra hierarki
✅ **Dropdown-navigation** — VĂ€lstrukturerad med ikoner och etiketter
✅ **Bra copy** — "We start with your decision. Not with our data." — starkt vĂ€rdeerbjudande
✅ **Strukturerad data** — Organization, BreadcrumbList, FAQPage, SoftwareApplication
✅ **Disambiguation-sektion** — Tydlig för Google Knowledge Graph (rad 1646)
✅ **hreflang** — 7 sprĂ„k/regioner
✅ **Favicon-komplett** — SVG, ICO, Apple touch icon, manifest
✅ **Canonical URL** — Korrekt
✅ **OG-tags** — Kompletta
✅ **Twitter Cards** — summary_large_image
✅ **KontaktformulĂ€r med feedback** — Success/error-meddelanden
✅ **Smooth scroll** — Bra UX för ankare
✅ **Responsiv** — Media queries för 900px, 640px, 480px
✅ **SVG-ikoner** — Skalbara, inline för snabb rendering
✅ **Trust-signal** — Org.nr, adress, juridisk struktur tydlig
✅ **Robots.txt** — Korrekt, Ă€ven bot-specifik (Googlebot, Bingbot, etc.)
---
## 📋 PRIORITERAD ÅTGÄRDSLista
### Omedelbart (Vecka 1)
| # | ÅtgĂ€rd | Plats | Effekt |
|---|--------|-------|--------|
| 1 | **LÀgg till `<label>`-element** för alla formulÀrinput | BÄda sidor | WCAG AA-efterlevnad, skÀrmlÀsare |
| 2 | **Fixa landvex sitemap.xml (403)** | `/var/www/landvex/sitemap.xml` | SEO-kritiskt |
| 3 | **LÀgg till skip-to-content pÄ landvex** | `index.html` | TillgÀnglighet |
| 4 | **LÀgg till `<main>`-tagg pÄ landvex** | `index.html` | Semantisk HTML |
| 5 | **Standardisera varumÀrkesstavning** | Landvex: Landvex (inte LandveX) | VarumÀrkeskonsistens |
| 6 | **LÀgg till `<header>`-taggar** | BÄda sidor | Semantisk HTML |
| 7 | **Fixa robots.txt för landvex** | Returnerar HTML istÀllet för text | SEO |
### Kortsiktigt (Vecka 2-3)
| # | ÅtgĂ€rd | Plats | Effekt |
|---|--------|-------|--------|
| 8 | **Extrahera CSS till externa filer** | BÄda sidor | Caching, prestanda |
| 9 | **LĂ€gg till `loading="lazy"`** | Bilder, tunga sektioner | LCP, prestanda |
| 10 | **LĂ€gg till `preconnect`/`dns-prefetch`** | Externa resurser | TTFB |
| 11 | **LÀgg till focus-trap i overlay-panel** | Quixzoom drill-down | TillgÀnglighet |
| 12 | **LÀgg till Escape-tangent-stöd** | Mobile menu, overlays | TillgÀnglighet |
| 13 | **LĂ€gg till breadcrumb JSON-LD** | Quixzoom alla sidor | SEO |
| 14 | **Korrigera `speakable` selektor** | Quixzoom JSON-LD | SEO |
| 15 | **LĂ€gg till `WebPage` schema** | Quixzoom | SEO |
### MedellÄng sikt (MÄnad 1-2)
| # | ÅtgĂ€rd | Plats | Effekt |
|---|--------|-------|--------|
| 16 | **Implementera WebP/AVIF-bilder** | BÄda sidor | LCP, bandbredd |
| 17 | **LÀgg till Service Worker** | BÄda sidor | PWA, offline |
| 18 | **FörbÀttra CSP** | Ta bort `'unsafe-inline'` | SÀkerhet |
| 19 | **LÀgg till sÀkerhetsheaders pÄ landvex** | HSTS, CSP, etc. | SÀkerhet |
| 20 | **LÀgg till cookie-consent** | BÄda sidor | GDPR |
| 21 | **Skapa 404-sida** | Quixzoom | UX |
| 22 | **Optimera SVG:er** | Sprite eller externalisera | HTML-storlek |
| 23 | **LÀgg till rate-limiting pÄ formulÀr** | BÄda sidor | Spam-skydd |
| 24 | **Uppdatera "August 2026"-copy** | NÀr produkten Àr live | Aktualitet |
| 25 | **LĂ€gg till progress-indicator** | Quixzoom waitlist | UX |
---
## 📈 Prestandauppskattning
| MÀtvÀrde | quixzoom.com (nu) | quixzoom.com (efter opt) | landvex.com (nu) | landvex.com (efter opt) |
|----------|-------------------|--------------------------|------------------|-------------------------|
| HTML-storlek | 224 KB | ~120 KB | 104 KB | ~80 KB |
| Första byte | ~200ms (CloudFront) | ~150ms | ~200ms | ~150ms |
| LCP (uppskattat) | ~2.5s | ~1.8s | ~2.0s | ~1.5s |
| CLS (uppskattat) | ~0.05 | ~0.02 | ~0.03 | ~0.01 |
| TillgÀnglighet | ~85% | ~98% | ~80% | ~98% |
| SEO | ~90% | ~98% | ~85% | ~98% |
---
## 🏆 Dom: quixzoom.com vs landvex.com
| Kategori | Vinnare | Motivering |
|----------|---------|------------|
| **Visuell design** | quixzoom.com | Mer polish, bÀttre spacing, modernare kÀnsla |
| **UX/AnvÀndbarhet** | quixzoom.com | BÀttre drill-down, tydligare flows |
| **SEO** | quixzoom.com | Mer omfattande strukturerad data |
| **InnehÄll** | landvex.com | Starkare copy, tydligare vÀrdeerbjudande |
| **TillgÀnglighet** | quixzoom.com | Skip-link, bÀttre ARIA |
| **Prestanda** | landvex.com | Mindre HTML, fÀrre inline-resurser |
| **SĂ€kerhet** | quixzoom.com | CSP, HSTS, m.fl. headers |
| **VarumÀrkeskonsistens** | quixzoom.com | Enhetlig stavning och ton |
**Totalt: quixzoom.com leder med 5-2-1** (landvex vinner prestanda, oavgjort i en kategori).
---
*Rapport genererad av OpenClaw Design Audit Subagent*
*Metod: Statisk kodanalys + HTTP-header-inspektion + manuell granskning*