# Fragments Date

**Fragments Date** est un assistant documentaire, statique et explicable, destiné à estimer la période d’une photographie à partir d’indices observables : procédé, support, format, dimensions, présentation, verso, vêtements, coiffures, objets et bornes documentaires.

L’application ne reconnaît pas automatiquement les images. Elle transforme les réponses de l’utilisateur en une courbe de compatibilité chronologique, expose les indices favorables ou contradictoires et permet de consulter les références utilisées.

![Aperçu de Fragments Date](docs/screenshots/fragments-date-home.png)

## Fonctionnalités

- questionnaire adaptatif pouvant atteindre onze étapes, dont seules les rubriques pertinentes apparaissent ;
- distinction entre la date de prise de vue et la date de fabrication du tirage ;
- 97 indices documentés, 42 questions conditionnelles, 17 règles de format et 55 références ;
- pondération explicite selon la force documentaire de chaque indice ;
- fourchettes principales et resserrées, pics secondaires et score de convergence ;
- détection de contradictions entre indices ;
- ajout de bornes certaines et d’indices personnalisés ;
- chargement facultatif du recto et du verso, affichés intégralement dans la synthèse, le rapport, l’impression et le PNG ;
- export JSON sans image, rapport PNG illustré et impression ;
- interface responsive, accessible au clavier et installable comme application web ;
- fonctionnement sans serveur applicatif, compte, base de données ou API tierce.

## Confidentialité par conception

Les images sélectionnées sont ouvertes au moyen d’URL temporaires créées par le navigateur. Elles ne sont pas envoyées, analysées, téléversées ou conservées par Fragments Date. Les réponses ne sont ni enregistrées dans `localStorage`, ni stockées dans IndexedDB, ni transmises à un service externe.

Le service worker met uniquement en cache le code public, les styles, les icônes et les fichiers documentaires nécessaires au fonctionnement hors ligne. Un hébergeur peut néanmoins conserver ses propres journaux techniques de requêtes ; voir [PRIVACY.md](PRIVACY.md).

## Périmètre et limites

Fragments Date est une aide à l’observation, pas une expertise matérielle. Une plage proposée doit être recoupée avec l’objet original, sa provenance, les inscriptions, les archives locales et, lorsque nécessaire, un professionnel de la conservation ou de l’histoire de la photographie.

La base est prioritairement calibrée pour la France et l’Europe occidentale. Les procédés circulent internationalement, mais les modes, réglementations postales, marques et disponibilités commerciales peuvent varier selon les territoires. Les reprises artistiques contemporaines, les retirages et les reproductions limitent également la valeur d’un indice isolé.

La méthode complète est décrite dans [METHODOLOGY.md](METHODOLOGY.md).

## Démarrage local

Prérequis : Node.js 20 ou supérieur. Node.js 22 est recommandé.

```bash
npm install
npm run dev
```

L’application est alors servie sur `http://localhost:4173`.

Ne pas ouvrir directement `index.html` avec le protocole `file://` : le navigateur bloquerait le chargement des fichiers JSON et des modules ES.

## Vérifications

```bash
npm run validate  # intégrité de la base documentaire
npm test          # tests unitaires du moteur
npm run build     # production de dist/
npm run check     # validation + tests + build
npm run qa:browser # parcours fonctionnel et captures, Chromium requis
```

Le build est entièrement reproductible à partir des fichiers suivis par Git. Le dossier `dist/` est régénéré et n’a pas besoin d’être versionné.

Le test navigateur facultatif vérifie les réponses HTTP, le rendu desktop et mobile, un parcours détaillé consacré à un lot de plaques de verre, les sélections multiples de scène, l’absence des questions incompatibles, l’affichage intégral du recto et du verso, le score de convergence, la bibliothèque des sources et les exports JSON/PNG. Par défaut, il cherche Chromium dans `/usr/bin/chromium` ; définir `CHROMIUM_PATH` pour utiliser un autre exécutable. Les captures sont produites dans `qa/`, dossier ignoré par Git.

## Déploiement gratuit avec Cloudflare Pages

Le dépôt GitHub sert uniquement à versionner le code. L’hébergement, les tests et les déploiements sont réalisés par Cloudflare Pages : aucun workflow GitHub Pages ni aucune GitHub Action ne sont nécessaires. Le dépôt peut rester privé.

### Création du projet

1. Pousser ce dépôt sur la branche `main` de GitHub.
2. Dans Cloudflare, ouvrir **Workers & Pages**.
3. Choisir **Create application > Pages > Import an existing Git repository**.
4. Autoriser l’application GitHub **Cloudflare Workers and Pages** à accéder uniquement à ce dépôt.
5. Utiliser les réglages suivants :

| Réglage | Valeur |
|---|---|
| Project name | `fragments-date` |
| Production branch | `main` |
| Framework preset | `None` |
| Build command | `npm run check` |
| Build output directory | `dist` |
| Root directory | laisser vide |
| Node.js | `22`, défini par `.nvmrc` |

`npm run check` valide les données, contrôle les fichiers statiques, exécute les tests puis génère `dist/`. Cloudflare interrompt donc le déploiement si un contrôle échoue. Chaque push sur `main` publie la production ; les autres branches peuvent recevoir une URL de prévisualisation.

### Sous-domaine

Après le premier déploiement :

1. ouvrir le projet dans **Workers & Pages** ;
2. choisir **Custom domains > Set up a domain** ;
3. saisir par exemple `date.fragments.photo` ;
4. confirmer la création de l’enregistrement DNS proposé par Cloudflare.

Ne pas créer uniquement un CNAME à la main : le sous-domaine doit d’abord être associé depuis la section **Custom domains** du projet Pages.

### Déploiement manuel facultatif

Le fichier `wrangler.toml` permet aussi un déploiement manuel après construction :

```bash
npm ci
npm run check
npx wrangler pages deploy dist --project-name fragments-date
```

La procédure détaillée, y compris la correction d’un dépôt déjà créé, se trouve dans [`DEPLOYMENT.md`](DEPLOYMENT.md).

## Structure du dépôt

```text
fragments-date/
├── .github/                 # modèles d’issues et de pull requests
├── assets/                  # logo et favicon
├── data/                    # critères et bibliothèque de sources
├── docs/                    # recherches et cahier de conception du futur studio
├── scripts/                 # serveur local, validation et build
├── src/                     # interface, moteur et exports
├── tests/                   # tests Node.js
├── index.html
├── sw.js
├── _headers
├── _redirects
├── DEPLOYMENT.md
├── METHODOLOGY.md
├── PRIVACY.md
└── README.md
```

## Base documentaire

La base se trouve dans [`data/criteria.fr.json`](data/criteria.fr.json). Chaque indice comprend notamment :

- un identifiant stable ;
- une cible (`capture` ou `object`) ;
- un niveau de fiabilité ;
- une ou plusieurs plages de dates ;
- une justification courte ;
- les identifiants des références correspondantes.

Les questions, options, indices et règles dimensionnelles peuvent déclarer des conditions `when`. Elles acceptent notamment les sélections multiples (`contains`, `containsAny`, `containsAll`) : une photographie peut donc comporter simultanément plusieurs profils de personnes, tenues, véhicules, décors et activités. Une réponse devenue incompatible est neutralisée par le moteur puis réinitialisée par l’interface.

Les références sont décrites dans [`data/sources.json`](data/sources.json). Toute modification doit être suivie de :

```bash
npm run validate
npm test
```

Les conventions de contribution et le format attendu sont détaillés dans [CONTRIBUTING.md](CONTRIBUTING.md).

## Projet connexe : Fragments Studio

Le dossier [`docs/fragments-studio/`](docs/fragments-studio/) contient le cahier de conception de la future application qui transformera localement une photographie contemporaine en tirage inspiré d’une période historique : moteur de filtres, cadres, textures, catalogue de préréglages, règles de production des assets et exigences de confidentialité.

Ce dossier contient **la spécification et les manifestes**, mais pas encore les textures, cadres binaires ni le moteur de rendu final. Ces ressources devront être produites, vérifiées, licenciées et testées séparément afin d’éviter les imitations de marques, les incohérences historiques et les fichiers inutilement lourds.

## Licence

Code, documentation et données originales du dépôt : [licence MIT](LICENSE).

Les sites et institutions cités conservent leurs droits sur leurs propres textes, images, bases et marques. Les liens de référence n’impliquent ni affiliation ni validation du projet par ces organismes.
