{"id":49079,"date":"2026-03-04T07:56:55","date_gmt":"2026-03-04T07:56:55","guid":{"rendered":"https:\/\/site-veterinaire-vetaction.fr\/?p=49079"},"modified":"2026-03-04T07:56:56","modified_gmt":"2026-03-04T07:56:56","slug":"semi-en-1h50","status":"publish","type":"post","link":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/2026\/03\/04\/semi-en-1h50\/","title":{"rendered":"Semi en 1h50"},"content":{"rendered":"\n<p><\/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>Plan Semi-Marathon \u00b7 2h \u2192 1h50<\/title>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Bebas+Neue&#038;family=DM+Mono:ital,wght@0,300;0,400;1,300&#038;family=Playfair+Display:ital@1&#038;display=swap\" rel=\"stylesheet\">\n<style>\n  :root {\n    --ink: #0e0d0b;\n    --paper: #f5f0e8;\n    --accent: #c8401a;\n    --accent2: #1a6bc8;\n    --muted: #8a8070;\n    --line: #d4cfc5;\n    --green: #1a7c4a;\n  }\n\n  * { margin: 0; padding: 0; box-sizing: border-box; }\n\n  body {\n    background: var(--paper);\n    color: var(--ink);\n    font-family: 'DM Mono', monospace;\n    font-size: 13px;\n    line-height: 1.6;\n    min-height: 100vh;\n  }\n\n  \/* HEADER *\/\n  header {\n    border-bottom: 3px solid var(--ink);\n    padding: 40px 48px 28px;\n    display: grid;\n    grid-template-columns: 1fr auto;\n    align-items: end;\n    gap: 24px;\n  }\n\n  .header-left h1 {\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: clamp(52px, 8vw, 96px);\n    line-height: 0.9;\n    letter-spacing: 2px;\n    color: var(--ink);\n  }\n\n  .header-left h1 span {\n    color: var(--accent);\n  }\n\n  .header-subtitle {\n    font-family: 'Playfair Display', serif;\n    font-style: italic;\n    font-size: 16px;\n    color: var(--muted);\n    margin-top: 8px;\n    letter-spacing: 0.5px;\n  }\n\n  .header-right {\n    text-align: right;\n  }\n\n  .target-badge {\n    display: inline-block;\n    background: var(--ink);\n    color: var(--paper);\n    padding: 10px 18px;\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 28px;\n    letter-spacing: 2px;\n    margin-bottom: 6px;\n  }\n\n  .target-label {\n    color: var(--muted);\n    font-size: 11px;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n  }\n\n  \/* ALLURES REFERENCE *\/\n  .allures-bar {\n    background: var(--ink);\n    color: var(--paper);\n    padding: 14px 48px;\n    display: flex;\n    gap: 40px;\n    flex-wrap: wrap;\n    align-items: center;\n  }\n\n  .allures-bar .label {\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 14px;\n    letter-spacing: 2px;\n    color: var(--muted);\n    margin-right: 8px;\n  }\n\n  .allure-item {\n    display: flex;\n    align-items: center;\n    gap: 10px;\n  }\n\n  .allure-dot {\n    width: 8px; height: 8px;\n    border-radius: 50%;\n    flex-shrink: 0;\n  }\n\n  .allure-item span { font-size: 12px; }\n  .allure-item strong { font-size: 13px; }\n\n  \/* MAIN GRID *\/\n  main {\n    padding: 0 48px 60px;\n  }\n\n  \/* INTRO *\/\n  .intro {\n    display: grid;\n    grid-template-columns: 1fr 1fr 1fr;\n    border-bottom: 1px solid var(--line);\n    margin-bottom: 0;\n  }\n\n  .intro-box {\n    padding: 24px 28px;\n    border-right: 1px solid var(--line);\n  }\n  .intro-box:last-child { border-right: none; }\n\n  .intro-box .num {\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 48px;\n    line-height: 1;\n    color: var(--accent);\n  }\n\n  .intro-box .desc {\n    color: var(--muted);\n    font-size: 11px;\n    letter-spacing: 1.5px;\n    text-transform: uppercase;\n    margin-top: 4px;\n  }\n\n  .intro-box .detail {\n    margin-top: 10px;\n    font-size: 12px;\n    line-height: 1.8;\n  }\n\n  \/* WEEKS *\/\n  .weeks-container {\n    margin-top: 0;\n  }\n\n  .phase-header {\n    display: flex;\n    align-items: center;\n    gap: 16px;\n    padding: 20px 0 12px;\n    border-top: 2px solid var(--ink);\n    margin-top: 32px;\n  }\n\n  .phase-header:first-child { margin-top: 0; border-top: none; padding-top: 28px; }\n\n  .phase-tag {\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 11px;\n    letter-spacing: 3px;\n    background: var(--accent);\n    color: white;\n    padding: 3px 10px;\n  }\n\n  .phase-tag.bleu { background: var(--accent2); }\n  .phase-tag.vert { background: var(--green); }\n\n  .phase-title {\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 22px;\n    letter-spacing: 1px;\n  }\n\n  .phase-desc {\n    margin-left: auto;\n    color: var(--muted);\n    font-size: 11px;\n    font-style: italic;\n    font-family: 'Playfair Display', serif;\n  }\n\n  \/* WEEK CARD *\/\n  .week-card {\n    border: 1px solid var(--line);\n    margin-bottom: 12px;\n    transition: all 0.2s ease;\n    cursor: pointer;\n  }\n\n  .week-card:hover { border-color: var(--accent); }\n  .week-card.active { border-color: var(--accent); }\n\n  .week-header {\n    display: grid;\n    grid-template-columns: 80px 1fr auto auto auto;\n    align-items: center;\n    gap: 20px;\n    padding: 14px 20px;\n    user-select: none;\n  }\n\n  .week-num {\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 36px;\n    line-height: 1;\n    color: var(--line);\n  }\n\n  .week-card.active .week-num,\n  .week-card:hover .week-num { color: var(--accent); }\n\n  .week-summary {\n    font-size: 12px;\n    color: var(--muted);\n  }\n\n  .week-summary strong {\n    display: block;\n    font-size: 13px;\n    color: var(--ink);\n    font-weight: 400;\n    margin-bottom: 2px;\n  }\n\n  .week-km {\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 28px;\n    color: var(--ink);\n    white-space: nowrap;\n  }\n\n  .week-km span {\n    font-family: 'DM Mono', monospace;\n    font-size: 11px;\n    color: var(--muted);\n  }\n\n  .week-badge {\n    font-size: 10px;\n    letter-spacing: 1.5px;\n    text-transform: uppercase;\n    padding: 3px 8px;\n    border: 1px solid currentColor;\n    white-space: nowrap;\n  }\n\n  .badge-repos { color: var(--green); }\n  .badge-cle { color: var(--accent); border-color: var(--accent); }\n\n  .week-toggle {\n    font-size: 18px;\n    color: var(--muted);\n    transition: transform 0.2s;\n    width: 20px;\n    text-align: center;\n  }\n\n  .week-card.active .week-toggle { transform: rotate(180deg); color: var(--accent); }\n\n  \/* SESSIONS *\/\n  .week-sessions {\n    display: none;\n    border-top: 1px solid var(--line);\n    padding: 0;\n  }\n\n  .week-card.active .week-sessions { display: block; }\n\n  .session-row {\n    display: grid;\n    grid-template-columns: 90px 110px 1fr auto;\n    align-items: center;\n    gap: 16px;\n    padding: 13px 20px;\n    border-bottom: 1px dashed var(--line);\n    transition: background 0.15s;\n  }\n\n  .session-row:last-child { border-bottom: none; }\n  .session-row:hover { background: rgba(200,64,26,0.03); }\n\n  .session-day {\n    font-size: 11px;\n    letter-spacing: 2px;\n    text-transform: uppercase;\n    color: var(--muted);\n  }\n\n  .session-type {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    font-size: 11px;\n    letter-spacing: 1px;\n    text-transform: uppercase;\n    font-weight: 400;\n  }\n\n  .type-dot {\n    width: 6px; height: 6px;\n    border-radius: 50%;\n    flex-shrink: 0;\n  }\n\n  .session-desc {\n    font-size: 12px;\n    line-height: 1.5;\n  }\n\n  .session-desc em {\n    color: var(--muted);\n    font-style: normal;\n    font-size: 11px;\n  }\n\n  .session-volume {\n    text-align: right;\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 20px;\n    white-space: nowrap;\n    color: var(--ink);\n  }\n\n  .session-volume span {\n    font-family: 'DM Mono', monospace;\n    font-size: 10px;\n    color: var(--muted);\n  }\n\n  .session-rest {\n    grid-column: 1 \/ -1;\n    text-align: center;\n    color: var(--muted);\n    font-size: 12px;\n    font-family: 'Playfair Display', serif;\n    font-style: italic;\n    padding: 10px 0;\n  }\n\n  \/* L\u00c9GENDE ALLURES *\/\n  .legend {\n    margin-top: 40px;\n    border-top: 2px solid var(--ink);\n    padding-top: 24px;\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n    gap: 16px;\n  }\n\n  .legend-item {\n    display: flex;\n    gap: 12px;\n    align-items: flex-start;\n  }\n\n  .legend-color {\n    width: 12px; height: 12px;\n    border-radius: 50%;\n    margin-top: 3px;\n    flex-shrink: 0;\n  }\n\n  .legend-title {\n    font-size: 11px;\n    letter-spacing: 1.5px;\n    text-transform: uppercase;\n    margin-bottom: 2px;\n  }\n\n  .legend-desc {\n    color: var(--muted);\n    font-size: 11px;\n    line-height: 1.6;\n  }\n\n  \/* Progress bar *\/\n  .progress-section {\n    padding: 20px 48px;\n    background: var(--ink);\n    color: var(--paper);\n    display: flex;\n    gap: 40px;\n    align-items: center;\n    flex-wrap: wrap;\n  }\n\n  .progress-label {\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 14px;\n    letter-spacing: 3px;\n    color: var(--muted);\n  }\n\n  .progress-track {\n    flex: 1;\n    min-width: 200px;\n    height: 4px;\n    background: rgba(255,255,255,0.1);\n    position: relative;\n  }\n\n  .progress-fill {\n    height: 100%;\n    background: var(--accent);\n    width: 0%;\n    transition: width 0.8s ease;\n  }\n\n  .progress-weeks {\n    display: flex;\n    gap: 0;\n    flex: 1;\n    min-width: 200px;\n  }\n\n  .prog-week {\n    flex: 1;\n    height: 4px;\n    background: rgba(255,255,255,0.1);\n    margin-right: 2px;\n    cursor: pointer;\n    transition: background 0.2s;\n  }\n\n  .prog-week.done { background: var(--accent); }\n  .prog-week:hover { background: rgba(200,64,26,0.7); }\n\n  .prog-week-label {\n    font-family: 'Bebas Neue', sans-serif;\n    font-size: 11px;\n    letter-spacing: 1px;\n    color: var(--muted);\n  }\n\n  \/* FOOTER *\/\n  footer {\n    border-top: 1px solid var(--line);\n    padding: 20px 48px;\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    color: var(--muted);\n    font-size: 11px;\n    letter-spacing: 1px;\n  }\n\n  .footer-note {\n    font-family: 'Playfair Display', serif;\n    font-style: italic;\n    font-size: 12px;\n  }\n\n  \/* Checkbox sessions *\/\n  .session-check {\n    width: 16px; height: 16px;\n    border: 1px solid var(--line);\n    border-radius: 2px;\n    cursor: pointer;\n    flex-shrink: 0;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    font-size: 10px;\n    color: transparent;\n    transition: all 0.15s;\n    margin-left: auto;\n  }\n\n  .session-check.checked {\n    background: var(--green);\n    border-color: var(--green);\n    color: white;\n  }\n\n  \/* Allure colors *\/\n  .col-footing { background: #6b9fd4; }\n  .col-tempo { background: var(--accent2); }\n  .col-seuil { background: var(--accent); }\n  .col-fractione { background: #9b2ca8; }\n  .col-sp { background: #c87f1a; }\n  .col-rest { background: var(--line); }\n  .col-sortie { background: var(--green); }\n\n  @media (max-width: 700px) {\n    header, main, .allures-bar, .progress-section, footer { padding-left: 20px; padding-right: 20px; }\n    .intro { grid-template-columns: 1fr; }\n    .intro-box { border-right: none; border-bottom: 1px solid var(--line); }\n    .session-row { grid-template-columns: 80px 1fr; }\n    .session-volume { display: none; }\n    .week-header { grid-template-columns: 60px 1fr auto; }\n    .week-km, .week-badge { display: none; }\n  }\n<\/style>\n<\/head>\n<body>\n\n<header>\n  <div class=\"header-left\">\n    <h1>SEMI<br><span>MARATHON<\/span><\/h1>\n    <p class=\"header-subtitle\">Programme d&rsquo;entra\u00eenement \u00b7 8 semaines<\/p>\n  <\/div>\n  <div class=\"header-right\">\n    <div class=\"target-badge\">1h50&rsquo;00\u00a0\u00bb<\/div>\n    <div class=\"target-label\">Objectif \u00b7 5&rsquo;13&Prime;\/km<\/div>\n  <\/div>\n<\/header>\n\n<div class=\"allures-bar\">\n  <span class=\"label\">ALLURES :<\/span>\n  <div class=\"allure-item\"><div class=\"allure-dot col-footing\"><\/div><span>Footing&nbsp;&nbsp;<strong>5&rsquo;45\u20136&rsquo;15&Prime;\/km<\/strong><\/span><\/div>\n  <div class=\"allure-item\"><div class=\"allure-dot col-sortie\"><\/div><span>Sortie longue&nbsp;&nbsp;<strong>5&rsquo;50\u20136&rsquo;20&Prime;\/km<\/strong><\/span><\/div>\n  <div class=\"allure-item\"><div class=\"allure-dot col-tempo\"><\/div><span>Tempo&nbsp;&nbsp;<strong>5&rsquo;20\u20135&rsquo;30&Prime;\/km<\/strong><\/span><\/div>\n  <div class=\"allure-item\"><div class=\"allure-dot col-seuil\"><\/div><span>Seuil&nbsp;&nbsp;<strong>5&rsquo;00\u20135&rsquo;10&Prime;\/km<\/strong><\/span><\/div>\n  <div class=\"allure-item\"><div class=\"allure-dot col-fractione\"><\/div><span>Fractionn\u00e9&nbsp;&nbsp;<strong>4&rsquo;45\u20135&rsquo;00&Prime;\/km<\/strong><\/span><\/div>\n  <div class=\"allure-item\"><div class=\"allure-dot col-sp\"><\/div><span>Sp\u00e9cifique&nbsp;&nbsp;<strong>5&rsquo;13&Prime;\/km<\/strong><\/span><\/div>\n<\/div>\n\n<div class=\"intro\">\n  <div class=\"intro-box\">\n    <div class=\"num\">4<\/div>\n    <div class=\"desc\">S\u00e9ances \/ semaine<\/div>\n    <div class=\"detail\">3 s\u00e9ances qualit\u00e9 + 1 sortie longue. Repos actifs conseill\u00e9s les autres jours (marche, v\u00e9lo, natation).<\/div>\n  <\/div>\n  <div class=\"intro-box\">\n    <div class=\"num\">\u201310&prime;<\/div>\n    <div class=\"desc\">Gain vis\u00e9<\/div>\n    <div class=\"detail\">Passer de 2h00 \u00e0 1h50 = gagner 28 sec\/km. Un objectif atteignable avec rigueur sur 8 semaines.<\/div>\n  <\/div>\n  <div class=\"intro-box\">\n    <div class=\"num\">~45km<\/div>\n    <div class=\"desc\">Volume cr\u00eate<\/div>\n    <div class=\"detail\">Volume progressif de 35km (S1) \u00e0 45km (S6), puis r\u00e9duction en semaine de r\u00e9cup\u00e9ration et aff\u00fbtage.<\/div>\n  <\/div>\n<\/div>\n\n<main>\n  <div class=\"weeks-container\" id=\"weeksContainer\"><\/div>\n\n  <div class=\"legend\">\n    <div class=\"legend-item\">\n      <div class=\"legend-color col-footing\"><\/div>\n      <div>\n        <div class=\"legend-title\">Footing r\u00e9cup\u00e9ration<\/div>\n        <div class=\"legend-desc\">Allure tr\u00e8s confortable. Conversation possible. Base a\u00e9robie.<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"legend-item\">\n      <div class=\"legend-color col-sortie\"><\/div>\n      <div>\n        <div class=\"legend-title\">Sortie longue<\/div>\n        <div class=\"legend-desc\">Endurance fondamentale. Cl\u00e9 de la pr\u00e9paration. Terminer frais.<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"legend-item\">\n      <div class=\"legend-color col-tempo\"><\/div>\n      <div>\n        <div class=\"legend-title\">Tempo \/ Allure marathon<\/div>\n        <div class=\"legend-desc\">Effort soutenu mais contr\u00f4l\u00e9. D\u00e9veloppe le confort \u00e0 l&rsquo;allure cible.<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"legend-item\">\n      <div class=\"legend-color col-seuil\"><\/div>\n      <div>\n        <div class=\"legend-title\">Seuil lactique<\/div>\n        <div class=\"legend-desc\">Effort difficile, soutenable ~30\u201340 min. Repousse la \u00ab\u00a0barri\u00e8re\u00a0\u00bb.<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"legend-item\">\n      <div class=\"legend-color col-fractione\"><\/div>\n      <div>\n        <div class=\"legend-title\">Fractionn\u00e9 \/ VMA<\/div>\n        <div class=\"legend-desc\">Intervalles courts et intenses. D\u00e9veloppe la puissance et la vitesse.<\/div>\n      <\/div>\n    <\/div>\n    <div class=\"legend-item\">\n      <div class=\"legend-color col-sp\"><\/div>\n      <div>\n        <div class=\"legend-title\">Allure sp\u00e9cifique<\/div>\n        <div class=\"legend-desc\">Exactement 5&rsquo;13&Prime;\/km. Pr\u00e9pare le corps et l&rsquo;esprit \u00e0 la course.<\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/main>\n\n<footer>\n  <div class=\"footer-note\">\u00c9coute ton corps \u00b7 Adapte si n\u00e9cessaire \u00b7 La r\u00e9cup\u00e9ration est l&rsquo;entra\u00eenement<\/div>\n  <div>SEMI-MARATHON \u00b7 21,097 km<\/div>\n<\/footer>\n\n<script>\nconst weeks = [\n  {\n    num: 1, phase: \"BASE\", km: 35, badge: null,\n    title: \"Mise en route\",\n    desc: \"Retrouver les sensations, construire la base\",\n    sessions: [\n      { day: \"Mardi\", type: \"footing\", label: \"Footing\", desc: \"30 min facile, warm-up progressif\", km: 6 },\n      { day: \"Mercredi\", type: \"tempo\", label: \"Tempo\", desc: \"15 min \u00e9chauffement \u00b7 20 min \u00e0 5'25\\\"\/km \u00b7 10 min retour\", km: 9 },\n      { day: \"Jeudi\", type: \"fractione\", label: \"Fractionn\u00e9\", desc: \"15 min \u00e9chauffement \u00b7 6 \u00d7 3 min \u00e0 4'55\\\"\/km (r\u00e9cup 2 min) \u00b7 10 min retour\", km: 10 },\n      { day: \"Dimanche\", type: \"sortie\", label: \"Sortie longue\", desc: \"1h15 \u00e0 6'00\\\"\/km \u2014 terrain plat de pr\u00e9f\u00e9rence\", km: 13 },\n    ]\n  },\n  {\n    num: 2, phase: \"BASE\", km: 38, badge: null,\n    title: \"Construction\",\n    desc: \"Augmentation du volume, seuil introduit\",\n    sessions: [\n      { day: \"Mardi\", type: \"footing\", label: \"Footing\", desc: \"35 min facile\", km: 6 },\n      { day: \"Mercredi\", type: \"seuil\", label: \"Seuil\", desc: \"15 min \u00e9chauffement \u00b7 2 \u00d7 12 min au seuil (5'05\\\"\/km) \u2014 r\u00e9cup 3 min \u00b7 10 min retour\", km: 10 },\n      { day: \"Jeudi\", type: \"fractione\", label: \"Fractionn\u00e9\", desc: \"15 min \u00e9chauffement \u00b7 8 \u00d7 2 min \u00e0 4'50\\\"\/km (r\u00e9cup 1'30) \u00b7 10 min retour\", km: 10 },\n      { day: \"Dimanche\", type: \"sortie\", label: \"Sortie longue\", desc: \"1h25 \u00e0 5'55\\\"\/km\", km: 14 },\n    ]\n  },\n  {\n    num: 3, phase: \"D\u00c9VELOPPEMENT\", km: 42, badge: null,\n    title: \"Intensification\",\n    desc: \"Premier bloc de charge \u2014 qualit\u00e9 maximale\",\n    sessions: [\n      { day: \"Mardi\", type: \"footing\", label: \"Footing\", desc: \"40 min easy, strides \u00d7 6 en fin de s\u00e9ance\", km: 8 },\n      { day: \"Mercredi\", type: \"seuil\", label: \"Seuil\", desc: \"15 min \u00e9chauffement \u00b7 3 \u00d7 10 min au seuil (5'05\\\"\/km) \u2014 r\u00e9cup 2'30 \u00b7 10 min retour\", km: 12 },\n      { day: \"Jeudi\", type: \"fractione\", label: \"Fractionn\u00e9\", desc: \"15 min \u00e9chauffement \u00b7 5 \u00d7 4 min \u00e0 4'50\\\"\/km (r\u00e9cup 2 min) \u00b7 10 min retour\", km: 11 },\n      { day: \"Dimanche\", type: \"sortie\", label: \"Sortie longue\", desc: \"1h35 \u00e0 5'50\\\"\/km \u2014 inclure 20 min \u00e0 allure cible (5'13\\\"\/km) en fin\", km: 16 },\n    ]\n  },\n  {\n    num: 4, phase: \"R\u00c9CUP\u00c9RATION\", km: 30, badge: \"repos\",\n    title: \"Semaine de r\u00e9cup\u00e9ration\",\n    desc: \"Assimilation des charges \u2014 volume r\u00e9duit, intensit\u00e9 maintenue\",\n    sessions: [\n      { day: \"Mardi\", type: \"footing\", label: \"Footing\", desc: \"25 min tr\u00e8s facile\", km: 5 },\n      { day: \"Mercredi\", type: \"tempo\", label: \"Tempo\", desc: \"12 min \u00e9chauffement \u00b7 15 min \u00e0 5'20\\\"\/km \u00b7 8 min retour\", km: 7 },\n      { day: \"Jeudi\", type: \"fractione\", label: \"Fractionn\u00e9\", desc: \"12 min \u00e9chauffement \u00b7 5 \u00d7 2 min \u00e0 4'55\\\"\/km (r\u00e9cup 2 min) \u00b7 10 min retour\", km: 8 },\n      { day: \"Dimanche\", type: \"sortie\", label: \"Sortie longue\", desc: \"1h00 \u00e0 6'10\\\"\/km \u2014 pas de pression\", km: 10 },\n    ]\n  },\n  {\n    num: 5, phase: \"D\u00c9VELOPPEMENT\", km: 44, badge: null,\n    title: \"Bloc sp\u00e9cifique I\",\n    desc: \"L'allure cible devient centrale dans l'entra\u00eenement\",\n    sessions: [\n      { day: \"Mardi\", type: \"footing\", label: \"Footing\", desc: \"40 min easy\", km: 7 },\n      { day: \"Mercredi\", type: \"sp\", label: \"Sp\u00e9cifique\", desc: \"15 min \u00e9chauffement \u00b7 3 \u00d7 15 min \u00e0 5'13\\\"\/km (r\u00e9cup 3 min) \u00b7 10 min retour\", km: 13 },\n      { day: \"Jeudi\", type: \"fractione\", label: \"Fractionn\u00e9\", desc: \"15 min \u00e9chauffement \u00b7 6 \u00d7 3 min \u00e0 4'45\\\"\/km (r\u00e9cup 2 min) \u00b7 10 min retour\", km: 11 },\n      { day: \"Dimanche\", type: \"sortie\", label: \"Sortie longue\", desc: \"1h40 \u00e0 5'45\\\"\/km \u2014 inclure 30 min \u00e0 5'13\\\"\/km en milieu de sortie\", km: 17 },\n    ]\n  },\n  {\n    num: 6, phase: \"D\u00c9VELOPPEMENT\", km: 45, badge: \"cle\",\n    title: \"Bloc sp\u00e9cifique II \u2014 Semaine cl\u00e9\",\n    desc: \"Point culminant de l'entra\u00eenement. Tenue obligatoire !\",\n    sessions: [\n      { day: \"Mardi\", type: \"footing\", label: \"Footing\", desc: \"35 min easy + \u00e9tirements\", km: 6 },\n      { day: \"Mercredi\", type: \"seuil\", label: \"Seuil\", desc: \"15 min \u00e9chauffement \u00b7 2 \u00d7 20 min au seuil (5'00\u20135'05\\\"\/km) \u2014 r\u00e9cup 4 min \u00b7 10 min retour\", km: 14 },\n      { day: \"Jeudi\", type: \"sp\", label: \"Sp\u00e9cifique\", desc: \"15 min \u00e9chauffement \u00b7 4 \u00d7 12 min \u00e0 5'13\\\"\/km (r\u00e9cup 2 min) \u00b7 8 min retour\", km: 13 },\n      { day: \"Dimanche\", type: \"sortie\", label: \"Sortie longue\", desc: \"1h45 \u2014 40 min footing + 40 min \u00e0 5'13\\\"\/km + 25 min footing\", km: 18 },\n    ]\n  },\n  {\n    num: 7, phase: \"AFF\u00dbTAGE\", km: 32, badge: null,\n    title: \"Aff\u00fbtage\",\n    desc: \"Fra\u00eecheur retrouv\u00e9e \u2014 entretenir les sensations\",\n    sessions: [\n      { day: \"Mardi\", type: \"footing\", label: \"Footing\", desc: \"25 min very easy\", km: 5 },\n      { day: \"Mercredi\", type: \"sp\", label: \"Sp\u00e9cifique\", desc: \"10 min \u00e9chauffement \u00b7 2 \u00d7 15 min \u00e0 5'13\\\"\/km (r\u00e9cup 3 min) \u00b7 7 min retour\", km: 10 },\n      { day: \"Jeudi\", type: \"fractione\", label: \"Fractionn\u00e9\", desc: \"10 min \u00e9chauffement \u00b7 4 \u00d7 2 min \u00e0 4'45\\\"\/km (r\u00e9cup 2 min) \u00b7 8 min retour\", km: 8 },\n      { day: \"Dimanche\", type: \"sortie\", label: \"Sortie longue\", desc: \"1h05 \u00e0 5'50\\\"\/km \u2014 20 min inclus \u00e0 5'13\\\"\/km\", km: 11 },\n    ]\n  },\n  {\n    num: 8, phase: \"COURSE\", km: 28, badge: null,\n    title: \"Semaine de course\",\n    desc: \"Repos, l\u00e9g\u00e8ret\u00e9, confiance \u2014 le travail est fait\",\n    sessions: [\n      { day: \"Mardi\", type: \"footing\", label: \"Footing\", desc: \"20 min tr\u00e8s facile\", km: 4 },\n      { day: \"Mercredi\", type: \"sp\", label: \"Sp\u00e9cifique\", desc: \"10 min \u00e9chauffement \u00b7 10 min \u00e0 5'13\\\"\/km \u00b7 5 min footing\", km: 5 },\n      { day: \"Jeudi\", type: \"footing\", label: \"Footing\", desc: \"15 min tr\u00e8s l\u00e9ger + 4 strides \u00b7 Pr\u00e9parer son mat\u00e9riel\", km: 3 },\n      { day: \"Samedi\", type: \"rest\", label: \"Repos\", desc: \"Repos complet. Hydratation, nutrition, sommeil.\", km: 0 },\n      { day: \"Dimanche\", type: \"sp\", label: \"RACE DAY\", desc: \"\ud83c\udfc3 SEMI-MARATHON \u00b7 Objectif : 1h50'00\\\" \u00b7 Allure : 5'13\\\"\/km \u00b7 BONNE CHANCE !\", km: 21 },\n    ]\n  }\n];\n\nconst phases = {\n  \"BASE\": { tag: \"\", class: \"\" },\n  \"D\u00c9VELOPPEMENT\": { tag: \"bleu\", class: \"bleu\" },\n  \"R\u00c9CUP\u00c9RATION\": { tag: \"vert\", class: \"vert\" },\n  \"AFF\u00dbTAGE\": { tag: \"vert\", class: \"vert\" },\n  \"COURSE\": { tag: \"\", class: \"\" }\n};\n\nconst typeColors = {\n  footing: \"col-footing\",\n  tempo: \"col-tempo\",\n  seuil: \"col-seuil\",\n  fractione: \"col-fractione\",\n  sp: \"col-sp\",\n  sortie: \"col-sortie\",\n  rest: \"col-rest\"\n};\n\nconst typeLabels = {\n  footing: \"Footing\",\n  tempo: \"Tempo\",\n  seuil: \"Seuil\",\n  fractione: \"Fractionn\u00e9\",\n  sp: \"Sp\u00e9cifique\",\n  sortie: \"Sortie longue\",\n  rest: \"Repos\"\n};\n\nlet phaseShown = {};\nlet checked = {};\n\nfunction render() {\n  const container = document.getElementById('weeksContainer');\n  let html = '';\n  let lastPhase = '';\n\n  weeks.forEach((week, wi) => {\n    if (week.phase !== lastPhase) {\n      const p = phases[week.phase] || {};\n      html += `\n        <div class=\"phase-header\">\n          <div class=\"phase-tag ${p.class}\">${week.phase}<\/div>\n          <div class=\"phase-title\">${getPhaseFull(week.phase)}<\/div>\n          <div class=\"phase-desc\">${getPhaseDesc(week.phase)}<\/div>\n        <\/div>`;\n      lastPhase = week.phase;\n    }\n\n    const open = checked[`open_${wi}`] ? 'active' : '';\n    html += `\n      <div class=\"week-card ${open}\" id=\"week${wi}\" onclick=\"toggleWeek(${wi})\">\n        <div class=\"week-header\">\n          <div class=\"week-num\">S${week.num}<\/div>\n          <div class=\"week-summary\">\n            <strong>${week.title}<\/strong>\n            ${week.desc}\n          <\/div>\n          <div class=\"week-km\">${week.km} <span>km<\/span><\/div>\n          ${week.badge === 'repos' ? '<div class=\"week-badge badge-repos\">\u2193 R\u00e9cup<\/div>' : week.badge === 'cle' ? '<div class=\"week-badge badge-cle\">\u2605 Cl\u00e9<\/div>' : '<div><\/div>'}\n          <div class=\"week-toggle\">\u25be<\/div>\n        <\/div>\n        <div class=\"week-sessions\">\n          ${week.sessions.map((s, si) => {\n            const key = `${wi}_${si}`;\n            const done = checked[key] ? 'checked' : '';\n            if (s.type === 'rest') {\n              return `<div class=\"session-row\">\n                <div class=\"session-rest\">\u2014 ${s.day} : ${s.desc} \u2014<\/div>\n              <\/div>`;\n            }\n            return `<div class=\"session-row\">\n              <div class=\"session-day\">${s.day}<\/div>\n              <div class=\"session-type\">\n                <div class=\"type-dot ${typeColors[s.type]}\"><\/div>\n                ${s.type === 'sp' && s.label === 'RACE DAY' ? '<strong>RACE DAY \ud83c\udfc1<\/strong>' : typeLabels[s.type]}\n              <\/div>\n              <div class=\"session-desc\">${s.desc}<\/div>\n              <div class=\"session-volume\">${s.km > 0 ? s.km + '<span> km<\/span>' : ''}<\/div>\n              <div class=\"session-check ${done}\" onclick=\"toggleCheck(event, '${key}')\">\u2713<\/div>\n            <\/div>`;\n          }).join('')}\n        <\/div>\n      <\/div>`;\n  });\n\n  container.innerHTML = html;\n}\n\nfunction getPhaseFull(p) {\n  const map = {\n    \"BASE\": \"Phase de base a\u00e9robie\",\n    \"D\u00c9VELOPPEMENT\": \"Phase de d\u00e9veloppement sp\u00e9cifique\",\n    \"R\u00c9CUP\u00c9RATION\": \"Semaine de r\u00e9cup\u00e9ration active\",\n    \"AFF\u00dbTAGE\": \"Phase d'aff\u00fbtage\",\n    \"COURSE\": \"Semaine de comp\u00e9tition\"\n  };\n  return map[p] || p;\n}\n\nfunction getPhaseDesc(p) {\n  const map = {\n    \"BASE\": \"Poser les fondations \u00b7 Semaines 1\u20132\",\n    \"D\u00c9VELOPPEMENT\": \"Charger et affiner \u00b7 Semaines 3, 5\u20136\",\n    \"R\u00c9CUP\u00c9RATION\": \"Laisser le corps s'adapter \u00b7 Semaine 4\",\n    \"AFF\u00dbTAGE\": \"Fra\u00eecheur et confiance \u00b7 Semaine 7\",\n    \"COURSE\": \"Le jour J \u00b7 Semaine 8\"\n  };\n  return map[p] || '';\n}\n\nfunction toggleWeek(wi) {\n  checked[`open_${wi}`] = !checked[`open_${wi}`];\n  render();\n}\n\nfunction toggleCheck(e, key) {\n  e.stopPropagation();\n  checked[key] = !checked[key];\n  const el = e.currentTarget;\n  el.classList.toggle('checked');\n}\n\nrender();\n\n\/\/ Open week 1 by default\nsetTimeout(() => {\n  checked['open_0'] = true;\n  render();\n}, 100);\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Plan Semi-Marathon \u00b7 2h \u2192 1h50 SEMIMARATHON Programme d&rsquo;entra\u00eenement \u00b7 8 semaines 1h50&rsquo;00\u00a0\u00bb Objectif \u00b7 5&rsquo;13&Prime;\/km ALLURES : Footing&nbsp;&nbsp;5&rsquo;45\u20136&rsquo;15&Prime;\/km Sortie longue&nbsp;&nbsp;5&rsquo;50\u20136&rsquo;20&Prime;\/km Tempo&nbsp;&nbsp;5&rsquo;20\u20135&rsquo;30&Prime;\/km Seuil&nbsp;&nbsp;5&rsquo;00\u20135&rsquo;10&Prime;\/km Fractionn\u00e9&nbsp;&nbsp;4&rsquo;45\u20135&rsquo;00&Prime;\/km Sp\u00e9cifique&nbsp;&nbsp;5&rsquo;13&Prime;\/km 4 S\u00e9ances \/ semaine 3 s\u00e9ances qualit\u00e9 + 1 sortie longue. Repos actifs conseill\u00e9s les autres jours (marche, v\u00e9lo, natation). \u201310&prime; Gain vis\u00e9 Passer de 2h00 \u00e0 1h50 = gagner &#8230; <a title=\"Semi en 1h50\" class=\"read-more\" href=\"https:\/\/site-veterinaire-vetaction.fr\/index.php\/2026\/03\/04\/semi-en-1h50\/\" aria-label=\"En savoir plus sur Semi en 1h50\">Lire plus<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-49079","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/posts\/49079","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/comments?post=49079"}],"version-history":[{"count":1,"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/posts\/49079\/revisions"}],"predecessor-version":[{"id":49080,"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/posts\/49079\/revisions\/49080"}],"wp:attachment":[{"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/media?parent=49079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/categories?post=49079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/site-veterinaire-vetaction.fr\/index.php\/wp-json\/wp\/v2\/tags?post=49079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}