# AUXIOMA — site éditorial + expérience Three.js

Mise en œuvre de `auxioma-silo-editorial-threejs-google-2026.md`.

## Démarrage

```bash
composer install
npm install
npm run build      # compile src/ → public/build (manifest lu par PHP)
npm run serve      # http://127.0.0.1:8000  (ou http://auxioma.test via Laragon)
```

Le site fonctionne sans build, sans JavaScript et sans WebGL : la 3D est une amélioration progressive.

## Structure

- `app/content/*.php` — contenu des pages par silo (title, description, H1, sections, CTA, liens contextuels).
- `app/content/anchors.php` — ancres descriptives du maillage interne.
- `app/views/` — gabarit HTML (fil d'Ariane, sections `data-scene-step`, CTA HTML, formulaire).
- `app/config.php` — `AUXIOMA_BASE_URL` (canonical de prod), `AUXIOMA_CONTACT_EMAIL`, `same_as`, `local_business`.
- `src/three/` — moteur commun (Experience, Renderer, Camera, World, PerformanceManager…), composants partagés, motifs et une scène par famille de pages.
- `src/page-config/three-pages.js` — mapping explicite page → scène (un chunk par famille).

## Langues

- Le français est la langue source, servie à la racine (`/`). Les 23 autres langues officielles de l’UE et le chinois simplifié (`/zh-cn/`) vivent sous un préfixe : `/en/`, `/de/`, `/ga/`, `/mt/`…
- `app/i18n.php` — liste des langues (`LOCALES`), `t()` pour les textes d’interface.
- `app/lang/<code>/` — une traduction par fichier de contenu (`core.php`, `services.php`…), plus `ui.php` (interface) et `anchors.php` (maillage). Les pages sont indexées par leur URL française ; chaque traduction définit son propre `slug`.
- Dans les traductions, les liens internes gardent l’URL française (`href="/services/ecommerce/"`) : ils sont réécrits automatiquement vers la bonne langue.
- Une section peut être réservée au français avec `'locales' => ['fr']` (même syntaxe que pour une page entière) : elle n’apparaît pas dans les autres langues tant qu’elle n’est pas traduite. Ces sections doivent être placées après les sections communes, car les traductions sont fusionnées par position.
- Après toute modification d’un contenu français ou d’une traduction : `php bin/check-translations.php` (ou `php bin/check-translations.php de it`). Le script vérifie que chaque langue a les mêmes pages, sections, liens et balises HTML que le français.

## Sitemaps

- `/sitemap.xml` est un index qui pointe vers un sitemap par langue (`/sitemap-fr.xml`, `/sitemap-zh-cn.xml`…). Chaque fichier contient les pages indexables (ni brouillons, ni offres expirées), les hreflang + `x-default`, les images, et `changefreq`/`priority` (lus par Yandex et Baidu, ignorés par Google et Bing). Au-delà de 1 000 URL, un fichier est découpé en `-2.xml`, `-3.xml`…
- `lastmod` vient du champ `updated` de la page. À défaut, c'est la date de la dernière modification réelle de son contenu, suivie dans `storage/sitemap-lastmod.json` (dossier à rendre accessible en écriture). Pour ajuster une page : `'sitemap' => ['changefreq' => 'weekly', 'priority' => 0.9]`.
- `/sitemap-zh-cn.xml` porte l'annotation Baidu `<mobile:mobile type="pc,mobile"/>` : c'est ce fichier qu'il faut soumettre dans Baidu Ziyuan.
- Soumettre `/sitemap.xml` dans Google Search Console, Bing Webmaster Tools et Yandex Webmaster. Google et Bing ont abandonné le « ping » de sitemap : pour Bing et Yandex, utiliser `php bin/indexnow.php`.

## Avant mise en production

- Pages en `draft` (noindex, hors sitemap, notes visibles en local) : `/realisations/plateforme-symfony/` — à compléter avec des faits vérifiables.
- Définir `AUXIOMA_BASE_URL`.
- E-mail de contact : les demandes partent vers `customer@auxioma.eu` via SMTP (PHPMailer). En local, elles arrivent dans Mailpit (http://localhost:8025). En production, définir `AUXIOMA_SMTP_HOST`, `AUXIOMA_SMTP_PORT`, `AUXIOMA_SMTP_USER`, `AUXIOMA_SMTP_PASS`, `AUXIOMA_SMTP_ENCRYPTION` (tls/ssl) et `AUXIOMA_MAIL_FROM` (adresse du domaine auxioma.eu, avec SPF/DKIM). Les échecs sont journalisés dans `storage/logs/mail.log`.
- Logo raster (`public/images/logo.png`), schémas des pages services (`public/images/services/`), visuels des articles (`public/images/blog/`) et aperçu de partage par défaut (`public/images/og-default.jpg`, nom `og`) : générés par `php bin/illustrations.php [nom…]` (extension Imagick avec support SVG). Modifier les définitions dans ce script puis relancer.
- Données structurées (`structured_data()` dans `app/site.php`) : `Service` + catalogue d’offres lu dans la section `ul.offers` des pages services (prix repris de la version française), `FAQPage` lue dans les blocs `div.faq`. Tout schéma doit correspondre à du contenu visible.
- Tester les performances sur mobile réel ; contrôler Search Console après mise en ligne.
- Faire relire les traductions par des locuteurs natifs avant de les annoncer, en priorité l’irlandais (`ga`) et le maltais (`mt`).
