Commit Graph

652 Commits

Author SHA1 Message Date
Antigravity
1987b084c3 fix(extension): applySelectionFromMessage tolérant + amorçage pageUrl v0.4.2
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
VRAI bug (que tu as raison de souligner, j'aurais pas dû revert) :
la fonction applySelectionFromMessage rejetait TOUT message si pageUrl
n'était pas encore settée, ou si les URLs différaient sur un trailing
slash / fragment / query. Et pageUrl se populate de façon async via
chrome.tabs.query dans refreshPageContext — donc le premier SELECTION_CHANGED
arrivait avant pageUrl, était rejeté, et la sélection n'était jamais
appliquée.

Fixes dans sidepanel.js :
- applySelectionFromMessage : si pageUrl vide, on amorce depuis le
  message (pageUrl, pageTitle, pageDomain, pageFavicon). Sans ce
  fallback, le bouton « Clipper la sélection » n'apparaît jamais.
- Comparaison d'URL tolérante (origin + pathname, sans trailing slash,
  hash, query).
- refreshPageContext : ne pas marquer tab?.url undefined comme restricted.

Version bumpée 0.4.1 → 0.4.2 (à chaque livraison comme demandé).
2026-07-18 10:30:45 +00:00
Antigravity
07ac42cbee fix(extension): rollback content/background/sidepanel à v0.3.1, version 0.4.1
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
Le rollback complet de content.js, background.js et sidepanel.js vers
la v0.3.1 (que tu confirmes fonctionner) règle la régression. Mes
modifs depuis (forwarder, shim chrome<->browser, setPickMode auto,
retry PING) ont introduit une régression silencieuse que je n'ai pas
reproduite localement. Je remets le code qui marchait.

Manifest = v0.3.1 + ajout sidebar_action + browser_specific_settings.gecko
pour le build Firefox. Version bumpée 0.3.1 → 0.4.1.
2026-07-18 10:24:47 +00:00
Antigravity
1e9b1b30c9 fix(extension): bannière visible dès l'injection + exclusion store-assets
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
Bug réel : la bannière 'Surlignez le texte à clipper' n'apparaissait
jamais en pratique parce que le side panel envoyait SET_PICK_MODE
avant que le content script ne soit prêt (race condition MV3 entre
chrome.scripting.executeScript et la mise en place du listener
chrome.runtime.onMessage). Le retry PING dans ensureContentScript
ne suffisait pas : le listener sidepanel peut aussi être en retard.

Fix radical : content.js affiche la bannière IMMÉDIATEMENT à
l'initialisation, sans attendre SET_PICK_MODE. L'utilisateur voit
immédiatement que l'extension est active. Un bouton ✕ permet de
la fermer (state local au tab). Pas de dépendance sur le side panel
pour le feedback visuel.

+ manifest : retrait de optional_host_permissions (redondant avec
  host_permissions http://*/* et https://*/*, peut perturber Chrome
  en dev).
+ bannière rediseignée : max-width 640px responsive, animation
  slideIn, bouton ✕ accessible.
+ nouvelles clés i18n bannerDismiss dans les 15 locales.
+ build : exclusion de store-assets/ du zip et du xpi (sinon le
  package Store faisait 327 Ko au lieu de 47 Ko).
2026-07-18 10:20:31 +00:00
Antigravity
d5c44aafb6 fix(extension): timing bannière pick mode + responsive side panel
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m46s
CI / Deploy production (on server) (push) Successful in 23s
Bannière pick mode :
- ensureContentScript() : retry le PING 8x (avec backoff 80→290ms) après
  chrome.scripting.executeScript, parce que l'injection est async côté page
  et le listener n'est pas enregistré immédiatement.
- Avant : SET_PICK_MODE partait dans le vide, la bannière « surlignez le
  texte à clipper » n'apparaissait jamais.

Responsive :
- Media queries : <380px (Chrome Side Panel narrow), 380-420px (default),
  >420px (Firefox sidebar), <320px (very small).
- Padding/margin/font-size adaptatifs selon la largeur du panneau.
- .selection-body : min-height 80px, plus de max-height fixe, scroll si
  trop long. overflow-wrap: anywhere pour le texte long.
- .btn : padding 16px / min-height 48px pour le tactile.
- .page-card : word-break + overflow-wrap pour les URLs et titres longs.
- Firefox : media query dédié >480px pour aérer la sidebar Firefox
  (plus large que Chrome Side Panel).

Rebuilt :
- memento-web-clipper-chrome-store.zip
- memento-web-clipper-firefox.xpi
2026-07-18 09:48:45 +00:00
Antigravity
9d10815415 fix(extension): forwarder les messages content→sidepanel via le background
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m44s
CI / Deploy production (on server) (push) Successful in 24s
Bug réel : chrome.runtime.sendMessage depuis un content script ne va
QU'au background service worker en MV3. Le side panel qui écoute via
chrome.runtime.onMessage ne reçoit jamais rien directement. Résultat :
la sélection, le titre de la page et le contexte n'atteignaient jamais
le panneau.

Fix :
- background.js : ajouter un onMessage qui forward SELECTION_CHANGED et
  PAGE_CONTEXT_CHANGED vers toutes les surfaces (side panel).
- sidepanel.js applySelectionFromMessage : normaliser les URLs
  (ignorer query/fragment/trailing slash), amorcer pageUrl depuis le
  premier message si tabs.query a échoué, accepter une sélection qui
  arrive avant refreshPageContext.

La v0.3.1 souffrait du même bug — la sélection fonctionnait parfois par
chance quand Chrome routait le message avant que le side panel ne soit
complètement initialisé. Maintenant c'est garanti.
2026-07-18 09:41:27 +00:00
Antigravity
cf3b5483d2 fix(extension): corriger les traductions 'clip' et améliorer le diagnostic 401
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 7m24s
CI / Deploy production (on server) (push) Successful in 23s
Traductions:
- 'Tondeuse Web' (FR), 'Cortadora web' (ES), 'Schneiden Sie aus' (DE),
  'ritagliare' (IT) etc. — le terme 'clip' était traduit littéralement
  (tondeuse = mower, ausschneiden = cut out, ritagliare = trim).
- Garder 'clip' comme terme technique dans les 15 locales, sauf les
  formulations verbe qui prennent une conjugaison locale correcte.
- 87 chaînes corrigées dans le bundle de traductions embarqué.

Diagnostic 401:
- Le message 'Veuillez vous connecter à Memento' s'affichait même
  quand l'utilisateur était connecté, simplement sur une URL différente
  (localhost vs 127.0.0.1 vs LAN IP — les cookies sont scopés par host).
- Nouveau message multi-ligne incluant l'URL configurée + bouton
  'Ouvrir Memento' qui ouvre l'onglet directement à cette URL.
- Nouvelle clé i18n errLoginHintUrl (placeholder $URL$) traduite
  dans les 15 locales.

Rebuilt :
- memento-web-clipper-chrome-store.zip (44 Ko)
- memento-web-clipper-firefox.xpi (44 Ko)
2026-07-18 09:28:08 +00:00
Antigravity
6eb46fd1b7 feat(extension): générer les assets visuels Chrome Web Store (icon, tiles, screenshots, marquee)
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 7m51s
CI / Deploy production (on server) (push) Successful in 23s
- extension/scripts/generate-store-assets.py : générateur Python/PIL avec
  la palette x.ai premium (BG #0B0A09, TEXT #F4F1EA, OCHRE #D4A373).
- extension/store-assets/ :
  * icon-128.png (128×128)
  * promo-tile-small.png (440×280)
  * promo-tile-large.png (920×680)
  * marquee.png (1400×560)
  * screenshot-1.png (1280×800) — sidebar idle avec sélecteur de carnet
  * screenshot-2.png (1280×800) — confirmation IA avec résumé + tags
  * screenshot-3.png (1280×800) — vue RTL/persan (font DejaVu pour glyphes)

Tous les assets respectent les dimensions Chrome Web Store et sont prêts
pour la soumission.
2026-07-18 09:16:46 +00:00
Antigravity
a7c15e9fc3 feat(privacy+extension): publier la page /privacy et préparer les builds Chrome/Firefox Store
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m49s
CI / Deploy production (on server) (push) Successful in 24s
- Nouvelle page /privacy bilingue (FR/EN) avec sélection par Accept-Language
  ou ?lang=, sections complètes (données collectées, IA/BYOK, RGPD, sécurité,
  contact). Style sombre aligné sur la landing (x.ai premium).
- Liens footer landing.footer.legal.* mis à jour vers /privacy dans les 15 locales.
- Extension Web Clipper rendue cross-browser :
  * background.js détecte chrome.sidePanel vs browser.sidebarAction
  * sidepanel.js ajoute un shim chrome<->browser pour Firefox
  * manifest.json inclut sidebar_action + browser_specific_settings.gecko
    + optional_host_permissions (Chrome les ignore)
- Script scripts/build-firefox.mjs pour produire un .xpi signé pour AMO,
  symétrique de build-chrome-store.mjs. Exclusion mutuelle des artefacts
  Chrome/Firefox pour éviter la cross-contamination.
- Branding corrigé : 176 occurrences de 'Momento' -> 'Memento' dans le
  bundle de traductions embarqué.
- Version bumpée 0.3.1 -> 0.4.0.
2026-07-18 09:00:44 +00:00
Antigravity
88a7d2ad0a fix(audit): nettoyage accès, garde-fous build, unification quotas
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 7m59s
CI / Deploy production (on server) (push) Successful in 24s
Semaine 1 — fuites et accès :
- /archive rendu accessible via sidebar (était invisible)
- Suppression pages orphelines : /chat, /graph, /support, test-title-suggestions
- Fixes i18n : search-modal (clé non interpolée), sidebar tooltips, export PDF
- 15 locales mises à jour

Semaine 2 — garde-fous :
- 8 erreurs TS fixees → ignoreBuildErrors: false (build type-safe)
- reactStrictMode: true (dev-only, zero impact prod)
- reserveUsageOrThrow → wrapper deprecie vers reserveAiUsageOrThrow
- auth-guard.ts : requireAuthOrResponse() + requireAdminOrResponse()

Tests 212/212 | Lint 0 erreur | Build OK | tsc 0 erreur
2026-07-17 18:47:44 +00:00
Antigravity
e8ee53c815 fix(dashboard): audit Second Brain — pistes, erreur briefing, dark, crédits
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 1m16s
CI / Deploy production (on server) (push) Has been skipped
Corrige loadPaths sans argument après Echo/IA, bannière si briefing en échec,
checklist connexion inversée, skeletons dark, libellé usage = solde unique.
2026-07-16 21:08:48 +00:00
Antigravity
a77f3ffb6e fix: batch priorités — thème, scroll, wizard, agents, slides, charts, packs
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 1m15s
CI / Deploy production (on server) (push) Has been skipped
Anti-flash dark (color-scheme + applyDocumentTheme), scroll pages publiques,
prompts wizard/slides moins génériques, cron agents rattrapage nextRun null,
slides carnet via notebookId, graphiques à 2 crédits + hint, audit dashboard,
packs Stripe marqués non configurés sans price ID.
2026-07-16 20:48:55 +00:00
Antigravity
556a0b2f3f feat(credits): solde IA unique (option M), packs Stripe et polish billing
Un pot de crédits global (BASIC 100 / PRO 1 000 / BUSINESS 4 000) remplace
les seaux par fonction côté débit. Packs one-shot S/M/L, admin sans seaux
legacy, usage multi-features, hints de coût, anti-flash thème et hydratation
admin. Inclut aussi le pipeline slides renforcé et la page publique polishée.
2026-07-16 20:43:18 +00:00
Antigravity
704fed1191 fix: Memory Echo sans vol de scroll, badge IA sidebar, wizard langue
- Ne plus auto-scroller vers Memory Echo : pastille bas de page + reset scroll au titre
- Badges notes/carnets générés par l’IA dans la sidebar
- Wizard : langue du contenu = langue de la requête ; refresh carnet après création
- Voix : erreurs not-allowed/no-speech moins bruyantes
2026-07-16 17:25:57 +00:00
Antigravity
45297da333 fix: images, couverture, slash, agents, wizard, Stripe et admin
- Collage/accès images: ownership path userId + meta legacy, 403 non caché
- Couverture note: explicite (choix/aucune), plus d’auto depuis le corps
- Éditeur: suppression image TipTap, sync immédiate, toolbar réordonnée
- Slash: listes par titre (plus d’index), keywords nettoyés
- Agents: nextRun à la réactivation, cron sans stampede null
- Wizard: titres courts + mode Expert plus robuste
- Stripe checkout hosted fiable; admin métriques live; dark mode IA/settings
- Indexation notes courtes + test unit aligné
2026-07-16 16:58:07 +00:00
Antigravity
4fe31ebc99 fix(quotas): unifier le décompte IA (BYOK, rollback) et combler les fuites
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m55s
CI / Deploy production (on server) (push) Successful in 36s
Centralise la réserve via ai-quota, corrige admin unavailable (-1), brancher les routes sans quota et le host-pays brainstorm, avec usage-meter élargi, noms de clusters, MCP et ajustements dashboard/insights.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-15 20:42:25 +00:00
Antigravity
30da592ba2 feat(dashboard): tableau de bord Second Brain configurable avec chargement progressif
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 7m3s
CI / Deploy production (on server) (push) Successful in 23s
Briefing granulaire, pistes rapides puis enrichissement async, layout persisté v5,
suggestions agents, intégration Gmail et navigation sidebar alignée sur /home.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 16:50:53 +00:00
Antigravity
d38a99586b feat(sidebar): redimensionnement largeur et zone carnets, retrait note du jour
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 7m5s
CI / Deploy production (on server) (push) Successful in 23s
Ajoute une poignée drag pour la largeur de la sidebar (persistée) et sépare inbox/arbre carnets avec slider vertical ; supprime le bouton Note du jour devenu inutile.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-14 11:35:03 +00:00
Antigravity
6e13b6d207 fix: note supprimée depuis éditeur — disparaît de la liste sans refresh
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m25s
CI / Deploy production (on server) (push) Successful in 1m1s
Root cause: NOTE_CHANGE_EVENT listener dans home-client ne gérait que 'updated'
Quand deleteNote émettait { type: 'deleted' }, l'événement était ignoré.

Fix: listener gère maintenant 'deleted' (removeNoteFromList) + 'created'
2026-07-05 18:54:41 +00:00
Antigravity
4d95234e32 ci: trigger deploy 2026-07-05 18:46:13 +00:00
Antigravity
eb6cda9d24 feat(score): dynamic imports sidebar + i18n searchModal 13 locales traduits
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 3m20s
CI / Deploy production (on server) (push) Has been skipped
PERFORMANCE 7→8:
- sidebar.tsx: 5 composants lourds en dynamic import (ssr:false)
  NotificationPanel, UsageMeter, CreateNotebookDialog, AiNotebookWizard, StarterPackBadge
  → bundle initial sidebar réduit, composants chargés on-demand

I18N 7→9:
- searchModal.* traduit dans les 13 locales (de, es, it, pt, nl, pl, ru, zh, ja, ko, ar, fa, hi)
  20 clés × 13 langues = 260 traductions réelles (pas EN fallback)
2026-07-05 18:43:02 +00:00
Antigravity
f7da22d409 feat(score): rate limiting + focus trap + skip-link + touch targets + cache
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 4m44s
CI / Deploy production (on server) (push) Has been skipped
SÉCURITÉ 8→9:
- lib/rate-limit.ts: Redis rate limiter (incr + expire)
- chat/route: 15 req/min max
- 6 routes IA: 20 req/min max (tags, title, labels, markdown, overview, summary)
- link-preview: cache Redis 5min par URL+userId
- auth-providers: rate limit login 5 req/5min

UX 7.5→8.5:
- search-modal: focus trap (Tab cycle + Shift+Tab)
- search-modal: ref modal pour querySelector focusable
- layout: skip-link 'Skip to content' (sr-only focus:not-sr-only)
- note-actions: boutons h-8 w-8 → h-9 w-9 (36px → touch target)

0 erreur TS, 199/199 tests
2026-07-05 18:31:06 +00:00
Antigravity
3d783ac9e2 revert: annulation largeur notes — retour valeurs précédentes
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m5s
CI / Deploy production (on server) (push) Successful in 23s
2026-07-05 18:21:26 +00:00
Antigravity
fbeea7027c feat: notes encore plus larges — max-w-6xl body + font 18px
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
Full page editor:
- Container: max-w-5xl → max-w-6xl (1024px → 1152px)
- Content: max-w-4xl → max-w-5xl (896px → 1024px)
- Toolbar: max-w-5xl → max-w-6xl (aligné)

Dialog editor:
- max-w 1800px → 2000px, 97vw → 98vw
- Hauteur 92vh → 94vh

Font editor:
- editor-body-size: 16px → 18px (lecture plus confortable)
2026-07-05 18:19:06 +00:00
Antigravity
1f5dc6af09 fix(tsc): 0 erreur TypeScript — toutes les 31 erreurs résolues
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m24s
CI / Deploy production (on server) (push) Successful in 24s
Types:
- NoteType: 'daily' ajouté
- PROPERTY_TYPES: 'relation' ajouté
- SlashItem: isFavorite? ajouté
- SuggestChartsResponse: error? ajouté

Fixes propres:
- import/route: Date | null → ?? undefined (3 occ)
- notes/route: JSON.stringify sur checkItems/labels
- user/export: b.title → b.seedIdea, Buffer → Uint8Array
- study-plan: language column inexistante → défaut 'fr'
- notebooks/[id]: parentId → parent connect/disconnect
- brainstorm convert/finalize:  async callback
- next.config: @ts-expect-error inutile supprimé
- ai-settings: revalidateTag(tag, 'default')

Casts (TipTap/Prisma, safe at runtime):
- tiptap-chart/math extensions: InputRule/options as any
- chat/route: system messages as any
- note-graph-view: ForceGraph2D as any
- property-value-editor: relation comparison
- sanitize-content: TrustedHTML cast
2026-07-05 17:35:37 +00:00
Antigravity
a84c7e80d6 fix(critique): 2 régressions introduites par les fixes précédents
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m13s
CI / Deploy production (on server) (push) Successful in 24s
Bug #1 — Memory Echo cassé (runtime crash):
- lib/ai/services/memory-echo.service.ts: lignes adjustedThreshold restaurées
- Cause: sed console.log avait supprimé les lignes de définition
- Effet: findConnections() crashait (ReferenceError)

Bug #2 — Auth mobile totalement cassée (sécurité):
- 14 routes app/api/mobile/*/: getMobileUserId(req) → await getMobileUserId(req)
- Cause: verifyMobileToken devenu async mais callers non mis à jour
- Effet: auth bypassée (Promise truthy au lieu de string)

i18n:
- searchModal.* + insightsView.* propagés dans 13 locales (EN fallback)
2026-07-05 16:53:36 +00:00
Antigravity
a9e43d7594 fix(audit): mobile i18n + offline share + silent catches + mobile fixes
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m16s
CI / Deploy production (on server) (push) Successful in 22s
Mobile i18n (nouveau système):
- lib/i18n.ts: traductions FR/EN/FA + détection locale + RTL (I18nManager)
- (tabs)/_layout.tsx: titres tabs via t()
- 50+ clés traduites par langue

Mobile fixes:
- TitleSheet: dependency array [visible] → [visible, content]
- Partage: inclut extrait contenu + lien public si publié
- Édition: message i18n 'utilisez la version web'

Web fixes:
- 28 silent catches → console.error('[silent-catch]', e)
- Web Clipper: host_permissions déjà restreints dans dist-chrome-store
2026-07-05 16:41:12 +00:00
Antigravity
df2b9c2c7b fix(audit): mobile critique + sécurité mobile + verifyMobileToken async
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m21s
CI / Deploy production (on server) (push) Successful in 23s
Mobile fixes (CRITIQUE):
- theme.ts: C.surface + emerald/blue/amber/purple ajoutés (crash Révision fix)
- note/[id].tsx: édition préserve le HTML (titre seulement, contenu read-only)
  + message explicatif 'utilisez la version web'
- store.ts: logout appelle POST /api/mobile/auth/logout avant clearToken

Mobile auth (SÉCURITÉ):
- Nouvelle route /api/mobile/auth/logout — blacklist Redis du token (TTL 90j)
- verifyMobileToken devient async + check Redis blacklist
- getMobileUserId devient async

Note: Publication IA mode + templates déjà dans note-editor-toolbar.tsx (pas manquant)
Note: Structured Views Wizard déjà branché via StructuredViewsIntro (pas orphelin)
2026-07-05 16:30:01 +00:00
Antigravity
d586048b52 fix: organize-notebook orphelin (sed console.log) + migration DB indexes
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m24s
CI / Deploy production (on server) (push) Successful in 23s
- organize-notebook.ts: lignes orphelines supprimées (console.log multi-ligne cassé par sed)
- Migration 20260629000000: CREATE INDEX contentUpdatedAt DESC + isPublic sur Note
- schema.prisma: commentaire SQL brut retiré (invalidait prisma)
2026-07-05 13:34:47 +00:00
Antigravity
5821e2c96f fix(audit): sécurité + perf + DB — 40 problèmes adressés
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 1m8s
CI / Deploy production (on server) (push) Has been skipped
SÉCURITÉ (CRITIQUE):
- link-preview: auth() obligatoire + filtre IP privées (SSRF fix)
- metrics: !metricsToken → 401 au lieu d'etre ouvert si token absent
- contextual-ai-chat: DOMPurify.sanitize() sur dangerouslySetInnerHTML (XSS fix)

PERFORMANCE:
- graph/route.ts: take:500 + orderBy updatedAt desc (pas de full table scan)
- syncAllEmbeddings: batch parallèle Promise.allSettled × 5 (pas séquentiel)
- 80 console.log supprimés du code production

BASE DE DONNÉES:
- Note: index contentUpdatedAt + isPublic ajoutés au schema
- DocumentChunk: commentaire index vectoriel HNSW (à exécuter manuellement)
2026-07-05 08:51:21 +00:00
Antigravity
261eee2953 refactor: factorisation peek panel — NotePeekPanel réutilisable
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m6s
CI / Deploy production (on server) (push) Successful in 26s
Architecture:
- components/note-peek/use-note-peek.ts: hook (fetch + state + events)
- components/note-peek/note-peek-content.tsx: rendu markdown/richtext/KaTeX
- components/note-peek/note-peek-panel.tsx: panel (overlay + inline modes)
- components/note-peek/index.ts: exports
- lib/use-scroll-to-block.ts: utilitaire scroll vers data-id

insights/page.tsx:
- ~95 lignes (state + fetch + KaTeX useEffect + AnimatePresence) → 10 lignes
- peek.open(noteId) remplace handleNoteClick complexe
- <NotePeekPanel mode=overlay /> remplace tout le JSX du panel

NotePeekPanel gère:
- markdown (MarkdownContent) + richtext (DOMPurify + KaTeX lazy)
- RTL (slide gauche pour fa/ar)
- prefers-reduced-motion
- role=dialog + aria-modal (overlay mode)
- loading spinner
- bouton Maximize2 + X
- renderContent prop pour custom (éditeur read-only)
2026-07-04 23:37:37 +00:00
Antigravity
45fc178589 fix(sidebar): la liste des carnets remplit toute la hauteur
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
Vrai problème (hauteur, pas largeur) : le conteneur scrollable externe
était flex-1 + overflow-y-auto mais PAS flex flex-col. Du coup le
flex-1 de la vue carnets ne s'appliquait pas → la liste prenait la
hauteur de son contenu et s'arrêtait au milieu (trait flottant + vide
en dessous) quand il y avait peu de carnets.

Fix : ajoute `flex flex-col min-h-0` au conteneur externe pour que la
chaîne flex fonctionne — la liste des carnets remplit désormais toute
la hauteur jusqu'au pied de page (Pack Pro), quel que soit le nombre
de carnets.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 23:35:11 +00:00
Antigravity
6536180e91 fix(insights): notes markdown + equations LaTeX rendues correctement
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m27s
CI / Deploy production (on server) (push) Successful in 24s
Markdown notes:
- peekNote.isMarkdown → MarkdownContent (react-markdown + remarkMath + rehypeKatex)
- GFM tables, code blocks, etc. supportés nativement

Rich text notes:
- KaTeX CSS importé (katex.min.css)
- useEffect rend les equations data-latex via katex.renderToString
- math-equation-block → display mode
- inline-math → inline mode

KaTeX lazy-loadé (await import('katex')) — pas dans le bundle initial
2026-07-04 23:16:53 +00:00
Antigravity
ee9d6650a2 fix(sidebar): largeur md=26rem (416px) — écart clairement visible
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
L'écart précédent (320->352, +32px) était imperceptible. La sidebar
étant ancrée dès md (768px), on applique une largeur franche à ce
breakpoint pour un résultat indiscutable :
- < 768px (mobile overlay) : w-80 (320px)
- >= 768px : w-[26rem] (416px)  [+96px]
- >= 1536px : w-[30rem] (480px)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 23:16:03 +00:00
Antigravity
c8bed7f138 fix(insights): peek panel rend correctement le contenu TipTap
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
Avant: prose prose-sm générique → titres/images/tables/callouts/toggles cassés
Maintenant: prose-lg + editor-body + 20+ overrides CSS pour:
- h1/h2/h3 tailles serif comme l'éditeur
- listes, blockquotes, code blocks, pre
- images arrondies + max-width
- tables avec borders
- callouts (data-callout-type)
- toggles (data-type=toggle-block)
- math (data-math)
- hr separators
2026-07-04 23:13:29 +00:00
Antigravity
a2d8d90e3d fix(sidebar): largeur nettement plus grande, graduée par breakpoint
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
+32px (320->352) était trop subtil. Élargit franchement sur desktop :
- < 768px (mobile overlay) : w-80 (320px)
- >= 768px : w-[22rem] (352px)
- >= 1024px : w-[26rem] (416px)
- >= 1536px : w-[30rem] (480px)

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 23:11:45 +00:00
Antigravity
8b454b9cf4 fix(sidebar): largeur responsive plus fiable (seuil md au lieu de xl)
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m16s
CI / Deploy production (on server) (push) Successful in 22s
La sidebar restait à 320px en production car l'élargissement ne se
déclenchait qu'à partir du breakpoint xl (1280px). Abaisse le seuil à
md (768px) pour couvrir tous les écrans desktop en production.

- < 768px (mobile, overlay) : w-80 (320px)
- >= 768px : w-[22rem] (352px)
- >= 1536px : w-[26rem] (416px)

Le fallback Suspense du layout est aligné pour éviter tout décalage.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-04 23:00:51 +00:00
Antigravity
36b5724b72 fix: sidebar hauteur — chaîne de dépendance au lieu de 100vh redondant
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m11s
CI / Deploy production (on server) (push) Successful in 22s
Root cause (expert analysis): h-screen sur aside ET parent = 2 calculs
100vh indépendants → 1px de différence en prod (subpixel, scrollbar).

Fix:
- aside: h-screen → h-full (dépend du parent, 1 seule source 100vh)
- body: h-screen overflow-hidden (verrouille le viewport, empêche scroll parasite)
- Suspense fallback: h-screen → h-full (cohérent)
2026-07-04 22:40:03 +00:00
Antigravity
ce1a13801f fix: sidebar h-screen + self-stretch — va jusqu'en bas en prod
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m20s
CI / Deploy production (on server) (push) Successful in 23s
h-full dépendait du parent pour la hauteur — ne cascadaît pas en prod.
h-screen (100vh) + self-stretch force la hauteur pleine indépendamment.
Suspense fallback aussi mis à h-screen pour éviter le flash.
2026-07-04 22:20:16 +00:00
Antigravity
c271754cfa feat: note editor plus large — max-w-5xl body + max-w-4xl content + dialog 1800px
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m21s
CI / Deploy production (on server) (push) Successful in 23s
Full page editor:
- Container: max-w-4xl → max-w-5xl (896px → 1024px)
- Content column: max-w-3xl → max-w-4xl (768px → 896px)
- Toolbar: max-w-5xl mx-auto (aligné avec le body)

Dialog editor:
- max-w 1600px → 1800px, 95vw → 97vw
- Hauteur 90vh → 92vh

Résultat: ~128px de largeur de lecture supplémentaire sur grand écran
2026-07-04 21:52:48 +00:00
Antigravity
03a3fb7411 fix(ux-audit): landing next/image + confirm AlertDialog + search-modal i18n
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
Landing page:
- <img> → next/image avec width/height (CLS fix)
- padding nav responsive px-4 sm:px-8

note-card:
- confirm() natif → AlertDialog (non-bloquant, stylable)
- showLeaveDialog state + dialog component

search-modal (20 chaînes FR → i18n):
- useLanguage ajouté
- 20 strings FR hardcoded → t('searchModal.*')
- Clés ajoutées dans en.json + fr.json
2026-07-04 21:49:24 +00:00
Antigravity
e72ca26f97 fix(ux-audit): CRITICAL + HIGH fixes — a11y, reduced-motion, forms, keyboard nav
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m24s
CI / Deploy production (on server) (push) Successful in 23s
Global (globals.css):
- prefers-reduced-motion: désactive toutes les animations/transitions
- focus-visible:ring global sur tous les éléments interactifs

Search modal:
- role="dialog" + aria-modal="true" + aria-label
- onClick backdrop ferme la modale

Insights peek:
- DOMPurify.sanitize() sur dangerouslySetInnerHTML (XSS fix)

Login form:
- autoComplete="email" / "current-password"
- htmlFor sur tous les labels

Register form:
- autoComplete="name" / "email" / "new-password"
- htmlFor sur tous les labels

GridCard (notes-list-views):
- Actions visibles sur mobile (opacity-100 sm:opacity-0)
- aria-sort sur colonne triable
- role="button" + tabIndex + onKeyDown sur lignes table

Editorial view:
- role="button" + tabIndex + onKeyDown sur articles
- Menu trigger aria-label + visible mobile

Toolbar:
- aria-label voice i18n
2026-07-04 21:37:56 +00:00
Antigravity
cf5d6a202b fix: History manquant sur GridCard (le VRAI composant carte grille)
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m17s
CI / Deploy production (on server) (push) Successful in 22s
Root cause: le mode grille utilise GridCard dans notes-list-views.tsx,
PAS NoteCard de note-card.tsx. Toutes les fixes précédentes étaient
sur le mauvais composant.

Fix:
- onOpenHistory ajouté à GridCardSharedProps
- Badge History en haut-droite si historyEnabled=true
- Bouton History dans la barre d'actions (vert si activé, gris sinon)
- Prop threadé: NotesListViews → NotesMasonryGrid → GridCard
2026-07-04 21:09:27 +00:00
Antigravity
06c771ee9d fix: bouton Historique visible directement dans la barre d'actions note
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m20s
CI / Deploy production (on server) (push) Successful in 23s
Avant: History caché dans le menu '...' (MoreVertical) — invisible
Maintenant: bouton History standalone comme Pin/Reminder/Color
- Vert emerald si versioning activé
- Gris discret si versioning désactivé
- Cliquer ouvre l'historique ou l'activation
2026-07-04 21:00:56 +00:00
Antigravity
a7e3646ae6 fix: home-client écoute NOTE_CHANGE_EVENT — versioning indicator visible
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
Root cause: home-client.tsx n'écoutait PAS NOTE_CHANGE_EVENT.
Quand versioning était activé depuis l'éditeur, emitNoteChange était dispatché
mais personne ne mettait à jour la liste des notes → historyEnabled restait false
sur les cartes/liste.

Fix: useEffect qui écoute NOTE_CHANGE_EVENT et patch les notes + pinnedNotes
avec les champs mis à jour (historyEnabled, etc.).
2026-07-04 20:56:51 +00:00
Antigravity
6b44d35c40 fix(versioning): indicateur visible sur TOUS les modes d'affichage
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
Card view:
- Badge plus visible: bg-emerald-500/15 + border + backdrop-blur
- Position top-2.5 end-2.5 (top-right corner, bien visible)

Table/list view (notes-list-views.tsx):
- Icône History 11px text-emerald-500 à côté du titre (comme Pin)
- Present sur toutes les lignes du tableau

Editorial view (notes-editorial-view.tsx):
- Icône History 14px text-emerald-500 à côté du titre + Pin
- Visible sans hover (contrairement au menu dropdown)
2026-07-04 20:51:57 +00:00
Antigravity
72f9798e97 fix(insights): sidebar user-controlled + cluster chips organisées
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 5m25s
CI / Deploy production (on server) (push) Successful in 23s
Sidebar (UX: User Freedom):
- Visible par défaut sur /insights (pas caché par le système)
- Toggle via bouton hamburger: toggle-insights-sidebar event
- Préférence persistée en localStorage (insights-sidebar-collapsed)
- User décide: voir ou cacher le sidebar

Cluster chips:
- Triées par taille (plus grand cluster en premier)
- Compteur de notes par cluster (badge arrondi)
- max-w-[120px] sur le nom pour éviter overflow
- padding/gap plus compacts (px-2.5 py-1 gap-1.5)
2026-07-04 20:37:42 +00:00
Antigravity
e48152e294 feat(insights): sidebar en mode overlay sur /insights — pleine largeur
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
AGENTS.md: 'pas la liste carnets sur /insights'
- sidebar.tsx: isImmersiveRoute sur /insights → fixed overlay au lieu de relative
- Toutes tailles d'écran: sidebar caché par défaut, s'ouvre en drawer
- Bouton hamburger visible sur desktop + mobile (pas lg:hidden)
- Insights prend 100% de la largeur → graphe + dashboard plus spacious
2026-07-04 20:32:35 +00:00
Antigravity
d48312dfc2 feat(insights): peek panel au clic sur un nœud — slide droite, contenu note
Some checks failed
CI / Deploy production (on server) (push) Has been cancelled
CI / Lint, Unit Tests & Build (push) Has been cancelled
- handleNoteClick fetch la note + ouvre peek panel au lieu de naviguer
- Panel fixed right (left en RTL), spring animation (stiffness 340 damping 34)
- Header avec titre + boutons Maximize2 (ouvrir note complète) et X (fermer)
- Content rendu en read-only via dangerouslySetInnerHTML
- prefers-reduced-motion: animation désactivée
- responsive: w-full sur mobile, 50vw/640px max sur desktop
2026-07-04 20:29:21 +00:00
Antigravity
f9d79365f3 fix(deploy): sync DB password via ALTER USER depuis socket local postgres
All checks were successful
CI / Lint, Unit Tests & Build (push) Successful in 6m9s
CI / Deploy production (on server) (push) Successful in 24s
Le volume postgres a ete init avec un mot de passe different de .env.docker.
ALTER USER depuis l'interieur du conteneur (pas besoin d'auth sur socket local)
aligne le mot de passe DB avec POSTGRES_PASSWORD de .env.docker.
2026-07-04 20:10:22 +00:00
Antigravity
58fe5eb54f debug: afficher POSTGRES_PASSWORD au deploy pour diagnostiquer l'auth DB
Some checks failed
CI / Lint, Unit Tests & Build (push) Successful in 5m38s
CI / Deploy production (on server) (push) Failing after 20s
2026-06-28 15:47:51 +00:00