# Passation — page « Jewelry Manufacturer for US Brands »

**Pour l'intégrateur.** Ce document suffit pour démarrer. Le détail complet, avec
tout le code, est dans `en/03-optimization/integration.md` (1 148 lignes).

---

## Ce qu'il y a à faire

Ajouter une page statique au projet Next `~/Github/advmfr-next` :
**`/jewelry-manufacturer-usa`**, en anglais uniquement.

Le contenu est écrit, mesuré et validé. Rien à rédiger, rien à reformuler.

## Où sont les fichiers

| Quoi | Où |
|---|---|
| Contenu prêt à coller | `en/02-draft/messages.en.json` |
| Page lisible (référence) | `en/02-draft/index.md` |
| Procédure complète | `en/03-optimization/integration.md` |
| Images provisoires | `assets/images/usa/` (12 fichiers) |
| Mesures et contraintes | `en/03-optimization/index.meta.json` |

## Avant de commencer

Le dépôt `advmfr-next` est actuellement sur `fix/remove-ai-writing-markers`
avec un working tree modifié. Repartir de `dev` propre, sur une branche dédiée :

```bash
cd ~/Github/advmfr-next
git status                       # traiter ce qui traîne
git checkout dev && git pull
git checkout -b feature/usa-landing-page
```

---

## Les 8 fichiers à toucher

1. **`src/i18n/routing.ts`** — ajouter à `pathnames` :
   `"/jewelry-manufacturer-usa": { en: "/jewelry-manufacturer-usa", fr: "/fabricant-bijoux-usa" }`
2. **`messages/en.json`** — fusionner le namespace `UsaPage` depuis `en/02-draft/messages.en.json`
3. **`messages/fr.json`** — mêmes clés (le build échoue sinon), jamais rendues
4. **`src/components/usa/`** — 11 composants, un par section
5. **`src/app/[locale]/jewelry-manufacturer-usa/page.tsx`** — calqué sur `sustainability/page.tsx`
6. **`src/app/[locale]/jewelry-manufacturer-usa/loading.tsx`** — 4 lignes
7. **`src/app/sitemap.ts`** — locale `en` uniquement
8. **`src/components/Footer.tsx`** — voir ci-dessous

---

## Six pièges — lisez-les, ils font perdre des heures

### 1. Neuf clés exigent `t.rich()`, pas `t()`

Le contenu porte ses liens **en milieu de phrase**, sous forme de balises
nommées : `<contact>discuss your project</contact>`.

Rendues avec `t()`, elles affichent le balisage en clair à l'écran.

Les neuf clés : `market.body4`, `categories.outro`, `quality.body1`,
`compliance.rjc.body`, `jck.note`, `why.outro`, `start.body`, `start.outro`,
`faq.items.startLine.a`.

Le projet a déjà ce pattern — voir `Error.description` dans `messages/en.json`
et sa consommation dans `src/app/[locale]/error.tsx`.

### 2. Ne renommez aucun fichier d'image

Les noms ont été choisis pour ne pas répéter les termes de leur texte
alternatif. Un renommage « plus propre » fausse les comptages de couverture
sémantique — `necklaces` a une cible fermée à **9 occurrences exactement**,
`metal` à **2**.

Même règle pour les textes alternatifs : ne les reformulez pas. Si une photo ne
correspond pas à son alt, changez la photo ou signalez-le.

### 3. Navigation : footer uniquement, conditionné à la locale

**Décidé.** La page n'entre pas dans le header. `Header.tsx` n'est pas modifié.

Dans `Footer.tsx`, l'entrée doit être conditionnée à `locale === "en"`. La
variante française est `noindex` et hors sitemap — un lien de footer non
conditionné l'exposerait sur toutes les pages françaises.

### 4. `seo.title` ne porte pas le suffixe

Le projet applique `%s | ADV MFR` via le template global de
`src/app/[locale]/layout.tsx`. L'ajouter dans le JSON produirait un doublon.

### 5. Le `noindex` français demande une précaution

`buildPageMetadata` pose **inconditionnellement** `other.robots = "index, follow, …"`.
Ajouter simplement `robots: { index: false }` produirait deux balises `robots`
contradictoires. Il faut retirer la clé du bloc `other` :

```ts
const { robots: _discard, ...otherWithoutRobots } = base.other ?? {};
```

⚠️ Ce point **n'a pas été validé au runtime**. Vérifiez le HTML rendu :
il doit sortir exactement une balise `robots`. Le code exact est dans
`integration.md`.

### 6. Le JSON-LD de la FAQ reste désactivé pour l'instant

`page.tsx` porte un indicateur `EMIT_FAQ_JSONLD = false`. Trois réponses de la
FAQ contiennent encore des `[CONFIRM WITH ADVMFR]` : publier un `FAQPage`
structuré avec des placeholders enverrait des données incomplètes à Google.

À basculer à `true` dans le même commit qui lève ces trois placeholders.
`integration.md` donne les deux jeux de vérifications, avant et après.

---

## Ce qui bloque la publication — deux familles indépendantes

**Elles ne se lèvent pas ensemble.** La page peut être intégrée et testée dès
maintenant ; elle ne peut pas être publiée tant que les deux ne sont pas closes.

### Famille 1 — 8 confirmations attendues du client

Marquées `[CONFIRM WITH ADVMFR]` dans le contenu. Elles portent sur : les détails
de la participation à JCK Las Vegas, les pratiques de conformité effectives, les
références clients américaines, et des seuils de volume.

Liste complète et localisation : `index.meta.json`,
clé `placeholders_to_complete_before_publication`.

⚠️ **Après chaque levée de placeholder, recomptez.** Ajouter une phrase dans
`materials` ou `compliance` peut casser `metal = 2`, qui est une cible fermée.
La commande exacte est dans `index.meta.json`, clé `counting_method`.

### Famille 2 — 12 visuels provisoires

Les images de `assets/images/usa/` sont des **placeholders**. Elles portent la
mention `PLACEHOLDER — NOT FOR PRODUCTION` incrustée dans l'image.

Elles débloquent l'intégration et les tests de rendu. Elles ne sont pas
publiables.

`assets/README.md` donne, pour chacune, le sujet à photographier.

**Où les copier** : le dossier `public/images/usa/` n'existe pas dans le projet.
La convention réelle y est l'import statique depuis `public/<section>/`. Le
chemin de destination est à arbitrer à l'intégration — les chemins écrits dans
`index.md` sont provisoires.

---

## Vérifications une fois intégré

```bash
bun run build                    # doit passer
```

Le build échoue si `seo.metaKeywords` est vide ou si `fr.json` n'a pas les mêmes
clés que `en.json` — ce sont les deux garde-fous du projet.

Puis, sur le serveur de dev :

- `/jewelry-manufacturer-usa` répond en **200**
- le `<title>` rendu est `Jewelry Manufacturer for US Brands | ADV MFR`
- la canonical est absolue et pointe vers le domaine de production
- `/fr/fabricant-bijoux-usa` porte **exactement une** balise `robots`, avec `noindex`
- `/sitemap.xml` contient l'URL anglaise et **pas** la française
- les **12 liens internes** répondent tous en 200
- **aucun balisage `<contact>` ou `<rich>` visible à l'écran** — signe qu'une clé
  est rendue avec `t()` au lieu de `t.rich()`
- les blocs JSON-LD sont présents et valides : `WebPage` + `BreadcrumbList`
  (pas de `FAQPage` tant que l'indicateur est à `false`)

`integration.md` fournit les commandes exactes, avec les valeurs attendues.

---

## Pour situer

Page commerciale ciblant les marques américaines, sur le mot-clé
`manufacturer for jewelry` (2 200 recherches/mois, KD 17, marché US).

3 093 mots · 1 H1 · 10 H2 · 16 H3 · 12 images · 12 liens vers 10 pages.

Son angle différenciant est la section **Compliance for US buyers** — FTC
Jewelry Guides, marquage des métaux, droits de douane. Aucun des neuf
concurrents analysés ne traite ce sujet.

Le raisonnement complet derrière la page — pourquoi ce format, pourquoi cet
angle, ce qui a été délibérément laissé aux autres pages du site — est dans
`en/03-optimization/workflow.md`.
