{"id":2007,"date":"2026-06-11T21:24:53","date_gmt":"2026-06-11T19:24:53","guid":{"rendered":"https:\/\/spes.anivise.fr\/?page_id=2007"},"modified":"2026-06-11T22:46:17","modified_gmt":"2026-06-11T20:46:17","slug":"fiches-spes-mammiferes","status":"publish","type":"page","link":"https:\/\/spes.anivise.fr\/index.php\/fiches-spes-mammiferes\/","title":{"rendered":"Fiches SPES &#8211; Mammif\u00e8res"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2007\" class=\"elementor elementor-2007\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e978140 e-flex e-con-boxed parallax_section_no qode_elementor_container_no e-con e-parent\" data-id=\"e978140\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-383d0ed e-con-full e-flex parallax_section_no qode_elementor_container_no e-con e-child\" data-id=\"383d0ed\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6a1a66a elementor-button-align-stretch elementor-widget elementor-widget-form\" data-id=\"6a1a66a\" data-element_type=\"widget\" id=\"search-espece\" data-settings=\"{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;button_width&quot;:&quot;100&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}\" data-widget_type=\"form.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<form class=\"elementor-form\" method=\"post\" name=\"New Form\">\n\t\t\t<input type=\"hidden\" name=\"post_id\" value=\"2007\"\/>\n\t\t\t<input type=\"hidden\" name=\"form_id\" value=\"6a1a66a\"\/>\n\t\t\t<input type=\"hidden\" name=\"referer_title\" value=\"\" \/>\n\n\t\t\t\n\t\t\t<div class=\"elementor-form-fields-wrapper elementor-labels-above\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-searchespece elementor-col-100\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-searchespece\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tESPECE RECHERCHEE\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[searchespece]\" id=\"form-field-searchespece\" class=\"elementor-field elementor-size-sm  elementor-field-textual\" placeholder=\"Ecrire ici\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons\">\n\t\t\t\t\t<button class=\"elementor-button elementor-size-sm\" type=\"submit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/form>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\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-ac9acb5 e-flex e-con-boxed parallax_section_no qode_elementor_container_no e-con e-parent\" data-id=\"ac9acb5\" 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-019c501 elementor-widget elementor-widget-html\" data-id=\"019c501\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n  console.log('shortcode fiches_rest_nonce exists?', (typeof window.wp !== 'undefined'));\r\n});\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-991917d elementor-widget elementor-widget-shortcode\" data-id=\"991917d\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n\n<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-794bd2b elementor-widget elementor-widget-shortcode\" data-id=\"794bd2b\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\"><script>window.FICHES_EXPORT = { canExportPdf: false };<\/script><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0122c1f elementor-widget elementor-widget-html\" data-id=\"0122c1f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- Fonts -->\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;600&display=swap\" rel=\"stylesheet\">\n\n<!-- Librairies -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/papaparse@5.4.1\/papaparse.min.js\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/fuse.js@6.6.2\"><\/script>\n<script src=\"https:\/\/www.gstatic.com\/charts\/loader.js\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n\n<style>\n\/* Masquer le logo du th\u00e8me Bridge *\/\n.q_logo,\n.header_logo,\n.logo_wrapper {\n  display: none !important;\n}\n\n\/* Police et base *\/\nbody {\n  font-family: 'Inter', sans-serif;\n  background-color: #f8f9fa;\n  color: #222;\n  margin: 0;\n  padding: 0;\n  line-height: 1.6;\n}\n\n\/* Conteneur du champ de recherche *\/\n#search-espece {\n  position: relative;\n  z-index: 999;\n}\n\n\/* Champ de recherche *\/\n#search-espece input[type=\"text\"] {\n  width: 100%;\n  max-width: 400px;\n  padding: 12px 16px;\n  font-size: 1rem;\n  border: 1px solid #ccc;\n  border-radius: 8px;\n  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.05);\n  outline: none;\n  transition: border-color 0.2s ease;\n  margin: 20px auto;\n  display: block;\n}\n\n#search-espece input[type=\"text\"]:focus {\n  border-color: #4ECDC4;\n}\n\n#search-espece input[type=\"text\"][disabled] {\n  opacity: 0.6;\n  cursor: not-allowed;\n}\n\n\/* Liste des suggestions *\/\n#suggestions {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  right: 0;\n  max-height: 150px;\n  overflow-y: auto;\n  overflow-x: hidden;\n  background-color: white;\n  border: 1px solid #ccc;\n  border-top: none;\n  z-index: 9999;\n  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n  overscroll-behavior: contain;\n  pointer-events: auto;\n}\n\n#suggestions::-webkit-scrollbar { width: 6px; }\n#suggestions::-webkit-scrollbar-thumb { background-color: #ccc; border-radius: 3px; }\n\n#suggestions div {\n  padding: 8px;\n  cursor: pointer;\n}\n\n#suggestions div:hover,\n#suggestions div.highlight {\n  background-color: #e0e0e0;\n  color: #222;\n  font-weight: 500;\n}\n\n\/* Blocs d'infos *\/\n.bloc {\n  background: white;\n  border: 1px solid #ddd;\n  border-left: 4px solid #824c22;\n  border-radius: 12px;\n  padding: 20px;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.06);\n  margin: 20px auto;\n  display: none;\n  max-width: 95vw;\n  width: 100%;\n}\n\n#fiche-espece {\n  position: relative;\n  left: 50%;\n  transform: translateX(-50%);\n  width: 90vw;\n  max-width: min(90vw, 2000px);\n  margin: 0;\n  padding: 0;\n  box-sizing: border-box;\n}\n\nh3 {\n  color: #824c22;\n  border-bottom: 1px solid #eee;\n  padding-bottom: 5px;\n  margin-bottom: 15px;\n  text-transform: uppercase;\n}\n\n\/* Graphiques *\/\n.charts-wrapper {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  align-items: flex-start;\n  gap: 30px;\n  margin-top: 20px;\n}\n\n.chart-block {\n  flex: 1 1 420px;\n  max-width: 520px;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.chart-container {\n  width: 100%;\n  max-width: 500px;\n  min-width: 0;\n  height: auto !important;\n  overflow: visible !important;\n}\n\n.custom-legend {\n  width: 100%;\n  max-width: 500px;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 8px;\n  margin: 14px auto 0 auto;\n  font-size: 0.95rem;\n  line-height: 1.4;\n  text-align: center;\n}\n\n.legend-item {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  line-height: 1.3;\n  width: fit-content;\n  max-width: 100%;\n}\n\n.legend-color {\n  width: 14px;\n  height: 14px;\n  border-radius: 50%;\n  flex-shrink: 0;\n  border: 1px solid #ccc;\n}\n\n\/* UICN *\/\n.uicn-bar-container {\n  position: relative;\n  width: 100%;\n  max-width: 1000px;\n  margin: 20px auto;\n}\n\n.uicn-bar-image {\n  width: 100%;\n  height: auto;\n  display: block;\n}\n\n.uicn-double-col {\n  display: flex;\n  flex-wrap: nowrap;\n  gap: 30px;\n  margin-top: 20px;\n  align-items: flex-start;\n  width: 100%;\n  box-sizing: border-box;\n}\n\n.uicn-col { box-sizing: border-box; }\n.uicn-gauche { flex: 0 0 25%; max-width: 25%; }\n.uicn-droite { flex: 0 0 25%; max-width: 25%; }\n\n.uicn-col h4 { font-size: 1.1rem; color: #824c22; text-transform: uppercase; margin-bottom: 15px; }\n\n.annexes-ligne { display: flex; flex-direction: column; align-items: center; gap: 8px; }\n\n.annexes-labels,\n.annexes-valeurs {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  gap: 60px;\n  width: 100%;\n  text-align: center;\n}\n\n.annexes-labels span { font-weight: bold; text-align: center; color: #333; }\n\n.badge-eu,\n.badge-cites { color: white !important; }\n\n.badge-eu {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 28px;\n  height: 28px;\n  border-radius: 50%;\n  font-size: 18px;\n  font-weight: 700;\n  color: white;\n  background-color: #ccc;\n  line-height: 1;\n  flex-shrink: 0;\n  flex-grow: 0;\n}\n\n.badge-eu-a { background-color: #e74c3c; }\n.badge-eu-b { background-color: #f39c12; }\n.badge-eu-c { background-color: #4ECDC4; }\n.badge-eu-d { background-color: #8e44ad; }\n.badge-eu-na { background-color: #ccc; color: #666; }\n\n.badge-cites {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  width: 28px;\n  height: 28px;\n  border-radius: 50%;\n  font-size: 16px;\n  font-weight: 700;\n  color: #fff !important;\n  line-height: 1;\n  flex-shrink: 0;\n  flex-grow: 0;\n}\n\n.badge-cites-i    { background-color: #c0392b; }\n.badge-cites-ii   { background-color: #d35400; }\n.badge-cites-iii  { background-color: #f1c40f; color: #000 !important; }\n.badge-cites-na   { background-color: #ccc; color: #666 !important; }\n\n\/* Rythme \/ traits *\/\n.rythme-liste {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: 20px;\n  text-align: center;\n  margin-top: 20px;\n}\n\n.rythme-liste > div {\n  flex: 1 1 200px;\n  min-width: 180px;\n}\n\n.rythme-titre {\n  font-size: 0.9rem;\n  color: #824c22;\n  font-weight: 500;\n  text-transform: uppercase;\n  margin-bottom: 5px;\n}\n\n.rythme-valeur {\n  font-size: 1.1rem;\n  font-weight: bold;\n  color: #222;\n}\n\n.rythme-source {\n  font-size: 0.75rem;\n  color: #666;\n  margin-top: 2px;\n  font-weight: normal;\n}\n\n.rythme-valeur-wrapper {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n}\n\n\/* Taxonomie *\/\n.taxonomy-tree {\n  margin-top: 20px;\n  margin-left: 20px;\n  display: flex;\n  flex-direction: column;\n  font-size: 15px;\n}\n\n.niveau {\n  display: flex;\n  align-items: center;\n  position: relative;\n  height: 20px;\n  margin-bottom: 0;\n}\n\n.branche.horizontale {\n  height: 2px;\n  background-color: #ccc;\n  flex-shrink: 0;\n  margin-right: 10px;\n}\n\n.niveau-1 .branche.horizontale { width: 30px; margin-left: 0px; }\n.niveau-2 .branche.horizontale { width: 30px; margin-left: 20px; }\n.niveau-3 .branche.horizontale { width: 30px; margin-left: 40px; }\n.niveau-4 .branche.horizontale { width: 30px; margin-left: 60px; }\n.niveau-5 .branche.horizontale { width: 30px; margin-left: 80px; }\n.niveau-6 .branche.horizontale { width: 30px; margin-left: 100px; }\n.niveau-7 .branche.horizontale { width: 30px; margin-left: 120px; }\n\n.branche.verticale {\n  width: 2px;\n  height: 20px;\n  background-color: #ccc;\n  margin-top: -2px;\n}\n\n.branche.verticale.niveau-1 { margin-left: 30px; }\n.branche.verticale.niveau-2 { margin-left: 50px; }\n.branche.verticale.niveau-3 { margin-left: 70px; }\n.branche.verticale.niveau-4 { margin-left: 90px; }\n.branche.verticale.niveau-5 { margin-left: 110px; }\n.branche.verticale.niveau-6 { margin-left: 130px; }\n\n.taxonomy-tree .label { font-size: 15px; }\n\n\/* Image wiki *\/\n#image-wiki-test img {\n  width: 100%;\n  max-width: 400px;\n  height: auto;\n  object-fit: cover;\n  border-radius: 12px;\n  display: block;\n  margin: 0 auto;\n}\n\n.bloc img { max-width: 95vw; display: block; }\n.bloc:not(#image-wiki-test) > img { display: none !important; }\n\n\/* Noms *\/\n.nom-fr-latin { text-align: center; margin-bottom: 10px; }\n.nom-fr { font-size: 1.4rem; font-weight: 600; color: #222; }\n.nom-latin { font-size: 1.1rem; font-style: italic; color: #555; margin-top: -5px; }\n\n.nom-principal-global { text-align: center; margin-bottom: 30px; }\n.nom-principal-global .nom-fr { font-size: 1.8rem; font-weight: 700; color: #222; margin-bottom: 5px; }\n.nom-principal-global .nom-latin { font-size: 1.2rem; font-style: italic; color: #666; }\n\n\/* Colonnes intro *\/\n.intro-cols { display: flex; flex-wrap: wrap; align-items: center; gap: 30px; }\n\n.col-gauche {\n  flex: 1 1 350px;\n  max-width: 400px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.col-milieu { flex: 2 1 500px; max-width: 700px; }\n.col-droite { flex: 2 1 500px; max-width: 700px; }\n\n#nom-principal { text-align: center; margin-bottom: 30px; }\n#nom-principal .nom-fr { font-size: 1.8rem; font-weight: 700; margin-bottom: 5px; color: #222; }\n#nom-principal .nom-latin { font-size: 1.2rem; font-style: italic; color: #666; }\n\n\/* Morpho *\/\n.morpho-wrapper {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 30px;\n  align-items: flex-start;\n  margin-top: 20px;\n}\n\n.morpho-texte { flex: 1 1 300px; min-width: 250px; }\n\n.morpho-image {\n  flex: 1 1 500px;\n  min-width: 300px;\n  max-width: 700px;\n}\n\n.morpho-image img {\n  width: 100%;\n  height: auto;\n  border-radius: 12px;\n  box-shadow: 0 4px 12px rgba(0,0,0,0.08);\n  object-fit: contain;\n}\n\n.morpho-texte p {\n  font-size: 1.1rem;\n  line-height: 1.3;\n  margin-bottom: 6px;\n  color: #333;\n  display: flex;\n  flex-wrap: wrap;\n}\n\n.morpho-texte p strong {\n  font-weight: normal;\n  color: inherit;\n  min-width: 240px;\n  display: inline-block;\n}\n\n\/* Bloc noms *\/\n#bloc-noms p {\n  font-size: 1.1rem;\n  line-height: 1.6;\n  margin-bottom: 10px;\n  color: #333;\n  display: flex;\n  align-items: center;\n}\n\n#bloc-noms .flag {\n  font-size: 1.4rem;\n  margin-right: 12px;\n  flex-shrink: 0;\n}\n\n#bloc-noms h3 {\n  font-size: 1.2rem;\n  color: #824c22;\n  margin-bottom: 15px;\n  text-transform: uppercase;\n}\n\n\/* Subfields *\/\n.subfield { font-size: 0.75em; font-weight: 400; color: #4A403A; line-height: 1.4; }\n.subvalue { font-weight: 600; color: #000; }\n\n\/* Carte *\/\n.carte-image-wrap { text-align: center; }\n\n.carte-image {\n  display: block !important;\n  width: 100% !important;\n  max-width: 100% !important;\n  height: auto !important;\n  margin: 0 auto !important;\n  border-radius: 12px;\n  box-shadow: 0 4px 12px rgba(0,0,0,0.08);\n}\n\n.carte-message {\n  color: #666;\n  font-style: italic;\n  text-align: center;\n  margin: 20px 0;\n}\n\n.infos-carte-distribution {\n  margin-top: 12px;\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: center;\n  gap: 20px;\n  font-size: 1rem;\n  color: #444;\n  text-align: center;\n}\n\n\/* Colonnes largeur *\/\n.col-gauche { flex: 0 0 20%; max-width: 20%; }\n.col-milieu { flex: 0 0 30%; max-width: 30%; }\n.col-droite { flex: 0 0 45%; max-width: 45%; }\n\n\/* Traits climate charts *\/\n.traits-climate-charts {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 24px;\n  margin-top: 35px;\n  width: 100%;\n}\n\n.trait-chart-card {\n  background: #ffffff;\n  border-radius: 14px;\n  padding: 18px;\n  box-shadow: 0 4px 18px rgba(0,0,0,0.08);\n  min-height: 340px;\n}\n\n.trait-chart-card h4 {\n  margin: 0 0 15px;\n  color: #824c22;\n  font-size: 16px;\n  font-weight: 700;\n  text-transform: uppercase;\n}\n\n.trait-chart-card canvas {\n  width: 100% !important;\n  height: 280px !important;\n}\n\n\/* =======================================================\n   OVERLAY CHARGEMENT\n   ======================================================= *\/\n\n\n\/* Fond page *\/\nbody::before {\n  content: \"\";\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100vw;\n  height: 100vh;\n  background-image: url('https:\/\/fiches-especes.simonpotier.fr\/wp-content\/uploads\/2026\/02\/alan_frijns-tropical-7459826-scaled.jpg');\n  background-size: cover;\n  background-position: center;\n  background-repeat: no-repeat;\n  z-index: -1;\n  opacity: 0.5;\n}\n\n\/* =======================================================\n   RESPONSIVE MOBILE\n   ======================================================= *\/\n@media (max-width: 768px) {\n  .intro-cols,\n  .morpho-wrapper,\n  .rythme-liste,\n  .charts-wrapper {\n    flex-direction: column !important;\n    align-items: stretch !important;\n  }\n\n  .col-gauche,\n  .col-milieu,\n  .col-droite,\n  .morpho-image,\n  .morpho-texte,\n  .chart-container {\n    max-width: 100% !important;\n    flex: none !important;\n    width: 100% !important;\n  }\n\n  .rythme-liste { gap: 5px !important; margin-top: 10px !important; padding: 0 !important; }\n  .rythme-liste > div { padding: 4px 0 !important; margin: 0 !important; flex: none !important; }\n  .rythme-titre { font-size: 0.75rem !important; margin-bottom: 2px !important; }\n  .rythme-valeur { font-size: 1rem !important; }\n  .rythme-source { font-size: 0.65rem !important; }\n\n  #search-espece input[type=\"text\"] { max-width: 90%; }\n\n  .bloc { margin: 10px 10px; padding: 15px; }\n  .taxonomy-tree { margin-left: 5px; font-size: 14px; }\n  #image-wiki-test img { max-width: 100%; }\n  .uicn-double-col { flex-direction: column !important; }\n  .uicn-col { max-width: 100% !important; width: 100% !important; flex: none !important; }\n  .annexes-labels, .annexes-valeurs { gap: 30px !important; }\n  .traits-climate-charts { grid-template-columns: 1fr; }\n}\n\nhtml, body { overflow-x: hidden !important; max-width: 100% !important; }\n\n.bloc,\n.chart-container,\n.morpho-wrapper,\n.morpho-image,\n.morpho-image img,\n#image-wiki-test img,\ncanvas,\nimg {\n  max-width: 100% !important;\n  box-sizing: border-box !important;\n  overflow-x: hidden !important;\n}\n\n#bloc-regime { overflow: visible !important; max-height: none !important; }\n<\/style>\n\n<!-- \u2705 Conteneur principal -->\n<div id=\"fiche-espece\">\n\n  <div class=\"bloc\" id=\"bloc-intro-complet\">\n    <div id=\"nom-principal\" class=\"nom-principal-global\"><\/div>\n    <div class=\"intro-cols\">\n      <div class=\"col-gauche\">\n        <div id=\"image-wiki-test\" style=\"overflow: hidden; display: none;\"><\/div>\n      <\/div>\n      <div class=\"col-milieu\">\n        <div id=\"bloc-noms\"><\/div>\n        <div id=\"bloc-classification\"><\/div>\n      <\/div>\n      <div class=\"col-droite\">\n        <div id=\"carte-distribution\"><\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"bloc\" id=\"bloc-uicn\"><\/div>\n  <div class=\"bloc\" id=\"bloc-regime\"><\/div>\n  <div class=\"bloc\" id=\"bloc-rythme\"><\/div>\n  <div class=\"bloc\" id=\"morpho-mesures\"><\/div>\n\n<\/div>\n\n<script>\n  if (!document.querySelector('meta[name=\"viewport\"]')) {\n    const meta = document.createElement('meta');\n    meta.name = \"viewport\";\n    meta.content = \"width=device-width, initial-scale=1\";\n    document.head.appendChild(meta);\n  }\n<\/script>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function () {\n\n  \/\/ =======================\n  \/\/ Traductions UICN\n  \/\/ =======================\n  function traduireCategorieUICN(valeur) {\n    const map = {\n      'EX': '\u00c9teint',\n      'EW': '\u00c9teint dans la nature',\n      'CR': 'En danger critique',\n      'EN': 'En danger',\n      'VU': 'Vuln\u00e9rable',\n      'NT': 'Quasi menac\u00e9e',\n      'LC': 'Pr\u00e9occupation mineure',\n      'DD': 'Donn\u00e9es insuffisantes',\n      'NA': 'Inconnu'\n    };\n    return map[valeur?.toUpperCase()] || 'Inconnu';\n  }\n\n  function traduireTendancePopulation(valeur) {\n    if (!valeur) return 'Inconnue';\n    const clean = valeur.toString().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\").replace(\/[\\r\\n\\t]\/g, \"\").trim().toUpperCase();\n    const map = {\n      'DECREASING': 'En baisse',\n      'INCREASING': 'En hausse',\n      'STABLE': 'Stable',\n      'UNKNOWN': 'Inconnue',\n      'NA': 'Inconnue'\n    };\n    return map[clean] || 'Inconnue';\n  }\n\n  const input = document.querySelector('#search-espece input[type=\"text\"]');\n  const suggestionBox = document.createElement('div');\n  suggestionBox.id = 'suggestions';\n  document.getElementById('search-espece').appendChild(suggestionBox);\n\n  function removeDiacritics(str) {\n    return str.normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\").toLowerCase();\n  }\n\n  function decodeTexte(str) {\n    const textarea = document.createElement('textarea');\n    textarea.innerHTML = str;\n    return textarea.value;\n  }\n\n  suggestionBox.addEventListener('wheel', function (e) {\n    if (\n      (e.deltaY > 0 && suggestionBox.scrollTop + suggestionBox.clientHeight < suggestionBox.scrollHeight) ||\n      (e.deltaY < 0 && suggestionBox.scrollTop > 0)\n    ) { e.stopPropagation(); }\n  }, { passive: true });\n\n  const blocs = {\n    noms: document.getElementById('bloc-noms'),\n    classification: document.getElementById('bloc-classification'),\n    uicn: document.getElementById('bloc-uicn'),\n    rythme: document.getElementById('bloc-rythme'),\n    regime: document.getElementById('bloc-regime'),\n    reproduction: null,\n    morpho: document.getElementById('morpho-mesures'),\n    image: document.getElementById('image-wiki-test')\n  };\n\n  let fuse;\n  let donneesCSV = [];\n\n  \/\/ =======================\n  \/\/ \u2705 Chargement via API REST WordPress (m\u00eame syst\u00e8me que les oiseaux)\n  \/\/ \u26a0\ufe0f Requiert le shortcode  plac\u00e9 au-dessus de ce widget\n  \/\/ =======================\n  async function loadDataFromApi() {\n\n    if (!window.FICHES_API || !window.FICHES_API.restUrl || !window.FICHES_API.nonce) {\n      console.error(\"FICHES_API absent. Assure-toi que  est pr\u00e9sent sur la page.\");\n      return;\n    }\n\n    \/\/ ---- 1) Charger l'INDEX l\u00e9ger ----\n    const indexPerPage = 2000;\n    let indexPage = 1;\n    let indexTotal = null;\n    let indexLoaded = 0;\n    let indexAll = [];\n\n    while (true) {\n      const urlIndex = window.FICHES_API.restUrl + `fiches\/v1\/index?page=${indexPage}&per_page=${indexPerPage}`;\n      let resp;\n      try {\n        resp = await fetch(urlIndex, {\n          method: 'GET',\n          credentials: 'same-origin',\n          headers: { 'Accept': 'application\/json', 'X-WP-Nonce': window.FICHES_API.nonce }\n        });\n      } catch (e) { console.error(\"Erreur r\u00e9seau fetch INDEX:\", e); return; }\n\n      if (!resp.ok) { console.error(\"API index error HTTP\", resp.status); return; }\n\n      let json;\n      try { json = await resp.json(); } catch (e) { console.error(\"API index JSON parse error:\", e); return; }\n\n      const items = Array.isArray(json?.items) ? json.items : [];\n      if (typeof json?.total === 'number') indexTotal = json.total;\n      indexAll = indexAll.concat(items);\n      indexLoaded += items.length;\n\n      if (items.length < indexPerPage) break;\n      indexPage++;\n      if (indexPage > 2000) break;\n    }\n\n    \/\/ Pr\u00e9pare index pour la recherche rapide\n    donneesCSV = (indexAll || []).filter(ligne => (ligne.English || ligne.scientificName || '').trim());\n    donneesCSV = donneesCSV.map(ligne => ({\n      ...ligne,\n      search_normalized: [\n        ligne.English,\n        ligne.scientificName,\n        ligne.New_latin,\n        ligne['Nom latin Ancien']\n      ].filter(Boolean).map(removeDiacritics).join(' ')\n    }));\n\n    fuse = new Fuse(donneesCSV, { keys: ['search_normalized'], threshold: 0.4 });\n\n    \/\/ ---- 2) Charger le DATA complet ----\n    const perPage = 200;\n    let page = 1;\n    let allItems = [];\n\n    while (true) {\n      const url = window.FICHES_API.restUrl + `fiches\/v1\/data?page=${page}&per_page=${perPage}`;\n      let resp;\n      try {\n        resp = await fetch(url, {\n          method: 'GET',\n          credentials: 'same-origin',\n          headers: { 'Accept': 'application\/json', 'X-WP-Nonce': window.FICHES_API.nonce }\n        });\n      } catch (e) { console.error(\"Erreur r\u00e9seau fetch DATA:\", e); return; }\n\n      if (!resp.ok) { console.error(\"API data error HTTP\", resp.status); return; }\n\n      let json;\n      try { json = await resp.json(); } catch (e) { console.error(\"API data JSON parse error:\", e); return; }\n\n      const items = Array.isArray(json?.items) ? json.items : [];\n      allItems = allItems.concat(items);\n\n      if (items.length < perPage) break;\n      page++;\n      if (page > 5000) break;\n    }\n\n    \/\/ Upgrade dataset complet\n    donneesCSV = (allItems || []).filter(ligne => (ligne.English || ligne.scientificName || '').trim());\n    donneesCSV = donneesCSV.map(ligne => ({\n      ...ligne,\n      search_normalized: [\n        ligne.English,\n        ligne.scientificName,\n        ligne.New_latin,\n        ligne['Nom latin Ancien']\n      ].filter(Boolean).map(removeDiacritics).join(' ')\n    }));\n\n    fuse = new Fuse(donneesCSV, { keys: ['search_normalized'], threshold: 0.4 });\n\n    chargerEspeceDepuisURL();\n  }\n\n  loadDataFromApi();\n\n  \/\/ =======================\n  \/\/ Affichage de la fiche\n  \/\/ =======================\n  function afficherEspece(espece) {\n    const blocIntro = document.getElementById('bloc-intro-complet');\n    if (blocIntro) blocIntro.style.display = 'block';\n\n    Object.values(blocs).forEach(b => { if (b) b.style.display = 'block'; });\n\n    \/\/ Titre principal : Nom anglais + New_latin\n    const nomPrincipal = document.getElementById('nom-principal');\n    if (nomPrincipal) {\n      nomPrincipal.innerHTML = `\n        <div class=\"nom-fr\">${espece.English || espece.scientificName || '\u2013'}<\/div>\n        <div class=\"nom-latin\"><em>${espece.New_latin || espece.scientificName || '\u2013'}<\/em><\/div>\n      `;\n    }\n\n    \/\/ Bloc noms (extensible \u2014 ajoute les langues ici plus tard)\n    blocs.noms.innerHTML = `\n      <h3>Noms<\/h3>\n      <p><span class=\"flag\">\ud83c\uddec\ud83c\udde7<\/span> ${espece.English || '\u2013'}<\/p>\n      <p><em style=\"color:#666;font-size:0.95rem;\">${espece.scientificName || '\u2013'}<\/em><\/p>\n    `;\n\n    \/\/ Image Wikipedia \u2014 New_latin en priorit\u00e9, fallback sur Nom latin Ancien\n    const imageTest = document.getElementById('image-wiki-test');\n    const nomLatinPrimaire = espece.New_latin?.trim().replace(\/_\/g, ' ');\n    const nomLatinFallback = espece['Nom latin Ancien']?.trim().replace(\/_\/g, ' ');\n\n    function fetchWikiImage(nomLatin, fallback) {\n      if (!nomLatin) {\n        if (fallback) { fetchWikiImage(fallback, null); return; }\n        if (imageTest) {\n          imageTest.style.display = 'block';\n          imageTest.innerHTML = `<p style=\"color:#888\">Nom latin manquant \u2013 pas de recherche d'image possible.<\/p>`;\n        }\n        return;\n      }\n\n      const wikiApiUrl = `https:\/\/en.wikipedia.org\/w\/api.php?action=query&format=json&formatversion=2&origin=*&prop=pageimages&piprop=original|thumbnail&pithumbsize=800&redirects=1&titles=${encodeURIComponent(nomLatin)}`;\n\n      fetch(wikiApiUrl)\n        .then(res => res.json())\n        .then(data => {\n          const page = data?.query?.pages?.[0];\n          if (page?.original?.source || page?.thumbnail?.source) {\n            const imgUrl = page.original?.source || page.thumbnail?.source;\n            if (imageTest) {\n              imageTest.style.display = 'block';\n              imageTest.innerHTML = `<img decoding=\"async\" src=\"${imgUrl}\" alt=\"Image Wikip\u00e9dia\" style=\"width:100%;height:auto;object-fit:cover;display:block;\">`;\n            }\n          } else if (fallback) {\n            fetchWikiImage(fallback, null);\n          } else {\n            if (imageTest) {\n              imageTest.style.display = 'block';\n              imageTest.innerHTML = `<p style=\"color:#888\">Aucune image trouv\u00e9e pour <em>${nomLatin}<\/em><\/p>`;\n            }\n          }\n        })\n        .catch(() => {\n          if (fallback) { fetchWikiImage(fallback, null); return; }\n          if (imageTest) {\n            imageTest.style.display = 'block';\n            imageTest.innerHTML = `<p style=\"color:red\">Erreur lors du chargement de l'image.<\/p>`;\n          }\n        });\n    }\n\n    fetchWikiImage(nomLatinPrimaire, nomLatinFallback);\n\n    \/\/ Classification compl\u00e8te\n    blocs.classification.innerHTML = `\n      <h3 style=\"margin-top: 40px;\">Classification<\/h3>\n      <div class=\"taxonomy-tree\">\n        <div class=\"niveau niveau-1\">\n          <div class=\"branche horizontale\"><\/div>\n          <div class=\"label\"><strong>R\u00e8gne<\/strong> : ${espece.Regne || 'Animalia'}<\/div>\n        <\/div>\n        <div class=\"branche verticale niveau-1\"><\/div>\n\n        <div class=\"niveau niveau-2\">\n          <div class=\"branche horizontale\"><\/div>\n          <div class=\"label\"><strong>Embranchement<\/strong> : ${espece.Embranchement || 'Chordata'}<\/div>\n        <\/div>\n        <div class=\"branche verticale niveau-2\"><\/div>\n\n        <div class=\"niveau niveau-3\">\n          <div class=\"branche horizontale\"><\/div>\n          <div class=\"label\"><strong>Sous-embranchement<\/strong> : ${espece['Sous embranchement'] || 'Vertebrata'}<\/div>\n        <\/div>\n        <div class=\"branche verticale niveau-3\"><\/div>\n\n        <div class=\"niveau niveau-4\">\n          <div class=\"branche horizontale\"><\/div>\n          <div class=\"label\"><strong>Classe<\/strong> : ${espece.Classe || 'Mammalia'}<\/div>\n        <\/div>\n        <div class=\"branche verticale niveau-4\"><\/div>\n\n        <div class=\"niveau niveau-5\">\n          <div class=\"branche horizontale\"><\/div>\n          <div class=\"label\"><strong>Ordre<\/strong> : ${espece.Order || '\u2013'}<\/div>\n        <\/div>\n        <div class=\"branche verticale niveau-5\"><\/div>\n\n        <div class=\"niveau niveau-6\">\n          <div class=\"branche horizontale\"><\/div>\n          <div class=\"label\"><strong>Famille<\/strong> : ${espece.family || '\u2013'}<\/div>\n        <\/div>\n        <div class=\"branche verticale niveau-6\"><\/div>\n\n        <div class=\"niveau niveau-7\">\n          <div class=\"branche horizontale\"><\/div>\n          <div class=\"label\"><strong>Genre<\/strong> : ${espece.genus || '\u2013'}<\/div>\n        <\/div>\n      <\/div>\n    `;\n\n    \/\/ Carte de distribution (bas\u00e9e sur New_latin)\n    const nomCarte = (espece.New_latin || espece.scientificName || '').trim().replace(\/\\s+\/g, '_');\n    const urlCarte = `https:\/\/fiches-especes.simonpotier.fr\/cartes\/${nomCarte}.jpg`;\n\n    const altMin = espece.AltMin ? parseInt(espece.AltMin) : (espece.lower_elevation_m ? parseInt(espece.lower_elevation_m) : null);\n    const altMax = espece.AltMax ? parseInt(espece.AltMax) : (espece.upper_elevation_m ? parseInt(espece.upper_elevation_m) : null);\n    const altDisplay = (!isNaN(altMin) && !isNaN(altMax) && altMin !== null && altMax !== null)\n      ? `${altMin}\u2013${altMax} m` : '\u2013';\n\n    const continents = espece.Continentes || '\u2013';\n\n    document.getElementById('carte-distribution').innerHTML = `\n      <div class=\"carte-distribution-wrap\">\n        <h3>Carte de distribution<\/h3>\n        <div class=\"carte-image-wrap\">\n          <img decoding=\"async\"\n            src=\"${urlCarte}\"\n            alt=\"\"\n            class=\"carte-image\"\n            onerror=\"this.style.display='none'; this.insertAdjacentHTML('afterend', '<p class=&quot;carte-message&quot;>Carte prochainement disponible<\/p>');\"\n          >\n        <\/div>\n        <div class=\"infos-carte-distribution\">\n          <div><strong>Continents :<\/strong> ${continents}<\/div>\n          <div><strong>Altitude :<\/strong> ${altDisplay}<\/div>\n        <\/div>\n      <\/div>\n    `;\n    document.getElementById('carte-distribution').style.display = 'block';\n\n    \/\/ ========================\n    \/\/ Bloc UICN\n    \/\/ ========================\n    const categorieUICN = traduireCategorieUICN(espece.redlistCategory);\n\n    const positionsUICN = {\n      'Donn\u00e9es insuffisantes': 10.55,\n      'Pr\u00e9occupation mineure': 23.69,\n      'Quasi menac\u00e9e': 36.84,\n      'Vuln\u00e9rable': 49.99,\n      'En danger': 63.14,\n      'En danger critique': 76.29,\n      '\u00c9teint dans la nature': 89.43\n    };\n    const largeurCategorie = 13.14;\n    const positionPercent = positionsUICN[categorieUICN] || 0;\n\n    function getEULabel(value) {\n      if (!value || value === '#N\/A') return '\u2013';\n      return value.trim().charAt(0).toUpperCase();\n    }\n\n    function getEUClass(value) {\n      if (!value || value === '#N\/A') return 'badge-eu-na';\n      switch (value.trim().charAt(0).toUpperCase()) {\n        case 'A': return 'badge-eu-a';\n        case 'B': return 'badge-eu-b';\n        case 'C': return 'badge-eu-c';\n        case 'D': return 'badge-eu-d';\n        default: return 'badge-eu-na';\n      }\n    }\n\n    function getCITESLabel(value) {\n      if (!value || value === '#N\/A') return '\u2013';\n      return value.trim().toUpperCase().split(\/[^I]\/)[0] || value.trim().charAt(0);\n    }\n\n    function getCITESClass(value) {\n      if (!value || value === '#N\/A') return 'badge-cites-na';\n      const upper = value.trim().toUpperCase();\n      if (upper.startsWith('III')) return 'badge-cites-iii';\n      if (upper.startsWith('II')) return 'badge-cites-ii';\n      if (upper.startsWith('I')) return 'badge-cites-i';\n      return 'badge-cites-na';\n    }\n\n    \/\/ CITES : ton CSV a deux colonnes CITES \u2014 on prend la derni\u00e8re non vide\n    const citesValue = espece['CITES'] || '';\n\n    blocs.uicn.innerHTML = `\n      <h3>Statut de protection<\/h3>\n      <div class=\"uicn-double-col\">\n\n        <!-- Tendance populations -->\n        <div class=\"uicn-col uicn-gauche\" style=\"display:flex;flex-direction:column;align-items:center;text-align:center;\">\n          <h4>Tendance des populations<\/h4>\n          <div style=\"display:flex;align-items:center;justify-content:center;gap:20px;height:100px;\">\n            ${(() => {\n              const tendance = (traduireTendancePopulation(espece.populationtrend) || '').toLowerCase();\n              if (tendance === 'en baisse') return `<svg width=\"50\" height=\"100\" viewBox=\"0 0 24 24\" fill=\"#d63031\"><path d=\"M11 3h2v10h4l-5 5-5-5h4V3z\"\/><\/svg><span style=\"font-size:1.4rem;font-weight:500;color:#d63031;\">En baisse<\/span>`;\n              if (tendance === 'en hausse') return `<svg width=\"50\" height=\"100\" viewBox=\"0 0 24 24\" fill=\"#00b894\"><path d=\"M13 21h-2V11H7l5-5 5 5h-4v10z\"\/><\/svg><span style=\"font-size:1.4rem;font-weight:500;color:#00b894;\">En hausse<\/span>`;\n              if (tendance === 'stable') return `<svg width=\"50\" height=\"100\" viewBox=\"0 0 24 24\" fill=\"#f1c40f\"><rect x=\"4\" y=\"11\" width=\"16\" height=\"2\"\/><\/svg><span style=\"font-size:1.4rem;font-weight:500;color:#f1c40f;\">Stable<\/span>`;\n              return `<span style=\"font-size:2.5rem;font-weight:700;color:#7f8c8d;\">?<\/span><span style=\"font-size:1.4rem;font-weight:500;color:#7f8c8d;\">Inconnue<\/span>`;\n            })()}\n          <\/div>\n        <\/div>\n\n        <!-- Statut UICN -->\n        <div class=\"uicn-col\" style=\"flex:1 1 50%;max-width:50%;display:flex;flex-direction:column;align-items:center;text-align:center;\">\n          <h4>Statut UICN<\/h4>\n          <div class=\"uicn-bar-container\" style=\"position:relative;width:100%;\">\n            <img decoding=\"async\"\n              src=\"https:\/\/fiches-especes.simonpotier.fr\/wp-content\/uploads\/2025\/12\/UICN-Categories-scaled.png\"\n              alt=\"Barre des statuts UICN\"\n              class=\"uicn-bar-image\"\n            >\n            <div style=\"position:absolute;top:0;left:calc(${positionPercent}% - ${largeurCategorie \/ 2}%);width:${largeurCategorie}%;height:100%;border:3px solid black;box-sizing:border-box;pointer-events:none;\"><\/div>\n            <div style=\"position:absolute;top:calc(90% - 1px);left:calc(${positionPercent}% - 12px);width:0;height:0;border-left:12px solid transparent;border-right:12px solid transparent;border-bottom:18px solid black;z-index:2;\"><\/div>\n          <\/div>\n        <\/div>\n\n        <!-- Annexes -->\n        <div class=\"uicn-col uicn-droite\" style=\"display:flex;flex-direction:column;align-items:center;text-align:center;\">\n          <h4>Annexes<\/h4>\n          <div class=\"annexes-ligne\">\n            <div class=\"annexes-labels\">\n              <span>EU<\/span>\n              <span>CITES<\/span>\n            <\/div>\n            <div class=\"annexes-valeurs\">\n              <span class=\"badge-eu ${getEUClass(espece.EU)}\">${getEULabel(espece.EU)}<\/span>\n              <span class=\"badge-cites ${getCITESClass(citesValue)}\">${getCITESLabel(citesValue)}<\/span>\n            <\/div>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    `;\n\n    \/\/ ========================\n    \/\/ Bloc R\u00e9gime alimentaire (mammif\u00e8res)\n    \/\/ ========================\n    google.charts.load('current', { packages: ['corechart'] });\n    google.charts.setOnLoadCallback(() => {\n      blocs.regime.innerHTML = `\n        <h3>R\u00e9gime alimentaire & Strat\u00e9gie de fourragement<\/h3>\n        <div class=\"charts-wrapper\">\n          <div class=\"chart-block\">\n            <div class=\"chart-container\" id=\"chart-diet\"><\/div>\n            <div id=\"legend-diet\" class=\"custom-legend\"><\/div>\n          <\/div>\n          <div class=\"chart-block\">\n            <div class=\"chart-container\" id=\"chart-strat\"><\/div>\n            <div id=\"legend-strat\" class=\"custom-legend\"><\/div>\n          <\/div>\n        <\/div>\n      `;\n\n      function drawCharts() {\n        const dietColorMap = {\n          'Invert\u00e9br\u00e9s': '#C7F464',\n          'Vert\u00e9br\u00e9s endothermes': '#FF6B6B',\n          'Vert\u00e9br\u00e9s ectothermes': '#C3B1E1',\n          'Poissons': '#4ECDC4',\n          'Vert\u00e9br\u00e9s inconnus': '#FFB6B9',\n          'Charognes': '#6C5B7B',\n          'Fruits': '#F67280',\n          'Nectars': '#FF9F1C',\n          'Graines': '#FFE66D',\n          'V\u00e9g\u00e9taux': '#B5EAD7'\n        };\n\n        \/\/ Colonnes de fourragement adapt\u00e9es aux mammif\u00e8res\n        const stratColorMap = {\n          'Aquatique': '#4ECDC4',\n          'Souterrain': '#8B6914',\n          'Au sol': '#FF6B6B',\n          'Arbustif': '#C7F464',\n          'Arboricole': '#FFE66D',\n          'A\u00e9rien': '#FF9F1C'\n        };\n\n        function prepareData(rows) {\n          const filtered = rows.filter(([_, value]) => value > 0);\n          let hasFake = false;\n          if (filtered.length === 1 && filtered[0][1] === 100) {\n            filtered.push(['', 0.00001]);\n            hasFake = true;\n          }\n          return { data: filtered, hasFake };\n        }\n\n        \/\/ R\u00e9gime alimentaire \u2014 colonnes mammif\u00e8res (det_*)\n        const rawDiet = [\n          ['Invert\u00e9br\u00e9s',           parseFloat(espece.det_inv)        || 0],\n          ['Vert\u00e9br\u00e9s endothermes', parseFloat(espece.det_vend)       || 0],\n          ['Vert\u00e9br\u00e9s ectothermes', parseFloat(espece.det_vect)       || 0],\n          ['Poissons',              parseFloat(espece.det_vfish)      || 0],\n          ['Vert\u00e9br\u00e9s inconnus',    parseFloat(espece.det_vunk)       || 0],\n          ['Charognes',             parseFloat(espece.det_scav)       || 0],\n          ['Fruits',                parseFloat(espece.det_fruit)      || 0],\n          ['Nectars',               parseFloat(espece.det_nect)       || 0],\n          ['Graines',               parseFloat(espece.det_seed)       || 0],\n          ['V\u00e9g\u00e9taux',              parseFloat(espece.det_plantother) || 0]\n        ].filter(d => d[1] > 0).sort((a, b) => b[1] - a[1]);\n\n        \/\/ Strates de fourragement \u2014 colonne foraging_stratum (valeur texte)\n        \/\/ On adapte selon les valeurs possibles dans ton CSV\n        const foragingRaw = (espece.foraging_stratum || espece.Foraging_strata || '').toLowerCase();\n        const rawStrat = [\n          ['Aquatique',  foragingRaw.includes('aquatic') || foragingRaw.includes('water') ? 100 : 0],\n          ['Souterrain', foragingRaw.includes('sub') || foragingRaw.includes('fossil') ? 100 : 0],\n          ['Au sol',     foragingRaw.includes('ground') || foragingRaw.includes('terrestr') ? 100 : 0],\n          ['Arbustif',   foragingRaw.includes('shrub') || foragingRaw.includes('under') ? 100 : 0],\n          ['Arboricole', foragingRaw.includes('arboreal') || foragingRaw.includes('tree') ? 100 : 0],\n          ['A\u00e9rien',     foragingRaw.includes('aerial') || foragingRaw.includes('air') ? 100 : 0]\n        ].filter(d => d[1] > 0);\n\n        const preparedDiet = prepareData(rawDiet);\n        const preparedStrat = prepareData(rawStrat.length > 0 ? rawStrat : [['Donn\u00e9es non disponibles', 100]]);\n\n        const dataDiet = google.visualization.arrayToDataTable([['Type', 'Pourcentage'], ...preparedDiet.data]);\n        const dataStrat = google.visualization.arrayToDataTable([['Strate', 'Pourcentage'], ...preparedStrat.data]);\n\n        const containerWidth = document.getElementById('chart-diet')?.offsetWidth || 300;\n\n        function getColorsFromMap(dataTable, colorMap) {\n          const colors = [];\n          for (let i = 0; i < dataTable.getNumberOfRows(); i++) {\n            const label = dataTable.getValue(i, 0);\n            colors.push(!label ? 'transparent' : (colorMap[label] || '#cccccc'));\n          }\n          return colors;\n        }\n\n        function makeSlices(dataTable, hasFake) {\n          const slices = {};\n          if (hasFake) {\n            const lastIndex = dataTable.getNumberOfRows() - 1;\n            slices[lastIndex] = { color: 'transparent', textStyle: { color: 'transparent' } };\n          }\n          return slices;\n        }\n\n        const baseOptions = {\n          pieHole: 0.4,\n          width: containerWidth,\n          height: Math.round(containerWidth * 0.75),\n          legend: 'none',\n          pieSliceText: 'percentage',\n          tooltip: { text: 'value' },\n          chartArea: { width: '90%', height: '80%' },\n          pieSliceBorderColor: 'transparent',\n          sliceVisibilityThreshold: 0\n        };\n\n        const chartDiet = new google.visualization.PieChart(document.getElementById('chart-diet'));\n        const chartStrat = new google.visualization.PieChart(document.getElementById('chart-strat'));\n\n        chartDiet.draw(dataDiet, { ...baseOptions, colors: getColorsFromMap(dataDiet, dietColorMap), slices: makeSlices(dataDiet, preparedDiet.hasFake) });\n        chartStrat.draw(dataStrat, { ...baseOptions, colors: getColorsFromMap(dataStrat, stratColorMap), slices: makeSlices(dataStrat, preparedStrat.hasFake) });\n\n        function generateLegend(elementId, dataTable, colorMap) {\n          const container = document.getElementById(elementId);\n          if (!container) return;\n          container.innerHTML = '';\n          for (let i = 0; i < dataTable.getNumberOfRows(); i++) {\n            const label = dataTable.getValue(i, 0);\n            const value = dataTable.getValue(i, 1);\n            const color = colorMap[label] || '#ccc';\n            if (!label || !value || isNaN(value) || value === 0) continue;\n            const item = document.createElement('div');\n            item.className = 'legend-item';\n            item.innerHTML = `<span class=\"legend-color\" style=\"background:${color};\"><\/span><span>${label} \u2013 ${value}%<\/span>`;\n            container.appendChild(item);\n          }\n        }\n\n        generateLegend('legend-diet', dataDiet, dietColorMap);\n        generateLegend('legend-strat', dataStrat, stratColorMap);\n      }\n\n      drawCharts();\n      window.addEventListener('resize', drawCharts);\n    });\n\n    \/\/ ========================\n    \/\/ Bloc Traits fonctionnels (mammif\u00e8res)\n    \/\/ \u2014 tu me diras quoi mettre ici au prochain bloc\n    \/\/ ========================\n    blocs.rythme.innerHTML = `\n      <h3>Traits fonctionnels<\/h3>\n      <div class=\"rythme-liste\">\n\n        <div>\n          <div class=\"rythme-titre\">ACTIVIT\u00c9<\/div>\n          <div class=\"rythme-valeur\">${(() => {\n            const val = espece.activity_cycle || espece.Activity || '';\n            const map = { '1': 'Nocturne', '2': 'Cr\u00e9pusculaire', '3': 'Diurne', 'nocturnal': 'Nocturne', 'diurnal': 'Diurne', 'cathemeral': 'Cathem\u00e9ral' };\n            return map[val.toLowerCase()] || map[val] || val || '\u2013';\n          })()}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">LOCOMOTION<\/div>\n          <div class=\"rythme-valeur\">${espece.Locomotion || '\u2013'}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">HIBERNATION \/ TORPEUR<\/div>\n          <div class=\"rythme-valeur\">${(() => {\n            const val = (espece.hibernation_torpor || '').toString().trim().toLowerCase();\n            if (val === '1' || val === 'yes' || val === 'true') return 'Oui';\n            if (val === '0' || val === 'no' || val === 'false') return 'Non';\n            return val || '\u2013';\n          })()}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">MILIEU<\/div>\n          <div class=\"rythme-valeur\">${(() => {\n            const milieux = [];\n            if (espece.freshwater === '1' || espece.freshwater === 1) milieux.push('Eau douce');\n            if (espece.marine === '1' || espece.marine === 1) milieux.push('Marin');\n            if (espece['terrestrial_non,volant'] === '1' || espece['terrestrial_non,volant'] === 1) milieux.push('Terrestre');\n            if (espece.terrestrial_volant === '1' || espece.terrestrial_volant === 1) milieux.push('Volant');\n            return milieux.length > 0 ? milieux.join(', ') : '\u2013';\n          })()}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">MASSE ADULTE<\/div>\n          <div class=\"rythme-valeur\">${(() => {\n            const g = parseFloat(espece.adult_mass_g);\n            if (isNaN(g)) return '\u2013';\n            if (g >= 1000000) return (g \/ 1000000).toFixed(2) + ' t';\n            if (g >= 1000) return (g \/ 1000).toFixed(1) + ' kg';\n            return Math.round(g) + ' g';\n          })()}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">LONG\u00c9VIT\u00c9 MAX.<\/div>\n          <div class=\"rythme-valeur-wrapper\">\n            <div class=\"rythme-valeur\">${(() => {\n              const d = parseFloat(espece.max_longevity_d);\n              if (isNaN(d)) return '\u2013';\n              return Math.round(d \/ 365.25) + ' ans';\n            })()}<\/div>\n          <\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">DISPERSION<\/div>\n          <div class=\"rythme-valeur\">${(() => {\n            const d = parseFloat(espece.dispersal_km);\n            if (isNaN(d)) return '\u2013';\n            return d.toFixed(1) + ' km';\n          })()}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">DOMAINE VITAL<\/div>\n          <div class=\"rythme-valeur\">${(() => {\n            const val = parseFloat(espece['22-1_HomeRange_km2']);\n            if (isNaN(val)) return '\u2013';\n            return val.toFixed(2) + ' km\u00b2';\n          })()}<\/div>\n        <\/div>\n\n      <\/div>\n\n      <div class=\"traits-climate-charts\">\n        <div class=\"trait-chart-card\">\n          <h4>Niche thermique<\/h4>\n          <canvas id=\"temperatureChart\"><\/canvas>\n        <\/div>\n        <div class=\"trait-chart-card\">\n          <h4>Niche d'aridit\u00e9<\/h4>\n          <canvas id=\"aridityChart\"><\/canvas>\n        <\/div>\n      <\/div>\n    `;\n\n    createClimateCharts(espece);\n\n    \/\/ ========================\n    \/\/ Bloc Reproduction (mammif\u00e8res)\n    \/\/ ========================\n    const oldRepro = document.getElementById('bloc-reproduction');\n    if (oldRepro) oldRepro.remove();\n\n    blocs.reproduction = document.createElement('div');\n    blocs.reproduction.className = 'bloc';\n    blocs.reproduction.id = 'bloc-reproduction';\n    document.getElementById('morpho-mesures').before(blocs.reproduction);\n    blocs.reproduction.style.display = 'block';\n\n    function formatDays(val) {\n      const d = parseFloat(val);\n      if (isNaN(d)) return '\u2013';\n      if (d >= 365) return (d \/ 365.25).toFixed(1) + ' ans';\n      return Math.round(d) + ' j';\n    }\n\n    function formatN(val) {\n      const n = parseFloat(val);\n      return isNaN(n) ? '\u2013' : n.toFixed(2);\n    }\n\n    blocs.reproduction.innerHTML = `\n      <h3>Reproduction<\/h3>\n      <div class=\"rythme-liste\">\n\n        <div>\n          <div class=\"rythme-titre\">GESTATION<\/div>\n          <div class=\"rythme-valeur\">${formatDays(espece.gestation_length_d)}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">TAILLE DE PORT\u00c9E<\/div>\n          <div class=\"rythme-valeur\">${formatN(espece.litter_size_n)}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">PORT\u00c9ES \/ AN<\/div>\n          <div class=\"rythme-valeur\">${formatN(espece.litters_per_year_n)}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">SEVRAGE<\/div>\n          <div class=\"rythme-valeur\">${formatDays(espece.weaning_age_d)}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">\u00c2GE MATURIT\u00c9 \u2640<\/div>\n          <div class=\"rythme-valeur\">${formatDays(espece.female_maturity_d || espece.maturity_d)}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">INTERVALLE ENTRE PORT\u00c9ES<\/div>\n          <div class=\"rythme-valeur\">${formatDays(espece.interbirth_interval_d)}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">MASSE N\u00c9ONATE<\/div>\n          <div class=\"rythme-valeur\">${(() => {\n            const g = parseFloat(espece.neonate_mass_g || espece['5-3_NeonateBodyMass_g']);\n            if (isNaN(g)) return '\u2013';\n            return g >= 1000 ? (g \/ 1000).toFixed(1) + ' kg' : Math.round(g) + ' g';\n          })()}<\/div>\n        <\/div>\n\n        <div>\n          <div class=\"rythme-titre\">MASSE AU SEVRAGE<\/div>\n          <div class=\"rythme-valeur\">${(() => {\n            const g = parseFloat(espece.weaning_mass_g || espece['5-4_WeaningBodyMass_g']);\n            if (isNaN(g)) return '\u2013';\n            return g >= 1000 ? (g \/ 1000).toFixed(1) + ' kg' : Math.round(g) + ' g';\n          })()}<\/div>\n        <\/div>\n\n      <\/div>\n    `;\n\n    \/\/ ========================\n    \/\/ Bloc Morphologie\n    \/\/ \u2014 tu me diras quoi mettre ici\n    \/\/ ========================\n    blocs.morpho.innerHTML = `\n      <h3>Donn\u00e9es morphologiques<\/h3>\n      <div class=\"morpho-wrapper\">\n        <div class=\"morpho-texte\">\n          ${[\n            { label: \"Longueur corps adulte\",   val: espece.adult_body_length_mm, unit: \" mm\" },\n            { label: \"Longueur avant-bras\",      val: espece['adult_forearm_length_mm'] || espece['8-1_AdultForearmLen_mm'], unit: \" mm\" },\n            { label: \"Longueur t\u00eate-corps\",      val: espece['13-1_AdultHeadBodyLen_mm'], unit: \" mm\" },\n            { label: \"Longueur t\u00eate-corps (n\u00e9onate)\", val: espece['13-2_NeonateHeadBodyLen_mm'], unit: \" mm\" },\n            { label: \"Masse adulte\",             val: (() => { const g = parseFloat(espece.adult_mass_g); if (isNaN(g)) return null; return g >= 1000 ? (g\/1000).toFixed(1) + ' kg' : Math.round(g) + ' g'; })(), unit: \"\" },\n            { label: \"Masse c\u00e9r\u00e9brale\",          val: espece.adult_brain_mass_g, unit: \" g\" },\n            { label: \"Nombre de t\u00e9tines\",        val: espece.teat_number_n || espece['24-1_TeatNumber'], unit: \"\" },\n            { label: \"Densit\u00e9 de population\",    val: espece['21-1_PopulationDensity_n\/km2'], unit: \" ind\/km\u00b2\" }\n          ].map(d => {\n            const valAffichee = d.val && d.val !== '#N\/A' && d.val !== '' ? d.val + d.unit : '\u2013';\n            return `<p><strong>${d.label} :<\/strong> ${valAffichee}<\/p>`;\n          }).join('')}\n        <\/div>\n        <div class=\"morpho-image\">\n          <!-- Remplace cette image par une illustration mammif\u00e8re si tu en as une -->\n          <img decoding=\"async\"\n            src=\"https:\/\/fiches-especes.simonpotier.fr\/wp-content\/uploads\/2025\/11\/Morphologie-scaled.jpg\"\n            alt=\"Illustration morphologique du mammif\u00e8re\"\n          >\n        <\/div>\n      <\/div>\n    `;\n  }\n\n  \/\/ =======================\n  \/\/ Graphiques climatiques\n  \/\/ =======================\n  let temperatureChartInstance = null;\n  let aridityChartInstance = null;\n\n  function parseClimateValue(value) {\n    if (value === undefined || value === null) return null;\n    const clean = value.toString().trim().replace(',', '.');\n    if (!clean || clean === '#N\/A' || clean.toLowerCase() === 'na') return null;\n    const number = parseFloat(clean);\n    return isNaN(number) ? null : number;\n  }\n\n  function getClimateValue(espece, month, type, minMax) {\n    const m1 = String(month).padStart(2, '0');\n    const m2 = String(month);\n    const possibleKeys = [\n      `${m1}_${type}${minMax}`,\n      `${m2}_${type}${minMax}`,\n      `${m1}_${type}_${minMax}`,\n      `${m2}_${type}_${minMax}`,\n      `${m1}${type}${minMax}`\n    ];\n    for (const key of possibleKeys) {\n      if (Object.prototype.hasOwnProperty.call(espece, key)) {\n        return parseClimateValue(espece[key]);\n      }\n    }\n    return null;\n  }\n\n  function createClimateCharts(espece) {\n    const tempCanvas = document.getElementById('temperatureChart');\n    const aridCanvas = document.getElementById('aridityChart');\n    if (!tempCanvas || !aridCanvas || typeof Chart === 'undefined') return;\n    if (temperatureChartInstance) temperatureChartInstance.destroy();\n    if (aridityChartInstance) aridityChartInstance.destroy();\n\n    const mois = ['Jan', 'F\u00e9v', 'Mar', 'Avr', 'Mai', 'Juin', 'Juil', 'Ao\u00fbt', 'Sep', 'Oct', 'Nov', 'D\u00e9c'];\n    const tempMin = [], tempMax = [], aridMin = [], aridMax = [];\n\n    for (let i = 1; i <= 12; i++) {\n      tempMin.push(getClimateValue(espece, i, 'T', 'Min'));\n      tempMax.push(getClimateValue(espece, i, 'T', 'Max'));\n      aridMin.push(getClimateValue(espece, i, 'A', 'Min'));\n      aridMax.push(getClimateValue(espece, i, 'A', 'Max'));\n    }\n\n    temperatureChartInstance = drawRangeChart(tempCanvas, mois, tempMin, tempMax, 'Temp\u00e9rature (\u00b0C)', '#2f7d32', 'rgba(82,170,82,0.25)');\n    aridityChartInstance = drawRangeChart(aridCanvas, mois, aridMin, aridMax, \"Indice d'aridit\u00e9\", '#b7791f', 'rgba(211,151,45,0.25)', true);\n  }\n\n  function drawRangeChart(canvas, labels, minData, maxData, yTitle, darkColor, lightColor, autoScale = false) {\n    return new Chart(canvas, {\n      type: 'line',\n      data: {\n        labels: labels,\n        datasets: [\n          { label: 'Maximum', data: maxData, borderColor: 'transparent', backgroundColor: lightColor, pointRadius: 0, fill: '+1', tension: 0.35 },\n          { label: 'Minimum', data: minData, borderColor: 'transparent', backgroundColor: lightColor, pointRadius: 0, fill: false, tension: 0.35 }\n        ]\n      },\n      options: {\n        responsive: true,\n        maintainAspectRatio: false,\n        interaction: { mode: 'index', intersect: false },\n        plugins: {\n          legend: { display: false },\n          tooltip: { callbacks: { label: ctx => ctx.raw === null ? '' : `${ctx.dataset.label} : ${Number(ctx.raw).toFixed(2)}` } }\n        },\n        scales: {\n          y: {\n            beginAtZero: !autoScale,\n            title: { display: true, text: yTitle, font: { size: 14, weight: '600' } },\n            ticks: { font: { size: 13 } },\n            grid: { color: 'rgba(0,0,0,0.08)' }\n          },\n          x: {\n            ticks: { font: { size: 13 } },\n            grid: { color: 'rgba(0,0,0,0.05)' }\n          }\n        }\n      }\n    });\n  }\n\n  \/\/ =======================\n  \/\/ Recherche + suggestions\n  \/\/ =======================\n  let selectedIndex = -1;\n  let currentSuggestions = [];\n\n  input.addEventListener('input', function () {\n    if (input.disabled) return;\n    const saisie = removeDiacritics(input.value.trim());\n    suggestionBox.innerHTML = '';\n    selectedIndex = -1;\n    currentSuggestions = [];\n    if (!saisie || !fuse) return;\n\n    let resultats = fuse.search(saisie);\n    resultats.sort((a, b) => {\n      const aStarts = a.item.search_normalized.startsWith(saisie);\n      const bStarts = b.item.search_normalized.startsWith(saisie);\n      if (aStarts && !bStarts) return -1;\n      if (!aStarts && bStarts) return 1;\n      return 0;\n    });\n\n    currentSuggestions = resultats.slice(0, 10);\n\n    currentSuggestions.forEach((result, index) => {\n      const nom = decodeTexte(result.item.English || result.item.scientificName || '\u2013');\n      const nomLatin = decodeTexte(result.item.New_latin || result.item.scientificName || '\u2013');\n      const div = document.createElement('div');\n      div.innerHTML = `<strong>${nom}<\/strong> \u2013 <em>${nomLatin}<\/em>`;\n      div.setAttribute('data-index', index);\n      div.addEventListener('click', () => {\n        input.value = nom;\n        suggestionBox.innerHTML = '';\n        afficherEspece(result.item);\n      });\n      suggestionBox.appendChild(div);\n    });\n  });\n\n  input.addEventListener('keydown', function (e) {\n    if (input.disabled) return;\n    const suggestionItems = suggestionBox.querySelectorAll('div');\n    if (e.key === 'ArrowDown') {\n      e.preventDefault();\n      if (!currentSuggestions.length) return;\n      selectedIndex = (selectedIndex + 1) % currentSuggestions.length;\n      updateHighlight(suggestionItems);\n    } else if (e.key === 'ArrowUp') {\n      e.preventDefault();\n      if (!currentSuggestions.length) return;\n      selectedIndex = (selectedIndex - 1 + currentSuggestions.length) % currentSuggestions.length;\n      updateHighlight(suggestionItems);\n    } else if (e.key === 'Enter') {\n      e.preventDefault();\n      if (selectedIndex >= 0 && currentSuggestions[selectedIndex]) {\n        const item = currentSuggestions[selectedIndex].item;\n        input.value = item.English || item.scientificName;\n        suggestionBox.innerHTML = '';\n        afficherEspece(item);\n      } else {\n        const saisie = removeDiacritics(input.value.trim());\n        if (!saisie || !fuse) return;\n        const resultats = fuse.search(saisie);\n        if (resultats.length > 0) { afficherEspece(resultats[0].item); suggestionBox.innerHTML = ''; }\n      }\n    }\n  });\n\n  function chargerEspeceDepuisURL() {\n    const params = new URLSearchParams(window.location.search);\n    const especeParam = params.get('espece');\n    if (!especeParam || !donneesCSV.length) return;\n    const valeur = removeDiacritics(especeParam.trim());\n    const matchExact = donneesCSV.find(item =>\n      removeDiacritics(item.English || '') === valeur ||\n      removeDiacritics(item.New_latin || '') === valeur ||\n      removeDiacritics(item.scientificName || '') === valeur\n    );\n    if (matchExact) { afficherEspece(matchExact); return; }\n    if (fuse) {\n      const resultats = fuse.search(valeur);\n      if (resultats.length > 0) afficherEspece(resultats[0].item);\n    }\n  }\n\n  function updateHighlight(items) {\n    items.forEach((item, index) => {\n      const isActive = index === selectedIndex;\n      item.classList.toggle('highlight', isActive);\n      if (isActive) item.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n    });\n  }\n\n});\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ffc61b9 elementor-widget elementor-widget-html\" data-id=\"ffc61b9\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- Librairies pour l'export -->\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\r\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js\"><\/script>\r\n\r\n<script>\r\n  document.addEventListener('DOMContentLoaded', function () {\r\n    const btnExport = document.getElementById('btn-export-pdf');\r\n\r\n    if (!btnExport) {\r\n      console.warn(\"\ud83d\udd34 Bouton #btn-export-pdf introuvable\");\r\n      return;\r\n    }\r\n\r\n    btnExport.addEventListener('click', async () => {\r\n      const elements = [\r\n        document.getElementById('bloc-noms'),\r\n        document.getElementById('bloc-classification'),\r\n        document.getElementById('bloc-rythme'),\r\n        document.getElementById('bloc-regime'),\r\n        document.getElementById('bloc-uicn'),\r\n        document.getElementById('morphologie') \/\/ \u2705 Bloc morphologie ajout\u00e9 ici\r\n      ];\r\n\r\n      const { jsPDF } = window.jspdf;\r\n      const doc = new jsPDF('p', 'mm', 'a4');\r\n      let positionY = 10;\r\n\r\n      for (const el of elements) {\r\n        if (!el) continue;\r\n\r\n        const canvas = await html2canvas(el, { scale: 2 });\r\n        const imgData = canvas.toDataURL('image\/png');\r\n\r\n        const imgWidth = 180;\r\n        const imgHeight = (canvas.height * imgWidth) \/ canvas.width;\r\n\r\n        if (positionY + imgHeight > 280) {\r\n          doc.addPage();\r\n          positionY = 10;\r\n        }\r\n\r\n        doc.addImage(imgData, 'PNG', 15, positionY, imgWidth, imgHeight);\r\n        positionY += imgHeight + 10;\r\n      }\r\n\r\n      doc.save('fiche-espece.pdf');\r\n    });\r\n  });\r\n<\/script>\r\n\t\t\t\t<\/div>\n\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-b63641d e-flex e-con-boxed parallax_section_no qode_elementor_container_no e-con e-parent\" data-id=\"b63641d\" 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-9e7cade elementor-widget elementor-widget-html\" data-id=\"9e7cade\" data-element_type=\"widget\" id=\"bloc-noms\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3bffc9e elementor-widget elementor-widget-html\" data-id=\"3bffc9e\" data-element_type=\"widget\" id=\"bloc-classification\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t \t\t\t\t<\/div>\n\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-d6485e4 e-flex e-con-boxed parallax_section_no qode_elementor_container_no e-con e-parent\" data-id=\"d6485e4\" 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-2e9f183 elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"2e9f183\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"bloc-uicn\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-78be4bb elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"78be4bb\" data-element_type=\"widget\" id=\"bloc-regime\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t \t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-82eb339 elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"82eb339\" data-element_type=\"widget\" id=\"bloc-rythme\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t \t\t\t\t<\/div>\n\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-49ceeda e-flex e-con-boxed parallax_section_no qode_elementor_container_no e-con e-parent\" data-id=\"49ceeda\" 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-e4ee36f elementor-widget__width-inherit elementor-widget elementor-widget-html\" data-id=\"e4ee36f\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\r\n<div id=\"morphologie\">\r\n\t\t\t\t<\/div>\n\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-cb0cc33 e-flex e-con-boxed parallax_section_no qode_elementor_container_no e-con e-parent\" data-id=\"cb0cc33\" 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-0bcfb53 elementor-widget elementor-widget-html\" data-id=\"0bcfb53\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\r\n  \/\/ \u274c D\u00e9sactiver s\u00e9lection de texte\r\n  document.addEventListener('selectstart', e => e.preventDefault());\r\n\r\n  \/\/ \u274c D\u00e9sactiver glisser-d\u00e9poser\r\n  document.addEventListener('dragstart', e => e.preventDefault());\r\n\r\n  \/\/ \u274c R\u00e9action \u00e0 la touche \"Print Screen\"\r\n  document.addEventListener('keydown', function(e) {\r\n    if (e.key === 'PrintScreen') {\r\n      alert(\"La capture d\u2019\u00e9cran est d\u00e9sactiv\u00e9e sur ce site.\");\r\n      document.body.style.filter = \"blur(10px)\";\r\n      setTimeout(() => {\r\n        document.body.style.filter = \"none\";\r\n      }, 2000);\r\n    }\r\n  });\r\n  \r\n    \/\/ \u274c R\u00e9sactiver  Ctrl+P\r\n  document.addEventListener('keydown', function(e) {\r\n  if ((e.ctrlKey || e.metaKey) && e.key === 'p') {\r\n    e.preventDefault();\r\n    alert(\"L'impression est d\u00e9sactiv\u00e9e sur ce site.\");\r\n  }\r\n});\r\n\r\n<\/script>\r\n\r\n\r\n\t\t\t\t<\/div>\n\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-9f4a56e e-flex e-con-boxed parallax_section_no qode_elementor_container_no e-con e-parent\" data-id=\"9f4a56e\" 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-7b6ccf5 elementor-widget elementor-widget-html\" data-id=\"7b6ccf5\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<?php echo do_shortcode('[fiches_rest_nonce]'); ?>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"pmpro_default_level":"","footnotes":""},"class_list":["post-2007","page","type-page","status-publish","hentry","pmpro-has-access"],"_links":{"self":[{"href":"https:\/\/spes.anivise.fr\/index.php\/wp-json\/wp\/v2\/pages\/2007","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spes.anivise.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spes.anivise.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spes.anivise.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spes.anivise.fr\/index.php\/wp-json\/wp\/v2\/comments?post=2007"}],"version-history":[{"count":34,"href":"https:\/\/spes.anivise.fr\/index.php\/wp-json\/wp\/v2\/pages\/2007\/revisions"}],"predecessor-version":[{"id":2044,"href":"https:\/\/spes.anivise.fr\/index.php\/wp-json\/wp\/v2\/pages\/2007\/revisions\/2044"}],"wp:attachment":[{"href":"https:\/\/spes.anivise.fr\/index.php\/wp-json\/wp\/v2\/media?parent=2007"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}