Files
MyClub/DOCS/LOGO_ENHANCEMENT_SUMMARY.md
T
Tomáš Dvořák 12cba639b9 upload
2025-10-16 13:32:05 +02:00

8.5 KiB

Logo Enhancement System - Implementation Summary

Overview

Enhanced the logo fetching system to use logoapi.sportcreative.eu with local caching, SVG optimization, and proper formatting across all components.

Key Features Implemented

1. Enhanced Logo Management (sportLogosAPI.ts)

  • IndexedDB Local Caching: Logos are cached locally for 7 days for fast loading
  • Automatic Cleanup: Unused logos are automatically deleted after 30 days
  • SVG Optimization: SVG files are optimized to remove empty space and fix viewBox
  • Fallback Chain: logoapi → FACR → placeholder
  • Cache Invalidation: Smart cache with timestamp validation

Key Functions:

  • fetchLogoFromLogoAPI(teamId, teamName): Fetches from logoapi with caching
  • getTeamLogo(teamId, teamName, facrLogo): Main function with fallback chain
  • batchFetchLogosFromSportLogosAPI(teamIds): Batch fetch multiple logos
  • cleanupUnusedLogos(): Removes stale cached logos
  • optimizeSVG(svgUrl): Removes padding and optimizes SVG viewBox

2. Reusable TeamLogo Component (TeamLogo.tsx)

New component that handles logo fetching and display with:

  • Automatic logoapi integration
  • Loading states with skeleton
  • Error handling with fallbacks
  • Configurable sizes (small/medium/large/custom)
  • Proper centering and formatting

Usage Example:

<TeamLogo
  teamId="12345"
  teamName="FC Example"
  facrLogo={match.home_logo_url}
  size="medium"
/>

3. CSS Utilities (logos.css)

Added comprehensive CSS for logo formatting:

  • .match-logo-small (24px)
  • .match-logo-medium (32px)
  • .match-logo-large (48px)
  • .logo-container: Flex centering wrapper
  • .team-logo: Proper object-fit and positioning
  • Loading animations
  • Special styles for next match hero logos

4. Component Updates

Updated Components:

  1. MatchesWidget: Now uses TeamLogo component with proper centering
  2. MatchesSection: Updated to use TeamLogo with team IDs
  3. CompetitionMatches: Enhanced with TeamLogo and proper spacing
  4. HomePage: Added cleanup call and logo CSS import

All match displays now show logos:

  • Centered vertically in their containers
  • Properly sized without distortion
  • With consistent spacing
  • Using logoapi when available

SVG Optimization Details

The SVG optimization process:

  1. Fetches the SVG file
  2. Parses it with DOMParser
  3. Creates temporary DOM element to calculate bounding box
  4. Adjusts viewBox to content bounds (removes padding)
  5. Removes width/height attributes for responsive scaling
  6. Serializes and creates blob URL
  7. Caches the optimized version

This ensures SVGs don't have empty space and scale perfectly.

Cache Management

Storage Strategy:

  • Location: IndexedDB (browser-native, large capacity)
  • Duration: 7 days
  • Cleanup: Unused logos (not accessed in 30 days) are auto-deleted
  • Indexes: By lastUsed and source for efficient queries

Benefits:

  • Fast logo loading (instant from cache)
  • Reduced API calls to logoapi
  • Offline support
  • Automatic storage management

Integration with logoapi.sportcreative.eu

API Endpoint:

GET https://logoapi.sportcreative.eu/logos/{teamId}/json

Response Structure:

{
  "logo_url_svg": "https://...",
  "logo_url_png": "https://...",
  "logo_url": "https://..."
}

Priority:

  1. SVG (optimized for web)
  2. PNG (fallback)
  3. Generic logo_url

SetupPage Integration

The SetupPage already has logoapi integration:

  • Fetches logos from logoapi during club selection
  • Falls back to FACR if not available
  • Uploads new logos to both logoapi and loga.sportcreative.eu
  • Shows source indicator (✓ logoapi.sportcreative.eu / FAČR / Nahráno)

Formatting Improvements

Before:

  • Logos with empty space causing alignment issues
  • Inconsistent sizing across components
  • No caching (slow repeated loads)
  • FACR logos only (limited availability)

After:

  • Logos perfectly centered without empty space
  • Consistent sizing (24px/28px/32px/48px/64px)
  • Fast loading with IndexedDB cache
  • logoapi first (broader coverage), FACR fallback
  • SVG optimization for perfect scaling
  • Automatic cleanup of unused logos

Match Display Formatting

Upcoming Matches Widget:

  • Logos in 24px containers
  • Perfect vertical centering
  • Proper spacing between logo and team name
  • Fallback icon (football) if logo fails

Match Rows (MatchesSection, CompetitionMatches):

  • Logos in 28px containers
  • Centered in flex containers
  • Team names properly truncated
  • Score display centered between teams

Hero/Featured Matches:

  • Larger logos (48-64px)
  • Enhanced with drop shadows
  • Background effects for visual appeal
  • Proper spacing in hero sections

Testing Checklist

To verify the implementation:

  1. Initial Load:

    • Check browser DevTools → Application → IndexedDB → LogoCache
    • Verify logos are being cached
  2. Logo Display:

    • Check MatchesWidget - logos should be centered
    • Check Calendar page - match rows properly formatted
    • Check Tables page - team logos visible
    • Check HomePage - all variants (Unified/Magazine/Pro/Edge)
  3. Performance:

    • First load: Network requests to logoapi
    • Second load: Instant from cache (no network requests)
    • Check cache cleanup after 30 days of non-use
  4. Fallbacks:

    • logoapi available: Use logoapi logo
    • logoapi unavailable: Use FACR logo
    • Both unavailable: Show placeholder
  5. SVG Optimization:

    • Inspect SVG logos in DevTools
    • Verify viewBox is set correctly
    • No extra padding around logo content

Files Modified

New Files:

  • frontend/src/utils/sportLogosAPI.ts (enhanced)
  • frontend/src/components/common/TeamLogo.tsx (new)
  • frontend/src/styles/logos.css (new)

Updated Files:

  • frontend/src/components/widgets/MatchesWidget.tsx
  • frontend/src/components/home/MatchesSection.tsx
  • frontend/src/components/home/CompetitionMatches.tsx
  • frontend/src/pages/HomePage.tsx

API Usage

logoapi.sportcreative.eu:

  • Base URL: https://logoapi.sportcreative.eu
  • Endpoint: /logos/{teamId}/json
  • Method: GET
  • Headers: Accept: application/json
  • Response: JSON with logo URLs (SVG/PNG)
  • Caching: 7 days local, honors HTTP cache headers

Future Enhancements

Potential improvements:

  1. Batch API: If logoapi adds batch endpoint, update batchFetchLogosFromSportLogosAPI
  2. WebP Support: Add WebP format preference for better compression
  3. Service Worker: Cache logos at service worker level for offline
  4. Image Optimization: Server-side image optimization pipeline
  5. CDN Integration: Serve cached logos from CDN
  6. Admin Upload: Direct upload interface in admin panel
  7. Logo Variants: Support for dark/light mode logo variants

Performance Metrics

Expected improvements:

  • First Load: ~100-300ms per logo (network)
  • Cached Load: <5ms per logo (IndexedDB)
  • Storage Usage: ~50-200KB per logo (SVG optimized)
  • Cache Hit Rate: >90% after initial page load

Browser Compatibility

Requires:

  • IndexedDB support (all modern browsers)
  • DOMParser (all modern browsers)
  • Blob URLs (all modern browsers)
  • SVGSVGElement.getBBox() (all modern browsers)

Troubleshooting

Issue: Logos not loading

  • Check browser console for errors
  • Verify logoapi.sportcreative.eu is accessible
  • Check IndexedDB in DevTools

Issue: Logos not centered

  • Verify CSS file is imported
  • Check flex container styles
  • Ensure image has object-fit: contain

Issue: Cache not working

  • Check IndexedDB permissions
  • Clear site data and retry
  • Verify browser supports IndexedDB

Issue: SVG optimization failing

  • Check SVG structure is valid
  • Verify CORS headers allow fetching
  • Fallback to original URL on error

Maintenance

Regular Tasks:

  1. Monitor logoapi availability
  2. Check cache size in production
  3. Review logo quality and coverage
  4. Update fallback logic if needed

When Adding New Components:

  1. Import TeamLogo component
  2. Import logos.css
  3. Use consistent size props
  4. Test with and without logoapi access

Summary

This enhancement provides a robust, performant logo management system that:

  • Fetches from logoapi.sportcreative.eu first
  • Caches locally for fast access
  • Optimizes SVGs to remove empty space
  • Properly formats and centers logos everywhere
  • Falls back gracefully when logos unavailable
  • Automatically cleans up unused logos
  • Works across all homepage styles
  • Provides reusable TeamLogo component
  • Maintains consistent sizing
  • Handles errors gracefully

The system is production-ready and fully integrated across the application.