Le container overflow-x-auto clippait les tooltips positionnés en absolu.
Nouveau composant TooltipLabel : calcule la position via getBoundingClientRect()
et rend le tooltip dans document.body via createPortal — visible partout,
indépendant de tout ancestor overflow.
Ajout du petit cercle "i" à côté du label pour signaler la présence du tooltip.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Client — lib/localCache.ts (nouveau) :
- saveCache / loadCache : wrapper localStorage préfixé "forex_v1_"
- formatCacheDate : affiche l'âge du cache (< 1h, 2h, 3j…)
Client — CurrencyCard.tsx :
- Sauvegarde chaque réponse macro réussie dans localStorage (clé macro_{currency})
- Si l'API échoue → charge la dernière valeur connue depuis localStorage
- Badge 🗄 "cache Xh" visible dans le header de la carte quand données stale
Client — page.tsx :
- Même logique pour drivers, expectations, yields
- Badge cache affiché dans le header à côté de l'heure
- Footer : Bytez → Groq
Serveur — macro/route.ts :
- stale-if-error : si tous les indicateurs reviennent null (panne API)
et qu'un cache serveur précédent existe → le renvoie avec stale:true
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- drivers: switch Brent (cb.f) and WTI (cl.f) from stale FRED to Stooq
near-real-time futures — same stooqMetal() already used for gold/silver
- macro: add scrapePMI() to scrape Trading Economics meta description for
manufacturing-pmi and services-pmi for all 8 currencies (no API key needed)
- narrative: replace dead Bytez API with Groq (OpenAI-compatible, free tier)
env var renamed BYTEZ_API_KEY → GROQ_API_KEY, model llama-3.1-8b-instant
- NarrativeButton: rebrand "Erreur Bytez" / "Bytez AI" → "Erreur IA" / "Groq AI"
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
IRSTCB01AUM156N, IRSTCB01CHM156N, IRSTCB01NZM156N don't exist on FRED.
IRSTCB01JPM156N and IRSTCB01CAM156N exist but stale since 2023-12.
Replace all with IR3TIB01*M156N (3-month interbank rate, updated monthly 2026)
which closely tracks each central bank's policy rate.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
GDP: GBP→NGDPRSAXDCGBQ, CAD→NGDPRSAXDCCAQ, AUD→NGDPRSAXDCAUQ,
NZD→NAEXKP01NZQ661S (all current level series, replaces non-existent ones)
CHF unemployment: LRHUTTTTCHM156S→LRHUTTTTCHQ156S (monthly N/A, use quarterly)
JPY cpiCore: set to null (FRED series stale since 2021, no free current source)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Retail Sales: switch all currencies to *SLRTTO01GPSAM format (OECD monthly,
already in MoM%) — covers USD, EUR(DEU proxy), GBP, JPY, CHF, CAD.
Remove retailSales from PCT_FIELDS since values are already percentages.
Employment: add LFEMTTTT*647S series (monthly levels → MoM%) for JPY, CAD,
AUD and quarterly for NZD. These replace null/non-existent FRED series.
PMI stays ⚠ — no free real-time source found.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
FRED series GOLDPMGBD228NLBM and SLVPRUSD do not exist on the free tier.
Replace with Stooq XAU/USD and XAG/USD free CSV endpoint (no API key needed).
Delta = intraday change vs session open. Cache 5 min on Vercel.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>