Kawader — Design & UX Audit

Production site kawader-cine1.odoo.com · Audit run 2026-04-15 · Automated probes + manual analysis

1. Executive Summary

16
A11y violations
6
Critical (axe-core)
10.4 MB
Home page weight
0
JSON-LD schemas
51
Raw purple-opacities (should tokenize)
40
Unique font-sizes (goal: 8)
Urgent: Canonical URLs point to https://www.kawader-cine.com/ — the abandoned Squarespace domain. Search engines are being directed away from the live site. Fix in conjunction with the domain-recovery case.

Top 5 wins (ship-ready fixes)

  1. Fix canonical URL to https://kawader-cine1.odoo.com (or the recovered domain once transferred) — 1-line Odoo website setting change, immediate SEO impact.
  2. Add JSON-LD LocalBusiness on Home + Contact, Product on product pages (snippets below). Currently 0 structured data, 12 routes eligible.
  3. Translate AR meta titles — all AR pages currently render "Home | Kawader-Rentals" in English even though the body content is fully Arabic. Fix in i18n_translations.py.
  4. Delete the 4 unused design tokens (--kw-border-hover, --kw-text-secondary, --kw-green-soft, --kw-red-soft) and merge the near-duplicate grays.
  5. Add missing <label> elements on the 17 shop filter checkboxes (critical a11y; 1 template fix).

Top 5 deferred fixes (next round)

  1. Hero value-prop text + trust signals on homepage (currently YouTube video only, no narrative).
  2. Tokenize 51 raw rgba(143, 67, 163, X) uses as named opacity tokens.
  3. Collapse 6 duplicated .kw-product-card blocks across homepage.css / shop.css / product.css / components.css into components.css only.
  4. Close RTL gaps: .kw-feedback-float, .kw-mobile-cta, .kw-process__steps (currently forces direction: ltr, breaking 1→2→3→4 narrative in Arabic).
  5. Typography scale: 40 unique sizes → 8-step scale. Spacing: 35 values → 8px-base 8-step scale.

2. Design System Findings

Token hygiene

FindingDetailRecommendation
Unused tokens4 tokens defined, 0 references Delete --kw-border-hover, --kw-text-secondary, --kw-green-soft, --kw-red-soft
Near-duplicate grays--kw-text-muted: #4b5563 vs --kw-text-secondary: #3f3f46 (ΔE≈8, not distinguishable) Merge to single --kw-text-muted
Raw purple opacities51 uses of rgba(143, 67, 163, X) across 9 CSS files Tokenize: --kw-purple-8, --kw-purple-12, --kw-purple-25, --kw-purple-40
Hardcoded state colors#7a3a8e (hover), #6b3280 (active) inline Add --kw-royal-purple-hover, --kw-royal-purple-active

Typography scale

Current: 40 unique font-size values across 9 CSS files. 9 cluster in a 0.17rem range (0.58, 0.6, 0.62, 0.65, 0.68, 0.7, 0.75, 0.78, 0.8rem) — visual chaos with no rhythm.

Proposed scale:

--fs-xs:   0.7rem   (11.2 px)
--fs-sm:   0.8rem   (12.8 px)
--fs-base: 0.875rem (14 px)
--fs-md:   1rem     (16 px)
--fs-lg:   1.125rem (18 px)
--fs-xl:   1.25rem  (20 px)
--fs-2xl:  1.5rem   (24 px)
--fs-hero: clamp(2rem, 4vw + 1rem, 3.5rem)

Spacing scale

Current: 35 unique spacing/gap values. 10+ cluster in 0.2–0.7rem range.

Proposed 8px-base scale:

--sp-1: 0.25rem (4px)
--sp-2: 0.5rem  (8px)
--sp-3: 0.75rem (12px)
--sp-4: 1rem    (16px)
--sp-5: 1.5rem  (24px)
--sp-6: 2rem    (32px)
--sp-7: 3rem    (48px)
--sp-8: 4rem    (64px)

Component duplication

ComponentFiles where definedTarget
.kw-product-card*homepage.css, shop.css, product.css, components.css (6 blocks)Consolidate into components.css
.kw-price-card*homepage.css, product.cssConsolidate into components.css
.kw-date-chip*product.css, components.cssConsolidate into components.css

3. UX Conversion Leaks

These are observed against the live site without survey data; confidence is directional, not quantitative.

LeakWhereFix
No hero value-propHomepage renders a YouTube video (autoplay, muted) as hero with no text overlay stating what Kawader does Overlay H1 + subhead + primary CTA on hero video
No trust signals on HomeNo testimonials, no client logos, no press, no certifications visible above the fold Logo strip of past clients (PSIFF, any broadcast partners); pull 2–3 testimonials from WhatsApp / email
Shop page has no H1Products page: 0 h1 elements, just category + product grid Add <h1>Rental Catalog</h1> or localized equivalent
Cart pre-checkout opacityCart shows item + price but dates are editable inline without confirmation step Add visible "Rental Period: 14 Apr → 21 Apr (7 days)" summary card
No "Why Kawader" sectionNo explanation of differentiation (equipment quality, film-industry focus, delivery, insurance) Add 3-up value-prop band below hero
Pricing page not linked from heroPricing is reachable only via top nav; homepage CTAs skip it Add secondary CTA "See Pricing Tiers" on hero

4. Accessibility Findings

Axe-core results (WCAG 2.1 AA) across 6 routes × 2 locales × 2 viewports = 24 runs:

SeverityTotal nodesTop rules
Critical50 label (form elements must have labels — 50 nodes, mostly shop filter checkboxes + contact form inputs)
Serious16 role-img-alt (10 nodes), aria-prohibited-attr (4), scrollable-region-focusable (2)
Moderate0
Minor0

Critical: form labels

Shop page filter checkboxes and the contact form inputs are missing <label for=...> associations. On EN+AR desktop runs, shop shows 17 unlabeled form elements; contact shows 4. Fix in the QWeb templates (shop filter widget is an Odoo stock view; may require a snippet override or the existing brand/js/a11y-shim.js to extend its reach to filter checkboxes).

Serious: role-img-alt

Decorative images marked role="img" without aria-label. Usually fixable by either removing the role="img" (if truly decorative) or adding aria-label="" describing the image.

Per-page axe HTML reports under outputs/audits/design-audit-20260415-225451/a11y/.

5. Arabic / RTL Localization

GapObservedFix
AR <title> untranslatedAll 6 AR routes render "Home | Kawader-Rentals" etc. in English Add title-tag translations to i18n_translations.py; push via i18n_translate_pages.py
Canonical uses /ar_001/Six AR canonicals use the Odoo locale code Map to /ar/ via website rewrite or canonical override
.kw-process__steps { direction: ltr }Forces LTR on AR Our Services page, breaking the 1→2→3→4 visual flow for Arabic readers Remove direction override; let parent [dir="rtl"] flip naturally
No hreflang alternates0 cross-links between EN and AR equivalents in <head> Emit <link rel="alternate" hreflang="ar" href="/ar/..."> and vice-versa
RTL CSS gapsKnown: .kw-feedback-float, .kw-mobile-cta, .kw-loading*, .kw-empty-state* Add per-component RTL rules to brand/css/rtl.css

6. Performance

Network waterfall (Home + Product)

PageRequestsTotal KBLoad (ms)Heaviest type
/6510,407 KB3,225script 6,102 KB (14 reqs)
/shop/…aputure…254,626 KB2,035script — (Odoo bundles)

Main bundles

Frontend JS: 802 KB wire / 2.77 MB decoded. Frontend CSS: 138 KB wire / 740 KB decoded. These are Odoo's consolidated bundles — not directly shrinkable without dropping modules, but reasonable for v18.

Product images

Sampled 5 products: average primary-image weight ~20 KB. Image optimization is not a priority.

Homepage YouTube embed

Homepage hero uses a live autoplay YouTube embed — contributes ~450 KB document + multiple xhr/fetch calls to youtube.com. On mobile (or slow networks) this is the largest LCP blocker. Replace with a poster image + click-to-play (lazy YouTube loader).

CrUX real-user

Requires CRUX_KEY env var (Google API key). Re-run CRUX_KEY=... node tools/odoo/audit/perf_probe.js to capture 75th-percentile LCP/CLS/INP from real visitors.

7. SEO + Schema

Structured data

0 JSON-LD blocks across all 12 routes (6 EN + 6 AR). Priority snippets:

<!-- Home + Contact: LocalBusiness -->
{
  "@context": "https://schema.org",
  "@type": "LocalBusiness",
  "@id": "https://kawader-cine.com/#org",
  "name": "Cine Kawader For Artistic Productions",
  "alternateName": "Kawader Art Productions & Film Services",
  "url": "https://kawader-cine.com",
  "telephone": "+970 59 958 8521",
  "email": "management@kawader-cine.com",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Al-Omaryoon St. 25",
    "addressLocality": "Ramallah",
    "addressRegion": "West Bank",
    "addressCountry": "PS"
  },
  "geo": { "@type": "GeoCoordinates", "latitude": 31.9040, "longitude": 35.2033 },
  "taxID": "562789826"
}
<!-- Product pages -->
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Aputure LS 600d Pro Daylight LED Monolight (V-Mount)",
  "image": "...primary carousel image src...",
  "brand": { "@type": "Brand", "name": "Aputure" },
  "offers": {
    "@type": "Offer",
    "priceCurrency": "USD",
    "price": "... (daily rental rate) ...",
    "availability": "https://schema.org/InStock",
    "url": "..."
  }
}

Meta + canonical

Sitemap + robots

8. Proposed Roadmap (Rounds 5–8)

Round 5 Quick wins (1–2 h, low risk)

Round 6 Conversion + SEO (2–3 h)

Round 7 RTL + A11y polish (2–3 h)

Round 8 Component consolidation (3–4 h)

Appendix — Artifacts