- PostCard: thumbnail 80x56px della cover image quando keyword e' URL
- Rilevamento con startsWith('http')
- object-cover, loading=lazy, onError nasconde se URL non valido
- Posizionato dopo cover_title e prima dei metadati secondari
- OutputReview: hint discreto Unsplash sotto il box info edit inline
- Visibile solo se unsplash_api_key_configured === false
- Link a /impostazioni con stile amber discreto
- Scompare automaticamente dopo configurazione Unsplash
- Usa Link da react-router-dom (pattern codebase)
- Add regeneratedSlots Set to track regenerated post indices
- Add summary counter showing: N post, X generati, Y rigenerati, Z modificati
- Counter updates in real-time after each regeneration or inline edit
- Pass isRegenerated prop to PostCard for visual badge
- Update info box to mention regen feature with RefreshCw icon
- Use JSON.stringify comparison for manual edit detection
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
GenerateResponse now includes calendar field from backend.
OutputReview merges CalendarSlot into PostResult via slot_index,
enabling BadgePN, BadgeSchwartz rendering and Retry button.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- GenerateCalendar.tsx: form con obiettivo+settimane+brand+tono+nicchie
- Pulsante Genera disabilitato senza API key con banner link a Impostazioni
- Async submit: mutation ritorna job_id, mostra ProgressIndicator
- Auto-navigate a /risultati/:jobId quando job completato
- OutputReview.tsx: carica job results via useJobResults(jobId)
- Griglia PostCard responsive con conteggio success/failed
- Stato locale per edit inline (aggiornato da PostCard.onEdit)
- Download CSV via useDownloadEditedCsv (POST con edits) con due pulsanti (header + footer)
- GenerateSingle.tsx: form con tipo PN, livello Schwartz, nicchia, formato narrativo
- Topic opzionale (altrimenti generato dall'AI)
- Anteprima risultato con PostCard+SlideViewer e download CSV singolo