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>
188 lines
5.3 KiB
Dart
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,
|
|
);*/ |