{"id":2954,"date":"2026-05-21T00:33:06","date_gmt":"2026-05-20T22:33:06","guid":{"rendered":"https:\/\/acriv.org\/WP\/?page_id=2954"},"modified":"2026-05-21T00:52:13","modified_gmt":"2026-05-20T22:52:13","slug":"computer-acriv-2","status":"publish","type":"page","link":"https:\/\/acriv.org\/WP\/computer-acriv-2\/","title":{"rendered":"COMPUTER ACRIV"},"content":{"rendered":"\n<p class=\"has-text-align-center has-vivid-red-color has-text-color has-link-color wp-elements-befb809ddd66132d3c9be5514f195c68 wp-block-paragraph\"><strong>Usage p\u00e9dagogique \u2014 Toujours v\u00e9rifier les donn\u00e9es officielles<\/strong><\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Calculateur Navigation PPL &#8211; Bretagne<\/title>\n<style>\n  :root {\n    --bg: #0a0e1a;\n    --bg2: #0f1628;\n    --bg3: #151e35;\n    --card: #1a2440;\n    --card2: #1f2c4d;\n    --border: #2a3a5c;\n    --border2: #3a4f7a;\n    --accent: #4a9eff;\n    --accent2: #2d7dd4;\n    --gold: #f0b429;\n    --gold2: #d4a017;\n    --green: #2ecc71;\n    --green2: #27ae60;\n    --red: #e74c3c;\n    --purple: #9b59b6;\n    --text: #e8eef8;\n    --text2: #9ab0d0;\n    --text3: #6a85aa;\n    --radius: 10px;\n    --radius2: 6px;\n  }\n\n  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }\n\n  body {\n    font-family: 'Segoe UI', system-ui, sans-serif;\n    background: var(--bg);\n    color: var(--text);\n    min-height: 100vh;\n  }\n\n  .nav-calc-wrapper {\n    max-width: 1200px;\n    margin: 0 auto;\n    padding: 2rem 1rem 4rem;\n  }\n\n  \/* \u2500\u2500 Header \u2500\u2500 *\/\n  .nav-header {\n    text-align: center;\n    margin-bottom: 2.5rem;\n    padding: 2rem;\n    background: linear-gradient(135deg, #0d1b3e 0%, #1a2a5e 50%, #0d1b3e 100%);\n    border-radius: 16px;\n    border: 1px solid var(--border2);\n    position: relative;\n    overflow: hidden;\n  }\n  .nav-header::before {\n    content: '';\n    position: absolute;\n    top: -50%; left: -50%;\n    width: 200%; height: 200%;\n    background: radial-gradient(circle at 30% 50%, rgba(74,158,255,0.06) 0%, transparent 60%),\n                radial-gradient(circle at 70% 50%, rgba(240,180,41,0.04) 0%, transparent 60%);\n    pointer-events: none;\n  }\n  .nav-header h1 {\n    font-size: clamp(1.4rem, 3vw, 2rem);\n    font-weight: 700;\n    letter-spacing: 0.04em;\n    color: var(--text);\n    margin-bottom: 0.4rem;\n  }\n  .nav-header h1 span { color: var(--accent); }\n  .nav-header p {\n    color: var(--text2);\n    font-size: 0.9rem;\n    letter-spacing: 0.06em;\n    text-transform: uppercase;\n  }\n  .badge-row {\n    display: flex;\n    justify-content: center;\n    gap: 0.75rem;\n    margin-top: 1rem;\n    flex-wrap: wrap;\n  }\n  .badge {\n    background: rgba(74,158,255,0.12);\n    border: 1px solid rgba(74,158,255,0.3);\n    color: var(--accent);\n    padding: 0.25rem 0.75rem;\n    border-radius: 20px;\n    font-size: 0.75rem;\n    font-weight: 600;\n    letter-spacing: 0.05em;\n  }\n  .badge.gold {\n    background: rgba(240,180,41,0.12);\n    border-color: rgba(240,180,41,0.3);\n    color: var(--gold);\n  }\n\n  \/* \u2500\u2500 Section titles \u2500\u2500 *\/\n  .section-title {\n    font-size: 0.7rem;\n    font-weight: 700;\n    letter-spacing: 0.12em;\n    text-transform: uppercase;\n    color: var(--text3);\n    margin-bottom: 1rem;\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n  }\n  .section-title::after {\n    content: '';\n    flex: 1;\n    height: 1px;\n    background: var(--border);\n  }\n\n  \/* \u2500\u2500 Grid layouts \u2500\u2500 *\/\n  .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 1.25rem; }\n  .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; }\n  .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; }\n  @media (max-width: 768px) {\n    .grid-2 { grid-template-columns: 1fr; }\n    .grid-3 { grid-template-columns: 1fr 1fr; }\n    .grid-4 { grid-template-columns: 1fr 1fr; }\n  }\n  @media (max-width: 480px) {\n    .grid-3, .grid-4 { grid-template-columns: 1fr; }\n  }\n\n  \/* \u2500\u2500 Cards \u2500\u2500 *\/\n  .card {\n    background: var(--card);\n    border: 1px solid var(--border);\n    border-radius: var(--radius);\n    padding: 1.5rem;\n    margin-bottom: 1.25rem;\n  }\n  .card.accent-border { border-top: 3px solid var(--accent); }\n  .card.gold-border   { border-top: 3px solid var(--gold); }\n  .card.green-border  { border-top: 3px solid var(--green); }\n\n  \/* \u2500\u2500 Form elements \u2500\u2500 *\/\n  .field-group { margin-bottom: 1rem; }\n  .field-group label {\n    display: block;\n    font-size: 0.75rem;\n    font-weight: 600;\n    color: var(--text2);\n    letter-spacing: 0.06em;\n    text-transform: uppercase;\n    margin-bottom: 0.4rem;\n  }\n  .field-group .hint {\n    font-size: 0.68rem;\n    color: var(--text3);\n    margin-top: 0.2rem;\n    font-style: italic;\n  }\n  input[type=\"number\"], input[type=\"text\"], select {\n    width: 100%;\n    background: var(--bg2);\n    border: 1px solid var(--border);\n    border-radius: var(--radius2);\n    color: var(--text);\n    padding: 0.6rem 0.8rem;\n    font-size: 0.95rem;\n    font-family: 'Courier New', monospace;\n    transition: border-color 0.2s;\n    -moz-appearance: textfield;\n  }\n  input[type=\"number\"]::-webkit-inner-spin-button,\n  input[type=\"number\"]::-webkit-outer-spin-button { -webkit-appearance: none; }\n  input[type=\"number\"]:focus, input[type=\"text\"]:focus, select:focus {\n    outline: none;\n    border-color: var(--accent);\n    box-shadow: 0 0 0 2px rgba(74,158,255,0.15);\n  }\n  select { cursor: pointer; }\n  select option { background: var(--bg2); }\n\n  \/* \u2500\u2500 Calculate button \u2500\u2500 *\/\n  .btn-calc {\n    width: 100%;\n    padding: 1rem 2rem;\n    background: linear-gradient(135deg, var(--accent2), var(--accent));\n    color: white;\n    border: none;\n    border-radius: var(--radius);\n    font-size: 1rem;\n    font-weight: 700;\n    letter-spacing: 0.08em;\n    text-transform: uppercase;\n    cursor: pointer;\n    margin: 1.5rem 0;\n    transition: opacity 0.2s, transform 0.1s;\n    position: relative;\n    overflow: hidden;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    gap: 0.6rem;\n    line-height: 1;\n    min-height: 52px;\n  }\n  .btn-calc:hover { opacity: 0.9; transform: translateY(-1px); }\n  .btn-calc:active { transform: translateY(0); }\n\n  \/* \u2500\u2500 Result panels \u2500\u2500 *\/\n  .result-panel {\n    background: var(--bg3);\n    border: 1px solid var(--border2);\n    border-radius: var(--radius);\n    padding: 1.25rem;\n    display: none;\n  }\n  .result-panel.visible { display: block; }\n\n  .result-big { text-align: center; padding: 1rem 0.5rem; }\n  .result-big .value {\n    font-size: 2.2rem;\n    font-weight: 800;\n    font-family: 'Courier New', monospace;\n    line-height: 1;\n    margin-bottom: 0.2rem;\n  }\n  .result-big .unit {\n    font-size: 0.7rem;\n    color: var(--text3);\n    letter-spacing: 0.1em;\n    text-transform: uppercase;\n  }\n  .result-big .label {\n    font-size: 0.72rem;\n    color: var(--text2);\n    letter-spacing: 0.08em;\n    text-transform: uppercase;\n    margin-top: 0.3rem;\n  }\n  .c-blue   { color: var(--accent); }\n  .c-gold   { color: var(--gold); }\n  .c-green  { color: var(--green); }\n  .c-red    { color: var(--red); }\n  .c-purple { color: var(--purple); }\n\n  \/* \u2500\u2500 Route blocks \u2500\u2500 *\/\n  .route-block {\n    background: var(--card2);\n    border: 1px solid var(--border);\n    border-radius: var(--radius);\n    margin-bottom: 1rem;\n    overflow: hidden;\n  }\n  .route-header {\n    background: var(--bg3);\n    padding: 0.6rem 1rem;\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    border-bottom: 1px solid var(--border);\n  }\n  .route-num {\n    font-size: 0.7rem;\n    font-weight: 800;\n    letter-spacing: 0.1em;\n    text-transform: uppercase;\n    color: var(--text3);\n  }\n  .route-name-display { font-size: 0.88rem; font-weight: 600; color: var(--text); }\n  .route-body { padding: 1rem; }\n  .route-results {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(130px, 1fr));\n    gap: 0.75rem;\n    margin-top: 1rem;\n  }\n  .route-result-cell {\n    background: var(--bg2);\n    border-radius: var(--radius2);\n    padding: 0.7rem;\n    text-align: center;\n  }\n  .route-result-cell .rv { font-size: 1.2rem; font-weight: 800; font-family: 'Courier New', monospace; }\n  .route-result-cell .rl { font-size: 0.62rem; color: var(--text3); text-transform: uppercase; letter-spacing: 0.08em; margin-top: 0.2rem; }\n\n  \/* \u2500\u2500 Info tooltip \u2500\u2500 *\/\n  .info-icon {\n    display: inline-block;\n    width: 16px; height: 16px;\n    background: var(--border2);\n    border-radius: 50%;\n    text-align: center;\n    line-height: 16px;\n    font-size: 10px;\n    color: var(--text2);\n    cursor: help;\n    margin-left: 0.3rem;\n    position: relative;\n  }\n  .info-icon:hover::after {\n    content: attr(data-tip);\n    position: absolute;\n    left: 50%;\n    bottom: calc(100% + 6px);\n    transform: translateX(-50%);\n    background: #1a2440;\n    border: 1px solid var(--border2);\n    border-radius: 6px;\n    padding: 0.5rem 0.75rem;\n    font-size: 0.72rem;\n    color: var(--text);\n    z-index: 100;\n    width: 240px;\n    white-space: normal;\n    line-height: 1.5;\n    font-family: 'Segoe UI', sans-serif;\n    font-weight: 400;\n  }\n\n  \/* \u2500\u2500 Declination map info \u2500\u2500 *\/\n  .declination-map {\n    background: var(--bg2);\n    border: 1px solid var(--border);\n    border-radius: var(--radius2);\n    padding: 0.75rem 1rem;\n    margin-top: 0.5rem;\n    font-size: 0.78rem;\n    color: var(--text2);\n    line-height: 1.6;\n  }\n  .declination-map strong { color: var(--gold); }\n\n  \/* \u2500\u2500 Formula box \u2500\u2500 *\/\n  .formula-box {\n    background: rgba(74,158,255,0.06);\n    border: 1px solid rgba(74,158,255,0.2);\n    border-radius: var(--radius2);\n    padding: 0.75rem 1rem;\n    font-size: 0.78rem;\n    color: var(--text2);\n    font-family: 'Courier New', monospace;\n    line-height: 2;\n    margin-top: 0.5rem;\n  }\n  .formula-box span { color: var(--text3); font-family: 'Segoe UI', sans-serif; font-size: 0.7rem; }\n\n  \/* \u2500\u2500 Animations \u2500\u2500 *\/\n  @keyframes fadeIn {\n    from { opacity: 0; transform: translateY(8px); }\n    to   { opacity: 1; transform: translateY(0); }\n  }\n  .result-panel.visible { animation: fadeIn 0.3s ease; }\n\n  @media (max-width: 600px) {\n    .card { padding: 1rem; }\n    .result-big .value { font-size: 1.6rem; }\n  }\n<\/style>\n<\/head>\n<body>\n\n<div class=\"nav-calc-wrapper\">\n\n  <!-- \u2550\u2550 HEADER \u2550\u2550 -->\n  <div class=\"nav-header\">\n    <h1>\u2708 Calculateur <span>Navigation PPL<\/span><\/h1>\n    <p>Bretagne \u00b7 France \u00b7 A\u00e9ronautique VFR<\/p>\n    <div class=\"badge-row\">\n      <span class=\"badge\">Triangle des vitesses<\/span>\n      <span class=\"badge\">Cap vrai \u2192 magn\u00e9tique \u2192 compas<\/span>\n      <span class=\"badge gold\">D\u00e9clinaison magn\u00e9tique Bretagne<\/span>\n      <span class=\"badge\">Altitude densit\u00e9<\/span>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550 BLOC 1 : CONDITIONS ATMOSPH\u00c9RIQUES & A\u00c9RONEF \u2550\u2550 -->\n  <div class=\"card accent-border\">\n    <div class=\"section-title\">\u2699 Param\u00e8tres atmosph\u00e9riques &amp; a\u00e9ronef<\/div>\n    <div class=\"grid-2\">\n      <div>\n        <div class=\"section-title\" style=\"font-size:0.65rem; margin-bottom:0.75rem;\">Vitesse &amp; altitude<\/div>\n        <div class=\"field-group\">\n          <label>Vitesse propre (TAS) <span class=\"info-icon\" data-tip=\"True Air Speed : vitesse de l'avion par rapport \u00e0 la masse d'air r\u00e9elle. Calcul\u00e9e \u00e0 partir de l'IAS corrig\u00e9e.\">i<\/span><\/label>\n          <input type=\"number\" id=\"tas\" placeholder=\"ex: 110\" min=\"30\" max=\"400\" step=\"1\" value=\"110\">\n          <div class=\"hint\">en n\u0153uds (kt)<\/div>\n        <\/div>\n        <div class=\"field-group\">\n          <label>Altitude pression (ft) <span class=\"info-icon\" data-tip=\"Altitude lue sur l'altim\u00e8tre cal\u00e9 sur le QNH.\">i<\/span><\/label>\n          <input type=\"number\" id=\"altitude\" placeholder=\"ex: 3500\" min=\"0\" max=\"20000\" step=\"100\" value=\"3500\">\n          <div class=\"hint\">pieds (ft) \u2014 pour TAS auto depuis IAS<\/div>\n        <\/div>\n        <div class=\"field-group\">\n          <label>IAS (optionnel) <span class=\"info-icon\" data-tip=\"Indicated Air Speed. Si renseign\u00e9e avec l'altitude et la temp\u00e9rature, la TAS sera recalcul\u00e9e automatiquement.\">i<\/span><\/label>\n          <input type=\"number\" id=\"ias\" placeholder=\"ex: 100\" min=\"30\" max=\"400\" step=\"1\">\n          <div class=\"hint\">kt \u2014 si renseign\u00e9e, remplace la TAS ci-dessus<\/div>\n        <\/div>\n      <\/div>\n      <div>\n        <div class=\"section-title\" style=\"font-size:0.65rem; margin-bottom:0.75rem;\">M\u00e9t\u00e9o &amp; pression<\/div>\n        <div class=\"field-group\">\n          <label>Temp\u00e9rature (\u00b0C) <span class=\"info-icon\" data-tip=\"Temp\u00e9rature OAT \u00e0 l'altitude de vol, lue sur le thermom\u00e8tre de bord ou fournie par le METAR\/ATIS.\">i<\/span><\/label>\n          <input type=\"number\" id=\"temp\" placeholder=\"ex: 8\" min=\"-60\" max=\"60\" step=\"1\" value=\"8\">\n        <\/div>\n        <div class=\"field-group\">\n          <label>QNH (hPa) <span class=\"info-icon\" data-tip=\"Pression atmosph\u00e9rique ramen\u00e9e au niveau de la mer. Utilis\u00e9e pour calculer l'altitude densit\u00e9.\">i<\/span><\/label>\n          <input type=\"number\" id=\"qnh\" placeholder=\"ex: 1013\" min=\"900\" max=\"1100\" step=\"1\" value=\"1013\">\n        <\/div>\n        <div class=\"field-group\">\n          <label>Erreur instrument (d\u00e9viation) <span class=\"info-icon\" data-tip=\"Erreur syst\u00e9matique du compas magn\u00e9tique, propre \u00e0 l'avion. Figurant sur la carte de d\u00e9viation du bord. Positive si le compas indique trop au Nord.\">i<\/span><\/label>\n          <input type=\"number\" id=\"deviation\" placeholder=\"ex: +2 ou -3\" min=\"-30\" max=\"30\" step=\"0.5\" value=\"0\">\n          <div class=\"hint\">degr\u00e9s \u00b7 + = erreur Est, \u2212 = erreur Ouest<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div id=\"atmo-results\" class=\"result-panel\" style=\"margin-top:1rem;\">\n      <div class=\"grid-3\">\n        <div class=\"result-big\">\n          <div class=\"value c-blue\" id=\"r-tas\">\u2014<\/div>\n          <div class=\"unit\">kt<\/div>\n          <div class=\"label\">TAS calcul\u00e9e<\/div>\n        <\/div>\n        <div class=\"result-big\">\n          <div class=\"value c-gold\" id=\"r-da\">\u2014<\/div>\n          <div class=\"unit\">ft<\/div>\n          <div class=\"label\">Altitude densit\u00e9<\/div>\n        <\/div>\n        <div class=\"result-big\">\n          <div class=\"value c-purple\" id=\"r-rho\">\u2014<\/div>\n          <div class=\"unit\">%<\/div>\n          <div class=\"label\">Densit\u00e9 air \/ std<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550 BLOC 2 : VENT \u2550\u2550 -->\n  <div class=\"card gold-border\">\n    <div class=\"section-title\">\ud83d\udca8 Vent<\/div>\n    <div class=\"grid-2\">\n      <div>\n        <div class=\"field-group\">\n          <label>Direction du vent (\u00b0V) <span class=\"info-icon\" data-tip=\"Direction d'o\u00f9 souffle le vent, en degr\u00e9s vrais (convention METAR\/a\u00e9ronautique). Ex: 270 = vent venant de l'Ouest.\">i<\/span><\/label>\n          <input type=\"number\" id=\"wind-dir\" placeholder=\"ex: 270\" min=\"0\" max=\"360\" step=\"1\" value=\"270\">\n          <div class=\"hint\">degr\u00e9s vrais \u2014 d&rsquo;o\u00f9 vient le vent (convention METAR\/a\u00e9ronautique)<\/div>\n        <\/div>\n        <div class=\"field-group\">\n          <label>Force du vent <span class=\"info-icon\" data-tip=\"Vitesse du vent en n\u0153uds, donn\u00e9e par le METAR ou le TAF.\">i<\/span><\/label>\n          <input type=\"number\" id=\"wind-spd\" placeholder=\"ex: 15\" min=\"0\" max=\"150\" step=\"1\" value=\"15\">\n          <div class=\"hint\">n\u0153uds (kt)<\/div>\n        <\/div>\n      <\/div>\n      <div>\n        <div class=\"formula-box\">\n          GS = TAS + Ve <br><span>Vitesse sol = TAS + vent effectif<\/span>\n          Ve = W \u00d7 cos(\u03b1) <br><span>Vent effectif (composante axiale)<\/span>\n          Vt = W \u00d7 sin(\u03b1) <br><span>Vent traversier (composante lat\u00e9rale)<\/span>\n          D\u00e9rive = arcsin(Vt \/ TAS) <br><span>Angle de d\u00e9rive \u00e0 corriger<\/span>\n          \u03b1 = (Dir_vent + 180\u00b0) \u2212 CV <br><span>Vent FROM \u2192 TO, puis angle\/route<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550 BLOC 3 : D\u00c9CLINAISON MAGN\u00c9TIQUE \u2550\u2550 -->\n  <div class=\"card\">\n    <div class=\"section-title\">\ud83e\uddf2 D\u00e9clinaison magn\u00e9tique \u2014 Bretagne<\/div>\n    <div class=\"grid-2\">\n      <div>\n        <div class=\"field-group\">\n          <label>Zone de vol <span class=\"info-icon\" data-tip=\"La d\u00e9clinaison varie l\u00e9g\u00e8rement d'Est en Ouest de la Bretagne. Choisissez la zone la plus proche de votre terrain.\">i<\/span><\/label>\n          <select id=\"declination-zone\">\n            <option value=\"-1.0\">Est Bretagne (Rennes, Vitr\u00e9) \u2014 \u22121.0\u00b0<\/option>\n            <option value=\"-1.5\" selected>Centre Bretagne (Loud\u00e9ac, Pontivy) \u2014 \u22121.5\u00b0<\/option>\n            <option value=\"-2.0\">Ouest Bretagne (Brest, Finist\u00e8re) \u2014 \u22122.0\u00b0<\/option>\n            <option value=\"-1.7\">C\u00f4tes d&rsquo;Armor (Saint-Brieuc) \u2014 \u22121.7\u00b0<\/option>\n            <option value=\"-1.8\">Morbihan (Vannes, Lorient) \u2014 \u22121.8\u00b0<\/option>\n            <option value=\"-1.3\">Ille-et-Vilaine (Foug\u00e8res, Saint-Malo) \u2014 \u22121.3\u00b0<\/option>\n            <option value=\"custom\">Valeur personnalis\u00e9e<\/option>\n          <\/select>\n        <\/div>\n        <div class=\"field-group\" id=\"custom-decl-group\" style=\"display:none;\">\n          <label>D\u00e9clinaison personnalis\u00e9e (\u00b0)<\/label>\n          <input type=\"number\" id=\"custom-decl\" placeholder=\"ex: -1.8\" min=\"-10\" max=\"10\" step=\"0.1\" value=\"-2.0\">\n          <div class=\"hint\">N\u00e9gatif = Ouest (cas de la Bretagne)<\/div>\n        <\/div>\n      <\/div>\n      <div>\n        <div class=\"declination-map\">\n          <strong>\ud83d\udccd D\u00e9clinaisons de r\u00e9f\u00e9rence Bretagne (2024\u20132025)<\/strong><br>\n          En Bretagne, le p\u00f4le magn\u00e9tique se situe \u00e0 l&rsquo;<strong>Ouest<\/strong> du p\u00f4le g\u00e9ographique.<br>\n          La d\u00e9clinaison est donc <strong>Ouest (n\u00e9gative)<\/strong> : la rose du compas est tourn\u00e9e vers l&rsquo;Ouest par rapport au Nord vrai.<br><br>\n          R\u00e8gle mn\u00e9motechnique :<br>\n          <strong>Cap vrai \u2192 Cap magn\u00e9tique :<\/strong> ajouter la d\u00e9clinaison Ouest (+) en valeur absolue, ou soustraire la valeur alg\u00e9brique.<br>\n          <em>Ex : CV = 090\u00b0V, D = \u22122\u00b0 \u2192 CM = 092\u00b0M \u2192 CC = CM \u2212 d\u00e9viation<\/em>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550 BOUTON CALCUL \u2550\u2550 -->\n  <button class=\"btn-calc\" onclick=\"calculateAll()\">\u25b6 CALCULER \u2014 Triangle des vitesses &amp; caps<\/button>\n\n  <!-- \u2550\u2550 R\u00c9SULTATS GLOBAUX \u2550\u2550 -->\n  <div id=\"global-results\" class=\"result-panel card\" style=\"display:none;\">\n    <div class=\"section-title\">\ud83d\udcca R\u00e9sultats \u2014 Conditions de vol<\/div>\n    <div class=\"grid-4\">\n      <div class=\"result-big\">\n        <div class=\"value c-blue\" id=\"disp-tas\">\u2014<\/div>\n        <div class=\"unit\">kt<\/div>\n        <div class=\"label\">TAS<\/div>\n      <\/div>\n      <div class=\"result-big\">\n        <div class=\"value c-gold\" id=\"disp-da2\">\u2014<\/div>\n        <div class=\"unit\">ft<\/div>\n        <div class=\"label\">Alt. densit\u00e9<\/div>\n      <\/div>\n      <div class=\"result-big\">\n        <div class=\"value c-green\" id=\"disp-decl\">\u2014<\/div>\n        <div class=\"unit\">\u00b0<\/div>\n        <div class=\"label\">D\u00e9clinaison<\/div>\n      <\/div>\n      <div class=\"result-big\">\n        <div class=\"value\" id=\"disp-dev\">\u2014<\/div>\n        <div class=\"unit\">\u00b0<\/div>\n        <div class=\"label\">D\u00e9viation compas<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550 BLOC 4 : ROUTES \u2550\u2550 -->\n  <div class=\"card green-border\" style=\"margin-top:1.25rem;\">\n    <div class=\"section-title\">\ud83d\uddfa Routes \u2014 Cap vrai \u2192 Cap compas<\/div>\n\n    <!-- Route 1 -->\n    <div class=\"route-block\" id=\"route-block-1\">\n      <div class=\"route-header\">\n        <span class=\"route-num\">Route 1<\/span>\n        <span class=\"route-name-display\" id=\"route-name-disp-1\">\u2014<\/span>\n      <\/div>\n      <div class=\"route-body\">\n        <div class=\"grid-3\">\n          <div class=\"field-group\">\n            <label>Nom \/ Destination<\/label>\n            <input type=\"text\" id=\"route-name-1\" placeholder=\"ex: LFRB\">\n          <\/div>\n          <div class=\"field-group\">\n            <label>Cap vrai (\u00b0V) <span class=\"info-icon\" data-tip=\"Route vraie mesur\u00e9e sur la carte a\u00e9ronautique, en degr\u00e9s vrais.\">i<\/span><\/label>\n            <input type=\"number\" id=\"route-cv-1\" placeholder=\"ex: 090\" min=\"0\" max=\"360\" step=\"1\">\n          <\/div>\n          <div class=\"field-group\">\n            <label>Distance (NM)<\/label>\n            <input type=\"number\" id=\"route-dist-1\" placeholder=\"ex: 45\" min=\"0\" max=\"9999\" step=\"1\">\n          <\/div>\n        <\/div>\n        <div id=\"route-results-1\" style=\"display:none;\">\n          <div class=\"route-results\">\n            <div class=\"route-result-cell\"><div class=\"rv c-blue\"  id=\"r1-cv\">\u2014<\/div><div class=\"rl\">Cap Vrai (CV)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-green\" id=\"r1-cm\">\u2014<\/div><div class=\"rl\">Cap Magn\u00e9t. (CM)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-gold\"  id=\"r1-cc\">\u2014<\/div><div class=\"rl\">Cap Compas (CC)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-purple\" id=\"r1-derive\">\u2014<\/div><div class=\"rl\">D\u00e9rive (\u00b0)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-blue\"  id=\"r1-cap-vent\">\u2014<\/div><div class=\"rl\">Cap pour CV<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r1-gs\">\u2014<\/div><div class=\"rl\">Vitesse sol (kt)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-green\" id=\"r1-ve\">\u2014<\/div><div class=\"rl\">Vent effectif<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-red\"   id=\"r1-vt\">\u2014<\/div><div class=\"rl\">Vent traversier<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r1-derive-max\">\u2014<\/div><div class=\"rl\">D\u00e9rive max<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r1-ete\">\u2014<\/div><div class=\"rl\">Temps estim\u00e9<\/div><\/div>\n          <\/div>\n          <div style=\"margin-top:1rem; background:var(--bg2); border-radius:6px; padding:0.75rem 1rem; font-size:0.78rem; color:var(--text2); line-height:2;\">\n            <strong style=\"color:var(--text); display:block; margin-bottom:0.25rem;\">\ud83d\udcd0 D\u00e9tail des calculs (Route 1)<\/strong>\n            <span id=\"r1-detail\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Route 2 -->\n    <div class=\"route-block\" id=\"route-block-2\">\n      <div class=\"route-header\">\n        <span class=\"route-num\">Route 2<\/span>\n        <span class=\"route-name-display\" id=\"route-name-disp-2\">\u2014<\/span>\n      <\/div>\n      <div class=\"route-body\">\n        <div class=\"grid-3\">\n          <div class=\"field-group\">\n            <label>Nom \/ Destination<\/label>\n            <input type=\"text\" id=\"route-name-2\" placeholder=\"ex: LFRN\">\n          <\/div>\n          <div class=\"field-group\">\n            <label>Cap vrai (\u00b0V) <span class=\"info-icon\" data-tip=\"Route vraie mesur\u00e9e sur la carte a\u00e9ronautique, en degr\u00e9s vrais.\">i<\/span><\/label>\n            <input type=\"number\" id=\"route-cv-2\" placeholder=\"ex: 145\" min=\"0\" max=\"360\" step=\"1\">\n          <\/div>\n          <div class=\"field-group\">\n            <label>Distance (NM)<\/label>\n            <input type=\"number\" id=\"route-dist-2\" placeholder=\"ex: 60\" min=\"0\" max=\"9999\" step=\"1\">\n          <\/div>\n        <\/div>\n        <div id=\"route-results-2\" style=\"display:none;\">\n          <div class=\"route-results\">\n            <div class=\"route-result-cell\"><div class=\"rv c-blue\"  id=\"r2-cv\">\u2014<\/div><div class=\"rl\">Cap Vrai (CV)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-green\" id=\"r2-cm\">\u2014<\/div><div class=\"rl\">Cap Magn\u00e9t. (CM)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-gold\"  id=\"r2-cc\">\u2014<\/div><div class=\"rl\">Cap Compas (CC)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-purple\" id=\"r2-derive\">\u2014<\/div><div class=\"rl\">D\u00e9rive (\u00b0)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-blue\"  id=\"r2-cap-vent\">\u2014<\/div><div class=\"rl\">Cap pour CV<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r2-gs\">\u2014<\/div><div class=\"rl\">Vitesse sol (kt)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-green\" id=\"r2-ve\">\u2014<\/div><div class=\"rl\">Vent effectif<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-red\"   id=\"r2-vt\">\u2014<\/div><div class=\"rl\">Vent traversier<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r2-derive-max\">\u2014<\/div><div class=\"rl\">D\u00e9rive max<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r2-ete\">\u2014<\/div><div class=\"rl\">Temps estim\u00e9<\/div><\/div>\n          <\/div>\n          <div style=\"margin-top:1rem; background:var(--bg2); border-radius:6px; padding:0.75rem 1rem; font-size:0.78rem; color:var(--text2); line-height:2;\">\n            <strong style=\"color:var(--text); display:block; margin-bottom:0.25rem;\">\ud83d\udcd0 D\u00e9tail des calculs (Route 2)<\/strong>\n            <span id=\"r2-detail\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Route 3 -->\n    <div class=\"route-block\" id=\"route-block-3\">\n      <div class=\"route-header\">\n        <span class=\"route-num\">Route 3<\/span>\n        <span class=\"route-name-display\" id=\"route-name-disp-3\">\u2014<\/span>\n      <\/div>\n      <div class=\"route-body\">\n        <div class=\"grid-3\">\n          <div class=\"field-group\">\n            <label>Nom \/ Destination<\/label>\n            <input type=\"text\" id=\"route-name-3\" placeholder=\"ex: LFRS\">\n          <\/div>\n          <div class=\"field-group\">\n            <label>Cap vrai (\u00b0V) <span class=\"info-icon\" data-tip=\"Route vraie mesur\u00e9e sur la carte a\u00e9ronautique, en degr\u00e9s vrais.\">i<\/span><\/label>\n            <input type=\"number\" id=\"route-cv-3\" placeholder=\"ex: 215\" min=\"0\" max=\"360\" step=\"1\">\n          <\/div>\n          <div class=\"field-group\">\n            <label>Distance (NM)<\/label>\n            <input type=\"number\" id=\"route-dist-3\" placeholder=\"ex: 35\" min=\"0\" max=\"9999\" step=\"1\">\n          <\/div>\n        <\/div>\n        <div id=\"route-results-3\" style=\"display:none;\">\n          <div class=\"route-results\">\n            <div class=\"route-result-cell\"><div class=\"rv c-blue\"  id=\"r3-cv\">\u2014<\/div><div class=\"rl\">Cap Vrai (CV)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-green\" id=\"r3-cm\">\u2014<\/div><div class=\"rl\">Cap Magn\u00e9t. (CM)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-gold\"  id=\"r3-cc\">\u2014<\/div><div class=\"rl\">Cap Compas (CC)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-purple\" id=\"r3-derive\">\u2014<\/div><div class=\"rl\">D\u00e9rive (\u00b0)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-blue\"  id=\"r3-cap-vent\">\u2014<\/div><div class=\"rl\">Cap pour CV<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r3-gs\">\u2014<\/div><div class=\"rl\">Vitesse sol (kt)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-green\" id=\"r3-ve\">\u2014<\/div><div class=\"rl\">Vent effectif<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-red\"   id=\"r3-vt\">\u2014<\/div><div class=\"rl\">Vent traversier<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r3-derive-max\">\u2014<\/div><div class=\"rl\">D\u00e9rive max<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r3-ete\">\u2014<\/div><div class=\"rl\">Temps estim\u00e9<\/div><\/div>\n          <\/div>\n          <div style=\"margin-top:1rem; background:var(--bg2); border-radius:6px; padding:0.75rem 1rem; font-size:0.78rem; color:var(--text2); line-height:2;\">\n            <strong style=\"color:var(--text); display:block; margin-bottom:0.25rem;\">\ud83d\udcd0 D\u00e9tail des calculs (Route 3)<\/strong>\n            <span id=\"r3-detail\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <!-- Route 4 -->\n    <div class=\"route-block\" id=\"route-block-4\">\n      <div class=\"route-header\">\n        <span class=\"route-num\">Route 4<\/span>\n        <span class=\"route-name-display\" id=\"route-name-disp-4\">\u2014<\/span>\n      <\/div>\n      <div class=\"route-body\">\n        <div class=\"grid-3\">\n          <div class=\"field-group\">\n            <label>Nom \/ Destination<\/label>\n            <input type=\"text\" id=\"route-name-4\" placeholder=\"ex: LFRH\">\n          <\/div>\n          <div class=\"field-group\">\n            <label>Cap vrai (\u00b0V) <span class=\"info-icon\" data-tip=\"Route vraie mesur\u00e9e sur la carte a\u00e9ronautique, en degr\u00e9s vrais.\">i<\/span><\/label>\n            <input type=\"number\" id=\"route-cv-4\" placeholder=\"ex: 320\" min=\"0\" max=\"360\" step=\"1\">\n          <\/div>\n          <div class=\"field-group\">\n            <label>Distance (NM)<\/label>\n            <input type=\"number\" id=\"route-dist-4\" placeholder=\"ex: 80\" min=\"0\" max=\"9999\" step=\"1\">\n          <\/div>\n        <\/div>\n        <div id=\"route-results-4\" style=\"display:none;\">\n          <div class=\"route-results\">\n            <div class=\"route-result-cell\"><div class=\"rv c-blue\"  id=\"r4-cv\">\u2014<\/div><div class=\"rl\">Cap Vrai (CV)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-green\" id=\"r4-cm\">\u2014<\/div><div class=\"rl\">Cap Magn\u00e9t. (CM)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-gold\"  id=\"r4-cc\">\u2014<\/div><div class=\"rl\">Cap Compas (CC)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-purple\" id=\"r4-derive\">\u2014<\/div><div class=\"rl\">D\u00e9rive (\u00b0)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-blue\"  id=\"r4-cap-vent\">\u2014<\/div><div class=\"rl\">Cap pour CV<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r4-gs\">\u2014<\/div><div class=\"rl\">Vitesse sol (kt)<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-green\" id=\"r4-ve\">\u2014<\/div><div class=\"rl\">Vent effectif<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv c-red\"   id=\"r4-vt\">\u2014<\/div><div class=\"rl\">Vent traversier<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r4-derive-max\">\u2014<\/div><div class=\"rl\">D\u00e9rive max<\/div><\/div>\n            <div class=\"route-result-cell\"><div class=\"rv\"         id=\"r4-ete\">\u2014<\/div><div class=\"rl\">Temps estim\u00e9<\/div><\/div>\n          <\/div>\n          <div style=\"margin-top:1rem; background:var(--bg2); border-radius:6px; padding:0.75rem 1rem; font-size:0.78rem; color:var(--text2); line-height:2;\">\n            <strong style=\"color:var(--text); display:block; margin-bottom:0.25rem;\">\ud83d\udcd0 D\u00e9tail des calculs (Route 4)<\/strong>\n            <span id=\"r4-detail\">\u2014<\/span>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- \u2550\u2550 L\u00c9GENDE FORMULES \u2550\u2550 -->\n  <div class=\"card\" style=\"margin-top:1.25rem;\">\n    <div class=\"section-title\">\ud83d\udcd6 Rappel des formules &amp; conventions<\/div>\n    <div class=\"grid-2\">\n      <div class=\"formula-box\">\n        <strong style=\"color:var(--text); font-family:'Segoe UI',sans-serif;\">Caps :<\/strong><br>\n        CM = CV \u2212 D<sub>mag<\/sub> <span>(D Ouest \u2192 CM &gt; CV)<\/span><br>\n        CC = CM \u2212 D\u00e9v <span>(d\u00e9viation de l&rsquo;instrument)<\/span><br>\n        <br>\n        <strong style=\"color:var(--text); font-family:'Segoe UI',sans-serif;\">Bretagne (D \u2248 \u22121\u00b0 \u00e0 \u22122\u00b0W) :<\/strong><br>\n        CM = CV + |D| <span>(on ajoute car Ouest)<\/span>\n      <\/div>\n      <div class=\"formula-box\">\n        <strong style=\"color:var(--text); font-family:'Segoe UI',sans-serif;\">Triangle des vitesses :<\/strong><br>\n        \u03b1 = (Dir_vent + 180\u00b0) \u2212 CV <span>(vent FROM \u2192 TO, puis angle\/route)<\/span><br>\n        Ve = W \u00d7 cos(\u03b1) <span>(vent effectif axial)<\/span><br>\n        Vt = W \u00d7 sin(\u03b1) <span>(vent traversier)<\/span><br>\n        D\u00e9rive = arcsin(Vt \/ TAS)<br>\n        GS = TAS \u00d7 cos(D\u00e9rive) + Ve\n      <\/div>\n    <\/div>\n  <\/div>\n\n<\/div><!-- \/.nav-calc-wrapper -->\n\n<script>\n(function() {\n\n  const toRad = d => d * Math.PI \/ 180;\n  const toDeg = r => r * 180 \/ Math.PI;\n  const norm360 = d => ((d % 360) + 360) % 360;\n  const $ = id => document.getElementById(id);\n  const num = id => parseFloat($(id).value) || 0;\n\n  function fmtHdg(d) {\n    return String(norm360(Math.round(d))).padStart(3, '0') + '\u00b0';\n  }\n  function fmtNum(v, dec=1) {\n    return isFinite(v) ? v.toFixed(dec) : '\u2014';\n  }\n\n  \/* \u2500\u2500 TAS depuis IAS \u2500\u2500 *\/\n  function calcTAS(ias, altFt, tempC) {\n    const tempISA = 15 - 1.98 * (altFt \/ 1000);\n    const pressRatio = Math.pow(1 - 0.0000226577 * altFt, 5.25588);\n    const tempRatio = (tempC + 273.15) \/ (tempISA + 273.15);\n    return ias \/ Math.sqrt(pressRatio \/ tempRatio);\n  }\n\n  \/* \u2500\u2500 Altitude densit\u00e9 \u2500\u2500 *\/\n  function densityAlt(altFt, tempC, qnh) {\n    const pressAlt = altFt + (1013.25 - qnh) * 30;        \/\/ 1 hPa = 30 ft (OACI)\n    const isaTemp  = 15 - 1.98 * (pressAlt \/ 1000);       \/\/ ISA \u00e0 l'alt pression\n    const da       = pressAlt + 120 * (tempC - isaTemp);   \/\/ DA = PA + 120\u00d7\u0394T\n    return { da: Math.round(da), pressAlt: Math.round(pressAlt) };\n  }\n\n  \/* \u2500\u2500 Calcul route \u2500\u2500 *\/\n  function calcRoute(cv, tas, windDir, windSpd, declination, deviation) {\n    \/\/ Convention a\u00e9ronautique : windDir = d'o\u00f9 vient le vent\n    const windTo       = windDir + 180;\n    const windAngleRad = toRad(windTo - cv);\n    const ve  = windSpd * Math.cos(windAngleRad);  \/\/ + = vent de dos\n    const vt  = windSpd * Math.sin(windAngleRad);  \/\/ + = vient de gauche \u2192 d\u00e9rive droite\n\n    const deriveRad  = Math.asin(Math.max(-1, Math.min(1, vt \/ tas)));\n    const derive     = toDeg(deriveRad);\n    const capPourCV  = cv - derive;\n    const gs         = tas * Math.cos(deriveRad) + ve;\n\n    \/\/ CM = capPourCV - d\u00e9clinaison alg\u00e9brique (D Ouest n\u00e9gatif \u2192 CM > capPourCV)\n    const cm = capPourCV - declination;\n    const cc = cm - deviation;\n\n    const deriveMax = toDeg(Math.asin(Math.min(1, windSpd \/ tas)));\n\n    return {\n      cv: norm360(cv), cm: norm360(cm), cc: norm360(cc),\n      capPourCV: norm360(capPourCV),\n      derive, deriveMax, ve, vt, gs\n    };\n  }\n\n  \/* \u2500\u2500 Calcul principal \u2500\u2500 *\/\n  window.calculateAll = function() {\n    let tas = num('tas');\n    const ias  = num('ias');\n    const alt  = num('altitude');\n    const temp = num('temp');\n    const qnh  = num('qnh');\n    const deviation = num('deviation');\n    const windDir   = num('wind-dir');\n    const windSpd   = num('wind-spd');\n\n    const declZone  = $('declination-zone').value;\n    const declination = declZone === 'custom' ? num('custom-decl') : parseFloat(declZone);\n\n    if (ias > 0) tas = calcTAS(ias, alt, temp);\n    if (tas <= 0) { alert('Veuillez saisir une TAS (ou IAS) valide.'); return; }\n\n    const { da } = densityAlt(alt, temp, qnh);\n    const rho    = Math.pow(1 - 0.0000226577 * da, 4.2561) * 100;\n\n    \/\/ R\u00e9sultats atmo\n    $('r-tas').textContent = tas.toFixed(1);\n    $('r-da').textContent  = da;\n    $('r-rho').textContent = rho.toFixed(1);\n    $('atmo-results').classList.add('visible');\n\n    \/\/ R\u00e9sultats globaux\n    $('disp-tas').textContent  = tas.toFixed(1);\n    $('disp-da2').textContent  = da;\n    $('disp-decl').textContent = (declination >= 0 ? '+' : '') + declination.toFixed(1);\n    $('disp-dev').textContent  = (deviation  >= 0 ? '+' : '') + deviation.toFixed(1);\n    const gr = $('global-results');\n    gr.style.display = 'block';\n    gr.classList.add('visible');\n\n    \/\/ Routes\n    for (let i = 1; i <= 4; i++) {\n      const cvRaw = parseFloat($('route-cv-' + i).value);\n      if (isNaN(cvRaw) || $('route-cv-' + i).value === '') {\n        $('route-results-' + i).style.display = 'none';\n        continue;\n      }\n      const dist      = parseFloat($('route-dist-' + i).value) || 0;\n      const routeName = $('route-name-' + i).value || ('Route ' + i);\n      $('route-name-disp-' + i).textContent = routeName;\n\n      const r = calcRoute(cvRaw, tas, windDir, windSpd, declination, deviation);\n\n      $('r' + i + '-cv').textContent        = fmtHdg(r.cv);\n      $('r' + i + '-cm').textContent        = fmtHdg(r.cm);\n      $('r' + i + '-cc').textContent        = fmtHdg(r.cc);\n      $('r' + i + '-derive').textContent    = (r.derive >= 0 ? '+' : '') + fmtNum(r.derive) + '\u00b0';\n      $('r' + i + '-cap-vent').textContent  = fmtHdg(r.capPourCV) + ' (CV corr.)';\n      $('r' + i + '-gs').textContent        = fmtNum(r.gs, 0) + ' kt';\n      $('r' + i + '-ve').textContent        = (r.ve >= 0 ? '+' : '') + fmtNum(r.ve, 0) + ' kt';\n      $('r' + i + '-vt').textContent        = (r.vt >= 0 ? '+' : '') + fmtNum(r.vt, 0) + ' kt';\n      $('r' + i + '-derive-max').textContent = fmtNum(r.deriveMax, 1) + '\u00b0';\n\n      if (dist > 0 && r.gs > 0) {\n        const eteMin = (dist \/ r.gs) * 60;\n        const h = Math.floor(eteMin \/ 60), m = Math.round(eteMin % 60);\n        $('r' + i + '-ete').textContent = (h > 0 ? h + 'h ' : '') + m + 'min';\n      } else {\n        $('r' + i + '-ete').textContent = '\u2014';\n      }\n\n      const dSide = r.derive > 0 ? 'droite' : 'gauche';\n      $('r' + i + '-detail').innerHTML =\n        `CV=${fmtHdg(r.cv)} \u2212 D\u00e9rive=${fmtNum(Math.abs(r.derive),1)}\u00b0 ${dSide} \u2192 Cap pour CV=${fmtHdg(r.capPourCV)}<br>` +\n        `CM = Cap pour CV (${fmtHdg(r.capPourCV)}) \u2212 d\u00e9cl. (${declination.toFixed(1)}\u00b0) = <strong>${fmtHdg(r.cm)}<\/strong><br>` +\n        `CC = CM (${fmtHdg(r.cm)}) \u2212 d\u00e9viation (${deviation >= 0 ? '+' : ''}${deviation.toFixed(1)}\u00b0) = <strong style=\"color:var(--gold)\">${fmtHdg(r.cc)}<\/strong>`;\n\n      $('route-results-' + i).style.display = 'block';\n    }\n\n    setTimeout(() => {\n      $('global-results').scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }, 100);\n  };\n\n  \/* \u2500\u2500 D\u00e9clinaison custom \u2500\u2500 *\/\n  $('declination-zone').addEventListener('change', function() {\n    $('custom-decl-group').style.display = this.value === 'custom' ? 'block' : 'none';\n  });\n\n  \/* \u2500\u2500 Preview nom route \u2500\u2500 *\/\n  for (let i = 1; i <= 4; i++) {\n    (function(idx) {\n      $('route-name-' + idx).addEventListener('input', function() {\n        $('route-name-disp-' + idx).textContent = this.value || '\u2014';\n      });\n    })(i);\n  }\n\n  \/* \u2500\u2500 Entr\u00e9e clavier \u2500\u2500 *\/\n  document.querySelectorAll('input').forEach(inp => {\n    inp.addEventListener('keypress', e => { if (e.key === 'Enter') window.calculateAll(); });\n  });\n\n})();\n<\/script>\n\n<\/body>\n<\/html>\n\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Usage p\u00e9dagogique \u2014 Toujours v\u00e9rifier les donn\u00e9es officielles Calculateur Navigation PPL &#8211; Bretagne \u2708 Calculateur Navigation PPL Bretagne \u00b7 France \u00b7 A\u00e9ronautique VFR Triangle des vitesses Cap vrai \u2192 magn\u00e9tique \u2192 compas D\u00e9clinaison magn\u00e9tique Bretagne Altitude densit\u00e9 \u2699 Param\u00e8tres atmosph\u00e9riques &amp; a\u00e9ronef Vitesse &amp; altitude Vitesse propre (TAS) i en n\u0153uds (kt) Altitude pression (ft) i pieds (ft) \u2014 pour<\/p>\n<p><a class=\"more-link\" href=\"https:\/\/acriv.org\/WP\/computer-acriv-2\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2954","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages\/2954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/comments?post=2954"}],"version-history":[{"count":4,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages\/2954\/revisions"}],"predecessor-version":[{"id":2959,"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/pages\/2954\/revisions\/2959"}],"wp:attachment":[{"href":"https:\/\/acriv.org\/WP\/wp-json\/wp\/v2\/media?parent=2954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}