manager-app/lib/constants.dart
Thomas Fransolet eb8e8497c8 Socle visuel et écran Guide IA à deux onglets
Socle visuel (constants.dart)
- 11 rôles typographiques, 8 espacements, 5 rayons, paddings de carte et de page,
  extraits du CSS des maquettes validées (DOCS/claude design/).
- Les couleurs restent celles de l'app : un écran neuf se fond dans manager-app,
  il n'y ouvre pas une seconde palette. Seules les valeurs sans équivalent
  existant sont reprises — remplissages discrets, bordures, gris atténué, ambre.
- Mesuré avant : 11 tailles de police différentes dans lib/Components/, de 9 à 25 px.

Écran Guide IA
- Coquille à deux onglets : Configuration / Ce que demandent vos visiteurs.
- Aperçu de conversation branché sur le vrai POST /api/AI/chat, pas une simulation.
- Carte « Ce que connaît votre guide » sur GET /api/Ai/knowledge/{id} : mesuré sur
  l'index vectoriel, pas sur les tables de contenu — une section désactivée en est
  purgée. Les « points d'intérêt » de la maquette deviennent « morceaux de contenu » :
  les points d'une carte sont indexés dans le texte de leur SectionMap.
- Onglet des questions visiteurs alimenté par GET /api/Ai/insights/{id}. Une carte
  sans données se masque au lieu d'afficher un cadre creux.

Client API
- AIApi était dans le client généré mais exposé nulle part dans client.dart, où
  les 18 autres façades le sont. Câblé.

34 clés i18n FR/EN/NL. flutter analyze propre, flutter build web .

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:48:40 +02:00

188 lines
5.3 KiB
Dart

import 'package:flutter/material.dart';
import 'package:manager_app/Models/resourceTypeModel.dart';
import 'package:manager_api_new/api.dart';
// Colors - TO FILL WIT CORRECT COLOR
//const kBackgroundColor = Color(0xFFFFFFFF);
const kTitleTextColor = Color(0xFF303030);
const kBodyTextColor = Color(0xFF393939); // TODO
const kBackgroundColor = Color(0xFFf5f5f7);
const kPrimaryColor = Color(0xFF264863); // #264863 // 308aae
const kError = Color(0xFFCA413F);
const kTextLightColor = Color(0xFFFCFDFD);
const kSecond = Color(0xFFC2C9D6);
const kWhite = Color(0xFFFFFFFF);
const kBlack = Color(0xFF000000);
const kSuccess = Color(0xFF8bc34a);
// Responsive
const kBreakpointMobile = 850.0;
// Shadows
const kDefaultShadow = BoxShadow(
color: kSecond,
spreadRadius: 0.5,
blurRadius: 5,
offset: Offset(0, 1.5),
);
// TextStyles for cards
const kCardTitleStyle = TextStyle(
fontSize: 14,
fontWeight: FontWeight.w600,
color: kWhite,
);
const kCardSubtitleStyle = TextStyle(
fontSize: 11,
fontWeight: FontWeight.w300,
color: Color(0xCCFFFFFF),
);
const kSectionLabelStyle = TextStyle(
fontSize: 13,
fontWeight: FontWeight.w600,
color: kTitleTextColor,
);
// ---------------------------------------------------------------------------
// Socle visuel — l'échelle typographique et les espacements viennent du CSS des
// maquettes validées (DOCS/claude design/guide-ia-screen.html et
// statistics-screen.html, tokens identiques dans les deux).
//
// Les couleurs, elles, restent celles de l'app : un écran neuf doit se fondre
// dans manager-app, pas y ouvrir une seconde palette. Seules les valeurs sans
// équivalent existant sont reprises des maquettes — les remplissages discrets,
// les bordures, le gris atténué et l'ambre d'avertissement.
// Pas de thème sombre : l'app n'en a pas.
// ---------------------------------------------------------------------------
const kGround = kBackgroundColor;
const kSurface = kWhite;
const kSurface2 = Color(0xFFF3F5F8);
const kSurface3 = Color(0xFFE7EBF1);
const kInk = kTitleTextColor;
const kInk2 = kBodyTextColor;
const kInk3 = Color(0xFF7C8B9A);
const kLine = Color(0xFFD6DDE5);
const kLineSoft = Color(0xFFE6EBF1);
const kBrand = kPrimaryColor;
const kBrand2 = Color(0xFF3C6C90);
const kBrandSoft = kSecond;
const kOnBrand = kWhite;
const kWarning = Color(0xFF9A6608);
const kSerious = kError;
const kGood = kSuccess;
const kMonoFamily = 'monospace';
const kSpace1 = 4.0;
const kSpace2 = 6.0;
const kSpace3 = 8.0;
const kSpace4 = 12.0;
const kSpace5 = 16.0;
const kSpace6 = 18.0;
const kSpace7 = 24.0;
const kSpace8 = 32.0;
const kRadiusInput = 5.0;
const kRadiusCard = 8.0;
const kRadiusShell = 10.0;
const kRadiusTrack = 4.0;
const kRadiusPill = 999.0;
const kCardPadding = EdgeInsets.fromLTRB(18, 17, 18, 19);
const kPagePadding = EdgeInsets.fromLTRB(28, 24, 28, 30);
const kCardShadow = [kDefaultShadow];
const kTitleScreen = TextStyle(
fontSize: 23,
fontWeight: FontWeight.w700,
letterSpacing: -0.41,
color: kInk,
);
const kTitleCard = TextStyle(
fontSize: 14.5,
fontWeight: FontWeight.w700,
color: kInk,
);
const kSubtitleCard = TextStyle(
fontSize: 12.5,
color: kInk3,
);
const kTextBody = TextStyle(
fontSize: 13.5,
color: kInk,
);
const kTextSmall = TextStyle(
fontSize: 13,
color: kInk2,
);
const kLabelField = TextStyle(
fontSize: 12.5,
fontWeight: FontWeight.w600,
color: kInk2,
);
const kTextHint = TextStyle(
fontSize: 12,
color: kInk3,
);
const kOverline = TextStyle(
fontSize: 11.5,
letterSpacing: 0.69,
color: kInk3,
);
const kOverlineMono = TextStyle(
fontFamily: kMonoFamily,
fontSize: 10.5,
letterSpacing: 0.95,
color: kInk3,
);
const kMetricLarge = TextStyle(
fontFamily: kMonoFamily,
fontSize: 29,
fontWeight: FontWeight.w600,
letterSpacing: -0.73,
height: 1,
color: kInk,
fontFeatures: [FontFeature.tabularFigures()],
);
const kMetricMedium = TextStyle(
fontFamily: kMonoFamily,
fontSize: 26,
fontWeight: FontWeight.w600,
letterSpacing: -0.52,
color: kInk,
fontFeatures: [FontFeature.tabularFigures()],
);
const List<String> section_types = ["Map", "Slider", "Video", "Web", "Menu", "Quiz", "Article", "PDF", "Game", "Agenda", "Weather", "Event", "Parcours"];
const List<String> map_types = ["none", "normal", "satellite", "terrain", "hybrid"];
const List<String> languages = ["FR", "NL", "EN", "DE", "IT", "ES", "CN", "PL", "AR", "UK"];
const List<String> map_types_mapBox = ["standard", "streets", "outdoors", "light", "dark", "satellite", "satellite_streets"];
const List<String> map_providers = ["Google", "MapBox"];
const kTitleMaxLength = 165;
const kDescriptionMaxLength = 2500;
List<ResourceTypeModel> resource_types = [
ResourceTypeModel(label: "Image", type: ResourceType.Image),
ResourceTypeModel(label: "Image url", type: ResourceType.ImageUrl),
ResourceTypeModel(label: "Vidéo", type: ResourceType.Video),
ResourceTypeModel(label: "Vidéo url", type: ResourceType.VideoUrl),
ResourceTypeModel(label: "Audio", type: ResourceType.Audio),
ResourceTypeModel(label: "PDF", type: ResourceType.Pdf),
ResourceTypeModel(label: "JSON", type: ResourceType.Json),
ResourceTypeModel(label: "JSON url", type: ResourceType.JsonUrl)
]; // "video url" , "video", {"label": "image"}, "image url", "audio"
/*
const kTextStyle = TextStyle(
fontSize: 23,
color: kPrimaryColor,
fontWeight: FontWeight.w600,
);*/