Escape double quotes in user-provided name and concept fields to prevent
YAML parsing errors when designs contain quotes (e.g., "tax wealth not work").
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use get_cart() with selectinload instead of refresh() to avoid
greenlet_spawn errors when accessing cart.items relationship.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Fetch products from API instead of hardcoded placeholders
- Show product images with hover effect
- Add 'Design Your Own' button
- Link products to detail pages
- Revalidate every 60 seconds
- Add /api/design/generate endpoint for AI image generation
- Add /api/design/{slug}/activate to publish designs
- Add /design page with form and preview
- Add 'Design Swag' button to navigation
- Update footer tagline to 'Build infrastructure, not empires'
- Remove port bindings from base compose (production)
- Keep ports only in dev override
- Remove obsolete version attribute
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Convert SKU to string when loading from metadata.yaml
- Add docker-compose.dev.yml for local development
- Add frontend type definitions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add package-lock.json for reproducible builds
- Add lib/utils.ts with cn() helper
- Fix .gitignore to not exclude frontend/lib
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>