Security (P0): - IsJTIRevoked fails closed on DB error (previously accepted revoked tokens) - Remove dead consume parameter from SCA gate (prevented token replay) - Rate limiter map TTL-based eviction (prevented memory exhaustion) - 2FA attempt map already had LRU eviction (verified) Money Safety (P1): - Gift card transfer refuses expired destination cards - Gift card balance deduction has WHERE balance >= amount guard - Webhook clawback acquires till-sale advisory lock - Sweep/retry lock keys aligned Privacy/Cookies (P2): - Self-host Google Fonts (Playfair Display woff2) - Replace CARTO map tiles with OpenStreetMap raster tiles - Replace Wikimedia/icon-icons external images with local SVGs - Remove external image URLs from CSP Legal (P3): - Privacy policy: add 6 missing data categories (gift cards, 2FA, GDPR, notifications, technical, cookies) - Terms: add Tips section (optionality, non-refundable, same processing as bookings) Code Quality (P4): - twofa.Check accepts db.Querier for testability - depositPromotionMinPct uses literal 0.20 (not misleading alias) - HolidayHours.svelte uses proper type (not as any[]) - Remove stale TODO comments from main.go Testing (P5): - 94 new float64 money validity tests across 3 test files - Cover VAT, splits, refunds, gift cards, rounding, precision boundaries - All 27 backend test packages pass
26 lines
1.3 KiB
XML
26 lines
1.3 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 300">
|
|
<defs>
|
|
<linearGradient id="bg7" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
<stop offset="0%" stop-color="#ede7f6"/>
|
|
<stop offset="100%" stop-color="#b39ddb"/>
|
|
</linearGradient>
|
|
</defs>
|
|
<rect width="400" height="300" fill="url(#bg7)" rx="8"/>
|
|
<!-- Ombre nail effect -->
|
|
<ellipse cx="200" cy="150" rx="55" ry="95" fill="url(#bg7)" opacity="0.5"/>
|
|
<defs>
|
|
<linearGradient id="ombre" x1="0%" y1="0%" x2="0%" y2="100%">
|
|
<stop offset="0%" stop-color="#7c4dff" stop-opacity="0.6"/>
|
|
<stop offset="40%" stop-color="#7c4dff" stop-opacity="0.3"/>
|
|
<stop offset="100%" stop-color="#fff" stop-opacity="0.1"/>
|
|
</linearGradient>
|
|
</defs>
|
|
<ellipse cx="200" cy="130" rx="45" ry="70" fill="url(#ombre)"/>
|
|
<!-- Sparkle trail -->
|
|
<circle cx="175" cy="100" r="2" fill="#fff" opacity="0.7"/>
|
|
<circle cx="185" cy="95" r="1.5" fill="#fff" opacity="0.5"/>
|
|
<circle cx="220" cy="105" r="2" fill="#fff" opacity="0.6"/>
|
|
<circle cx="210" cy="98" r="1" fill="#fff" opacity="0.4"/>
|
|
<circle cx="195" cy="90" r="1.5" fill="#fff" opacity="0.5"/>
|
|
<text x="200" y="260" text-anchor="middle" fill="#4527a0" font-family="Georgia, serif" font-size="14" opacity="0.6">Nail Art — Ombre</text>
|
|
</svg> |