Files
Claude 1116c3a648 feat: Add multi-site product search system with SearXNG integration
This commit adds a comprehensive product search feature that allows users
to search for products across multiple configured e-commerce sites.

Backend changes:
- Add SearXNG service to docker-compose for meta-search capability
- Add SearchSite model and Alembic migration with default sites
- Create searxng_service.py for search queries across sites
- Create light_scraper_service.py for fast HTTP-based extraction
- Create search_service.py orchestrator combining SearXNG + HTTP + Browserless
- Add API endpoints for search (/api/search) with SSE streaming
- Add CRUD endpoints for search sites (/api/search-sites)

Frontend changes:
- Add new /search page with real-time results display
- Create SearchResultCard component for product display
- Add Progress, Checkbox, and Badge UI components
- Update Settings page with search sites management section
- Add navigation link to search page
- Create new modern SVG logo with price-flow gradient design
- Update favicon to SVG format

The search system uses a hybrid approach:
1. SearXNG finds product URLs across configured sites
2. Light HTTP scraper attempts fast extraction
3. Falls back to Browserless for JavaScript-heavy sites
4. Results stream progressively via SSE
2025-11-22 11:03:48 +00:00

72 lines
2.3 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<defs>
<linearGradient id="bgGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#D4AF37;stop-opacity:1" />
<stop offset="50%" style="stop-color:#C5A028;stop-opacity:1" />
<stop offset="100%" style="stop-color:#22C55E;stop-opacity:1" />
</linearGradient>
<linearGradient id="lineGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#FFFFFF;stop-opacity:0.9" />
<stop offset="100%" style="stop-color:#22C55E;stop-opacity:1" />
</linearGradient>
<filter id="glow" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur stdDeviation="8" result="coloredBlur"/>
<feMerge>
<feMergeNode in="coloredBlur"/>
<feMergeNode in="SourceGraphic"/>
</feMerge>
</filter>
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
<feDropShadow dx="0" dy="4" stdDeviation="8" flood-color="#000000" flood-opacity="0.3"/>
</filter>
</defs>
<!-- Background rounded square -->
<rect x="20" y="20" width="472" height="472" rx="80" ry="80" fill="url(#bgGradient)" filter="url(#shadow)"/>
<!-- Price chart line -->
<g filter="url(#glow)">
<path
d="M 80 320
Q 120 280, 160 300
Q 200 320, 240 260
Q 280 200, 320 220
Q 360 240, 400 160
L 400 160"
fill="none"
stroke="url(#lineGradient)"
stroke-width="24"
stroke-linecap="round"
stroke-linejoin="round"
/>
<!-- Arrow pointing down at the end -->
<path
d="M 380 180 L 420 140 L 420 175"
fill="none"
stroke="#22C55E"
stroke-width="20"
stroke-linecap="round"
stroke-linejoin="round"
/>
</g>
<!-- Decorative dots on the line -->
<circle cx="80" cy="320" r="12" fill="#FFFFFF" opacity="0.9"/>
<circle cx="160" cy="300" r="10" fill="#FFFFFF" opacity="0.8"/>
<circle cx="240" cy="260" r="10" fill="#FFFFFF" opacity="0.8"/>
<circle cx="320" cy="220" r="10" fill="#FFFFFF" opacity="0.8"/>
<circle cx="400" cy="160" r="14" fill="#22C55E"/>
<!-- Euro symbol -->
<text x="256" y="430"
font-family="Arial, sans-serif"
font-size="80"
font-weight="bold"
fill="#FFFFFF"
fill-opacity="0.3"
text-anchor="middle">
PRICEFLOW
</text>
</svg>