feat: dashboard Second Brain, essai 7 jours et vérification e-mail
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 7m14s
CI / Deploy production (on server) (push) Successful in 1m25s

Rendre le dashboard actionnable (inbox, peek, carte mentale), aligner la facturation sur l’essai 7 jours, et bloquer le login e-mail tant que l’adresse n’est pas confirmée.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Antigravity
2026-08-30 07:19:36 +00:00
parent 69c99e4f4f
commit 80ccc1f6de
95 changed files with 4158 additions and 618 deletions

View File

@@ -214,6 +214,32 @@ export function normalizeSlideDeck(input: {
}
return { ...s, stats: valid.slice(0, 4) }
}
// Equation without real formulas → degrade to bullets (avoid shipping f(x)=?)
if (s.type === 'equation') {
const eqs = Array.isArray(s.equations) ? s.equations : []
const real = eqs.filter((eq: any) => String(eq?.latex || '').trim() && !/f\s*\(\s*x\s*\)\s*=\s*\?/i.test(String(eq.latex)))
if (real.length === 0) {
return {
type: 'bullets',
title: trimStr(s.title || 'Points clés', 90),
items: cleanList(
[...(s.explanation ? [String(s.explanation)] : []), ...eqs.map((eq: any) => eq?.label).filter(Boolean)],
4,
140,
),
}
}
return { ...s, equations: real.slice(0, 4) }
}
// Image without URL → degrade to bullets (avoid placeholder in final deck)
if (s.type === 'image' && !String(s.url || '').trim()) {
const caption = String(s.caption || '').trim()
return {
type: 'bullets',
title: trimStr(s.title || 'Illustration', 90),
items: caption ? [caption] : cleanList(s.items, 3, 140),
}
}
return s
})