VARNI STOREFRONTS · QUALITY AUDIT · 2026-07-12

Ice Heist — iceheist theme

Live site: https://iceheist.varnijewels.com · Design reference: iceheist.com

47/100 Blockers 10 critical · 13 major · 7 medium · 26 minor

Audited across three dimensions: launch readiness (functionality, SEO, performance, security, accessibility, analytics, brand), mobile QA (real device emulation, touch), and desktop QA (1920/1440/1366, hover + keyboard). Report-only — no purchase was completed.

Category scores

Launch-readiness scoring. Infra-only items are marked MANUAL and left unscored.

CategoryScoreVerdictDefects
Core Functionality (guest journey) 75 warn 5
Performance & Core Web Vitals 20 fail 3
Technical SEO 42 fail 7
Security 38 fail 3
Frontend / Responsive 80 warn 2
Backend / API (externally observable only) 70 manual 2
Analytics & Tracking 5 fail 2
Accessibility (WCAG) 82 warn 3
Brand Consistency 60 warn 3
Marketing Readiness 42 warn 3
Monitoring & Maintenance manual 1

Lighthouse & Core Web Vitals

Lighthouse CLI, mobile emulation defaults.

PageurlperformanceaccessibilitybestPracticesseolcpclstbtfcpspeedIndexttireportPath
homehttps://iceheist.varnijewels.com/36929610058.5 s0.60 ms3.9 s10.5 s58.7 slh-iceheist-home.json
pdphttps://iceheist.varnijewels.com/products/test-import-104364_0588_04025989961009.4 s0.03920 ms3.9 s8.9 s9.4 slh-iceheist-pdp.json

Launch-readiness findings

34 findings across functionality, SEO, security, performance, accessibility, analytics and brand consistency.

critical Homepage Lighthouse Performance score 36/100 with catastrophic LCP Performance & Core Web Vitals

LCP 58.5s (threshold: good <2.5s), Interactive/TTI 58.7s, Speed Index 10.5s, CLS 0.6 (threshold: good <0.1), FCP 3.9s, TBT 0ms.

lh-iceheist-home.json (categories.performance.score=0.36; audits largest-contentful-paint=58.5s; cumulative-layout-shift=0.6; interactive=58.7s)

Fix: Investigate the LCP element on the homepage (likely a large hero/banner image or slow-resolving client-side render) — this is launch-blocking. Also fix layout shift sources (banners/carousels loading without reserved space).

critical PDP Lighthouse Performance score 59/100, LCP 9.4s Performance & Core Web Vitals

LCP 9.4s (threshold: good <2.5s), TTI 9.4s, Speed Index 8.9s, CLS 0.039 (good), TBT 20ms (good), FCP 3.9s.

lh-iceheist-pdp.json

Fix: Optimize PDP largest image/gallery loading (preload hero product image, serve next-gen formats, reduce render-blocking JS before first paint).

critical Homepage title, meta description, and OG/Twitter title are unbranded defaults Technical SEO

<title>Home | Our Store</title>; meta description 'Welcome to our store! We are dedicated to providing the best shopping experience.'; og:title/twitter:title also read 'Home | Our Store'. og:site_name correctly reads 'ICE HEIST', so the mismatch is isolated to page title/description templates, not a reference-brand leak.

seo-iceheist/home-full.html (grep of <title>, meta description, og:title/description)

Fix: Wire the homepage <title>/meta description/OG/Twitter title-description through themeContent.brandName and a real value prop, not the 'Our Store' placeholder default.

critical XML sitemap is broken (404 then 500) Technical SEO

robots.txt declares Sitemap: https://iceheist.varnijewels.com/sitemaps/iceheist.varnijewels.com-sitemaps/sitemap_index.xml. /sitemap.xml returns 404 with {"message":"Sitemap not found, you can generate sitemap through the admin dashboard."}; the exact URL declared in robots.txt returns HTTP 500.

seo-iceheist/sitemap.txt (404 body); curl -o /dev/null -w '%{http_code}' on the robots.txt-declared sitemap URL = 500

Fix: Generate the sitemap via the admin dashboard (per the site's own error message) or fix the sitemap generation job; this is launch-blocking for organic discovery/indexing.

critical No security headers present on the HTML response Security

curl -I on the homepage shows no Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, or Strict-Transport-Security headers.

seo-iceheist/headers.txt (grep for these headers returns none)

Fix: Add the standard security header set at the edge (Cloudflare) or app layer: CSP, X-Frame-Options/frame-ancestors, X-Content-Type-Options: nosniff, Referrer-Policy, Permissions-Policy, and HSTS.

critical No analytics/tag manager/pixel detected on the homepage Analytics & Tracking

Grep of the full homepage HTML for googletagmanager, gtag, GTM-*, G-*, fbq(, and Facebook pixel script tags returned zero matches.

seo-iceheist/home-full.html grep (empty result)

Fix: Install GA4/GTM (and Meta Pixel if used) with Enhanced Ecommerce events (view_item, add_to_cart, begin_checkout, purchase) before launch — currently there is no way to measure conversion or funnel drop-off.

critical Homepage <title>/meta description are the un-rebranded 'Our Store' default (see SEO) Brand Consistency

This is a brand-consistency failure even though it isn't a reference-brand leak: the visible browser tab, search result snippet, and shared-link preview all show 'Home | Our Store' instead of Ice Heist branding.

seo-iceheist/home-full.html

Fix: Same fix as the SEO finding — wire title/meta through themeContent.brandName.

critical No analytics/pixel installed (duplicate of Analytics finding) Marketing Readiness

Fix: See Analytics & Tracking section.

major Product catalog is full of unfinished seed/test data Core Functionality (guest journey)

Homepage, mobile nav, PLP, and 'You may also like' rails are dominated by placeholder products named 'TEST IMPORT-XXXXXX', 'DIAMOND ESSENTIALS BUNDLE 14K WHITE GOLD2', etc. Many of these show 'OUT OF STOCK'. The PDP used for this walkthrough itself is named 'Test Import-104364_0588_0402'.

iceheist-shots/mobile-sidenav-text.txt; iceheist-shots/all-links.json (product slugs like /products/test-import-202163, /products/diamond-essentials-bundle-14k-white-gold2); PDP title 'Test Import-104364_0588_0402 — Buy Online at Ice Heist | Free Delivery'

Fix: Purge or hide test/seed SKUs from the live storefront before launch; replace with real, in-stock catalog data.

major No CDN edge caching / compression evidence beyond Cloudflare passthrough Performance & Core Web Vitals

cf-cache-status: DYNAMIC on the homepage response — HTML is not being cached at the edge.

seo-iceheist/headers.txt

Fix: MANUAL/infra: review Cloudflare cache rules and server-side caching for HTML/API responses.

major PDP BreadcrumbList structured data has a malformed item URL (missing slash) Technical SEO

itemListElement[0].item = 'https://iceheist.varnijewels.comrings' — concatenation bug drops the '/' before the category slug, producing an invalid URL.

seo-iceheist/pdp-full.html ld+json BreadcrumbList block

Fix: Fix the breadcrumb schema URL builder to join base URL and slug with a '/'.

major PDP Product schema is missing required/recommended fields for rich results Technical SEO

Product ld+json only contains brand, aggregateRating (5.0 from 1 review), and offers.priceValidUntil. It is missing name, image, description, sku, url, offers.price, offers.priceCurrency, and offers.availability — Google's Merchant/Product rich-result validator will flag this as incomplete.

seo-iceheist/pdp-full.html ld+json Product block

Fix: Populate full Product schema (name/image/sku/offers.price/priceCurrency/availability/url) from the same PDP data already rendered on the page.

major No cookie consent banner detected Analytics & Tracking

Grep for cookie-consent/accept-cookies copy on the homepage returned no matches.

seo-iceheist/home-full.html grep (empty result)

Fix: Add a consent banner if any tracking/analytics is added, and wire Google Consent Mode if targeting EU/UK traffic.

major sameAs social links in Organization schema are generic platform homepages, not real Ice Heist profiles Brand Consistency

sameAs: ["https://x.com/", "https://www.facebook.com/", "https://www.instagram.com/", "https://youtube.com"] — matches the header social icon hrefs, which are also generic platform roots rather than a real @iceheist handle.

seo-iceheist/home-full.html ld+json Organization; iceheist-shots/all-links.json (first 4 entries)

Fix: Point social icons and schema sameAs at real store social profile URLs, or remove them if no real profiles exist yet.

major Social profile links are generic platform homepages (duplicate of Brand Consistency finding) Marketing Readiness

Fix: See Brand Consistency section.

minor 7 empty/hash hrefs found in DOM link scan Core Functionality (guest journey)

276 links captured, 64 unique; 7 resolve to '', '#', or javascript:void(0).

iceheist-shots/all-links.json

Fix: Audit and fix or remove dead anchors.

minor og:image and twitter:image are empty on the homepage Technical SEO

<meta property="og:image" content=""/> and <meta name="twitter:image" content=""/> — sharing the homepage link will show no preview image.

seo-iceheist/home-full.html

Fix: Set a branded hero/logo image for social sharing previews.

minor No clear single H1 on homepage; H1s found are mid-page section headings Technical SEO

Automated scan found <h1> elements reading 'Custom Design Jewellery' and 'FAQs' — not a page-level branded H1 for the homepage itself.

playwright h1 scan on https://iceheist.varnijewels.com/

Fix: Confirm heading hierarchy: homepage should carry one canonical H1 (e.g. hero headline), with section titles as H2.

minor Header logo <img alt="Logo"> is generic, not branded Frontend / Responsive

The actual header logo image (static.varnijewels.com asset) has alt text 'Logo' rather than the brand name (e.g. 'Ice Heist').

playwright header img scan: {src: '.../asset-14000x-8-1-hxlckulb7x8t.png', alt: 'Logo'}

Fix: Set alt text to the brand name for accessibility and SEO.

minor No skip-to-content link Accessibility (WCAG)

Scanned for 'Skip to content'/'Skip to main' anchors on the homepage — none found.

playwright skip-link scan (count=0)

Fix: Add a visually-hidden-until-focused skip link before the header.

minor Generic logo alt text (see Frontend section) Accessibility (WCAG)

See Frontend / Responsive finding.

same as above

info Guest checkout flow works end-to-end to the address step Core Functionality (guest journey)

Add to cart -> /checkout/cart -> 'Go To Checkout' -> /checkout/address renders a guest contact form (email, phone, 'Login to autofill your details' optional, Save Contact) without forcing login. Qty stepper, delete, subtotal, and coupon field are present on cart.

iceheist-checkout/checkout2-log.json; iceheist-checkout/after-checkout-click.png

Fix: None — working as expected. Note: on first attempt the cart->address transition showed a stuck-looking full-page dim + spinner overlay for a few seconds before Playwright's shorter wait caught up; consider tightening the loading-state visual so it doesn't read as frozen.

info Wishlist 422 'Invalid credentials' on every page for guest sessions Core Functionality (guest journey)

Console shows 'Failed to load resource: 422' and 'While fetching wishlist {message: Invalid credentials.}' on home, PLP, PDP, and cart for an unauthenticated visitor.

iceheist-shots/walkthrough-log.json; iceheist-shots/pdp-cart-log.json

Fix: This matches the known/expected guest-wishlist-422 behavior called out in the fix list — not a new bug. No action required, but confirm the UI never surfaces this as a visible user-facing error.

info PDP variant options: no distinct option groups detected on the audited product Core Functionality (guest journey)

Automated scan found 0 option-group elements / 0 variant-button candidates on the 'Test Import-104364_0588_0402' PDP (single-variant product), so the mandatory selected-state visibility check could not be exercised on this SKU.

iceheist-shots/pdp-cart-log.json (pdp_option_group_elements: 0, variant_button_candidates: 0)

Fix: MANUAL follow-up: re-run the variant-selected-state check on a multi-variant product (e.g. a ring with metal/size options) to confirm selected-chip contrast per the mandatory PDP rule.

info robots.txt and canonical tag are present and reasonable Technical SEO

robots.txt disallows checkout/my/filter-query paths appropriately and declares a sitemap URL (which itself 500s, see above). Canonical tag present and self-referential on home and PDP.

seo-iceheist/robots.txt; seo-iceheist/home-full.html; seo-iceheist/pdp-full.html

Fix: None beyond the sitemap fix above.

info HTTPS + session cookie hygiene look correct Security

Site is served over HTTP/2 HTTPS via Cloudflare with a valid cert (browser TLS negotiation succeeded for all Playwright/Lighthouse/curl runs). The litekart_store_id cookie is set with HttpOnly; Secure; SameSite=Lax.

seo-iceheist/headers.txt (set-cookie line)

Fix: None.

info Admin panel protection, MFA, password policy, rate limiting, CAPTCHA, WAF/SQLi/vuln scanning Security

Not externally observable from the storefront surface.

N/A

Fix: MANUAL/ops: verify with the platform/infra team (shared api.varnijewels.com backend).

info Mobile hamburger menu, sidenav, and category rails render correctly Frontend / Responsive

Mobile home, mobile sidenav open, and mobile nav click-through all captured without errors; sidenav text extraction succeeded with full category tree.

iceheist-shots/02-mobile-home.png, 03-mobile-sidenav.png, 06-mobile-nav-click1.png, mobile-sidenav-text.txt

Fix: None.

info Page and API responses returned promptly except for the wishlist 422 (expected) Backend / API (externally observable only)

No 502s or Cloudflare-shim crashes observed across home, PLP, PDP, cart, and checkout/address during this run.

iceheist-shots/walkthrough-log.json, pdp-cart-log.json; iceheist-checkout/checkout2-log.json

Fix: None from the outside.

info DB indexing/query optimization, memory leaks, cron/queue jobs, load balancing, autoscaling, backups, log/exception management Backend / API (externally observable only)

Not observable from outside the app.

N/A

Fix: MANUAL/ops: verify via backend monitoring on api.varnijewels.com.

info Lighthouse Accessibility: 92/100 (home), 89/100 (PDP) Accessibility (WCAG)

Both above the common 90 bar on home, PDP slightly under.

lh-iceheist-home.json, lh-iceheist-pdp.json categories.accessibility

info Wordmark parity holds: no reference-brand leak found Brand Consistency

Header wordmark, mobile sidenav, footer, product cards, PDP title, and Organization/WebSite schema all consistently say 'ICE HEIST' / 'Ice Heist'. No sign of a leaked reference/API-store name (e.g. no 'Boris & Twins').

iceheist-shots/01-home.png, footer-text.txt, mobile-sidenav-text.txt, seo-iceheist/home-full.html ld+json Organization name

Fix: None — this is the correct theme-wins behavior.

info Trust badges, FAQ, and newsletter capture present Marketing Readiness

'Our Best Service For You' trust row (Ethical Sourcing, Customisation Service, Bespoke Jewellery, Excellent Quality, World Wide Shipping, Sales Support 24/7), an FAQ accordion, and a 'Stay In Touch' email subscribe field all render on the homepage.

iceheist-shots/01-home.png

info Uptime, error, performance, SSL-expiry, backup, and CWV monitoring Monitoring & Maintenance

Not observable from outside the storefront.

N/A

Fix: MANUAL/ops: confirm which of these are wired up for the shared Varni fleet (Dokploy + api.varnijewels.com).

Mobile QA

Real mobile emulation (iPhone 13 (390x844, DPR3, touch, mobile Safari UA) via Playwright chromium headless, devices['iPhone 13'], Pixel 7 (412x915, DPR2.625, touch, mobile Chrome UA) via Playwright chromium headless, devices['Pixel 7'], Landscape spot-checks on both profiles (844x390 and 915x412) for home, PDP, checkout), touch interaction, thumb-driven journey.

critical Homepage does not finish rendering within a real mobile load window; severe layout jump lands where the thumb rests Home / Performance & CLS

Under Slow-4G + 4x CPU throttle (representative of real mobile conditions), the homepage hero/carousel region was still an empty grey placeholder or a partial sliver of image after 90+ seconds of elapsed wall time; the page's own H1/hero element jumped ~516 CSS px vertically (from y=4580 to y=4064) between the 8s and 15s in-page checkpoints. This corroborates and adds texture to the already-known ~58s unthrottled LCP / ~0.6 CLS finding from the prior launch-readiness pass: a real one-thumb user would almost certainly have abandoned long before the page settles, and any tap placed near the top of the visible content before the jump risks landing on the wrong element after content reflows underneath it. 104 of the page's image requests were observed with net::ERR_ABORTED during the load window (partly an artifact of repeat navigations in this test, but also consistent with images being repeatedly re-triggered as the layout reflows).

scratchpad/audit/shots/iceheist-iphone-00-home-t3000.png, iceheist-iphone-00-home-t8000.png, iceheist-iphone-00-home-t55000.png (hero still a blank void / thin image sliver at 93s elapsed); iceheist-iphone-results.json steps home_checkpoint / home_layout_shift_events

Fix: Reserve explicit width/height or aspect-ratio on the hero/carousel image containers so layout doesn't shift as images arrive; prioritize/preload the LCP hero image; investigate the high volume of aborted image requests; re-verify against the prior launch-readiness Core Web Vitals findings after a fix.

major Add to Cart button is not sticky — scrolls completely off-screen once the shopper scrolls past the fold PDP / Add to Cart

The PDP's Add to Cart button (374x64 on iPhone13, 396x64 on Pixel7 — good size) sits in a normal, non-fixed flow position. After scrolling down ~800-900px (e.g. to read specs), computed style is position:static and the button's rect moves to y=-114 / y=-175 (fully above the viewport). There is no persistent bottom action bar bringing it back, unlike the Cart page and PLP's sort/filter bar, both of which DO have a fixed bottom bar on this same site. A shopper who scrolls down to read product details has to manually scroll back to the top to buy.

scratchpad/audit/iceheist-iphone-results.json step atc_sticky_after_scroll ({position:'static', rect.y:-114}); scratchpad/audit/iceheist-pixel7-results.json step atc_sticky_check ({position:'static', rect.y:-175}); scratchpad/audit/shots/iceheist-iphone-07-pdp-scrolled-sticky-atc.png

Fix: Add a fixed/sticky bottom Add-to-Cart bar on PDP once the primary button scrolls out of view, matching the pattern already used on Cart/PLP.

major No toast or immediate visual confirmation when Add to Cart is tapped PDP / Add to Cart feedback

Tapping Add to Cart produced no toast/snackbar and no immediate cart-badge change in the same view; toastVisible was false and both cartBadgeBefore/After were null immediately after the tap in the instrumented run, even though the add did register server-side (confirmed later on the Cart page where the subtotal was correct). On a slow, janky page this is exactly the situation where a user re-taps, adds a duplicate, or gives up thinking the button is broken.

scratchpad/audit/iceheist-iphone-results.json step add_to_cart_feedback ({toastVisible:false, cartBadgeBefore:null, cartBadgeAfter:null}); scratchpad/audit/shots/iceheist-iphone-08-pdp-after-add-to-cart.png

Fix: Fire an immediate toast/snackbar plus a visible cart-badge bump animation the instant Add to Cart succeeds.

major Raw 'TEST IMPORT-xxxxx' seed SKU strings shown as the customer-facing product name across the whole Rings catalog, paired with implausible discounts Catalog content / Trust (mobile PLP, PDP, cart)

Every sampled Rings product (6 different PDPs, plus the PLP grid covering the 262-product Rings category) displays its literal import SKU — e.g. 'TEST IMPORT-104364_0588_0402', 'TEST IMPORT-100269' — as the product title on the PLP card, the PDP H1, and the Cart line item. Cart also shows a 'You saved $13,185.61' banner against an 81% strikethrough discount ($18,592 -> $3,568) on a single ring. On a phone, where a shopper skims a compact 2-column grid at speed, this reads as broken/fake inventory and undermines trust at the exact screens (PLP/PDP/cart) that decide mobile conversion. This is the mobile-visible face of the already-known 'catalog has TEST IMPORT seed SKUs' issue from the prior launch-readiness pass — flagged here with the specific mobile screens/evidence it appears on.

scratchpad/audit/shots/iceheist-pixel7-02-plp-rings.png, iceheist-iphone-10-cart-after-qty-increase.png, iceheist-iphone-04-pdp-loaded.png

Fix: Replace seed/import SKU strings with real merchandised product names before launch; review discount-percentage plausibility across the catalog.

medium Quantity stepper and remove-item controls are under the ~44px minimum tap target Cart / Tap targets

Measured on iPhone 13: quantity '+' stepper bounding box is 24x24 CSS px; remove/trash icon button is 30x30 CSS px. Pixel 7 confirms the same ~30x30 remove control. Both are core, frequently-tapped controls for a one-thumb shopper adjusting quantity or removing an item, and both sit meaningfully below the generally accepted 44x44 minimum hit area.

scratchpad/audit/iceheist-iphone-results.json steps qty_plus_box ({width:24,height:24}) and remove_button_box ({width:30,height:30}); scratchpad/audit/iceheist-pixel7-results.json step remove_box ({width:30,height:30})

Fix: Increase the tappable hit-area (via padding, not necessarily the visual icon) to at least 44x44 CSS px on both controls.

medium Fixed 'Go To Checkout' bar crowds/overlaps the last cart item's quantity and remove controls on shorter phone viewports Cart / Layout overlap

On the iPhone-13-height viewport (390x844) the cart item's quantity stepper and trash icon sit flush against, and appear partially obscured by, the fixed black 'Go To Checkout' bottom bar. The identical cart page on the taller Pixel 7 viewport (412x915) shows clear separation between the same controls and the fixed bar. This indicates the cart list's bottom padding/safe-area doesn't reserve enough space for the fixed bar's height on standard-or-shorter phone screens, risking mis-taps or a control the user can't reach cleanly.

scratchpad/audit/shots/iceheist-iphone-10-cart-after-qty-increase.png (crowded, 390x844) vs iceheist-pixel7-06-cart.png (clear, 412x915)

Fix: Add bottom padding to the cart item list equal to the fixed bar's rendered height (plus safe-area-inset-bottom) so controls are never crowded by it.

medium Hamburger menu button hit-area measures only 28x28 CSS px Nav / Tap target

The mobile nav trigger (the primary way to reach all site navigation on a phone) has a bounding box of 28x28 CSS px, below the ~44x44 minimum recommended for a frequently-tapped primary control.

scratchpad/audit/iceheist-pixel7-results.json step hamburger_candidates ({width:28, height:28})

Fix: Increase the button's padding/hit-area to at least 44x44 CSS px while keeping the visual icon size unchanged.

minor Homepage <title> is generic 'Home | Our Store' instead of the Ice Heist brand Home / Branding & SEO

document.title on the homepage reads 'Home | Our Store' even though the on-page header/footer clearly brand the site as 'Ice Heist'. This surfaces in the mobile browser tab, bookmarks, share sheets, and search snippets.

scratchpad/audit/iceheist-iphone-results.json step home_domcontentloaded / title_and_brand ({title:'Home | Our Store'})

Fix: Wire the page <title> from the theme's brand config (brandName) rather than a generic default.

minor Category banner subtitle text is low-contrast and hard to read on a phone PLP / Readability

On the Rings PLP, the banner subtitle ('Level up your fit. Our collections are made of high quality moissanite diamonds and sterling silver.') renders as light grey text on a light grey overlay, requiring the reader to strain even without competing with outdoor daylight glare.

scratchpad/audit/shots/iceheist-pixel7-02-plp-rings.png

Fix: Increase the contrast ratio of the banner subtitle text against its background overlay.

minor Checkout page heading always reads 'YOUR SHOPPING BAG' regardless of step, and an empty-cart visit to /checkout/address shows a generic empty-cart state rather than step-appropriate messaging Checkout / Content consistency

Both the cart step and the contact-details/address step display the same 'YOUR SHOPPING BAG' H1, even though a step indicator elsewhere on the page (Shopping Cart -> Checkout Details -> Order Complete) shows the correct step. Navigating directly to /checkout/address with an empty cart renders 'Your cart is empty' / 'Continue Shopping' rather than address-step content, which is defensible behavior but the label mismatch across steps is a small polish gap.

scratchpad/audit/shots/iceheist-iphone-11-checkout-address.png, iceheist-followup-01-address-initial.png

Fix: Make the page H1 reflect the active checkout step (e.g. 'Checkout Details').

minor Could not exercise the PDP 'selected variant chip' contrast check — sampled products expose no selectable variant chips PDP / Variant selection — coverage gap, not a confirmed defect

Across 6 different sampled Rings PDPs, none rendered any option-group or chip-button elements (0 in every case); each PDP instead lists attributes like 'Ring Size: 7', 'Metal Color: White' as static specs, suggesting each size/metal combination is modeled as its own separate product/SKU rather than a variant of one PDP. This may be an intentional catalog structure, in which case there is nothing to fix, but it does mean a mobile shopper cannot switch ring size or metal from the PDP itself without navigating back to search — and it means the known fleet-wide 'PDP selected option invisible' pattern could not be checked here for lack of a variant control to test.

scratchpad/audit/iceheist-iphone-results.json steps pdp_candidate_check (optionInfo groups:0/chipButtons:0 x6); scratchpad/audit/shots/iceheist-iphone-07-pdp-scrolled-sticky-atc.png (shows 'Ring Size: 7' as static spec)

Fix: If a variant model is intended (so the same product page lets a shopper switch size/metal), implement chip controls with a clearly visible selected state (per fleet standard: 2px accent border, readable text) and re-run this check. If the one-SKU-per-listing model is intentional, no action needed here, but consider surfacing 'other sizes' as related-product links.

Desktop QA

Desktop viewports (1920x1080, 1440x900, 1366x768), hover states, keyboard navigation, layout integrity.

critical Catalog is seed/test data: TEST IMPORT SKU names + fake uniform pricing/discounts PLP/PDP

Product titles are raw 'TEST IMPORT-xxxxx' SKU strings across every category (rings, pendants). Multiple unrelated products all show identical $1784 price with a fabricated 'was $9296, saved $7512 (80%+ off)' discount banner, visible on PLP and again in cart ('You saved $7512 on this order').

Load /products at any desktop width; read card titles/prices. Add to cart, view /checkout/cart.

Fix: Replace seed/import data with real catalog names, descriptions and honest pricing before launch; this is a catalog/CMS data fix, not a theme code fix.

major Gallery image tiny with ~30% of viewport left as dead whitespace, no thumbnails/zoom PDP

Main product image renders at a fixed 547x547 CSS px regardless of viewport. Measured via DOM rects at 1920x1080: image right edge = 658px, product title (h1) left edge = 1235px, leaving 577px (30% of the 1920px viewport) of empty white space between the gallery and info column. No thumbnail strip, no lightbox, no hover-zoom overlay of any kind.

Open any PDP (e.g. /products/test-import-104364_0588_0402) at 1920x1080, 1440x900, or 1366x768 — the gap is present at every width since the image doesn't scale with viewport.

Fix: Make the gallery column responsive (scale with viewport / max-width container), add a thumbnail rail, and add hover-zoom or click-to-lightbox on the main image.

major No hover-zoom affordance on PDP gallery image PDP

Hovering the main product image for 600ms produces a pixel-identical screenshot to the resting state — no cursor change, no magnify overlay, no zoom-in behavior tested.

Hover the PDP main image for 1+ second at any of the 3 desktop widths.

Fix: Implement hover-zoom (magnifier or scale-on-hover) consistent with desktop shopper expectations called out in this audit's brief.

major High Cumulative Layout Shift (CLS) confirmed on all 3 desktop widths Home / Performance

Direct PerformanceObserver measurement (buffered layout-shift entries, 9s settle window after domcontentloaded) recorded CLS of 0.668 at 1920x1080, 0.674 at 1440x900, and 0.622 at 1366x768 -- solidly in the 'poor' (>0.25) Core Web Vitals band on every desktop size tested. domcontentloaded itself took 10-17 seconds.

Cold-load https://iceheist.varnijewels.com/ and observe hero/banner images shifting the layout after first paint; or inspect iceheist-d-raw-<viewport>.json layoutShift field.

Fix: Reserve image/banner dimensions (aspect-ratio or explicit width/height) so hero content doesn't shift after load; this compounds the known ~58s LCP issue.

medium Raw '<ul></ul>' markup visibly rendered in top announcement bar during load Home (global header)

For several seconds after DOMContentLoaded, the top announcement bar shows the literal text '<ul></ul>' instead of the intended tagline. It later resolves to 'Crafting Beauty since 2015'. Reproduced at both 1920x1080 and 1440x900.

Hard-reload the home page and screenshot within ~9 seconds of DOMContentLoaded; look at the top center bar.

Fix: Fix the announcement-bar component's empty/loading state -- looks like an unescaped or mis-templated promo-list render.

medium Page <title> is generic placeholder 'Home | Our Store', not the Ice Heist brand Global metadata

document.title returns 'Home | Our Store' on every page at all 3 viewports tested, rather than an Ice Heist-branded title. Affects SEO and browser tab/bookmark identity, which matters more on desktop where users keep many tabs open.

Inspect document.title on any page load.

Fix: Wire the theme's brandName into route/page metadata (title tag), following the same brand-wordmark-parity rule already applied to visible header/footer/sidenav.

medium Cart icon disappears from header while on the Cart/Bag page Header (Cart page)

Home/PLP/PDP header icon row shows 4 icons (compare/refresh, cart, account, wishlist). The /checkout/cart page's header shows only 3 icons -- the cart icon itself is missing while viewing the cart.

Add an item to cart, navigate to /checkout/cart, compare the header icon row to any other page (e.g. a PDP) at 1920x1080.

Fix: Fix the header component's conditional render so the cart icon persists on the cart page itself.

medium Add to Cart CTA is not sticky; scrolling loses it into a large empty void PDP

After adding to cart and scrolling ~1200px down the PDP, the Add to Cart button/price are gone and a large empty gray/white area is visible before the Reviews section -- the info column is much shorter than the (empty) gallery column, so scrolling exposes more dead space rather than more content.

Add to cart on any PDP, scroll down ~1200px, observe.

Fix: Add a sticky/persistent add-to-cart summary bar for desktop, and balance column heights in the PDP grid.

minor No skip-to-content link; 16-20 Tab presses needed to reach first checkout form field Checkout keyboard nav

Tabbing from page load on /checkout/address takes 16 presses (1920x1080), 20+ presses (1440x900, did not reach within 20 tabs), and 16 presses (1366x768) to reach the Email address input -- every page tabs through social icons, language selector, currency selector, account/wishlist icons, and the full 5-item nav before reaching page content. Focus rings themselves ARE visible (1-2px blue outline) throughout, so this is inefficiency rather than an invisible-focus failure.

Load /checkout/address, press Tab repeatedly from page load, count presses until focus reaches the email input.

Fix: Add a 'skip to content' link as the first focusable element, or reorder tabindex so page content is reachable before the full top-bar/nav chrome.

minor No visible hover affordance on product cards PLP product cards

Screenshots taken before and after a 500ms hover on the first PLP product card are pixel-identical -- no shadow/elevation, no scale, no image swap. Quick-action icons (cart/wishlist/quick-view) are always visible rather than reveal-on-hover, so mouse-over communicates no interactivity.

Hover any PLP product card for 500ms+ and compare to the resting screenshot.

Fix: Add a subtle hover transition (shadow/elevation or image swap) to product cards for desktop mouse users.

minor Previously-reported '7 dead/hash hrefs' not reproduced in this pass Nav

This pass explicitly enumerated header <a> (9 links), footer <a> (41 links), and every opened megamenu panel's links across all 3 viewports and found 0 with href='#', empty href, or javascript: -- contradicting prior known context of 7 dead/hash hrefs. Not claiming the prior finding was wrong; flagging as unresolved-but-not-reproduced since it may be on a page/state this pass didn't visit.

n/a -- informational; re-check with a fuller site crawl (blog, account pages, PLP filter chips) if still suspected.

Fix: Re-verify against the original finding's specific page/state before considering it closed or still open.

Cross-check notes

The three dimensions were run independently, so some findings were corrected or contradicted by a later pass. Those disagreements are recorded here rather than silently resolved — a claim below is not firm until re-verified.

Not reproduced 7 dead/hash hrefs

Desktop QA checked header, footer and megamenu across all three viewports and found zero dead hrefs.

Action: Left open rather than closed — the original finding may have sampled a page the QA pass did not.

← All storefronts