L’explication du moteur de difficulté en langage clair, dans une fenêtre ouverte depuis l’accueil ; son contenu (EngineInfoContent) est repris tel quel par la page /methode.
stableÀ valider
Écran ou section propre à Pathou, pas un composant du design system : à ne pas réutiliser ailleurs. Tous les écrans et sections
// Titre : Contenu : comment Pathou décide (EngineInfoContent)
import { EngineInfoContent } from '@pathou/components/EngineInfo';
export default function Exemple() {
return (
<div className="ip-main" style={{ width: 720, maxHeight: 680, overflowY: 'auto' }}>
<EngineInfoContent />
</div>
);
}
Installation
Copie le fichier dans ton projet, ainsi que les tokens qu’il utilise.
import { RATING_COLOR } from '../lib/colors';
import { RATINGS, RATING_LABEL } from '../lib/difficulty/rules';
import Modal from './Modal';
/** Explication du moteur de difficulté, en langage clair, ouverte depuis l'accueil. */
export default function EngineInfo({ onClose }: { onClose: () => void }) {
return (
<Modal title="Comment Pathou évalue la difficulté" onClose={onClose}>
<EngineInfoContent />
</Modal>
);
}
/** Contenu de la modale, repris tel quel par la page /methode. */
export function EngineInfoContent() {
return (
<div className="engine-info">
<p className="modal-lead">
Pathou découpe ta trace en points tous les 10 m et juge chacun d’eux selon ta pratique et ton niveau, en croisant le relief, la nature réelle du
chemin et sa technicité. Les points sont ensuite regroupés en passages, en points d’attention et en un verdict.
</p>
<ol>
<li>
<h3>Le relief</h3>
<p>
L’altitude vient du modèle de l’institut géographique national quand le pays est couvert (IGN RGE ALTI en France, précis au mètre ; la liste complète est dans « Pays couverts »), pas du GPS de ta montre, souvent faux de plusieurs dizaines de mètres. La
trace est recalée sur le chemin cartographié avant de mesurer l’altitude, puis lissée. Pathou en tire la pente moyenne sur 100 m, les montées et
le dénivelé.
</p>
</li>
<li>
<h3>La nature du chemin</h3>
<p>
Chaque point est rattaché au chemin OpenStreetMap qu’il emprunte, classé en six familles : route goudronnée, piste roulante, piste cassante,
chemin de terre, sentier et sentier technique. Là où OpenStreetMap ne connaît pas le passage, la base nationale des chemins prend le relais : BD TOPO de l’IGN en France, BTN de l’IGN España (pistes) en Espagne.
</p>
</li>
<li>
<h3>La technicité</h3>
<p>
Elle suit l’échelle VTT S0 à S5. Pathou prend la cotation d’OpenStreetMap quand elle existe ; sinon il l’estime d’après le type de sentier et l’état du
sol.
</p>
</li>
<li>
<h3>Ton profil</h3>
<p>
Ta pratique et ton niveau fixent des limites : la technicité où tu restes à l’aise, la pente que tu montes sans pousser selon le type de sol, la
pente où une descente devient engagée, et ton rythme. Le bouton « i » à côté du niveau les détaille.
</p>
</li>
<li>
<h3>La cotation de chaque point</h3>
<p>Quatre critères sont évalués ; le plus sévère l’emporte :</p>
<ul>
<li>
<b>Chemin et pratique</b> : un sentier technique pénalise le gravel, tout ce qui n’est pas goudronné est inadapté en route.
</li>
<li>
<b>Technicité</b> : à ta limite, le passage est difficile ; un cran au-dessus, très difficile ; deux crans, inadapté. La pente
module la cotation : un sentier compte un cran de plus en descente raide, un cran de moins à plat à partir de S2.
</li>
<li>
<b>Montée</b> : au-delà de ta limite pour ce type de sol, c’est un poussage probable. Avec une altitude fine (5 m ou mieux, comme en France, en Espagne ou en Suisse), Pathou repère
aussi les rampes courtes (pente sur 50 m) que la moyenne sur 100 m efface : difficile au-delà de ta limite, poussage à 3 points de plus.
</li>
<li>
<b>Descente</b> : au-delà de ta limite, elle est très difficile ; à une fois et demie ta limite, inadaptée.
</li>
</ul>
<div className="engine-scale">
{RATINGS.map((r) => (
<span key={r}>
<i style={{ background: RATING_COLOR[r] }} />
{RATING_LABEL[r]}
</span>
))}
</div>
</li>
<li>
<h3>Les points d’attention</h3>
<p>
Les passages difficiles voisins sont regroupés. S’y ajoutent les obstacles (échaliers, gués, escaliers), les accès interdits ou privés, les
sentiers exposés au vide (pente du terrain mesurée de part et d’autre du chemin), les sentiers peu visibles et les passages hors de tout
réseau connu.
</p>
<p>
Pour chaque passage très difficile, inadapté ou à pousser, Pathou cherche une alternative sur les chemins OpenStreetMap autour de la trace :
il part d’un carrefour avant le passage, en rejoint un après, et préfère les chemins faciles pour toi, pente comprise. Le contournement
retenu est ensuite coté comme la trace, avec l’altitude précise du pays. S’il reste difficile par endroits, il est présenté comme « moins dur » ;
s’il n’existe pas, ou s’il rallonge de plus de 3 km (ou du double du passage), Pathou le dit. Seuls les chemins cartographiés dans OpenStreetMap près
de la trace sont connus : un détour plus large ou un sentier absent de la carte ne sera pas proposé. Le verdict, lui, juge toujours la
trace telle quelle.
</p>
</li>
<li>
<h3>Le verdict</h3>
<table className="engine-verdict">
<tbody>
<tr>
<th>Non adaptée</th>
<td>plus de 3 % de la distance au-delà de ton niveau (à faire à pied), ou un accès interdit ou privé</td>
</tr>
<tr>
<th>Exigeante</th>
<td>plus de 6 % en très difficile ou inadapté, ou une sortie très longue pour ton niveau</td>
</tr>
<tr>
<th>Engagée</th>
<td>plus de 12 % en difficile ou au-delà, au moins un court passage à pied, ou une sortie longue pour ton niveau</td>
</tr>
<tr>
<th>Adaptée</th>
<td>sinon</td>
</tr>
</tbody>
</table>
<p>
Un court passage à faire à pied ne condamne donc pas la trace : il est signalé dans les points d’attention et compté dans le verdict, qui
indique la distance concernée. Le volume compte aussi : au-delà d’une durée en roulant propre à chaque niveau (par exemple 4 h 30, puis 7 h
pour un intermédiaire), la sortie devient engagée, puis exigeante, mais jamais « non adaptée » : on peut toujours rouler plus lentement.
Quand seule la durée relève le verdict, la trace est dite « longue » ou « très longue pour ton niveau », pas engagée : elle
reste facile techniquement. Si tu saisis ta vitesse moyenne, c’est elle qui compte.
</p>
<p>
Une jauge de confiance l’accompagne. Elle dit sur quelles données le verdict repose, au kilomètre près : cotation VTT renseignée, cotation
randonnée ou état du sol, revêtement seul, simple type de chemin ou passage hors de tout réseau. L’altitude compte aussi : celle d’un modèle national est plus sûre que celle
du GPS. Une confiance faible ne veut pas dire que la trace est dure, seulement qu’il faut vérifier davantage sur place ou sur les photos.
</p>
</li>
<li>
<h3>Le temps estimé</h3>
<p>
Il part d’une vitesse de base selon ta pratique et ton niveau, réduite selon le type de sol, freinée en montée (entre 450 et 1 050 m de
dénivelé par heure selon le niveau) et ramenée au pas là où tu pousses. Si tu saisis ta vitesse moyenne, elle remplace ce calcul.
</p>
</li>
</ol>
<p className="muted small">
Tout reste indicatif : la qualité du résultat dépend de ce qui est cartographié, et ni la boue ni la météo ne sont prises en compte. Vérifie les
passages signalés sur la photo aérienne et les photos au sol. Sans les chemins OpenStreetMap (serveurs indisponibles), seule la pente est jugée.
</p>
</div>
);
}
Tokens : --panel --text --muted --line --accent --chip --ease-out
Utilisation
import EngineInfo, { EngineInfoContent } from './components/EngineInfo';
{open && <EngineInfo onClose={() => setOpen(false)} />}Exemples
Dans sa fenêtre (EngineInfo)
// Titre : Dans sa fenêtre (EngineInfo)
import { useState } from 'react';
import EngineInfo from '@pathou/components/EngineInfo';
export default function Exemple() {
const [open, setOpen] = useState(true);
return (
<div style={{ minHeight: 600 }}>
<button type="button" onClick={() => setOpen(true)}>
Comment Pathou décide
</button>
{open && <EngineInfo onClose={() => setOpen(false)} />}
</div>
);
}
Guidelines
- MUSTGarder un seul contenu pour la fenêtre et la page /methode (EngineInfoContent).
- MUSTTirer les seuils cités des règles du moteur (lib/difficulty/rules.ts).
Référence de l’API
EngineInfo (export par défaut)
| Prop | Type | Défaut |
|---|---|---|
onClose | () => void | requis |
EngineInfoContent
Aucune prop.