Created
March 16, 2026 20:19
-
-
Save yachi/38ff1522d1ca60935f83de03926f0ef3 to your computer and use it in GitHub Desktop.
Sashimi supplier comparison: Soldeli vs Waso UK — interactive charts and analysis
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Soldeli vs Waso — Japanese Food Delivery Comparison</title> | |
| <link rel="preconnect" href="https://fonts.googleapis.com"> | |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> | |
| <link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;600;700&family=Fragment+Mono:wght@400&display=swap" rel="stylesheet"> | |
| <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.7/dist/chart.umd.min.js"></script> | |
| <style> | |
| /* ============ THEME — Deep Blue + Gold (Premium) ============ */ | |
| :root { | |
| --font-body: 'Bricolage Grotesque', system-ui, sans-serif; | |
| --font-mono: 'Fragment Mono', 'SF Mono', Consolas, monospace; | |
| --bg: #f7f5f0; | |
| --surface: #ffffff; | |
| --surface2: #f0ede6; | |
| --surface-elevated: #fffdf8; | |
| --border: rgba(0, 0, 0, 0.07); | |
| --border-bright: rgba(0, 0, 0, 0.14); | |
| --text: #1e1e1e; | |
| --text-dim: #6b6560; | |
| --soldeli: #c2410c; | |
| --soldeli-dim: rgba(194, 65, 12, 0.08); | |
| --waso: #1e3a5f; | |
| --waso-dim: rgba(30, 58, 95, 0.08); | |
| --gold: #d4a73a; | |
| --gold-dim: rgba(212, 167, 58, 0.08); | |
| --green: #16a34a; | |
| --green-dim: rgba(22, 163, 74, 0.08); | |
| --red: #dc2626; | |
| --red-dim: rgba(220, 38, 38, 0.08); | |
| --amber: #d97706; | |
| --amber-dim: rgba(217, 119, 6, 0.08); | |
| } | |
| @media (prefers-color-scheme: dark) { | |
| :root { | |
| --bg: #141210; | |
| --surface: #1e1c18; | |
| --surface2: #282520; | |
| --surface-elevated: #302c26; | |
| --border: rgba(255, 255, 255, 0.06); | |
| --border-bright: rgba(255, 255, 255, 0.12); | |
| --text: #ede8df; | |
| --text-dim: #9a9389; | |
| --soldeli: #fb923c; | |
| --soldeli-dim: rgba(251, 146, 60, 0.12); | |
| --waso: #93c5fd; | |
| --waso-dim: rgba(147, 197, 253, 0.1); | |
| --gold: #fbbf24; | |
| --gold-dim: rgba(251, 191, 36, 0.1); | |
| --green: #4ade80; | |
| --green-dim: rgba(74, 222, 128, 0.1); | |
| --red: #f87171; | |
| --red-dim: rgba(248, 113, 113, 0.1); | |
| --amber: #fbbf24; | |
| --amber-dim: rgba(251, 191, 36, 0.1); | |
| } | |
| } | |
| /* ============ RESET + BASE ============ */ | |
| * { margin: 0; padding: 0; box-sizing: border-box; } | |
| body { | |
| background: var(--bg); | |
| background-image: | |
| radial-gradient(ellipse at 20% 0%, var(--gold-dim) 0%, transparent 50%), | |
| radial-gradient(ellipse at 80% 100%, var(--waso-dim) 0%, transparent 40%); | |
| color: var(--text); | |
| font-family: var(--font-body); | |
| padding: 40px; | |
| min-height: 100vh; | |
| line-height: 1.5; | |
| } | |
| /* ============ ANIMATION ============ */ | |
| @keyframes fadeUp { | |
| from { opacity: 0; transform: translateY(12px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| @keyframes fadeScale { | |
| from { opacity: 0; transform: scale(0.95); } | |
| to { opacity: 1; transform: scale(1); } | |
| } | |
| .animate { animation: fadeUp 0.4s ease-out both; animation-delay: calc(var(--i, 0) * 0.05s); } | |
| .animate-scale { animation: fadeScale 0.35s ease-out both; animation-delay: calc(var(--i, 0) * 0.05s); } | |
| @media (prefers-reduced-motion: reduce) { | |
| *, *::before, *::after { | |
| animation-duration: 0.01ms !important; | |
| animation-delay: 0ms !important; | |
| transition-duration: 0.01ms !important; | |
| } | |
| } | |
| /* ============ LAYOUT — Responsive Nav ============ */ | |
| .wrap { | |
| max-width: 1400px; | |
| margin: 0 auto; | |
| display: grid; | |
| grid-template-columns: 180px 1fr; | |
| gap: 0 40px; | |
| } | |
| .main { min-width: 0; } | |
| /* TOC — Desktop */ | |
| .toc { | |
| position: sticky; | |
| top: 24px; | |
| align-self: start; | |
| padding: 14px 0; | |
| grid-row: 1 / -1; | |
| max-height: calc(100dvh - 48px); | |
| overflow-y: auto; | |
| } | |
| .toc::-webkit-scrollbar { width: 3px; } | |
| .toc::-webkit-scrollbar-thumb { background: var(--surface-elevated); border-radius: 2px; } | |
| .toc-title { | |
| font-family: var(--font-mono); | |
| font-size: 9px; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 2px; | |
| color: var(--text-dim); | |
| padding: 0 0 10px; | |
| margin-bottom: 8px; | |
| border-bottom: 1px solid var(--border); | |
| } | |
| .toc a { | |
| display: block; | |
| font-size: 11px; | |
| color: var(--text-dim); | |
| text-decoration: none; | |
| padding: 4px 8px; | |
| border-radius: 5px; | |
| border-left: 2px solid transparent; | |
| transition: all 0.15s; | |
| line-height: 1.4; | |
| margin-bottom: 1px; | |
| } | |
| .toc a:hover { color: var(--text); background: var(--surface2); } | |
| .toc a.active { color: var(--text); border-left-color: var(--gold); } | |
| /* TOC — Mobile */ | |
| @media (max-width: 1000px) { | |
| .wrap { grid-template-columns: 1fr; padding-top: 0; } | |
| body { padding-top: 0; } | |
| .toc { | |
| position: sticky; top: 0; z-index: 200; | |
| max-height: none; display: flex; gap: 4px; align-items: center; | |
| overflow-x: auto; -webkit-overflow-scrolling: touch; | |
| background: var(--bg); border-bottom: 1px solid var(--border); | |
| padding: 10px 16px; margin: 0 -40px; grid-row: auto; | |
| } | |
| .toc::-webkit-scrollbar { display: none; } | |
| .toc-title { display: none; } | |
| .toc a { | |
| white-space: nowrap; flex-shrink: 0; | |
| border-left: none; border-bottom: 2px solid transparent; | |
| border-radius: 4px 4px 0 0; padding: 6px 10px; font-size: 10px; | |
| } | |
| .toc a.active { border-left: none; border-bottom-color: var(--gold); background: var(--surface); } | |
| .main { padding-top: 20px; } | |
| .sec-head { scroll-margin-top: 52px; } | |
| } | |
| /* ============ HEADINGS ============ */ | |
| h1 { | |
| font-size: 36px; | |
| font-weight: 700; | |
| letter-spacing: -0.5px; | |
| margin-bottom: 6px; | |
| line-height: 1.15; | |
| } | |
| .subtitle { | |
| color: var(--text-dim); | |
| font-family: var(--font-mono); | |
| font-size: 12px; | |
| margin-bottom: 36px; | |
| } | |
| .sec-head { | |
| font-family: var(--font-mono); | |
| font-size: 11px; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 1.5px; | |
| color: var(--gold); | |
| margin: 40px 0 16px; | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| } | |
| .sec-head::before { | |
| content: ''; | |
| width: 8px; | |
| height: 8px; | |
| border-radius: 50%; | |
| background: var(--gold); | |
| } | |
| /* ============ HERO CARD ============ */ | |
| .hero-card { | |
| background: color-mix(in srgb, var(--surface) 92%, var(--gold) 8%); | |
| box-shadow: 0 4px 20px rgba(0, 0, 0, 0.06); | |
| border: 1px solid color-mix(in srgb, var(--border) 50%, var(--gold) 50%); | |
| border-radius: 14px; | |
| padding: 28px 32px; | |
| margin-bottom: 24px; | |
| } | |
| .hero-card p { | |
| font-size: 17px; | |
| line-height: 1.65; | |
| color: var(--text); | |
| max-width: 720px; | |
| } | |
| .hero-card strong { color: var(--soldeli); } | |
| .hero-card em { color: var(--waso); font-style: normal; font-weight: 600; } | |
| /* ============ KPI ROW ============ */ | |
| .kpi-row { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); | |
| gap: 14px; | |
| margin-bottom: 24px; | |
| } | |
| .kpi-card { | |
| background: var(--surface-elevated); | |
| border: 1px solid var(--border); | |
| border-radius: 10px; | |
| padding: 18px; | |
| box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04); | |
| } | |
| .kpi-card__value { | |
| font-size: 32px; | |
| font-weight: 700; | |
| line-height: 1.1; | |
| font-variant-numeric: tabular-nums; | |
| } | |
| .kpi-card__label { | |
| font-family: var(--font-mono); | |
| font-size: 10px; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 1.2px; | |
| color: var(--text-dim); | |
| margin-top: 6px; | |
| } | |
| /* ============ VERSUS CARDS ============ */ | |
| .vs-grid { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 16px; | |
| margin-bottom: 24px; | |
| } | |
| @media (max-width: 700px) { .vs-grid { grid-template-columns: 1fr; } } | |
| .vs-card { | |
| background: var(--surface); | |
| border: 1px solid var(--border); | |
| border-radius: 12px; | |
| padding: 22px 24px; | |
| border-top: 3px solid var(--border); | |
| } | |
| .vs-card--soldeli { border-top-color: var(--soldeli); } | |
| .vs-card--waso { border-top-color: var(--waso); } | |
| .vs-card__name { | |
| font-family: var(--font-mono); | |
| font-size: 11px; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 1.5px; | |
| margin-bottom: 12px; | |
| } | |
| .vs-card--soldeli .vs-card__name { color: var(--soldeli); } | |
| .vs-card--waso .vs-card__name { color: var(--waso); } | |
| .vs-card__stat { | |
| display: flex; | |
| justify-content: space-between; | |
| padding: 6px 0; | |
| font-size: 14px; | |
| border-bottom: 1px solid var(--border); | |
| } | |
| .vs-card__stat:last-child { border-bottom: none; } | |
| .vs-card__stat-label { color: var(--text-dim); font-size: 13px; } | |
| .vs-card__stat-value { font-weight: 600; } | |
| /* ============ DATA TABLES ============ */ | |
| .table-wrap { | |
| background: var(--surface); | |
| border: 1px solid var(--border); | |
| border-radius: 12px; | |
| overflow: hidden; | |
| margin-bottom: 24px; | |
| } | |
| .table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; } | |
| .data-table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| font-size: 13px; | |
| line-height: 1.55; | |
| } | |
| .data-table thead { position: sticky; top: 0; z-index: 2; } | |
| .data-table th { | |
| background: var(--surface2); | |
| font-family: var(--font-mono); | |
| font-size: 10px; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 1.2px; | |
| color: var(--text-dim); | |
| text-align: left; | |
| padding: 14px 16px; | |
| border-bottom: 2px solid var(--border-bright); | |
| white-space: nowrap; | |
| } | |
| .data-table td { | |
| padding: 12px 16px; | |
| border-bottom: 1px solid var(--border); | |
| vertical-align: top; | |
| } | |
| .data-table tbody tr:last-child td { border-bottom: none; } | |
| .data-table tbody tr:nth-child(even) { background: var(--gold-dim); } | |
| .data-table tbody tr { | |
| transition: background 0.15s ease; | |
| animation: fadeUp 0.35s ease-out both; | |
| animation-delay: calc(var(--i, 0) * 0.04s); | |
| } | |
| .data-table tbody tr:hover { background: var(--border); } | |
| .data-table .wide { min-width: 180px; max-width: 350px; } | |
| .data-table small { display: block; color: var(--text-dim); font-size: 11px; margin-top: 2px; } | |
| .data-table tfoot td { | |
| background: var(--surface2); | |
| font-weight: 600; | |
| font-family: var(--font-mono); | |
| font-size: 12px; | |
| border-top: 2px solid var(--border-bright); | |
| border-bottom: none; | |
| padding: 14px 16px; | |
| } | |
| /* Numeric right-align */ | |
| .num { text-align: right; font-variant-numeric: tabular-nums; font-family: var(--font-mono); font-size: 13px; } | |
| /* ============ STATUS BADGES ============ */ | |
| .badge { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 5px; | |
| font-family: var(--font-mono); | |
| font-size: 10px; | |
| font-weight: 600; | |
| padding: 3px 10px; | |
| border-radius: 6px; | |
| white-space: nowrap; | |
| letter-spacing: 0.3px; | |
| } | |
| .badge::before { | |
| content: ''; | |
| width: 6px; | |
| height: 6px; | |
| border-radius: 50%; | |
| background: currentColor; | |
| } | |
| .badge--soldeli { background: var(--soldeli-dim); color: var(--soldeli); } | |
| .badge--waso { background: var(--waso-dim); color: var(--waso); } | |
| .badge--tie { background: var(--gold-dim); color: var(--gold); } | |
| .badge--green { background: var(--green-dim); color: var(--green); } | |
| .badge--red { background: var(--red-dim); color: var(--red); } | |
| /* ============ CHART CONTAINER ============ */ | |
| .chart-grid { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 16px; | |
| margin-bottom: 24px; | |
| } | |
| @media (max-width: 700px) { .chart-grid { grid-template-columns: 1fr; } } | |
| .chart-card { | |
| background: var(--surface); | |
| border: 1px solid var(--border); | |
| border-radius: 12px; | |
| padding: 20px; | |
| } | |
| .chart-card__title { | |
| font-family: var(--font-mono); | |
| font-size: 11px; | |
| font-weight: 600; | |
| text-transform: uppercase; | |
| letter-spacing: 1px; | |
| color: var(--text-dim); | |
| margin-bottom: 16px; | |
| } | |
| .chart-card canvas { max-height: 220px; } | |
| /* ============ RECOMMENDATION BOX ============ */ | |
| .rec-grid { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 16px; | |
| margin-bottom: 24px; | |
| } | |
| @media (max-width: 700px) { .rec-grid { grid-template-columns: 1fr; } } | |
| .rec-card { | |
| border-radius: 12px; | |
| padding: 24px; | |
| border: 1px solid var(--border); | |
| } | |
| .rec-card--soldeli { | |
| background: var(--soldeli-dim); | |
| border-color: color-mix(in srgb, var(--border) 50%, var(--soldeli) 50%); | |
| } | |
| .rec-card--waso { | |
| background: var(--waso-dim); | |
| border-color: color-mix(in srgb, var(--border) 50%, var(--waso) 50%); | |
| } | |
| .rec-card__title { | |
| font-size: 16px; | |
| font-weight: 700; | |
| margin-bottom: 12px; | |
| } | |
| .rec-card--soldeli .rec-card__title { color: var(--soldeli); } | |
| .rec-card--waso .rec-card__title { color: var(--waso); } | |
| .rec-card ul { | |
| list-style: none; | |
| padding: 0; | |
| } | |
| .rec-card li { | |
| position: relative; | |
| padding: 5px 0 5px 18px; | |
| font-size: 14px; | |
| line-height: 1.5; | |
| border-bottom: 1px solid var(--border); | |
| } | |
| .rec-card li:last-child { border-bottom: none; } | |
| .rec-card li::before { | |
| content: ''; | |
| position: absolute; | |
| left: 0; | |
| top: 12px; | |
| width: 6px; | |
| height: 6px; | |
| border-radius: 50%; | |
| } | |
| .rec-card--soldeli li::before { background: var(--soldeli); } | |
| .rec-card--waso li::before { background: var(--waso); } | |
| .rec-card .price { | |
| font-family: var(--font-mono); | |
| font-size: 12px; | |
| color: var(--text-dim); | |
| } | |
| /* ============ STRATEGY BOX ============ */ | |
| .strategy-box { | |
| background: color-mix(in srgb, var(--surface) 90%, var(--gold) 10%); | |
| border: 2px solid var(--gold); | |
| border-radius: 14px; | |
| padding: 28px 32px; | |
| margin-bottom: 24px; | |
| } | |
| .strategy-box__title { | |
| font-size: 20px; | |
| font-weight: 700; | |
| color: var(--gold); | |
| margin-bottom: 10px; | |
| } | |
| .strategy-box p { | |
| font-size: 15px; | |
| line-height: 1.65; | |
| max-width: 720px; | |
| } | |
| /* ============ COLLAPSIBLE ============ */ | |
| details.collapsible { | |
| border: 1px solid var(--border); | |
| border-radius: 10px; | |
| overflow: hidden; | |
| margin-bottom: 16px; | |
| } | |
| details.collapsible summary { | |
| padding: 14px 20px; | |
| background: var(--surface); | |
| font-family: var(--font-mono); | |
| font-size: 12px; | |
| font-weight: 600; | |
| cursor: pointer; | |
| list-style: none; | |
| display: flex; | |
| align-items: center; | |
| gap: 8px; | |
| color: var(--text); | |
| transition: background 0.15s ease; | |
| } | |
| details.collapsible summary:hover { background: var(--surface-elevated); } | |
| details.collapsible summary::-webkit-details-marker { display: none; } | |
| details.collapsible summary::before { | |
| content: '\25B8'; | |
| font-size: 11px; | |
| color: var(--text-dim); | |
| transition: transform 0.15s ease; | |
| } | |
| details.collapsible[open] summary::before { transform: rotate(90deg); } | |
| details.collapsible .coll-body { | |
| padding: 16px 20px; | |
| border-top: 1px solid var(--border); | |
| font-size: 13px; | |
| line-height: 1.6; | |
| color: var(--text-dim); | |
| } | |
| details.collapsible .coll-body strong { color: var(--text); font-weight: 600; } | |
| /* ============ FOOTER ============ */ | |
| .page-footer { | |
| margin-top: 48px; | |
| padding-top: 20px; | |
| border-top: 1px solid var(--border); | |
| font-family: var(--font-mono); | |
| font-size: 10px; | |
| color: var(--text-dim); | |
| line-height: 1.6; | |
| } | |
| .page-footer a { color: var(--gold); text-decoration: none; } | |
| .page-footer a:hover { text-decoration: underline; } | |
| @media (max-width: 768px) { | |
| body { padding: 16px; } | |
| h1 { font-size: 26px; } | |
| .hero-card { padding: 20px; } | |
| .hero-card p { font-size: 15px; } | |
| .data-table th, .data-table td { padding: 10px 12px; } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="wrap"> | |
| <nav class="toc" id="toc"> | |
| <div class="toc-title">Contents</div> | |
| <a href="#s1">1. Overview</a> | |
| <a href="#s2">2. Trustpilot</a> | |
| <a href="#s3">3. Sashimi Prices</a> | |
| <a href="#s4">4. Shellfish</a> | |
| <a href="#s5">5. Meat</a> | |
| <a href="#s6">6. Groceries</a> | |
| <a href="#s7">7. Delivery</a> | |
| <a href="#s8">8. Scoring</a> | |
| <a href="#s9">9. Recommendations</a> | |
| </nav> | |
| <div class="main"> | |
| <h1 class="animate" style="--i:0">Soldeli vs Waso</h1> | |
| <p class="subtitle animate" style="--i:1">quantitative comparison of UK Japanese food delivery — March 2026</p> | |
| <!-- ==================== S1: OVERVIEW ==================== --> | |
| <div id="s1" class="sec-head animate" style="--i:2">1 — Company Overview</div> | |
| <div class="hero-card animate" style="--i:3"> | |
| <p>Two leading UK Japanese food delivery services with different strengths: <strong>Soldeli</strong> is a specialist sashimi-grade fish and shellfish supplier (~400–500 SKUs) with a physical shop in Southall, while <em>Waso</em> is a full Japanese & Hong Kong grocery supermarket (~2,000 SKUs / 1,600+ products) with Michelin-chef prepared meals. Note: this is a specialist-vs-generalist comparison — aggregate scores favour the broader retailer by design. See methodology notes.</p> | |
| </div> | |
| <div class="vs-grid"> | |
| <div class="vs-card vs-card--soldeli animate" style="--i:4"> | |
| <div class="vs-card__name">Soldeli</div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Focus</span><span class="vs-card__stat-value">Sashimi & Shellfish</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">SKUs</span><span class="vs-card__stat-value">~400–500</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Platform</span><span class="vs-card__stat-value">Shopify</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Physical Store</span><span class="vs-card__stat-value">Southall, UB2 5FB</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Chef Pedigree</span><span class="vs-card__stat-value">N/A</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Website</span><span class="vs-card__stat-value">soldeli.co.uk</span></div> | |
| </div> | |
| <div class="vs-card vs-card--waso animate" style="--i:5"> | |
| <div class="vs-card__name">Waso</div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Focus</span><span class="vs-card__stat-value">Full Japanese Grocery</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">SKUs</span><span class="vs-card__stat-value">~2,000 (1,600+ listed)</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Platform</span><span class="vs-card__stat-value">Custom</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Physical Store</span><span class="vs-card__stat-value">Online Only</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Chef Pedigree</span><span class="vs-card__stat-value">Ex-1★ & ex-2★ Michelin</span></div> | |
| <div class="vs-card__stat"><span class="vs-card__stat-label">Website</span><span class="vs-card__stat-value">waso.uk</span></div> | |
| </div> | |
| </div> | |
| <!-- ==================== S2: TRUSTPILOT ==================== --> | |
| <div id="s2" class="sec-head animate" style="--i:6">2 — Trustpilot Ratings</div> | |
| <div class="kpi-row animate-scale" style="--i:7"> | |
| <div class="kpi-card"> | |
| <div class="kpi-card__value" style="color:var(--soldeli)">2.9</div> | |
| <div class="kpi-card__label">Soldeli Rating</div> | |
| </div> | |
| <div class="kpi-card"> | |
| <div class="kpi-card__value" style="color:var(--waso)">4.3</div> | |
| <div class="kpi-card__label">Waso Rating</div> | |
| </div> | |
| <div class="kpi-card"> | |
| <div class="kpi-card__value">11</div> | |
| <div class="kpi-card__label">Soldeli Reviews</div> | |
| </div> | |
| <div class="kpi-card"> | |
| <div class="kpi-card__value">65</div> | |
| <div class="kpi-card__label">Waso Reviews</div> | |
| </div> | |
| </div> | |
| <div class="chart-grid animate" style="--i:8"> | |
| <div class="chart-card"> | |
| <div class="chart-card__title">Soldeli Rating Distribution</div> | |
| <canvas id="chart-soldeli-tp"></canvas> | |
| </div> | |
| <div class="chart-card"> | |
| <div class="chart-card__title">Waso Rating Distribution</div> | |
| <canvas id="chart-waso-tp"></canvas> | |
| </div> | |
| </div> | |
| <details class="collapsible animate" style="--i:9"> | |
| <summary>Review Theme Analysis</summary> | |
| <div class="coll-body"> | |
| <strong>Soldeli</strong> is bimodal: 45% five-star (praise for fish quality and freshness) vs 46% one-star (delivery delays, food safety concerns, poor communication). Zero reviews in the middle.<br><br> | |
| <strong>Waso</strong> is consistently positive: 83% five-star (quality products, excellent customer service, fast delivery). Only 6% one-star (occasional quality inconsistency on repeat orders, unclear delivery minimums).<br><br> | |
| <strong>Note:</strong> Trustpilot’s displayed rating (4.3) uses a proprietary algorithm that weights recency and other factors — it does not equal the raw arithmetic mean of the star distribution (which would be ~4.6). Similarly, Soldeli’s raw mean is ~2.91, displayed as 2.9. Both n-values (11 and 65) are too small for statistical inference. | |
| </div> | |
| </details> | |
| <!-- ==================== S3: SASHIMI PRICES ==================== --> | |
| <div id="s3" class="sec-head animate" style="--i:10">3 — Sashimi & Raw Fish Prices</div> | |
| <div class="table-wrap animate" style="--i:11"> | |
| <div class="table-scroll"> | |
| <table class="data-table"> | |
| <thead> | |
| <tr> | |
| <th class="wide">Product</th> | |
| <th>Soldeli</th> | |
| <th>Waso</th> | |
| <th>Winner</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr style="--i:1"><td>Salmon Saku 100g</td><td class="num">£4.90</td><td class="num">~£5.99–6.99</td><td><span class="badge badge--soldeli">Soldeli</span></td></tr> | |
| <tr style="--i:2"><td>Salmon Toro Belly</td><td class="num">£3.30<small>weight unspecified</small></td><td class="num">~£8.99<small>80–90g</small></td><td><span class="badge badge--soldeli">Soldeli</span></td></tr> | |
| <tr style="--i:3"><td>Salmon Saku 200g</td><td class="num">£7.95<small>sale</small></td><td class="num">~£6.67/100g<small>£19.99/300g</small></td><td><span class="badge badge--tie">Close</span></td></tr> | |
| <tr style="--i:4"><td>Bluefin Tuna Akami</td><td class="num">£9.90</td><td class="num">~£8.99<small>first-order promo</small></td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:5"><td>Bluefin Otoro 90–130g</td><td class="num">£14.80</td><td class="num">~£8.99<small>Chutoro flash sale</small></td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:6"><td>Hamachi Saku</td><td class="num">£7.80</td><td class="num">In 3-set</td><td><span class="badge badge--tie">Close</span></td></tr> | |
| <tr style="--i:7"><td>Hiramasa Saku Block</td><td class="num">£8.70</td><td class="num">—</td><td><span class="badge badge--soldeli">Exclusive</span></td></tr> | |
| <tr style="--i:8"><td>Chef Sashimi Set (3-fish)</td><td class="num">—</td><td class="num">~£23.99</td><td><span class="badge badge--waso">Exclusive</span></td></tr> | |
| <tr style="--i:9"><td>Assorted Sashimi (4–5 ppl)</td><td class="num">£38.95<small>sale</small></td><td class="num">—</td><td><span class="badge badge--soldeli">Exclusive</span></td></tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- ==================== S4: SHELLFISH ==================== --> | |
| <div id="s4" class="sec-head animate" style="--i:12">4 — Shellfish & Seafood</div> | |
| <div class="table-wrap animate" style="--i:13"> | |
| <div class="table-scroll"> | |
| <table class="data-table"> | |
| <thead> | |
| <tr> | |
| <th class="wide">Product</th> | |
| <th>Soldeli</th> | |
| <th>Waso</th> | |
| <th>Winner</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr style="--i:1"><td>Amaebi (Sweet Prawns)</td><td class="num">£5.95<small>sale from £6.95</small></td><td class="num">~£7–9</td><td><span class="badge badge--soldeli">Soldeli</span></td></tr> | |
| <tr style="--i:2"><td>Hokkaido Scallops (Hotate)</td><td class="num">£11.95<small>8pc, sale from £15</small></td><td class="num">~£8–10<small>4–5pc, 100g</small></td><td><span class="badge badge--tie">Diff qty</span></td></tr> | |
| <tr style="--i:3"><td>Uni Sea Urchin</td><td class="num">£29.99<small>sale from £44.80</small></td><td class="num">—</td><td><span class="badge badge--soldeli">Exclusive</span></td></tr> | |
| <tr style="--i:4"><td>Botan Ebi (Spot Prawn) 500g</td><td class="num">£35.00<small>sale</small></td><td class="num">—</td><td><span class="badge badge--soldeli">Exclusive</span></td></tr> | |
| <tr style="--i:5"><td>Zuwaigani Crab Leg</td><td class="num">£7.80</td><td class="num">—</td><td><span class="badge badge--soldeli">Exclusive</span></td></tr> | |
| <tr style="--i:6"><td>King Crab Cluster</td><td class="num">£76.90</td><td class="num">—</td><td><span class="badge badge--soldeli">Exclusive</span></td></tr> | |
| <tr style="--i:7"><td>Abalone</td><td class="num">£54.95</td><td class="num">—</td><td><span class="badge badge--soldeli">Exclusive</span></td></tr> | |
| </tbody> | |
| <tfoot> | |
| <tr><td colspan="4">Soldeli dominates shellfish with wider range and competitive pricing</td></tr> | |
| </tfoot> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- ==================== S5: MEAT ==================== --> | |
| <div id="s5" class="sec-head animate" style="--i:14">5 — Meat Products</div> | |
| <div class="table-wrap animate" style="--i:15"> | |
| <div class="table-scroll"> | |
| <table class="data-table"> | |
| <thead> | |
| <tr> | |
| <th class="wide">Product</th> | |
| <th>Soldeli</th> | |
| <th>Waso</th> | |
| <th>Winner</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr style="--i:1"><td>A5 Wagyu Rib Cap /100g</td><td class="num">~£11.60</td><td class="num">Available</td><td><span class="badge badge--tie">Check Both</span></td></tr> | |
| <tr style="--i:2"><td>A3 Wagyu Steak /100g</td><td class="num">~£10.10</td><td class="num">Available</td><td><span class="badge badge--tie">Check Both</span></td></tr> | |
| <tr style="--i:3"><td>Pork Shabu-Shabu</td><td class="num">£6.99<small>sale from £7.50</small></td><td class="num">Available</td><td><span class="badge badge--tie">Close</span></td></tr> | |
| <tr style="--i:4"><td>Beef Sukiyaki</td><td class="num">£8.55<small>sold out</small></td><td class="num">In stock</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:5"><td>Thinly Sliced Meat (variety)</td><td class="num">Limited</td><td class="num">Wide range</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:6"><td>Yakitori (20 sticks)</td><td class="num">£14.95<small>sale from £16.70</small></td><td class="num">—</td><td><span class="badge badge--soldeli">Exclusive</span></td></tr> | |
| <tr style="--i:7"><td>Char Siu (Roast Pork)</td><td class="num">£4.90–8.30</td><td class="num">Available</td><td><span class="badge badge--tie">Close</span></td></tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- ==================== S6: GROCERIES ==================== --> | |
| <div id="s6" class="sec-head animate" style="--i:16">6 — Groceries & Pantry</div> | |
| <div class="table-wrap animate" style="--i:17"> | |
| <div class="table-scroll"> | |
| <table class="data-table"> | |
| <thead> | |
| <tr> | |
| <th class="wide">Category</th> | |
| <th>Soldeli</th> | |
| <th>Waso</th> | |
| <th>Winner</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr style="--i:1"><td>Udon Noodles</td><td class="num">£1.50<small>sale from £1.75</small></td><td class="num">~£1.89</td><td><span class="badge badge--soldeli">Soldeli</span></td></tr> | |
| <tr style="--i:2"><td>Miso (instant)</td><td class="num">£3.85<small>sale from £4.20</small></td><td class="num">~£1.79–11.99<small>full range</small></td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:3"><td>Japanese Rice</td><td>Minimal</td><td>Full range</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:4"><td>Tofu & Natto</td><td>Minimal</td><td>Full range</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:5"><td>Seasonings & Condiments</td><td>Minimal</td><td>Full range</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:6"><td>Nori & Dried Goods</td><td>Some</td><td>Full range</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:7"><td>Snacks & Drinks</td><td>Minimal</td><td>Extensive</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:8"><td>Sake & Whisky</td><td>—</td><td>Available</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:9"><td>Chef-Prepared Meals</td><td>—</td><td>Michelin-chef range</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| </tbody> | |
| <tfoot> | |
| <tr><td colspan="4">Waso dominates groceries — ~2,000 SKUs vs ~400–500. Only udon is cheaper at Soldeli.</td></tr> | |
| </tfoot> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- ==================== S7: DELIVERY ==================== --> | |
| <div id="s7" class="sec-head animate" style="--i:18">7 — Delivery Comparison</div> | |
| <div class="table-wrap animate" style="--i:19"> | |
| <div class="table-scroll"> | |
| <table class="data-table"> | |
| <thead> | |
| <tr> | |
| <th class="wide">Factor</th> | |
| <th>Soldeli</th> | |
| <th>Waso</th> | |
| <th>Winner</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr style="--i:1"><td>Free Delivery Threshold</td><td>£70 (weekday)<small>£150 Saturday</small></td><td>Free<small>with min order</small></td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:2"><td>Min Order (Central London)</td><td>None stated</td><td>£29.95</td><td><span class="badge badge--tie">Depends</span></td></tr> | |
| <tr style="--i:3"><td>Min Order (UK Nationwide)</td><td>None stated</td><td>£49.95–79.95</td><td><span class="badge badge--tie">Depends</span></td></tr> | |
| <tr style="--i:4"><td>Lead Time</td><td>2–5 business days</td><td>Same-day / Next-day</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:5"><td>Saturday Delivery</td><td>Yes (£150+)</td><td>Yes (London)</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:6"><td>Doorstep (Unattended)</td><td>No</td><td>Yes + theft guarantee</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:7"><td>First-Order Discount</td><td>None</td><td>15% off<small>was valid until Dec 2025; may have renewed</small></td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:8"><td>Packaging</td><td>Insulated + ice packs</td><td>Dry ice + insulated</td><td><span class="badge badge--tie">Close</span></td></tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- ==================== S8: SCORING ==================== --> | |
| <div id="s8" class="sec-head animate" style="--i:20">8 — Composite Scoring</div> | |
| <div class="chart-grid animate" style="--i:21"> | |
| <div class="chart-card" style="grid-column: 1 / -1;"> | |
| <div class="chart-card__title">Weighted Score by Dimension (1–5 scale)</div> | |
| <canvas id="chart-radar" style="max-height: 380px;"></canvas> | |
| </div> | |
| </div> | |
| <div class="kpi-row animate-scale" style="--i:22"> | |
| <div class="kpi-card"> | |
| <div class="kpi-card__value" style="color:var(--soldeli)">3.05</div> | |
| <div class="kpi-card__label">Soldeli Weighted Score</div> | |
| </div> | |
| <div class="kpi-card"> | |
| <div class="kpi-card__value" style="color:var(--waso)">4.25</div> | |
| <div class="kpi-card__label">Waso Weighted Score</div> | |
| </div> | |
| <div class="kpi-card"> | |
| <div class="kpi-card__value" style="color:var(--green)">+39%</div> | |
| <div class="kpi-card__label">Waso Advantage</div> | |
| </div> | |
| </div> | |
| <div class="table-wrap animate" style="--i:23"> | |
| <div class="table-scroll"> | |
| <table class="data-table"> | |
| <thead> | |
| <tr> | |
| <th class="wide">Dimension</th> | |
| <th>Weight</th> | |
| <th>Soldeli</th> | |
| <th>Waso</th> | |
| <th>Winner</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr style="--i:1"><td>Sashimi Quality</td><td class="num">20%</td><td class="num">4.0</td><td class="num">4.5</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:2"><td>Sashimi Price</td><td class="num">15%</td><td class="num">4.5</td><td class="num">3.5</td><td><span class="badge badge--soldeli">Soldeli</span></td></tr> | |
| <tr style="--i:3"><td>Shellfish Range & Price</td><td class="num">10%</td><td class="num">4.5</td><td class="num">2.5</td><td><span class="badge badge--soldeli">Soldeli</span></td></tr> | |
| <tr style="--i:4"><td>Grocery Range</td><td class="num">15%</td><td class="num">1.5</td><td class="num">5.0</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:5"><td>Ready Meals / Chef Dishes</td><td class="num">5%</td><td class="num">1.0</td><td class="num">5.0</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:6"><td>Meat Range</td><td class="num">10%</td><td class="num">3.0</td><td class="num">4.0</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:7"><td>Delivery Speed & Flex</td><td class="num">10%</td><td class="num">2.0</td><td class="num">5.0</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:8"><td>Customer Satisfaction</td><td class="num">10%</td><td class="num">2.0</td><td class="num">4.5</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| <tr style="--i:9"><td>Promotions & Deals</td><td class="num">5%</td><td class="num">3.0</td><td class="num">4.5</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| </tbody> | |
| <tfoot> | |
| <tr><td>Weighted Total</td><td class="num">100%</td><td class="num" style="color:var(--soldeli); font-size:14px;">3.05</td><td class="num" style="color:var(--waso); font-size:14px;">4.25</td><td><span class="badge badge--waso">Waso</span></td></tr> | |
| </tfoot> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- ==================== S9: RECOMMENDATIONS ==================== --> | |
| <div id="s9" class="sec-head animate" style="--i:24">9 — What to Order Where</div> | |
| <div class="rec-grid animate" style="--i:25"> | |
| <div class="rec-card rec-card--soldeli"> | |
| <div class="rec-card__title">Order from Soldeli</div> | |
| <ul> | |
| <li>Salmon Saku <span class="price">£4.90/100g — best price</span></li> | |
| <li>Salmon Toro Belly <span class="price">£3.30 — much cheaper</span></li> | |
| <li>Amaebi Sweet Prawns <span class="price">£5.95</span></li> | |
| <li>Hokkaido Scallops <span class="price">£11.95/8pc sale</span></li> | |
| <li>Uni Sea Urchin <span class="price">£29.99 — exclusive</span></li> | |
| <li>Botan Ebi Spot Prawns <span class="price">£35/500g</span></li> | |
| <li>Bulk Sashimi Platter <span class="price">£38.95 for 4–5 ppl</span></li> | |
| <li>Hiramasa, Crab, Abalone <span class="price">exclusive range</span></li> | |
| </ul> | |
| </div> | |
| <div class="rec-card rec-card--waso"> | |
| <div class="rec-card__title">Order from Waso</div> | |
| <ul> | |
| <li>All Japanese Groceries <span class="price">rice, miso, natto, tofu, nori</span></li> | |
| <li>Chef-Prepared Meals <span class="price">Michelin-chef crafted</span></li> | |
| <li>Ready-to-Eat Sashimi Sets <span class="price">pre-sliced by chef</span></li> | |
| <li>Thinly Sliced Meat <span class="price">wider selection, in stock</span></li> | |
| <li>Bluefin Tuna (first order) <span class="price">Chutoro ~£8.99 promo</span></li> | |
| <li>Snacks, Drinks, Sake, Whisky <span class="price">extensive range</span></li> | |
| <li>Anything Time-Sensitive <span class="price">same-day / next-day</span></li> | |
| <li>Miso, Seasonings, Condiments <span class="price">full pantry range</span></li> | |
| </ul> | |
| </div> | |
| </div> | |
| <div class="strategy-box animate" style="--i:26"> | |
| <div class="strategy-box__title">Optimal Strategy: Use Both (by Use Case)</div> | |
| <p><strong>For sashimi & shellfish enthusiasts:</strong> Soldeli wins on price and exclusive range (uni, botan ebi, crab). Monthly haul — hit £70 for free delivery. Note: many prices are current sales and may increase.<br><br> | |
| <strong>For weekly Japanese cooking:</strong> Waso is the clear choice — broader grocery range, faster delivery (same/next-day), and chef-prepared meals. Use their price-beat guarantee if you find groceries cheaper elsewhere.<br><br> | |
| <strong>Caveat:</strong> The aggregate score (Waso 4.25 vs Soldeli 3.05) reflects a general-purpose evaluation. A sashimi-focused weighting would narrow or reverse the gap. Neither score is statistically robust — treat as directional guidance, not definitive ranking.</p> | |
| </div> | |
| <details class="collapsible animate" style="--i:27"> | |
| <summary>Methodology & Limitations (Academic Defense Review)</summary> | |
| <div class="coll-body"> | |
| <strong>Data collection:</strong> Prices scraped from soldeli.co.uk and waso.uk/waso.tokyo on 16 March 2026. Some Waso prices are approximate (site blocks automated fetching — marked with ~). Many Soldeli prices reflect active sales (original prices noted where known). Trustpilot ratings as of same date.<br><br> | |
| <strong>Scoring:</strong> 9-dimension weighted model. Weights were assigned by the study author based on assumed consumer priorities — <strong>no empirical consumer survey, conjoint analysis, or AHP was conducted.</strong> Under equal weighting (11.1% each), Waso still leads (4.28 vs 2.83), indicating the directional conclusion is robust to weight perturbation.<br><br> | |
| <strong>Critical limitations acknowledged:</strong><br> | |
| • <strong>Single-date snapshot:</strong> Prices captured on one date only. No measure of price volatility, seasonal variation, or promotional cycle effects. Results reflect March 2026 conditions and should not be generalised.<br> | |
| • <strong>Specialist vs generalist bias:</strong> Comparing a ~500-SKU specialist to a ~2,000-SKU generalist on “range” dimensions structurally favours the broader retailer. Dimensions like Grocery Range and Ready Meals penalise Soldeli for not being something it never claimed to be. The aggregate score is most meaningful for customers seeking a general-purpose Japanese food delivery — sashimi-focused buyers should weight dimensions 1–3 more heavily.<br> | |
| • <strong>Trustpilot sample size:</strong> Soldeli n=11 is not statistically meaningful (margin of error ±29.5% at 95% CI). Waso n=65 is marginal. Both are self-selected voluntary samples subject to response bias. No Mann-Whitney U test was conducted. Treat as directional only.<br> | |
| • <strong>Estimated Waso prices:</strong> ~30% of Waso price comparisons are estimated from search snippets and cached pages due to 403 site blocks. These are marked with ~ but no confidence interval is provided. A ±20% price swing on estimated items would not change category-level winners.<br> | |
| • <strong>Missing dimensions:</strong> Not evaluated: delivery coverage by postcode, minimum order impact on effective cost, packaging/cold-chain quality, product authenticity/sourcing transparency, subscription/loyalty programs, website usability, refund policy, allergen information.<br> | |
| • <strong>Sale price bias:</strong> Multiple Soldeli prices reflect active promotions. When sales end, Soldeli’s price advantage on salmon saku, amaebi, udon, and miso narrows or disappears.<br> | |
| • <strong>Temporal validity:</strong> These findings are scoped to March 2026. Prices, stock, reviews, and delivery terms change. Recommend re-evaluation quarterly. | |
| </div> | |
| </details> | |
| <!-- ============ FOOTER ============ --> | |
| <div class="page-footer animate" style="--i:28"> | |
| Sources: <a href="https://soldeli.co.uk/">soldeli.co.uk</a> · <a href="https://waso.uk/">waso.uk</a> · <a href="https://uk.trustpilot.com/review/soldeli.co.uk">Soldeli Trustpilot</a> · <a href="https://uk.trustpilot.com/review/waso.tokyo">Waso Trustpilot</a><br> | |
| Generated March 2026 · Prices may have changed since collection | |
| </div> | |
| </div><!-- /main --> | |
| </div><!-- /wrap --> | |
| <!-- ============ CHARTS ============ --> | |
| <script> | |
| document.addEventListener('DOMContentLoaded', function() { | |
| const rootStyle = getComputedStyle(document.documentElement); | |
| const textDim = rootStyle.getPropertyValue('--text-dim').trim() || '#6b6560'; | |
| const chartDefaults = { | |
| responsive: true, | |
| maintainAspectRatio: true, | |
| plugins: { | |
| legend: { display: false } | |
| } | |
| }; | |
| // Soldeli Trustpilot | |
| new Chart(document.getElementById('chart-soldeli-tp'), { | |
| type: 'bar', | |
| data: { | |
| labels: ['5-star', '4-star', '3-star', '2-star', '1-star'], | |
| datasets: [{ | |
| data: [45, 0, 0, 9, 46], | |
| backgroundColor: ['#16a34a', '#65a30d', '#d97706', '#ea580c', '#dc2626'], | |
| borderRadius: 4, | |
| barThickness: 28 | |
| }] | |
| }, | |
| options: { | |
| ...chartDefaults, | |
| scales: { | |
| y: { | |
| beginAtZero: true, | |
| max: 100, | |
| ticks: { callback: v => v + '%', color: textDim, font: { family: "'Fragment Mono', monospace", size: 10 } }, | |
| grid: { color: 'rgba(0,0,0,0.05)' } | |
| }, | |
| x: { | |
| ticks: { color: textDim, font: { family: "'Fragment Mono', monospace", size: 10 } }, | |
| grid: { display: false } | |
| } | |
| } | |
| } | |
| }); | |
| // Waso Trustpilot | |
| new Chart(document.getElementById('chart-waso-tp'), { | |
| type: 'bar', | |
| data: { | |
| labels: ['5-star', '4-star', '3-star', '2-star', '1-star'], | |
| datasets: [{ | |
| data: [83, 6, 5, 0, 6], | |
| backgroundColor: ['#16a34a', '#65a30d', '#d97706', '#ea580c', '#dc2626'], | |
| borderRadius: 4, | |
| barThickness: 28 | |
| }] | |
| }, | |
| options: { | |
| ...chartDefaults, | |
| scales: { | |
| y: { | |
| beginAtZero: true, | |
| max: 100, | |
| ticks: { callback: v => v + '%', color: textDim, font: { family: "'Fragment Mono', monospace", size: 10 } }, | |
| grid: { color: 'rgba(0,0,0,0.05)' } | |
| }, | |
| x: { | |
| ticks: { color: textDim, font: { family: "'Fragment Mono', monospace", size: 10 } }, | |
| grid: { display: false } | |
| } | |
| } | |
| } | |
| }); | |
| // Radar chart | |
| new Chart(document.getElementById('chart-radar'), { | |
| type: 'radar', | |
| data: { | |
| labels: ['Sashimi Quality', 'Sashimi Price', 'Shellfish', 'Groceries', 'Ready Meals', 'Meat', 'Delivery', 'Satisfaction', 'Promos'], | |
| datasets: [ | |
| { | |
| label: 'Soldeli', | |
| data: [4.0, 4.5, 4.5, 1.5, 1.0, 3.0, 2.0, 2.0, 3.0], | |
| borderColor: rootStyle.getPropertyValue('--soldeli').trim() || '#c2410c', | |
| backgroundColor: 'rgba(194, 65, 12, 0.1)', | |
| borderWidth: 2, | |
| pointBackgroundColor: rootStyle.getPropertyValue('--soldeli').trim() || '#c2410c', | |
| pointRadius: 4 | |
| }, | |
| { | |
| label: 'Waso', | |
| data: [4.5, 3.5, 2.5, 5.0, 5.0, 4.0, 5.0, 4.5, 4.5], | |
| borderColor: rootStyle.getPropertyValue('--waso').trim() || '#1e3a5f', | |
| backgroundColor: 'rgba(30, 58, 95, 0.1)', | |
| borderWidth: 2, | |
| pointBackgroundColor: rootStyle.getPropertyValue('--waso').trim() || '#1e3a5f', | |
| pointRadius: 4 | |
| } | |
| ] | |
| }, | |
| options: { | |
| responsive: true, | |
| maintainAspectRatio: true, | |
| plugins: { | |
| legend: { | |
| position: 'bottom', | |
| labels: { | |
| color: textDim, | |
| font: { family: "'Fragment Mono', monospace", size: 11 }, | |
| padding: 20, | |
| usePointStyle: true, | |
| pointStyle: 'circle' | |
| } | |
| } | |
| }, | |
| scales: { | |
| r: { | |
| beginAtZero: true, | |
| max: 5, | |
| ticks: { | |
| stepSize: 1, | |
| color: textDim, | |
| font: { size: 9 }, | |
| backdropColor: 'transparent' | |
| }, | |
| pointLabels: { | |
| color: textDim, | |
| font: { family: "'Fragment Mono', monospace", size: 10 } | |
| }, | |
| grid: { color: 'rgba(0,0,0,0.06)' }, | |
| angleLines: { color: 'rgba(0,0,0,0.06)' } | |
| } | |
| } | |
| } | |
| }); | |
| }); | |
| </script> | |
| <!-- ============ SCROLL SPY ============ --> | |
| <script> | |
| (function() { | |
| const toc = document.getElementById('toc'); | |
| const links = toc.querySelectorAll('a'); | |
| const sections = []; | |
| links.forEach(link => { | |
| const id = link.getAttribute('href').slice(1); | |
| const el = document.getElementById(id); | |
| if (el) sections.push({ id, el, link }); | |
| }); | |
| const observer = new IntersectionObserver(entries => { | |
| entries.forEach(entry => { | |
| if (entry.isIntersecting) { | |
| links.forEach(l => l.classList.remove('active')); | |
| const match = sections.find(s => s.el === entry.target); | |
| if (match) { | |
| match.link.classList.add('active'); | |
| if (window.innerWidth <= 1000) { | |
| match.link.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'center' }); | |
| } | |
| } | |
| } | |
| }); | |
| }, { rootMargin: '-10% 0px -80% 0px' }); | |
| sections.forEach(s => observer.observe(s.el)); | |
| links.forEach(link => { | |
| link.addEventListener('click', e => { | |
| e.preventDefault(); | |
| const id = link.getAttribute('href').slice(1); | |
| const el = document.getElementById(id); | |
| if (el) { | |
| el.scrollIntoView({ behavior: 'smooth', block: 'start' }); | |
| history.replaceState(null, '', '#' + id); | |
| } | |
| }); | |
| }); | |
| })(); | |
| </script> | |
| </body> | |
| </html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment