diff --git a/CLAUDE.md b/CLAUDE.md
index 8fcb36e..48fab6b 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -33,11 +33,16 @@ visibles des suivants exactement comme dans le monofichier. Ordre actuel :
```
js/argon2.js (IIFE, globalThis.NobleArgon2)
js/app.crypto.js (KDF, verifier, encrypt/decrypt — extrait §3.1)
+js/app.import.js (export container + import CSV/JSON — extrait §3.1)
js/app.js (le reste : state, Bridge, api, UI…)
js/app.sync.js (WebDAV + merge — extrait §3.1, APRÈS app.js car
effet de bord top-level `Bridge.onWebdavResult = …`)
```
+`app.import.js` contient `encryptImportEntry`, appelé aussi par
+`app.sync.js` (`applyRemoteSnapshot`) — OK, référence cross-fichier résolue
+au call-time via le scope global partagé.
+
Note ordre : un module **sans** exécution top-level (que des déclarations,
comme `app.crypto.js`) peut se charger AVANT `app.js`. Un module **avec** un
effet de bord top-level qui touche un global d'`app.js` (`Bridge`, `state`…)
@@ -94,6 +99,7 @@ parsing CSV d'import, et l'arbitrage merge/tombstone de sync
| Handlers REST | `delphi-backend/Handlers/PM.Handler.*.pas` |
| Frontend principal (en cours de découpage §3.1) | `js/app.js` |
| Crypto frontend (KDF, verifier, AES-GCM) — extrait §3.1 | `js/app.crypto.js` |
+| Import/export frontend (CSV/JSON parse, export container) — extrait §3.1 | `js/app.import.js` |
| Sync frontend (WebDAV, snapshot, merge) — extrait §3.1 | `js/app.sync.js` |
| Argon2id vendé (bundle `@noble/hashes`, IIFE) | `js/argon2.js` |
| HTML racine | `index.html` |
diff --git a/CODE_AUDIT.md b/CODE_AUDIT.md
index fca8bff..77242ed 100644
--- a/CODE_AUDIT.md
+++ b/CODE_AUDIT.md
@@ -228,8 +228,12 @@ réécriture des call-sites, risque quasi nul vs conversion en modules ES).
identique, 42 tests verts, pas de `const` dupliqué. Chargé AVANT app.js.
- ✅ `js/app.sync.js` extrait (WebDAV, snapshot, merge `applyRemoteSnapshot`)
— byte-for-byte identique, couvert par les tests merge, chargé APRÈS app.js
- (effet de bord top-level `Bridge.onWebdavResult`). Pattern + règles d'ordre
+ (effet de bord top-level `Bridge.onWebdavResult`).
+- ✅ `js/app.import.js` extrait (export container + parsing CSV/JSON +
+ `doImport`/`doExport`) — byte-for-byte identique, couvert par les 14 tests
+ CSV, chargé AVANT app.js (pures déclarations). Pattern + règles d'ordre
documentés dans CLAUDE.md « Découpage frontend ».
+- `app.js` : 11 936 → **10 253 lignes** (crypto + sync + import sortis).
- Reste à extraire (grosses sections cohésives) : slideover, settings,
quicksearch, autofill, auto-backup…
- ✅ `node --check` en pré-étape de `BuildAssets.ps1` : **déjà fait** (cf. §3.2).
diff --git a/delphi-backend/assets/BuildAssets.ps1 b/delphi-backend/assets/BuildAssets.ps1
index aadd59b..d947c5e 100644
--- a/delphi-backend/assets/BuildAssets.ps1
+++ b/delphi-backend/assets/BuildAssets.ps1
@@ -53,6 +53,7 @@ $patterns = @(
'index.html',
'js\argon2.js',
'js\app.crypto.js',
+ 'js\app.import.js',
'js\app.js',
'js\app.sync.js',
'css\style.css'
diff --git a/index.html b/index.html
index 6351c02..71ac05d 100644
--- a/index.html
+++ b/index.html
@@ -1194,6 +1194,7 @@
+