{"id":226,"date":"2026-01-13T17:49:50","date_gmt":"2026-01-13T16:49:50","guid":{"rendered":"http:\/\/traveltennis.com\/?page_id=226"},"modified":"2026-01-20T12:41:32","modified_gmt":"2026-01-20T11:41:32","slug":"le-terrain-des-joueurs","status":"publish","type":"page","link":"http:\/\/traveltennis.com\/en\/le-terrain-des-joueurs\/","title":{"rendered":"3.1. Le terrain des joueurs"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"226\" class=\"elementor elementor-226\">\n\t\t\t\t<div class=\"elementor-element elementor-element-29303b7 e-flex e-con-boxed e-con e-parent\" data-id=\"29303b7\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f31099a elementor-widget elementor-widget-html\" data-id=\"f31099a\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<section id=\"terrain-joueurs\" style=\"max-width:1140px; margin:24px auto; padding:0 20px;\">\n\n  <!-- HERO -->\n  <div style=\"border-radius:18px; background:linear-gradient(135deg,#000 0%, #0E0E0E 50%, #000 100%); color:#fff; overflow:hidden;\">\n    <div style=\"padding:70px 22px;\">\n      <div style=\"display:flex; gap:24px; align-items:flex-start; flex-wrap:wrap;\">\n\n        <div style=\"flex:1; min-width:280px;\">\n          <div style=\"display:inline-block; padding:6px 12px; border-radius:999px; background:rgba(255,255,255,0.10); font-size:14px; margin-bottom:14px;\">\n            Espace priv\u00e9 \u2022 Objectifs \u2022 Suivi\n          <\/div>\n\n          <h1 style=\"margin:0 0 12px; font-size:44px; line-height:1.08; color:#E76F1D; text-shadow:0 0 22px rgba(231,111,29,0.45);\">\n            Le terrain des joueurs\n          <\/h1>\n\n          <p style=\"margin:0 0 18px; font-size:18px; line-height:1.7; opacity:0.92; max-width:720px;\">\n            Bienvenue dans ton espace personnel Travel Tennis. Ici tu retrouves tes <strong>objectifs<\/strong>,\n            ton <strong>suivi<\/strong> et les retours de ton coach. On avance \u00e9tape par \u00e9tape, avec une vision claire.\n          <\/p>\n\n          <div style=\"display:flex; gap:12px; flex-wrap:wrap;\">\n            <a href=\"#objectifs\" style=\"background:#1F5F3B; color:#fff; text-decoration:none; padding:12px 18px; border-radius:999px; font-weight:900; display:inline-block; box-shadow:0 10px 22px rgba(31,95,59,0.30);\">\n              Mes objectifs\n            <\/a>\n            <a href=\"#suivi\" style=\"border:2px solid #E76F1D; color:#fff; text-decoration:none; padding:10px 18px; border-radius:999px; font-weight:900; display:inline-block;\">\n              Mon suivi\n            <\/a>\n          <\/div>\n\n          <p style=\"margin:14px 0 0; font-size:13px; opacity:0.75;\">\n            Astuce : mets \u00e0 jour tes objectifs chaque semaine (5 minutes).\n          <\/p>\n        <\/div>\n\n        <div style=\"flex:1; min-width:280px;\">\n          <div style=\"background:rgba(255,255,255,0.06); border:1px solid rgba(255,255,255,0.10); border-radius:16px; padding:16px;\">\n            <div style=\"font-weight:900; margin-bottom:8px;\">Profil joueur<\/div>\n            <div style=\"display:grid; gap:8px; opacity:0.95;\">\n              <div>\ud83d\udc64 <strong>Nom :<\/strong> <span style=\"opacity:0.85;\">(auto \/ \u00e0 brancher)<\/span><\/div>\n              <div>\ud83c\udfbe <strong>Niveau :<\/strong> <span style=\"opacity:0.85;\">(auto \/ \u00e0 brancher)<\/span><\/div>\n              <div>\ud83d\udcc5 <strong>Saison :<\/strong> <span style=\"opacity:0.85;\">2026<\/span><\/div>\n              <div>\ud83e\udde0 <strong>Coach r\u00e9f\u00e9rent :<\/strong> <span style=\"opacity:0.85;\">(auto \/ \u00e0 brancher)<\/span><\/div>\n            <\/div>\n\n            <div style=\"margin-top:14px; padding:12px; border-radius:14px; background:rgba(0,0,0,0.30); border:1px solid rgba(255,255,255,0.10);\">\n              <div style=\"font-weight:900; color:#fff;\">Statut de l\u2019acc\u00e8s<\/div>\n              <div style=\"margin-top:6px; font-size:14px; opacity:0.9; line-height:1.6;\">\n                \u2705 <strong>Gratuit :<\/strong> objectifs + suivi basique<br>\n                \ud83d\udd12 <strong>Complet :<\/strong> bilans d\u00e9taill\u00e9s + historique + exports + modules avanc\u00e9s\n              <\/div>\n              <a href=\"\/en\/URL_PAGE_UPGRADE_PREMIUM\/\" style=\"display:inline-block; margin-top:10px; background:#E76F1D; color:#fff; text-decoration:none; padding:10px 14px; border-radius:999px; font-weight:900;\">\n                Passer en version compl\u00e8te\n              <\/a>\n            <\/div>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- DASHBOARD -->\n  <div style=\"margin-top:18px; display:grid; grid-template-columns: 1.25fr 0.75fr; gap:18px;\">\n\n    <!-- Colonne principale -->\n    <div style=\"display:grid; gap:18px;\">\n\n      <!-- OBJECTIFS -->\n      <section id=\"objectifs\" style=\"background:#fff; border:1px solid rgba(11,45,69,0.10); border-radius:18px; padding:22px; box-shadow:0 10px 22px rgba(0,0,0,0.06);\">\n        <h2 style=\"margin:0 0 10px; font-size:26px; color:#0B2D45;\">Mes objectifs<\/h2>\n        <p style=\"margin:0 0 14px; color:rgba(11,45,69,0.82); line-height:1.7;\">\n          D\u00e9finis un objectif principal, puis 2\u20133 objectifs hebdo. Ton coach valide et ajuste.\n        <\/p>\n\n        <div class=\"tt-goals-grid\">\n          <div class=\"tt-goal-card\">\n            <div class=\"tt-goal-top\">\n              <strong>Objectif saison<\/strong>\n              <span class=\"tt-pill tt-pill--green\">En cours<\/span>\n            <\/div>\n            <div class=\"tt-goal-text\">Ex : am\u00e9liorer mon ratio de points gagn\u00e9s sur 2\u00e8me balle.<\/div>\n            <div class=\"tt-goal-meta\">\u00c9ch\u00e9ance : \u2026<\/div>\n          <\/div>\n\n          <div class=\"tt-goal-card\">\n            <div class=\"tt-goal-top\">\n              <strong>Objectif du mois<\/strong>\n              <span class=\"tt-pill\">\u00c0 faire<\/span>\n            <\/div>\n            <div class=\"tt-goal-text\">Ex : stabiliser mon revers en diagonale sous pression.<\/div>\n            <div class=\"tt-goal-meta\">\u00c9ch\u00e9ance : \u2026<\/div>\n          <\/div>\n\n          <div class=\"tt-goal-card\">\n            <div class=\"tt-goal-top\">\n              <strong>Objectifs semaine<\/strong>\n              <span class=\"tt-pill tt-pill--orange\">Prioritaire<\/span>\n            <\/div>\n            <div class=\"tt-goal-text\">Ex : 3 s\u00e9ances service + 2 s\u00e9ances points \u201csch\u00e9ma 1\u201d.<\/div>\n            <div class=\"tt-goal-meta\">Semaine : \u2026<\/div>\n          <\/div>\n        <\/div>\n\n        <div style=\"display:flex; gap:10px; flex-wrap:wrap; margin-top:14px;\">\n          <a href=\"\/en\/URL_FORM_OBJECTIFS_JOUEUR\/\" class=\"tt-btn-green\">Mettre \u00e0 jour mes objectifs<\/a>\n          <a href=\"#premium\" class=\"tt-btn-outline\">Voir les options premium<\/a>\n        <\/div>\n\n        <div class=\"tt-note\" style=\"margin-top:10px;\">\n          (\u00c0 brancher plus tard) Ce bloc pourra afficher les objectifs r\u00e9els depuis l\u2019application.\n        <\/div>\n      <\/section>\n\n      <!-- SUIVI -->\n      <section id=\"suivi\" style=\"background:#fff; border:1px solid rgba(11,45,69,0.10); border-radius:18px; padding:22px; box-shadow:0 10px 22px rgba(0,0,0,0.06);\">\n        <h2 style=\"margin:0 0 10px; font-size:26px; color:#0B2D45;\">Mon suivi<\/h2>\n\n        <!-- =========================\n        NOTES DE MATCH (Joueur) \u2013 Travel Tennis\n        ========================= -->\n        <div id=\"ttMatchTracker\" style=\"margin-top:12px;\">\n\n          <!-- FORM MATCH -->\n          <div style=\"background:#F4F6F8; border:1px solid rgba(11,45,69,0.10); border-radius:18px; padding:18px;\">\n            <div style=\"display:flex; align-items:center; justify-content:space-between; gap:10px; flex-wrap:wrap;\">\n              <div>\n                <h3 style=\"margin:0; font-size:18px; color:#0B2D45;\">\ud83d\udcdd Notes de match<\/h3>\n                <p style=\"margin:6px 0 0; color:rgba(11,45,69,0.78); line-height:1.6; font-size:14px;\">\n                  Renseigne les infos du match et \u00e9value les objectifs (1 \u00e0 5). Tout est sauvegard\u00e9 automatiquement sur ce navigateur.\n                <\/p>\n              <\/div>\n              <div style=\"display:flex; gap:10px; flex-wrap:wrap;\">\n                <button id=\"ttMatchReset\" type=\"button\" class=\"tt-btn-outline\">R\u00e9initialiser le formulaire<\/button>\n                <button id=\"ttMatchExport\" type=\"button\" class=\"tt-btn-green\">Exporter (copier)<\/button>\n              <\/div>\n            <\/div>\n\n            <!-- Match meta -->\n            <div style=\"display:grid; grid-template-columns:repeat(12, 1fr); gap:12px; margin-top:14px;\">\n              <div style=\"grid-column:span 6;\">\n                <label style=\"font-weight:900; font-size:13px; color:#0B2D45;\">Tournoi<\/label>\n                <input id=\"ttTournoi\" type=\"text\" placeholder=\"Ex : Open de Cabourg\"\n                       style=\"width:100%; margin-top:6px; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\">\n              <\/div>\n              <div style=\"grid-column:span 3;\">\n                <label style=\"font-weight:900; font-size:13px; color:#0B2D45;\">Date<\/label>\n                <input id=\"ttDate\" type=\"date\"\n                       style=\"width:100%; margin-top:6px; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\">\n              <\/div>\n              <div style=\"grid-column:span 3;\">\n                <label style=\"font-weight:900; font-size:13px; color:#0B2D45;\">Score<\/label>\n                <input id=\"ttScore\" type=\"text\" placeholder=\"Ex : 6\/3 4\/6 10-7\"\n                       style=\"width:100%; margin-top:6px; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\">\n              <\/div>\n\n              <div style=\"grid-column:span 6;\">\n                <label style=\"font-weight:900; font-size:13px; color:#0B2D45;\">Adversaire<\/label>\n                <input id=\"ttAdversaire\" type=\"text\" placeholder=\"Nom \/ Pr\u00e9nom\"\n                       style=\"width:100%; margin-top:6px; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\">\n              <\/div>\n              <div style=\"grid-column:span 3;\">\n                <label style=\"font-weight:900; font-size:13px; color:#0B2D45;\">Classement adverse<\/label>\n                <input id=\"ttClassement\" type=\"text\" placeholder=\"Ex : 15\/2\"\n                       style=\"width:100%; margin-top:6px; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\">\n              <\/div>\n              <div style=\"grid-column:span 3;\">\n                <label style=\"font-weight:900; font-size:13px; color:#0B2D45;\">R\u00e9sultat<\/label>\n                <select id=\"ttResultat\"\n                        style=\"width:100%; margin-top:6px; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\">\n                  <option value=\"\">S\u00e9lectionner<\/option>\n                  <option value=\"Victoire\">Victoire<\/option>\n                  <option value=\"D\u00e9faite\">D\u00e9faite<\/option>\n                  <option value=\"Abandon\">Abandon<\/option>\n                <\/select>\n              <\/div>\n            <\/div>\n\n            <!-- Objectives -->\n            <div style=\"margin-top:14px; display:grid; gap:12px;\">\n              <div class=\"tt-obj-card\">\n                <div class=\"tt-obj-top\">\n                  <div style=\"font-weight:900; color:#0B2D45;\">Objectif 1<\/div>\n                  <div class=\"tt-rate\" data-tt-rate=\"obj1\"><\/div>\n                <\/div>\n                <div style=\"margin-top:6px; color:rgba(11,45,69,0.86); line-height:1.6; font-size:14px;\">\n                  Utilisation de la hanche au service + rythme correct\n                <\/div>\n                <textarea id=\"ttObj1Note\" rows=\"2\" placeholder=\"Retour sur l'objectif 1\u2026\"\n                  style=\"margin-top:10px; width:100%; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\"><\/textarea>\n              <\/div>\n\n              <div class=\"tt-obj-card\">\n                <div class=\"tt-obj-top\">\n                  <div style=\"font-weight:900; color:#0B2D45;\">Objectif 2<\/div>\n                  <div class=\"tt-rate\" data-tt-rate=\"obj2\"><\/div>\n                <\/div>\n                <div style=\"margin-top:6px; color:rgba(11,45,69,0.86); line-height:1.6; font-size:14px;\">\n                  Tenter des vol\u00e9es lift\u00e9es apr\u00e8s une attaque si une balle haute revient\n                <\/div>\n                <textarea id=\"ttObj2Note\" rows=\"2\" placeholder=\"Retour sur l'objectif 2\u2026\"\n                  style=\"margin-top:10px; width:100%; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\"><\/textarea>\n              <\/div>\n\n              <div class=\"tt-obj-card\">\n                <div class=\"tt-obj-top\">\n                  <div style=\"font-weight:900; color:#0B2D45;\">Objectif 3<\/div>\n                  <div class=\"tt-rate\" data-tt-rate=\"obj3\"><\/div>\n                <\/div>\n                <div style=\"margin-top:6px; color:rgba(11,45,69,0.86); line-height:1.6; font-size:14px;\">\n                  Utiliser ponctuellement le chop de revers en d\u00e9fense ou sur balle basse pour ralentir le jeu\n                <\/div>\n                <textarea id=\"ttObj3Note\" rows=\"2\" placeholder=\"Retour sur l'objectif 3\u2026\"\n                  style=\"margin-top:10px; width:100%; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\"><\/textarea>\n              <\/div>\n            <\/div>\n\n            <!-- Global comment -->\n            <div style=\"margin-top:12px;\">\n              <label style=\"font-weight:900; font-size:13px; color:#0B2D45;\">Commentaire global du match<\/label>\n              <textarea id=\"ttGlobalNote\" rows=\"4\" placeholder=\"R\u00e9sum\u00e9 : attitude, points cl\u00e9s, sch\u00e9mas, mental, axes de travail\u2026\"\n                style=\"margin-top:6px; width:100%; padding:12px; border-radius:12px; border:1px solid rgba(11,45,69,0.18); background:#fff;\"><\/textarea>\n            <\/div>\n\n            <div style=\"display:flex; gap:10px; flex-wrap:wrap; margin-top:12px; align-items:center; justify-content:space-between;\">\n              <div id=\"ttMatchHint\" style=\"font-size:13px; color:rgba(11,45,69,0.70);\">\n                Conseil : note simple et factuelle (ce que tu as fait + ce que tu feras au prochain match).\n              <\/div>\n              <button id=\"ttMatchSave\" type=\"button\" class=\"tt-btn-green\">Ajouter \u00e0 l\u2019historique<\/button>\n            <\/div>\n          <\/div>\n\n          <!-- HISTORY -->\n          <div style=\"margin-top:14px; background:#fff; border:1px solid rgba(11,45,69,0.10); border-radius:18px; padding:18px; box-shadow:0 10px 22px rgba(0,0,0,0.05);\">\n            <div style=\"display:flex; align-items:center; justify-content:space-between; gap:10px; flex-wrap:wrap;\">\n              <h3 style=\"margin:0; font-size:18px; color:#0B2D45;\">\ud83c\udfc6 Historique des matchs<\/h3>\n              <button id=\"ttMatchClear\" type=\"button\" class=\"tt-btn-outline\">Effacer l\u2019historique<\/button>\n            <\/div>\n\n            <div id=\"ttMatchList\" style=\"margin-top:12px; display:grid; gap:12px;\"><\/div>\n\n            <div class=\"tt-note\" style=\"margin-top:10px;\">\n              (Plus tard) On pourra synchroniser cet historique sur ton compte Travel Tennis et exporter en PDF.\n            <\/div>\n          <\/div>\n\n        <\/div>\n\n        <!-- Bloc existant (placeholder) -->\n        <div style=\"margin-top:16px;\" class=\"tt-note\">\n          (\u00c0 brancher plus tard) Les bilans et r\u00e9sultats seront aliment\u00e9s par le coach depuis \u201cLa tribune des coachs\u201d.\n        <\/div>\n      <\/section>\n\n      <!-- SWINGVISION -->\n      <section id=\"swingvision\" style=\"background:#F4F6F8; border:1px solid rgba(11,45,69,0.10); border-radius:18px; padding:22px;\">\n        <h2 style=\"margin:0 0 10px; font-size:26px; color:#0B2D45;\">SwingVision (\u00e0 venir)<\/h2>\n        <p style=\"margin:0; color:rgba(11,45,69,0.82); line-height:1.7;\">\n          Objectif : connecter tes analyses vid\u00e9o SwingVision (statistiques, s\u00e9quences cl\u00e9s) \u00e0 ton suivi.\n          Cette section pourra afficher : points gagn\u00e9s\/perdus, patterns, zones service, highlights.\n        <\/p>\n\n        <div style=\"display:flex; gap:10px; flex-wrap:wrap; margin-top:14px;\">\n          <a class=\"tt-btn-green\" href=\"\/en\/URL_SWINGVISION_CONNECT\/\" target=\"_blank\" rel=\"noopener\">Connecter mon compte (plus tard)<\/a>\n          <a class=\"tt-btn-outline\" href=\"#premium\">Voir la version compl\u00e8te<\/a>\n        <\/div>\n\n        <div class=\"tt-note\" style=\"margin-top:10px;\">\n          (Placeholder) L\u2019int\u00e9gration pourra \u00eatre faite via lien, embed, ou automatisation selon les possibilit\u00e9s SwingVision.\n        <\/div>\n      <\/section>\n\n    <\/div>\n\n    <!-- Colonne droite -->\n    <aside style=\"display:grid; gap:18px;\">\n\n      <div style=\"background:#F4F6F8; border:1px solid rgba(11,45,69,0.10); border-radius:18px; padding:22px;\">\n        <h3 style=\"margin:0 0 10px; font-size:18px; color:#0B2D45;\">Actions rapides<\/h3>\n        <div style=\"display:grid; gap:10px;\">\n          <a class=\"tt-btn-green\" href=\"\/en\/URL_FORM_MESSAGE_COACH\/\">Contacter mon coach<\/a>\n          <a class=\"tt-btn-outline\" href=\"\/en\/URL_PAGE_TOURNOIS\/\">Trouver un tournoi<\/a>\n          <a class=\"tt-btn-outline\" href=\"\/en\/URL_PAGE_STAGES\/\">Voir les stages<\/a>\n        <\/div>\n      <\/div>\n\n      <div id=\"premium\" style=\"background:#fff; border:1px solid rgba(11,45,69,0.10); border-radius:18px; padding:22px; box-shadow:0 10px 22px rgba(0,0,0,0.06);\">\n        <h3 style=\"margin:0 0 10px; font-size:18px; color:#0B2D45;\">Version compl\u00e8te (premium)<\/h3>\n        <ul style=\"margin:0; padding-left:18px; color:rgba(11,45,69,0.88); line-height:1.85;\">\n          <li>Bilans coach d\u00e9taill\u00e9s + historique<\/li>\n          <li>Suivi d\u2019objectifs par p\u00e9riodes<\/li>\n          <li>Exports (PDF) & synth\u00e8ses<\/li>\n          <li>Modules avanc\u00e9s : mental \/ service \/ sch\u00e9mas<\/li>\n          <li>Int\u00e9gration SwingVision (si possible)<\/li>\n        <\/ul>\n        <a href=\"\/en\/URL_PAGE_UPGRADE_PREMIUM\/\" style=\"display:inline-block; margin-top:12px; background:#E76F1D; color:#fff; text-decoration:none; padding:10px 14px; border-radius:999px; font-weight:900;\">\n          Activer la version compl\u00e8te\n        <\/a>\n        <div class=\"tt-note\" style=\"margin-top:10px;\">\n          Aucun prix affich\u00e9 ici. Tu peux g\u00e9rer \u00e7a sur une page d\u00e9di\u00e9e.\n        <\/div>\n      <\/div>\n\n    <\/aside>\n  <\/div>\n\n<\/section>\n\n<style>\n\/* Boutons *\/\n.tt-btn-green{\n  display:inline-block;\n  background:#1F5F3B;\n  color:#fff;\n  text-decoration:none;\n  padding:10px 14px;\n  border-radius:999px;\n  font-weight:900;\n  font-size:14px;\n  box-shadow:0 10px 22px rgba(31,95,59,0.18);\n}\n.tt-btn-outline{\n  display:inline-block;\n  border:2px solid #0B0B0B;\n  color:#0B0B0B;\n  text-decoration:none;\n  padding:8px 14px;\n  border-radius:999px;\n  font-weight:900;\n  font-size:14px;\n  background:#fff;\n}\n.tt-note{\n  font-size:12px;\n  color:rgba(11,45,69,0.65);\n  line-height:1.5;\n}\n\n\/* Goals *\/\n.tt-goals-grid{\n  display:grid;\n  grid-template-columns:repeat(3, minmax(0,1fr));\n  gap:12px;\n}\n.tt-goal-card{\n  background:#F8FAFC;\n  border:1px solid rgba(11,45,69,0.10);\n  border-radius:16px;\n  padding:14px;\n}\n.tt-goal-top{\n  display:flex;\n  justify-content:space-between;\n  align-items:center;\n  gap:10px;\n  margin-bottom:8px;\n  color:#0B2D45;\n}\n.tt-goal-text{\n  color:rgba(11,45,69,0.86);\n  line-height:1.6;\n  font-size:14px;\n}\n.tt-goal-meta{\n  margin-top:8px;\n  font-size:12px;\n  color:rgba(11,45,69,0.65);\n}\n.tt-pill{\n  display:inline-flex;\n  padding:6px 10px;\n  border-radius:999px;\n  background:rgba(11,45,69,0.08);\n  color:#0B2D45;\n  font-weight:900;\n  font-size:12px;\n}\n.tt-pill--green{ background:rgba(31,95,59,0.12); color:#1F5F3B; }\n.tt-pill--orange{ background:rgba(231,111,29,0.12); color:#E76F1D; }\n\n\/* Tracker *\/\n.tt-tracker-grid{\n  display:grid;\n  grid-template-columns:repeat(2, minmax(0,1fr));\n  gap:12px;\n}\n.tt-track-card{\n  background:#F8FAFC;\n  border:1px solid rgba(11,45,69,0.10);\n  border-radius:16px;\n  padding:14px;\n}\n.tt-track-text{ margin-top:8px; color:rgba(11,45,69,0.86); line-height:1.6; font-size:14px; }\n.tt-track-meta{ margin-top:8px; font-size:12px; color:rgba(11,45,69,0.65); }\n.tt-locked{ position:relative; background:#fff; }\n.tt-lock{\n  position:absolute;\n  top:10px; right:10px;\n  font-size:12px;\n  font-weight:900;\n  color:#E76F1D;\n  background:rgba(231,111,29,0.12);\n  padding:6px 10px;\n  border-radius:999px;\n}\n.tt-mini-link{\n  display:inline-block;\n  margin-top:10px;\n  font-weight:900;\n  color:#2563EB;\n  text-decoration:none;\n  font-size:13px;\n}\n\n\/* Notes de match *\/\n.tt-obj-card{\n  background:#fff;\n  border:1px solid rgba(11,45,69,0.10);\n  border-radius:16px;\n  padding:14px;\n}\n.tt-obj-top{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:10px;\n}\n\n\/* Rating 1\u20135 *\/\n.tt-rate{\n  display:flex;\n  gap:8px;\n  align-items:center;\n}\n.tt-rate input{ display:none; }\n.tt-rate label{\n  width:34px;\n  height:34px;\n  border-radius:10px;\n  border:1px solid rgba(11,45,69,0.18);\n  background:#fff;\n  cursor:pointer;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  font-weight:900;\n  color:#0B2D45;\n  user-select:none;\n}\n.tt-rate label:hover{\n  transform: translateY(-1px);\n}\n.tt-rate input:checked + label{\n  background: rgba(31,95,59,0.12);\n  border-color: rgba(31,95,59,0.35);\n  color:#1F5F3B;\n}\n\n\/* Cards historique *\/\n.tt-match-item{\n  border:1px solid rgba(11,45,69,0.10);\n  border-radius:16px;\n  padding:14px;\n  background:#F8FAFC;\n}\n.tt-match-head{\n  display:flex;\n  justify-content:space-between;\n  gap:10px;\n  flex-wrap:wrap;\n  align-items:flex-start;\n}\n.tt-match-title{\n  font-weight:900;\n  color:#0B2D45;\n}\n.tt-match-meta{\n  margin-top:6px;\n  color:rgba(11,45,69,0.78);\n  font-size:13px;\n  line-height:1.6;\n}\n.tt-mini-btn{\n  border:1px solid rgba(11,45,69,0.18);\n  background:#fff;\n  border-radius:999px;\n  padding:8px 10px;\n  cursor:pointer;\n  font-weight:900;\n  font-size:13px;\n  color:#0B2D45;\n}\n.tt-mini-btn:hover{\n  border-color: rgba(231,111,29,0.5);\n}\n\n\/* Responsive *\/\n@media (max-width: 980px){\n  #terrain-joueurs > div[style*=\"grid-template-columns: 1.25fr 0.75fr\"]{ grid-template-columns:1fr !important; }\n  .tt-goals-grid{ grid-template-columns:1fr !important; }\n  .tt-tracker-grid{ grid-template-columns:1fr !important; }\n}\n<\/style>\n\n<script>\n(function(){\n  const KEY = \"tt_match_history_v1\";\n\n  \/\/ --- DOM\n  const elTournoi = document.getElementById(\"ttTournoi\");\n  const elDate = document.getElementById(\"ttDate\");\n  const elAdversaire = document.getElementById(\"ttAdversaire\");\n  const elClassement = document.getElementById(\"ttClassement\");\n  const elScore = document.getElementById(\"ttScore\");\n  const elResultat = document.getElementById(\"ttResultat\");\n\n  const elObj1Note = document.getElementById(\"ttObj1Note\");\n  const elObj2Note = document.getElementById(\"ttObj2Note\");\n  const elObj3Note = document.getElementById(\"ttObj3Note\");\n  const elGlobalNote = document.getElementById(\"ttGlobalNote\");\n\n  const elSave = document.getElementById(\"ttMatchSave\");\n  const elReset = document.getElementById(\"ttMatchReset\");\n  const elClear = document.getElementById(\"ttMatchClear\");\n  const elExport = document.getElementById(\"ttMatchExport\");\n  const elList = document.getElementById(\"ttMatchList\");\n  const elHint = document.getElementById(\"ttMatchHint\");\n\n  \/\/ --- Ratings mount\n  function mountRating(container, name){\n    container.innerHTML = \"\";\n    for(let v=1; v<=5; v++){\n      const id = \"tt_\" + name + \"_\" + v;\n      const input = document.createElement(\"input\");\n      input.type = \"radio\";\n      input.name = name;\n      input.value = String(v);\n      input.id = id;\n\n      const label = document.createElement(\"label\");\n      label.setAttribute(\"for\", id);\n      label.textContent = String(v);\n\n      container.appendChild(input);\n      container.appendChild(label);\n    }\n  }\n  document.querySelectorAll(\".tt-rate\").forEach(el => {\n    mountRating(el, el.getAttribute(\"data-tt-rate\"));\n  });\n\n  function getRate(name){\n    const checked = document.querySelector('input[name=\"'+name+'\"]:checked');\n    return checked ? Number(checked.value) : null;\n  }\n  function setRate(name, val){\n    document.querySelectorAll('input[name=\"'+name+'\"]').forEach(i => {\n      i.checked = (Number(i.value) === Number(val));\n    });\n  }\n  function clearRates(){\n    [\"obj1\",\"obj2\",\"obj3\"].forEach(n => setRate(n, -1));\n    document.querySelectorAll('input[name=\"obj1\"],input[name=\"obj2\"],input[name=\"obj3\"]').forEach(i=> i.checked=false);\n  }\n\n  \/\/ --- Storage\n  function load(){\n    try{\n      return JSON.parse(localStorage.getItem(KEY) || \"[]\");\n    }catch(e){\n      return [];\n    }\n  }\n  function save(list){\n    localStorage.setItem(KEY, JSON.stringify(list));\n  }\n\n  function fmtDate(d){\n    if(!d) return \"\u2014\";\n    const parts = d.split(\"-\");\n    if(parts.length !== 3) return d;\n    const [y,m,dd] = parts;\n    return dd + \"\/\" + m + \"\/\" + y;\n  }\n\n  function sanitize(t){ return (t || \"\").toString().trim(); }\n\n  \/\/ --- Form reset\n  function resetForm(){\n    elTournoi.value = \"\";\n    elDate.value = \"\";\n    elAdversaire.value = \"\";\n    elClassement.value = \"\";\n    elScore.value = \"\";\n    elResultat.value = \"\";\n    elObj1Note.value = \"\";\n    elObj2Note.value = \"\";\n    elObj3Note.value = \"\";\n    elGlobalNote.value = \"\";\n    clearRates();\n    elHint.textContent = \"Formulaire pr\u00eat. Renseigne ton match \ud83d\ude42\";\n    elHint.style.color = \"rgba(11,45,69,0.70)\";\n  }\n\n  \/\/ --- Render list\n  function render(){\n    const list = load();\n    if(!list.length){\n      elList.innerHTML = \"<div class='tt-note'>Aucun match enregistr\u00e9 pour le moment.<\/div>\";\n      return;\n    }\n\n    elList.innerHTML = \"\";\n    list.slice().reverse().forEach((m) => {\n      const wrap = document.createElement(\"div\");\n      wrap.className = \"tt-match-item\";\n\n      const title = sanitize(m.tournoi) || \"Match\";\n      const metaLine =\n        \"<div class='tt-match-meta'>\" +\n        \"<strong>Date :<\/strong> \" + fmtDate(m.date) + \" \u2022 \" +\n        \"<strong>Adversaire :<\/strong> \" + (sanitize(m.adversaire) || \"\u2014\") + \" (\" + (sanitize(m.classement) || \"\u2014\") + \")\" + \" \u2022 \" +\n        \"<strong>Score :<\/strong> \" + (sanitize(m.score) || \"\u2014\") + \" \u2022 \" +\n        \"<strong>R\u00e9sultat :<\/strong> \" + (sanitize(m.resultat) || \"\u2014\") +\n        \"<\/div>\";\n\n      const obj =\n        \"<div style='margin-top:10px; display:grid; gap:8px; color:rgba(11,45,69,0.86); line-height:1.6; font-size:14px;'>\" +\n          \"<div><strong>Objectif 1<\/strong> (note \" + (m.obj1Rate ?? \"\u2014\") + \"\/5) \u2014 \" + (m.obj1Note ? m.obj1Note : \"<span style='opacity:.7;'>\u2014<\/span>\") + \"<\/div>\" +\n          \"<div><strong>Objectif 2<\/strong> (note \" + (m.obj2Rate ?? \"\u2014\") + \"\/5) \u2014 \" + (m.obj2Note ? m.obj2Note : \"<span style='opacity:.7;'>\u2014<\/span>\") + \"<\/div>\" +\n          \"<div><strong>Objectif 3<\/strong> (note \" + (m.obj3Rate ?? \"\u2014\") + \"\/5) \u2014 \" + (m.obj3Note ? m.obj3Note : \"<span style='opacity:.7;'>\u2014<\/span>\") + \"<\/div>\" +\n        \"<\/div>\";\n\n      const global =\n        \"<div style='margin-top:10px; padding:12px; border-radius:14px; background:#fff; border:1px solid rgba(11,45,69,0.10);'>\" +\n          \"<div style='font-weight:900; color:#0B2D45;'>Commentaire global<\/div>\" +\n          \"<div style='margin-top:6px; color:rgba(11,45,69,0.86); line-height:1.6; font-size:14px;'>\" +\n          (m.globalNote ? m.globalNote : \"<span style='opacity:.7;'>\u2014<\/span>\") +\n          \"<\/div>\" +\n        \"<\/div>\";\n\n      const actions =\n        \"<div style='display:flex; gap:10px; flex-wrap:wrap; margin-top:12px;'>\" +\n          \"<button class='tt-mini-btn' data-edit='\" + m.id + \"' type='button'>Modifier<\/button>\" +\n          \"<button class='tt-mini-btn' data-del='\" + m.id + \"' type='button'>Supprimer<\/button>\" +\n        \"<\/div>\";\n\n      wrap.innerHTML =\n        \"<div class='tt-match-head'>\" +\n          \"<div>\" +\n            \"<div class='tt-match-title'>\ud83c\udfc6 \" + title + \"<\/div>\" +\n            metaLine +\n          \"<\/div>\" +\n        \"<\/div>\" +\n        obj +\n        global +\n        actions;\n\n      elList.appendChild(wrap);\n    });\n  }\n\n  \/\/ --- Save match\n  function upsertMatch(id){\n    const tournoi = sanitize(elTournoi.value);\n    const date = sanitize(elDate.value);\n    const adversaire = sanitize(elAdversaire.value);\n    const classement = sanitize(elClassement.value);\n    const score = sanitize(elScore.value);\n    const resultat = sanitize(elResultat.value);\n\n    const obj1Rate = getRate(\"obj1\");\n    const obj2Rate = getRate(\"obj2\");\n    const obj3Rate = getRate(\"obj3\");\n\n    const obj1Note = sanitize(elObj1Note.value);\n    const obj2Note = sanitize(elObj2Note.value);\n    const obj3Note = sanitize(elObj3Note.value);\n\n    const globalNote = sanitize(elGlobalNote.value);\n\n    if(!tournoi && !date && !adversaire){\n      elHint.textContent = \"Ajoute au moins le tournoi ou la date ou l\u2019adversaire \ud83d\ude42\";\n      elHint.style.color = \"#E11D48\";\n      return null;\n    }\n    if(obj1Rate === null || obj2Rate === null || obj3Rate === null){\n      elHint.textContent = \"Note les 3 objectifs (1 \u00e0 5) avant d\u2019enregistrer.\";\n      elHint.style.color = \"#E11D48\";\n      return null;\n    }\n\n    const match = {\n      id: id || (\"m_\" + Date.now()),\n      tournoi, date, adversaire, classement, score, resultat,\n      obj1Rate, obj2Rate, obj3Rate,\n      obj1Note, obj2Note, obj3Note,\n      globalNote,\n      updatedAt: Date.now()\n    };\n\n    const list = load();\n    const idx = list.findIndex(x => x.id === match.id);\n    if(idx >= 0) list[idx] = match;\n    else list.push(match);\n\n    save(list);\n    elHint.textContent = \"Match enregistr\u00e9 \u2705\";\n    elHint.style.color = \"rgba(31,95,59,0.95)\";\n    render();\n    return match.id;\n  }\n\n  \/\/ --- Edit mode\n  let editingId = null;\n\n  function loadIntoForm(m){\n    elTournoi.value = m.tournoi || \"\";\n    elDate.value = m.date || \"\";\n    elAdversaire.value = m.adversaire || \"\";\n    elClassement.value = m.classement || \"\";\n    elScore.value = m.score || \"\";\n    elResultat.value = m.resultat || \"\";\n\n    setRate(\"obj1\", m.obj1Rate);\n    setRate(\"obj2\", m.obj2Rate);\n    setRate(\"obj3\", m.obj3Rate);\n\n    elObj1Note.value = m.obj1Note || \"\";\n    elObj2Note.value = m.obj2Note || \"\";\n    elObj3Note.value = m.obj3Note || \"\";\n    elGlobalNote.value = m.globalNote || \"\";\n\n    editingId = m.id;\n    elSave.textContent = \"Mettre \u00e0 jour le match\";\n    elHint.textContent = \"Mode modification : mets \u00e0 jour puis enregistre.\";\n    elHint.style.color = \"rgba(11,45,69,0.70)\";\n  }\n\n  function exitEditMode(){\n    editingId = null;\n    elSave.textContent = \"Ajouter \u00e0 l\u2019historique\";\n  }\n\n  \/\/ --- Events\n  elSave.addEventListener(\"click\", () => {\n    const id = upsertMatch(editingId);\n    if(id){\n      exitEditMode();\n      resetForm();\n    }\n  });\n\n  elReset.addEventListener(\"click\", () => {\n    resetForm();\n    exitEditMode();\n  });\n\n  elClear.addEventListener(\"click\", () => {\n    if(!confirm(\"Effacer tout l\u2019historique sur ce navigateur ?\")) return;\n    localStorage.removeItem(KEY);\n    render();\n  });\n\n  elExport.addEventListener(\"click\", async () => {\n    const list = load();\n    const text = (list.length ? list : []).map(m => {\n      return [\n        \"Tournoi: \" + (m.tournoi||\"\"),\n        \"Date: \" + fmtDate(m.date),\n        \"Adversaire: \" + (m.adversaire||\"\") + \" (\" + (m.classement||\"\") + \")\",\n        \"Score: \" + (m.score||\"\") + \" | R\u00e9sultat: \" + (m.resultat||\"\"),\n        \"Obj1 (\"+m.obj1Rate+\"\/5): \" + (m.obj1Note||\"\"),\n        \"Obj2 (\"+m.obj2Rate+\"\/5): \" + (m.obj2Note||\"\"),\n        \"Obj3 (\"+m.obj3Rate+\"\/5): \" + (m.obj3Note||\"\"),\n        \"Global: \" + (m.globalNote||\"\"),\n        \"\u2014\"\n      ].join(\"\\n\");\n    }).join(\"\\n\\n\");\n\n    try{\n      await navigator.clipboard.writeText(text || \"Aucun match enregistr\u00e9.\");\n      elHint.textContent = \"Export copi\u00e9 dans le presse-papier \u2705\";\n      elHint.style.color = \"rgba(31,95,59,0.95)\";\n    }catch(e){\n      elHint.textContent = \"Impossible de copier (navigateur).\";\n      elHint.style.color = \"#E11D48\";\n    }\n  });\n\n  \/\/ Delegate edit\/delete\n  document.getElementById(\"ttMatchList\").addEventListener(\"click\", (e) => {\n    const btn = e.target.closest(\"button\");\n    if(!btn) return;\n\n    const delId = btn.getAttribute(\"data-del\");\n    const editId = btn.getAttribute(\"data-edit\");\n\n    const list = load();\n\n    if(delId){\n      if(!confirm(\"Supprimer ce match ?\")) return;\n      const next = list.filter(x => x.id !== delId);\n      save(next);\n      render();\n      return;\n    }\n\n    if(editId){\n      const m = list.find(x => x.id === editId);\n      if(!m) return;\n      loadIntoForm(m);\n      window.location.hash = \"#suivi\";\n    }\n  });\n\n  \/\/ Init\n  resetForm();\n  render();\n})();\n<\/script>\n<!-- =========================\n     POPUP LOGIN (AUTO ON LOAD)\n     \u00c0 coller sur la page \"Terrain des joueurs\"\n     ========================= -->\n\n<!-- OVERLAY + MODAL -->\n<div id=\"ttLoginOverlay\" class=\"tt-login-overlay\" aria-hidden=\"true\">\n  <div class=\"tt-login-modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"ttLoginTitle\">\n    <button type=\"button\" class=\"tt-login-close\" aria-label=\"Fermer\">\u00d7<\/button>\n\n    <div class=\"tt-login-top\">\n      <div class=\"tt-login-pill\">Espace priv\u00e9 \u2022 Connexion<\/div>\n      <h2 id=\"ttLoginTitle\" class=\"tt-login-title\">Connexion joueur<\/h2>\n      <p class=\"tt-login-sub\">\n        Connecte-toi pour acc\u00e9der \u00e0 ton suivi, tes objectifs et tes bilans.\n      <\/p>\n    <\/div>\n\n    <form id=\"ttLoginForm\" class=\"tt-login-form\" autocomplete=\"on\" action=\"\">\n      <label class=\"tt-login-label\" for=\"ttLoginEmail\">Adresse email<\/label>\n      <input id=\"ttLoginEmail\" name=\"email\" type=\"email\" required\n class=\"tt-login-input\" placeholder=\"ex : prenom.nom@email.com\" autocomplete=\"email\">\n\n      <label class=\"tt-login-label\" for=\"ttLoginPassword\">Mot de passe<\/label>\n      <input id=\"ttLoginPassword\" name=\"password\" type=\"password\" required\n class=\"tt-login-input\" placeholder=\"\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022\" autocomplete=\"current-password\">\n\n      <div class=\"tt-login-row\">\n        <label class=\"tt-login-check\">\n          <input id=\"ttLoginRemember\" type=\"checkbox\">\n          <span>Se souvenir de moi<\/span>\n        <\/label>\n\n        <button type=\"button\" id=\"ttLoginForgot\" class=\"tt-login-link\">\n          Mot de passe oubli\u00e9 ?\n        <\/button>\n      <\/div>\n\n      <div id=\"ttLoginError\" class=\"tt-login-error\" style=\"display:none;\"><\/div>\n\n      <button type=\"submit\" class=\"tt-login-btn-primary\">\n        Se connecter\n      <\/button>\n\n      <div class=\"tt-login-divider\"><span>ou<\/span><\/div>\n\n      <a id=\"ttCreateAccount\" class=\"tt-login-btn-secondary\" href=\"\/en\/URL_PAGE_CREER_COMPTE\/\">\n        Cr\u00e9er un compte\n      <\/a>\n\n      <p class=\"tt-login-foot\">\n        En te connectant, tu acceptes la politique de confidentialit\u00e9 Travel Tennis.\n      <\/p>\n    <input type=\"hidden\" name=\"trp-form-language\" value=\"en\"\/><\/form>\n  <\/div>\n<\/div>\n\n<style>\n\/* ====== Overlay translucide (page visible derri\u00e8re) ====== *\/\n.tt-login-overlay{\n  position: fixed;\n  inset: 0;\n  z-index: 99999;\n  display: none;                 \/* affich\u00e9 en JS *\/\n  align-items: center;\n  justify-content: center;\n  padding: 18px;\n  background: rgba(0,0,0,0.42);  \/* transparence *\/\n  backdrop-filter: blur(4px);\n}\n\n\/* ====== Modal ====== *\/\n.tt-login-modal{\n  width: min(520px, 100%);\n  background: #fff;\n  border-radius: 18px;\n  border: 1px solid rgba(11,45,69,0.10);\n  box-shadow: 0 24px 60px rgba(0,0,0,0.35);\n  overflow: hidden;\n  position: relative;\n}\n\n.tt-login-close{\n  position:absolute;\n  top:10px; right:12px;\n  width:40px; height:40px;\n  border:none;\n  border-radius:12px;\n  background: rgba(11,45,69,0.06);\n  color:#0B2D45;\n  font-size:22px;\n  cursor:pointer;\n  font-weight:900;\n}\n\n.tt-login-top{\n  padding: 18px 18px 0;\n}\n\n.tt-login-pill{\n  display:inline-block;\n  padding:6px 12px;\n  border-radius:999px;\n  background: rgba(11,45,69,0.06);\n  color:#0B2D45;\n  font-weight:900;\n  font-size:13px;\n}\n\n.tt-login-title{\n  margin: 12px 0 6px;\n  font-size: 26px;\n  color:#0B2D45;\n}\n\n.tt-login-sub{\n  margin: 0 0 12px;\n  color: rgba(11,45,69,0.75);\n  line-height: 1.6;\n}\n\n.tt-login-form{\n  padding: 14px 18px 18px;\n  display:grid;\n  gap:10px;\n}\n\n.tt-login-label{\n  font-weight:900;\n  font-size:13px;\n  color:#0B2D45;\n}\n\n.tt-login-input{\n  padding:12px;\n  border-radius:12px;\n  border:1px solid #CBD5E1;\n  font-size:14px;\n  outline:none;\n}\n\n.tt-login-input:focus{\n  border-color: rgba(231,111,29,0.55);\n  box-shadow: 0 0 0 3px rgba(231,111,29,0.15);\n}\n\n.tt-login-row{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:12px;\n  margin-top:4px;\n}\n\n.tt-login-check{\n  display:flex;\n  gap:8px;\n  align-items:center;\n  color: rgba(11,45,69,0.80);\n  font-size:13px;\n  font-weight:800;\n}\n\n.tt-login-link{\n  border:none;\n  background:transparent;\n  color:#2563EB;\n  font-weight:900;\n  font-size:13px;\n  cursor:pointer;\n  padding:0;\n}\n\n.tt-login-error{\n  background: rgba(225,29,72,0.08);\n  border: 1px solid rgba(225,29,72,0.25);\n  color: #BE123C;\n  border-radius: 14px;\n  padding: 10px 12px;\n  font-weight:900;\n  font-size:13px;\n}\n\n.tt-login-btn-primary{\n  margin-top:4px;\n  padding: 13px 16px;\n  border-radius: 12px;\n  border:none;\n  cursor:pointer;\n  background:#1F5F3B;\n  color:#fff;\n  font-weight:900;\n  box-shadow: 0 10px 22px rgba(31,95,59,0.25);\n}\n\n.tt-login-divider{\n  display:flex;\n  align-items:center;\n  gap:10px;\n  margin: 6px 0 0;\n  color: rgba(11,45,69,0.55);\n  font-weight:900;\n  font-size:12px;\n}\n.tt-login-divider:before,\n.tt-login-divider:after{\n  content:\"\";\n  height:1px;\n  flex:1;\n  background: rgba(11,45,69,0.12);\n}\n.tt-login-divider span{ padding:0 6px; }\n\n.tt-login-btn-secondary{\n  text-align:center;\n  padding: 11px 16px;\n  border-radius: 12px;\n  border:2px solid #E76F1D;\n  color:#E76F1D;\n  font-weight:900;\n  text-decoration:none;\n  background:#fff;\n}\n\n.tt-login-foot{\n  margin: 6px 0 0;\n  font-size: 12px;\n  color: rgba(11,45,69,0.60);\n  line-height:1.5;\n}\n\n\/* Mobile *\/\n@media (max-width: 520px){\n  .tt-login-title{ font-size:22px; }\n  .tt-login-row{ flex-direction:column; align-items:flex-start; }\n}\n<\/style>\n\n<script>\n(function(){\n  const overlay = document.getElementById(\"ttLoginOverlay\");\n  const modal   = overlay.querySelector(\".tt-login-modal\");\n  const closeBtn= overlay.querySelector(\".tt-login-close\");\n  const form    = document.getElementById(\"ttLoginForm\");\n  const emailEl = document.getElementById(\"ttLoginEmail\");\n  const passEl  = document.getElementById(\"ttLoginPassword\");\n  const rememberEl = document.getElementById(\"ttLoginRemember\");\n  const errorEl = document.getElementById(\"ttLoginError\");\n  const forgotBtn = document.getElementById(\"ttLoginForgot\");\n\n  \/\/ ====== CONFIG ======\n  \/\/ 1) Page de cr\u00e9ation de compte (mets ton URL)\n  \/\/ (d\u00e9j\u00e0 dans href=\"URL_PAGE_CREER_COMPTE\")\n\n  \/\/ 2) Choisis ton mode:\n  const USE_WORDPRESS_LOGIN = false; \/\/ <-- mets true si tu veux utiliser wp-login.php (recommand\u00e9)\n\n  \/\/ 3) URLs (\u00e0 adapter)\n  const WP_LOGIN_URL = \"\/wp-login.php\";\n  const WP_REDIRECT_AFTER_LOGIN = \"\/terrain-joueurs\/\"; \/\/ ou ta page dashboard\n  const CREATE_ACCOUNT_URL = \"URL_PAGE_CREER_COMPTE\";\n\n  \/\/ 4) Redirection page perso (si tu veux une r\u00e8gle email -> url)\n  \/\/    Exemple: joueur@email.com -> \/joueurs\/joueur-email\/\n  function playerPageFromEmail(email){\n    \/\/ version \"safe\" : slug simple\n    const slug = email.trim().toLowerCase()\n      .replace(\/[^a-z0-9@._-]\/g, \"\")\n      .replace(\/@\/g, \"-at-\")\n      .replace(\/\\.\/g, \"-\");\n    return \"\/joueurs\/\" + slug + \"\/\";\n  }\n\n  \/\/ ====== Helpers ======\n  function openModal(){\n    overlay.style.display = \"flex\";\n    overlay.setAttribute(\"aria-hidden\", \"false\");\n    document.body.style.overflow = \"hidden\";\n\n    \/\/ Prefill if remembered\n    const remembered = localStorage.getItem(\"tt_remember_email\");\n    if (remembered){\n      emailEl.value = remembered;\n      rememberEl.checked = true;\n    }\n    setTimeout(() => emailEl.focus(), 30);\n  }\n\n  function closeModal(){\n    overlay.style.display = \"none\";\n    overlay.setAttribute(\"aria-hidden\", \"true\");\n    document.body.style.overflow = \"\";\n  }\n\n  function showError(msg){\n    errorEl.textContent = msg;\n    errorEl.style.display = \"block\";\n  }\n\n  function clearError(){\n    errorEl.textContent = \"\";\n    errorEl.style.display = \"none\";\n  }\n\n  \/\/ ====== Open on load (si pas \"connect\u00e9\") ======\n  \/\/ Ici on consid\u00e8re \"connect\u00e9\" si un flag existe (mode d\u00e9mo).\n  \/\/ En WordPress r\u00e9el, tu remplaceras \u00e7a par un vrai check serveur (ou plugin membres).\n  const isLogged = localStorage.getItem(\"tt_logged_in\") === \"1\";\n  if (!isLogged){\n    openModal();\n  }\n\n  \/\/ ====== Close behaviors ======\n  closeBtn.addEventListener(\"click\", closeModal);\n  overlay.addEventListener(\"click\", (e) => {\n    if (e.target === overlay) closeModal(); \/\/ clic hors modal\n  });\n  document.addEventListener(\"keydown\", (e) => {\n    if (e.key === \"Escape\" && overlay.style.display === \"flex\") closeModal();\n  });\n\n  \/\/ Stop click bubbling inside modal\n  modal.addEventListener(\"click\", (e) => e.stopPropagation());\n\n  \/\/ Forgot password\n  forgotBtn.addEventListener(\"click\", () => {\n    \/\/ WordPress: \/wp-login.php?action=lostpassword\n    window.location.href = \"\/wp-login.php?action=lostpassword\";\n  });\n\n  \/\/ ====== Submit ======\n  form.addEventListener(\"submit\", (e) => {\n    e.preventDefault();\n    clearError();\n\n    const email = emailEl.value.trim();\n    const pass  = passEl.value;\n\n    if (!email || !pass){\n      showError(\"Merci de remplir l\u2019email et le mot de passe.\");\n      return;\n    }\n\n    \/\/ Remember\n    if (rememberEl.checked){\n      localStorage.setItem(\"tt_remember_email\", email);\n    } else {\n      localStorage.removeItem(\"tt_remember_email\");\n    }\n\n    \/\/ ===== Mode WordPress (r\u00e9el) =====\n    if (USE_WORDPRESS_LOGIN){\n      \/\/ On envoie vers wp-login.php avec redirect\n      \/\/ NOTE: WordPress g\u00e8re le cookie \"rememberme\" si le champ est pr\u00e9sent.\n      const params = new URLSearchParams();\n      params.set(\"log\", email);\n      params.set(\"pwd\", pass);\n      params.set(\"redirect_to\", WP_REDIRECT_AFTER_LOGIN);\n      if (rememberEl.checked) params.set(\"rememberme\", \"forever\");\n\n      \/\/ POST via form dynamique (\u00e9vite CORS)\n      const f = document.createElement(\"form\");\n      f.method = \"POST\";\n      f.action = WP_LOGIN_URL;\n\n      for (const [k,v] of params.entries()){\n        const inp = document.createElement(\"input\");\n        inp.type = \"hidden\";\n        inp.name = k;\n        inp.value = v;\n        f.appendChild(inp);\n      }\n      document.body.appendChild(f);\n      f.submit();\n      return;\n    }\n\n    \/\/ ===== Mode D\u00e9mo (front-only) =====\n    \/\/ Ici on ne peut pas v\u00e9rifier le mot de passe vraiment.\n    \/\/ On simule \"connect\u00e9\", puis on redirige vers une page perso bas\u00e9e sur l\u2019email.\n    localStorage.setItem(\"tt_logged_in\", \"1\");\n\n    \/\/ Redirection joueur\n    const dest = playerPageFromEmail(email);\n    closeModal();\n    window.location.href = dest;\n  });\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b1f3b2f elementor-widget elementor-widget-shortcode\" data-id=\"b1f3b2f\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-172e9bd e-flex e-con-boxed e-con e-parent\" data-id=\"172e9bd\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4f777c9 elementor-widget elementor-widget-shortcode\" data-id=\"4f777c9\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><!-- ========= Travel Tennis \u2013 Player App UX (CSS\/HTML\/JS only) ========= -->\n<style>\n\/* Conteneur global (look premium, coh\u00e9rent avec vos pages) *\/\n.tt-playerapp{\n  font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial;\n  color:#0f1b2d;\n}\n\n\/* Titre + intro *\/\n.tt-playerapp h2,\n.tt-playerapp h3{\n  margin:0 0 10px;\n  letter-spacing:-.02em;\n}\n\n.tt-playerapp .tt-top{\n  background: radial-gradient(1200px 500px at 15% 0%, rgba(231,111,29,.18), transparent 55%),\n              radial-gradient(900px 520px at 85% 30%, rgba(31,107,59,.18), transparent 55%),\n              linear-gradient(180deg, #0b0b0b 0%, #101214 100%);\n  border-radius:22px;\n  padding:26px 22px;\n  color:#fff;\n  box-shadow:0 24px 60px rgba(0,0,0,.22);\n  border:1px solid rgba(255,255,255,.08);\n  margin-bottom:18px;\n}\n\n.tt-playerapp .tt-kicker{\n  display:inline-flex;\n  gap:8px;\n  align-items:center;\n  padding:8px 12px;\n  background:rgba(255,255,255,.08);\n  border:1px solid rgba(255,255,255,.10);\n  border-radius:999px;\n  font-weight:800;\n  font-size:12px;\n  margin-bottom:10px;\n}\n\n.tt-playerapp .tt-title{\n  font-size:34px;\n  line-height:1.05;\n  margin:0 0 10px;\n}\n.tt-playerapp .tt-title b{ color:#E76F1D; }\n\n.tt-playerapp .tt-sub{\n  margin:0;\n  color:rgba(255,255,255,.78);\n  font-size:14px;\n  line-height:1.6;\n  max-width:68ch;\n}\n\n.tt-playerapp .tt-meta-row{\n  display:flex;\n  gap:10px;\n  flex-wrap:wrap;\n  margin-top:14px;\n}\n\n.tt-playerapp .tt-pill{\n  display:inline-flex;\n  align-items:center;\n  gap:8px;\n  padding:8px 12px;\n  border-radius:999px;\n  font-weight:900;\n  font-size:12px;\n  background:rgba(255,255,255,.08);\n  border:1px solid rgba(255,255,255,.10);\n}\n.tt-playerapp .tt-pill span{ opacity:.85; font-weight:800; }\n\n\/* Zone formulaire existante : on \u201cre-skin\u201d ce que le shortcode sort *\/\n.tt-playerapp form{\n  background:#f6f7f9;\n  border:1px solid rgba(15,27,45,.08);\n  border-radius:18px;\n  padding:18px;\n  box-shadow:0 14px 40px rgba(0,0,0,.05);\n  margin:16px 0 18px;\n}\n\n\/* Champs *\/\n.tt-playerapp label{\n  font-weight:900;\n  font-size:13px;\n  color:#0f1b2d;\n}\n.tt-playerapp input[type=\"text\"],\n.tt-playerapp input[type=\"email\"],\n.tt-playerapp input[type=\"tel\"],\n.tt-playerapp select,\n.tt-playerapp textarea{\n  width:100%;\n  border:1px solid rgba(15,27,45,.12);\n  border-radius:12px;\n  padding:12px 12px;\n  font-size:14px;\n  outline:none;\n  background:#fff;\n  box-shadow:0 8px 18px rgba(0,0,0,.03);\n}\n.tt-playerapp textarea{ min-height:110px; resize:vertical; }\n\n.tt-playerapp input:focus,\n.tt-playerapp select:focus,\n.tt-playerapp textarea:focus{\n  border-color:rgba(231,111,29,.55);\n  box-shadow:0 0 0 4px rgba(231,111,29,.14);\n}\n\n\/* Bouton submit *\/\n.tt-playerapp button,\n.tt-playerapp input[type=\"submit\"]{\n  background:#1f6b3b;\n  color:#fff;\n  border:none;\n  border-radius:999px;\n  padding:12px 16px;\n  font-weight:1000;\n  cursor:pointer;\n  box-shadow:0 10px 22px rgba(31,107,59,.32);\n}\n.tt-playerapp button:hover,\n.tt-playerapp input[type=\"submit\"]:hover{\n  transform:translateY(-1px);\n}\n\n\/* Message succ\u00e8s *\/\n.tt-playerapp .tt-toast{\n  display:none;\n  margin-top:12px;\n  background:rgba(31,107,59,.10);\n  border:1px solid rgba(31,107,59,.25);\n  color:#1f6b3b;\n  font-weight:900;\n  border-radius:14px;\n  padding:10px 12px;\n}\n\n\/* --- Filtres (Objectif \/ Technique \/ Mental) --- *\/\n.tt-playerapp .tt-filters{\n  display:flex;\n  gap:10px;\n  flex-wrap:wrap;\n  margin: 6px 0 14px;\n}\n.tt-playerapp .tt-filter{\n  display:inline-flex;\n  align-items:center;\n  gap:8px;\n  padding:10px 12px;\n  border-radius:999px;\n  font-weight:950;\n  font-size:13px;\n  cursor:pointer;\n  background:#fff;\n  border:1px solid rgba(15,27,45,.10);\n  box-shadow:0 10px 22px rgba(0,0,0,.04);\n}\n.tt-playerapp .tt-filter.is-active{\n  border-color:rgba(231,111,29,.45);\n  box-shadow:0 0 0 4px rgba(231,111,29,.12);\n}\n\n\/* --- Zone \"Mon suivi\" en cartes --- *\/\n.tt-playerapp .tt-cards{\n  display:grid;\n  grid-template-columns:repeat(12, 1fr);\n  gap:14px;\n}\n\n.tt-playerapp .tt-card{\n  grid-column: span 6;\n  background: linear-gradient(180deg, #0b0b0b 0%, #111417 100%);\n  border:1px solid rgba(255,255,255,.08);\n  border-radius:18px;\n  padding:14px 14px 12px;\n  box-shadow:0 18px 50px rgba(0,0,0,.18);\n  color:#fff;\n  position:relative;\n  overflow:hidden;\n}\n.tt-playerapp .tt-card:before{\n  content:\"\";\n  position:absolute;\n  inset:-30% -30% auto auto;\n  width:260px;\n  height:260px;\n  background: radial-gradient(circle at 30% 30%, rgba(231,111,29,.30), transparent 60%);\n  filter: blur(2px);\n}\n\n.tt-playerapp .tt-card__top{\n  position:relative;\n  display:flex;\n  justify-content:space-between;\n  gap:10px;\n  align-items:flex-start;\n  margin-bottom:10px;\n}\n\n.tt-playerapp .tt-badge{\n  display:inline-flex;\n  align-items:center;\n  gap:8px;\n  padding:7px 10px;\n  border-radius:999px;\n  font-weight:1000;\n  font-size:12px;\n  border:1px solid rgba(255,255,255,.12);\n  background:rgba(255,255,255,.06);\n}\n.tt-playerapp .tt-badge[data-cat=\"Technique\"]{ border-color:rgba(31,107,59,.40); background:rgba(31,107,59,.12); }\n.tt-playerapp .tt-badge[data-cat=\"Mental\"]{ border-color:rgba(231,111,29,.45); background:rgba(231,111,29,.14); }\n.tt-playerapp .tt-badge[data-cat=\"Objectif\"]{ border-color:rgba(255,255,255,.18); background:rgba(255,255,255,.08); }\n\n.tt-playerapp .tt-date{\n  position:relative;\n  font-weight:900;\n  font-size:12px;\n  color:rgba(255,255,255,.75);\n  white-space:nowrap;\n}\n\n.tt-playerapp .tt-card__title{\n  position:relative;\n  margin:0 0 8px;\n  font-size:16px;\n  line-height:1.25;\n  font-weight:1000;\n}\n\n.tt-playerapp .tt-card__note{\n  position:relative;\n  margin:0;\n  font-size:13px;\n  line-height:1.55;\n  color:rgba(255,255,255,.78);\n}\n\n\/* Responsive *\/\n@media (max-width: 900px){\n  .tt-playerapp .tt-title{ font-size:28px; }\n  .tt-playerapp .tt-card{ grid-column: span 12; }\n}\n<\/style>\n\n<div class=\"tt-playerapp\" id=\"ttPlayerAppUX\">\n  <!-- Bandeau premium (ne casse rien : pure UI) -->\n  <div class=\"tt-top\">\n    <div class=\"tt-kicker\">\ud83c\udfbe Espace priv\u00e9 \u2022 Objectifs \u2022 Suivi<\/div>\n    <h2 class=\"tt-title\">Le terrain de <b>mon joueur<\/b><\/h2>\n    <p class=\"tt-sub\">\n      D\u00e9finis tes objectifs, note tes points cl\u00e9s (technique \/ mental \/ tactique) et garde un historique clair.\n      Ton suivi reste priv\u00e9 et visible par le staff Travel Tennis.\n    <\/p>\n    <div class=\"tt-meta-row\">\n      <div class=\"tt-pill\">\ud83d\udcc5 <span id=\"ttToday\"><\/span><\/div>\n      <div class=\"tt-pill\">\u2705 <span>Ajoute 2\u20133 points par semaine<\/span><\/div>\n      <div class=\"tt-pill\">\ud83c\udfaf <span>Objectifs + notes match<\/span><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Shortcode WordPress -->\n  <div class=\"tt-shortcode\">\n    <div style=\"text-align:center;padding:40px;font-weight:800;\">\r\n        \ud83d\udd12 Connecte-toi pour acc\u00e9der \u00e0 ton espace joueur.\r\n        <\/div>\n  <\/div>\n\n  <!-- Filtres (JS) + rendu cartes (JS) -->\n  <div class=\"tt-filters\" aria-label=\"Filtres suivi\">\n    <button type=\"button\" class=\"tt-filter is-active\" data-filter=\"all\">\ud83d\udccc Tout<\/button>\n    <button type=\"button\" class=\"tt-filter\" data-filter=\"Objectif\">\ud83c\udfaf Objectif<\/button>\n    <button type=\"button\" class=\"tt-filter\" data-filter=\"Technique\">\ud83d\udee0\ufe0f Technique<\/button>\n    <button type=\"button\" class=\"tt-filter\" data-filter=\"Mental\">\ud83e\udde0 Mental<\/button>\n  <\/div>\n\n  <div class=\"tt-cards\" id=\"ttCards\"><\/div>\n\n  <div class=\"tt-toast\" id=\"ttToast\">\u2705 Objectif enregistr\u00e9<\/div>\n<\/div>\n\n<script>\n(function(){\n  \/\/ Date du jour (affichage premium)\n  const today = new Date();\n  const fmt = new Intl.DateTimeFormat('fr-FR', { day:'2-digit', month:'long', year:'numeric' });\n  const ttToday = document.getElementById('ttToday');\n  if(ttToday) ttToday.textContent = fmt.format(today);\n\n  const root = document.getElementById('ttPlayerAppUX');\n  if(!root) return;\n\n  \/\/ 1) Tenter d\u2019am\u00e9liorer les titres des labels (sans casser)\n  \/\/ On remplace juste le texte affich\u00e9 si on le trouve.\n  const replaceLabel = (from, to)=>{\n    root.querySelectorAll('label').forEach(l=>{\n      const t = (l.textContent||'').trim().toLowerCase();\n      if(t.includes(from.toLowerCase())) l.textContent = to;\n    });\n  };\n  replaceLabel('objectif', '\ud83c\udfaf Objectif (s\u00e9ance \/ match \/ focus)');\n  replaceLabel('cat\u00e9gorie', '\ud83c\udff7\ufe0f Cat\u00e9gorie');\n  replaceLabel('note', '\ud83d\udcdd Note \/ point cl\u00e9');\n\n  \/\/ 2) D\u00e9tecter un message \"Objectif enregistr\u00e9\" \u00e9ventuel (si ton shortcode l\u2019affiche)\n  \/\/ Et afficher notre toast premium en plus.\n  const maybeShowToast = ()=>{\n    \/\/ Cherche des \u00e9l\u00e9ments existants contenant \"Objectif enregistr\u00e9\"\n    const found = Array.from(root.querySelectorAll('*'))\n      .find(el => (el.childElementCount===0) && (el.textContent||'').toLowerCase().includes('objectif enregistr\u00e9'));\n    if(found){\n      const toast = document.getElementById('ttToast');\n      if(toast){\n        toast.style.display = 'block';\n        setTimeout(()=> toast.style.display = 'none', 2600);\n      }\n    }\n  };\n  maybeShowToast();\n\n  \/\/ 3) Transformer la liste \"Mon suivi\" en cartes premium\n  \/\/ Hypoth\u00e8se : ton shortcode affiche une liste <ul><li>...<\/li><\/ul> pour le suivi (comme sur ta capture).\n  const cardsWrap = document.getElementById('ttCards');\n  const list = root.querySelector('.tt-shortcode ul') || root.querySelector('ul');\n  if(!cardsWrap || !list) return;\n\n  \/\/ Heuristique pour extraire une cat\u00e9gorie depuis le texte du li (si possible)\n  \/\/ Ex: \"Technique : ...\" ou \"[Mental] ...\" etc. Sinon -> Objectif par d\u00e9faut.\n  const getCategory = (text)=>{\n    const t = (text||'').toLowerCase();\n    if(t.includes('mental')) return 'Mental';\n    if(t.includes('technique')) return 'Technique';\n    if(t.includes('objectif')) return 'Objectif';\n    return 'Objectif';\n  };\n\n  const prettify = (s)=> (s||'').replace(\/\\s+\/g,' ').trim();\n\n  const liItems = Array.from(list.querySelectorAll('li'));\n  \/\/ On garde la liste d\u2019origine (au cas o\u00f9) mais on la masque pour \u00e9viter doublon\n  list.style.display = 'none';\n\n  const buildCards = ()=>{\n    cardsWrap.innerHTML = '';\n    liItems.forEach((li, idx)=>{\n      const raw = prettify(li.textContent || '');\n      if(!raw) return;\n\n      const cat = getCategory(raw);\n      const dateText = fmt.format(today); \/\/ c\u00f4t\u00e9 front : date auto (du jour)\n      \/\/ Titre : premi\u00e8re phrase \/ ou la ligne enti\u00e8re si simple\n      const title = raw.length > 80 ? raw.slice(0, 80) + '\u2026' : raw;\n      const note = raw;\n\n      const card = document.createElement('article');\n      card.className = 'tt-card';\n      card.dataset.cat = cat;\n\n      card.innerHTML = `\n        <div class=\"tt-card__top\">\n          <div class=\"tt-badge\" data-cat=\"${cat}\">\n            ${cat === 'Mental' ? '\ud83e\udde0' : (cat === 'Technique' ? '\ud83d\udee0\ufe0f' : '\ud83c\udfaf')}\n            <span>${cat}<\/span>\n          <\/div>\n          <div class=\"tt-date\">\ud83d\udcc5 ${dateText}<\/div>\n        <\/div>\n        <h3 class=\"tt-card__title\">${title}<\/h3>\n        <p class=\"tt-card__note\">${note}<\/p>\n      `;\n\n      cardsWrap.appendChild(card);\n    });\n  };\n\n  buildCards();\n\n  \/\/ 4) Filtres\n  const filters = root.querySelectorAll('.tt-filter');\n  const applyFilter = (val)=>{\n    filters.forEach(b=> b.classList.toggle('is-active', b.dataset.filter===val));\n    Array.from(cardsWrap.children).forEach(card=>{\n      const ok = (val === 'all') || (card.dataset.cat === val);\n      card.style.display = ok ? '' : 'none';\n    });\n  };\n\n  filters.forEach(btn=>{\n    btn.addEventListener('click', ()=> applyFilter(btn.dataset.filter));\n  });\n\n  \/\/ 5) Apr\u00e8s submit : on affiche le toast (sans bloquer)\n  \/\/ On capte l\u2019envoi du formulaire si pr\u00e9sent\n  const form = root.querySelector('form');\n  if(form){\n    form.addEventListener('submit', ()=>{\n      const toast = document.getElementById('ttToast');\n      if(toast){\n        toast.textContent = '\u2705 Enregistrement en cours\u2026';\n        toast.style.display = 'block';\n      }\n      \/\/ Quand la page se recharge \/ ou que le shortcode r\u00e9-affiche le message, maybeShowToast relancera.\n    });\n  }\n})();\n<\/script>\n<!-- ========= \/Travel Tennis \u2013 Player App UX ========= -->\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0a83754 e-flex e-con-boxed e-con e-parent\" data-id=\"0a83754\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ec0c73d elementor-widget elementor-widget-shortcode\" data-id=\"ec0c73d\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Espace priv\u00e9 \u2022 Objectifs \u2022 Suivi Le terrain des joueurs Bienvenue dans ton espace personnel Travel Tennis. Ici tu retrouves [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"disabled","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-226","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"http:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/pages\/226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/comments?post=226"}],"version-history":[{"count":45,"href":"http:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/pages\/226\/revisions"}],"predecessor-version":[{"id":727,"href":"http:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/pages\/226\/revisions\/727"}],"wp:attachment":[{"href":"http:\/\/traveltennis.com\/en\/wp-json\/wp\/v2\/media?parent=226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}