From 474cd61244a7b97e3809c6428521f0efe5c38de5 Mon Sep 17 00:00:00 2001 From: Thomas Fransolet Date: Thu, 30 Apr 2026 16:46:45 +0200 Subject: [PATCH] Wip sections --- .env.production | 1 + .gitignore | 42 + AGENTS.md | 5 + CLAUDE.md | 97 + README.md | 12 + next.config.ts | 22 + package-lock.json | 2409 +++++++++++++++++ package.json | 26 + postcss.config.mjs | 7 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/vercel.svg | 1 + public/window.svg | 1 + src/app/[slug]/[configId]/layout.tsx | 25 + src/app/[slug]/[configId]/page.tsx | 40 + .../[configId]/sections/[sectionId]/page.tsx | 58 + src/app/[slug]/layout.tsx | 31 + src/app/[slug]/page.tsx | 21 + src/app/favicon.ico | Bin 0 -> 25931 bytes src/app/globals.css | 34 + src/app/layout.tsx | 33 + src/app/page.tsx | 65 + src/components/ConfigurationGrid.tsx | 89 + src/components/SectionList.tsx | 244 ++ src/components/sections/AgendaSection.tsx | 133 + src/components/sections/ArticleSection.tsx | 161 ++ src/components/sections/MapSection.tsx | 5 + src/components/sections/MenuSection.tsx | 108 + src/components/sections/PdfSection.tsx | 73 + src/components/sections/QuizSection.tsx | 254 ++ src/components/sections/SliderSection.tsx | 132 + src/components/sections/VideoSection.tsx | 108 + src/components/sections/WeatherSection.tsx | 211 ++ src/components/sections/WebSection.tsx | 75 + src/components/ui/AppBar.tsx | 62 + src/context/VisitorContext.tsx | 42 + src/lib/api/client.ts | 31 + src/lib/api/types.ts | 245 ++ src/lib/i18n.ts | 19 + src/lib/theme.ts | 40 + tsconfig.json | 34 + 42 files changed, 4999 insertions(+) create mode 100644 .env.production create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 src/app/[slug]/[configId]/layout.tsx create mode 100644 src/app/[slug]/[configId]/page.tsx create mode 100644 src/app/[slug]/[configId]/sections/[sectionId]/page.tsx create mode 100644 src/app/[slug]/layout.tsx create mode 100644 src/app/[slug]/page.tsx create mode 100644 src/app/favicon.ico create mode 100644 src/app/globals.css create mode 100644 src/app/layout.tsx create mode 100644 src/app/page.tsx create mode 100644 src/components/ConfigurationGrid.tsx create mode 100644 src/components/SectionList.tsx create mode 100644 src/components/sections/AgendaSection.tsx create mode 100644 src/components/sections/ArticleSection.tsx create mode 100644 src/components/sections/MapSection.tsx create mode 100644 src/components/sections/MenuSection.tsx create mode 100644 src/components/sections/PdfSection.tsx create mode 100644 src/components/sections/QuizSection.tsx create mode 100644 src/components/sections/SliderSection.tsx create mode 100644 src/components/sections/VideoSection.tsx create mode 100644 src/components/sections/WeatherSection.tsx create mode 100644 src/components/sections/WebSection.tsx create mode 100644 src/components/ui/AppBar.tsx create mode 100644 src/context/VisitorContext.tsx create mode 100644 src/lib/api/client.ts create mode 100644 src/lib/api/types.ts create mode 100644 src/lib/i18n.ts create mode 100644 src/lib/theme.ts create mode 100644 tsconfig.json diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..83a4039 --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +NEXT_PUBLIC_API_URL=https://api.myinfomate.be diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..75692fe --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files +.env.local +.env.production.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..8bd0e39 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,5 @@ + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices. + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..ddb5efb --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,97 @@ +@AGENTS.md + +# visitapp-web + +App visiteur web MyInfoMate — `app.myinfomate.be/[slug]` + +Next.js (App Router), TypeScript, Tailwind CSS. + +## Contexte produit + +Partie de l'écosystème MyInfoMate (voir `GITEA/CLAUDE.md` pour la vue d'ensemble). + +Cette app est l'équivalent web de `mymuseum-visitapp` (Flutter). Elle doit reproduire +fidèlement le visuel de `home_3.0.dart` et `configuration_page.dart`. + +Le backend est `manager-service` (C# / ASP.NET Core) — même API que les apps Flutter. + +> **Règle de développement** : pour tout bug ou feature à implémenter, toujours commencer +> par lire l'équivalent Flutter dans `mymuseum-visitapp`. C'est la référence de comportement : +> logique de navigation, appels API, endpoints utilisés — tout doit correspondre. + +## Architecture + +### Routing + +``` +src/app/ + [slug]/ + layout.tsx → fetch instance, inject thème CSS (couleurs instance) + page.tsx → home (grille de configurations) + [configId]/ + layout.tsx → fetch ConfigurationDTO, override couleurs si définies + page.tsx → liste des sections + sections/[sectionId]/ + page.tsx → dispatcher par type de section +``` + +### Theming + +Couleurs injectées en CSS variables sur `` depuis le backend : + +- Home → `ApplicationInstanceDTO.primaryColor / secondaryColor` +- Dans une configuration → `ConfigurationDTO.primaryColor ?? instance.primaryColor` + +Variables CSS disponibles partout : +- `--color-primary`, `--color-secondary` +- `--color-primary-light` (dérivée, 12% opacité) +- `--color-on-primary` (blanc ou noir, calculé par contraste WCAG) +- `--color-background`, `--color-surface`, `--color-text`, `--color-text-muted`, `--color-border` + +### Multi-langue + +- Langue stockée dans `VisitorContext` (React context) + `localStorage` +- Tous les champs texte sont `TranslationDTO[]` → `{ language: string, value: string }[]` +- Helper `t(translations, lang)` pour résoudre la valeur dans la langue active + +### Client API + +Généré depuis le Swagger de `manager-service`. Fichiers dans `src/lib/api/`. + +### Rendu du contenu textuel + +Tous les champs de contenu texte long (article, description, etc.) sont produits par un +éditeur **Quill** dans `manager-app`. Ils contiennent du **HTML** (balises `

`, ``, +`