<?xml 
version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="https://dev.chrysleg.fr/spip.php?page=backend.xslt" ?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>BAS</title>
	<link>https://www.dev.chrysleg.fr/</link>
	<description></description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://dev.chrysleg.fr/spip.php?id_rubrique=1&amp;page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>BAS</title>
		<url>https://dev.chrysleg.fr/local/cache-vignettes/L144xH138/logo-principal-d2cd0.webp?1777451617</url>
		<link>https://www.dev.chrysleg.fr/</link>
		<height>138</height>
		<width>144</width>
	</image>



<item xml:lang="fr">
		<title>Mod&#232;le carte interactive pour SPIP</title>
		<link>https://dev.chrysleg.fr/modele-carte-interactive-pour-spip</link>
		<guid isPermaLink="true">https://dev.chrysleg.fr/modele-carte-interactive-pour-spip</guid>
		<dc:date>2026-04-22T19:55:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Chrys</dc:creator>



		<description>&lt;p&gt;Ajoutez facilement des cartes interactives OpenStreetMap dans SPIP avec un mod&#232;le l&#233;ger et autonome&lt;/p&gt;

-
&lt;a href="https://dev.chrysleg.fr/-modeles-spip-" rel="directory"&gt;Mod&#232;les&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Int&#233;grez rapidement des cartes interactives dans vos articles SPIP gr&#226;ce &#224; un mod&#232;le simple et autonome. Bas&#233; sur OpenStreetMap et Leaflet, il ne n&#233;cessite aucune installation complexe. Une solution l&#233;g&#232;re, flexible et optimis&#233;e pour am&#233;liorer vos contenus.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Ce mod&#232;le a &#233;t&#233; con&#231;u pour faciliter l'int&#233;gration de cartes interactives dans les articles SPIP, en s'appuyant sur OpenStreetMap et la librairie Leaflet.&lt;/p&gt;
&lt;p&gt;L'objectif est de proposer une solution simple &#224; utiliser, l&#233;g&#232;re, et sans configuration complexe.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;&#192; propos du mod&#232;le&lt;/h2&gt;
&lt;p&gt;Je ne suis pas d&#233;veloppeur de m&#233;tier, mais plut&#244;t quelqu'un de passionn&#233;, curieux, et int&#233;ress&#233; par le code.&lt;/p&gt;
&lt;p&gt;Ce mod&#232;le est donc le r&#233;sultat de tests et d'exp&#233;rimentations. Il peut parfaitement &#234;tre utilis&#233; tel quel, mais il est recommand&#233; de le tester dans un environnement de d&#233;veloppement avant une mise en production.&lt;/p&gt;
&lt;p&gt;Si vous souhaitez l'am&#233;liorer, l'adapter ou le faire &#233;voluer, c'est totalement ouvert.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation&lt;/h2&gt;
&lt;p&gt;L'installation est volontairement simple.&lt;/p&gt;
&lt;p&gt;Il suffit de copier le fichier &lt;strong&gt;map.html&lt;/strong&gt; dans le dossier :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/squelettes/modeles&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Aucune d&#233;pendance n'est &#224; installer manuellement.&lt;/p&gt;
&lt;p&gt;Le mod&#232;le est autonome : il d&#233;tecte automatiquement la pr&#233;sence de Leaflet et, si n&#233;cessaire, charge les ressources depuis un CDN. Ce chargement est effectu&#233; uniquement sur les pages contenant une carte.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Utilisation&lt;/h2&gt;
&lt;p&gt;L'insertion d'une carte se fait directement dans le contenu d'un article, &#224; l'aide d'une balise d&#233;di&#233;e avec des coordonn&#233;es g&#233;ographiques.&lt;/p&gt;
&lt;p&gt;Une simple latitude et longitude permettent d'afficher une carte centr&#233;e sur un point pr&#233;cis.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Personnalisation&lt;/h2&gt;
&lt;p&gt;Le mod&#232;le propose plusieurs options pour adapter l'affichage et le comportement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Position et zoom&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il est possible de d&#233;finir le niveau de zoom afin de contr&#244;ler le niveau de d&#233;tail, de la vue globale &#224; une vue tr&#232;s pr&#233;cise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Marqueurs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Deux approches sont disponibles :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; un marqueur unique, plac&#233; automatiquement au centre&lt;/li&gt;&lt;li&gt; plusieurs marqueurs, d&#233;finis via une syntaxe simple permettant d'associer coordonn&#233;es et texte&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cela permet par exemple d'afficher plusieurs villes ou points d'int&#233;r&#234;t sur une m&#234;me carte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Style visuel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Plusieurs styles de carte sont disponibles :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; standard OpenStreetMap&lt;/li&gt;&lt;li&gt; topographique&lt;/li&gt;&lt;li&gt; clair&lt;/li&gt;&lt;li&gt; sombre&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Il est &#233;galement possible de d&#233;finir la largeur, le ratio d'affichage comme &lt;i&gt;16/9&lt;/i&gt; ou &lt;i&gt;21/9&lt;/i&gt;, et d'ajouter des classes CSS personnalis&#233;es.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Interaction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Le zoom &#224; la molette est d&#233;sactiv&#233; par d&#233;faut afin de pr&#233;server le confort de navigation sur la page, mais il peut &#234;tre activ&#233; si n&#233;cessaire.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Quelques exemples&lt;/h2&gt;&lt;div class=&#034;spip-map-container &#034; style=&#034;max-width: 600px; aspect-ratio: 16/9;&#034;&gt; &lt;div id=&#034;map-79128&#034; class=&#034;spip-map-canvas&#034; data-lat=&#034;46.2&#034; data-lng=&#034;2.2&#034; data-zoom=&#034;12&#034; data-scroll=&#034;oui&#034; data-layer=&#034;osm&#034; data-popup=&#034;&#034; data-tooltip=&#034;&#034; data-markers=&#034;48.8,2.3,Paris;45.7,4.8,Lyon;43.2,5.3,Marseille&#034;&gt; &lt;/div&gt;
&lt;/div&gt; &lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdD4KLyoqCiAqIE1vZMOobGUgU1BJUCA6IENhcnRlIGludGVyYWN0aXZlIExlYWZsZXQgYXZlYyBtdWx0aS1tYXJxdWV1cnMgKFZlcnNpb24gUm9idXN0ZSkKICovCihmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGxvYWRMZWFmbGV0KGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHdpbmRvdy5MKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlYWZsZXQtY3NzJykpIHsKICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICAgICAgbGluay5pZCA9ICdsZWFmbGV0LWNzcyc7CiAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICAgICAgICBsaW5rLmhyZWYgPSAnaHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldEAxLjkuNC9kaXN0L2xlYWZsZXQuY3NzJzsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsKICAgICAgICB9CgogICAgICAgIGlmICghd2luZG93LmxlYWZsZXRMb2FkaW5nKSB7CiAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS45LjQvZGlzdC9sZWFmbGV0LmpzJzsKICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xlYWZsZXQtbG9hZGVkJykpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xlYWZsZXQtbG9hZGVkJywgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcC03OTEyOCcpOwogICAgICAgIGlmICghZWwgfHwgZWwuZGF0YXNldC5pbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIGxvYWRMZWFmbGV0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgY2VudGVyTGF0ID0gcGFyc2VGbG9hdChlbC5kYXRhc2V0LmxhdCkgfHwgNDUuNzU7CiAgICAgICAgICAgIGNvbnN0IGNlbnRlckxuZyA9IHBhcnNlRmxvYXQoZWwuZGF0YXNldC5sbmcpIHx8IDQuODU7CiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBwYXJzZUludChlbC5kYXRhc2V0Lnpvb20pIHx8IDEyOwogICAgICAgICAgICBjb25zdCBzY3JvbGwgPSBlbC5kYXRhc2V0LnNjcm9sbCA9PT0gJ291aSc7CiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZWwuZGF0YXNldC5sYXllciB8fCAnb3NtJzsKICAgICAgICAgICAgY29uc3QgbWFya2Vyc0RhdGEgPSBlbC5kYXRhc2V0Lm1hcmtlcnM7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQb3B1cCA9IGVsLmRhdGFzZXQucG9wdXA7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUb29sdGlwID0gZWwuZGF0YXNldC50b29sdGlwOwoKICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gewogICAgICAgICAgICAgICAgb3NtOiAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgdG9wbzogJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnRvcG9tYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICBkYXJrOiAnaHR0cHM6Ly97c30uYmFzZW1hcHMuY2FydG9jZG4uY29tL2RhcmtfYWxsL3t6fS97eH0ve3l9e3J9LnBuZycsCiAgICAgICAgICAgICAgICBsaWdodDogJ2h0dHBzOi8ve3N9LmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9hbGwve3p9L3t4fS97eX17cn0ucG5nJwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgbWFwID0gTC5tYXAoZWwsIHsKICAgICAgICAgICAgICAgIHNjcm9sbFdoZWVsWm9vbTogc2Nyb2xsCiAgICAgICAgICAgIH0pLnNldFZpZXcoW2NlbnRlckxhdCwgY2VudGVyTG5nXSwgem9vbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBMLnRpbGVMYXllcihsYXllcnNbbGF5ZXJdIHx8IGxheWVycy5vc20sIHsKICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJwogICAgICAgICAgICB9KS5hZGRUbyhtYXApOwoKICAgICAgICAgICAgbGV0IGhhc01hcmtlcnMgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIEdlc3Rpb24gZGVzIG1hcnF1ZXVycyBtdWx0aXBsZXMKICAgICAgICAgICAgaWYgKG1hcmtlcnNEYXRhICYmIG1hcmtlcnNEYXRhLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IG1hcmtlcnNEYXRhLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgICAgICBwb2ludHMuZm9yRWFjaChwID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXAudHJpbSgpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1MYXQgPSBwYXJzZUZsb2F0KHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbUxuZyA9IHBhcnNlRmxvYXQocGFydHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtVGV4dCA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oJywnKS50cmltKCk7IC8vIFJlam9pbnQgbGUgcmVzdGUgc2kgdmlyZ3VsZXMgZGFucyBsZSB0ZXh0ZQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihtTGF0KSAmJiAhaXNOYU4obUxuZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFttTGF0LCBtTG5nXSkuYWRkVG8obWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGV4dCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobVRleHQpOyAvLyBVbmlxdWVtZW50IGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWFya2VycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2kgYXVjdW4gbWFycXVldXIgbidhIMOpdMOpIGFqb3V0w6kgdmlhIGxhIGxpc3RlLCBvbiBtZXQgbGUgbWFycXVldXIgY2VudHJhbCBhdmVjIHNlcyBpbmZvcwogICAgICAgICAgICBpZiAoIWhhc01hcmtlcnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFtjZW50ZXJMYXQsIGNlbnRlckxuZ10pLmFkZFRvKG1hcCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFRvb2x0aXAgJiYgZGVmYXVsdFRvb2x0aXAudHJpbSgpICE9PSAiIikgewogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0VG9vbHRpcC50cmltKCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0UG9wdXAgJiYgZGVmYXVsdFBvcHVwLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTaSBvbiBhIHVuIHBhcmFtw6h0cmUgcG9wdXAsIG9uIGwndXRpbGlzZSBwb3VyIGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0UG9wdXAudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWwuZGF0YXNldC5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICBqUXVlcnkoaW5pdE1hcCk7CiAgICAgICAgaWYgKHR5cGVvZiBvbkFqYXhMb2FkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIG9uQWpheExvYWQoaW5pdE1hcCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdE1hcCk7CiAgICB9Cn0pKCk7Cjwvc2NyaXB0Pg==&#034;&gt;&lt;/div&gt; &lt;style&gt;
.spip-map-container { width: 100%; margin: 1.5rem auto; border-radius: 0.75rem; overflow: hidden; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); border: 1px solid #e5e7eb; background: #f9fafb;
} .spip-map-canvas { width: 100%; height: 100%; min-height: 350px; z-index: 1;
} @media (max-width: 640px) { .spip-map-container { aspect-ratio: 4/3 !important; border-radius: 0.5rem; } .spip-map-canvas { min-height: 250px; }
}
&lt;/style&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;map|lat=46.2|lng=2.2|markers=48.8,2.3,Paris;45.7,4.8,Lyon;43.2,5.3,Marseille|scroll=oui&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mode Topographique (Topo)&lt;/strong&gt;&lt;br class='autobr' /&gt;
Ce param&#232;tre change l'aspect visuel du fond de carte.&lt;/p&gt;
&lt;div class=&#034;spip-map-container &#034; style=&#034;max-width: 600px; aspect-ratio: 16/9;&#034;&gt; &lt;div id=&#034;map-62674&#034; class=&#034;spip-map-canvas&#034; data-lat=&#034;45.8326&#034; data-lng=&#034;6.8651&#034; data-zoom=&#034;13&#034; data-scroll=&#034;non&#034; data-layer=&#034;topo&#034; data-popup=&#034;Le Mont Blanc&#034; data-tooltip=&#034;&#034; data-markers=&#034;&#034;&gt; &lt;/div&gt;
&lt;/div&gt; &lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdD4KLyoqCiAqIE1vZMOobGUgU1BJUCA6IENhcnRlIGludGVyYWN0aXZlIExlYWZsZXQgYXZlYyBtdWx0aS1tYXJxdWV1cnMgKFZlcnNpb24gUm9idXN0ZSkKICovCihmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGxvYWRMZWFmbGV0KGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHdpbmRvdy5MKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlYWZsZXQtY3NzJykpIHsKICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICAgICAgbGluay5pZCA9ICdsZWFmbGV0LWNzcyc7CiAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICAgICAgICBsaW5rLmhyZWYgPSAnaHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldEAxLjkuNC9kaXN0L2xlYWZsZXQuY3NzJzsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsKICAgICAgICB9CgogICAgICAgIGlmICghd2luZG93LmxlYWZsZXRMb2FkaW5nKSB7CiAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS45LjQvZGlzdC9sZWFmbGV0LmpzJzsKICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xlYWZsZXQtbG9hZGVkJykpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xlYWZsZXQtbG9hZGVkJywgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcC02MjY3NCcpOwogICAgICAgIGlmICghZWwgfHwgZWwuZGF0YXNldC5pbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIGxvYWRMZWFmbGV0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgY2VudGVyTGF0ID0gcGFyc2VGbG9hdChlbC5kYXRhc2V0LmxhdCkgfHwgNDUuNzU7CiAgICAgICAgICAgIGNvbnN0IGNlbnRlckxuZyA9IHBhcnNlRmxvYXQoZWwuZGF0YXNldC5sbmcpIHx8IDQuODU7CiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBwYXJzZUludChlbC5kYXRhc2V0Lnpvb20pIHx8IDEyOwogICAgICAgICAgICBjb25zdCBzY3JvbGwgPSBlbC5kYXRhc2V0LnNjcm9sbCA9PT0gJ291aSc7CiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZWwuZGF0YXNldC5sYXllciB8fCAnb3NtJzsKICAgICAgICAgICAgY29uc3QgbWFya2Vyc0RhdGEgPSBlbC5kYXRhc2V0Lm1hcmtlcnM7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQb3B1cCA9IGVsLmRhdGFzZXQucG9wdXA7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUb29sdGlwID0gZWwuZGF0YXNldC50b29sdGlwOwoKICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gewogICAgICAgICAgICAgICAgb3NtOiAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgdG9wbzogJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnRvcG9tYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICBkYXJrOiAnaHR0cHM6Ly97c30uYmFzZW1hcHMuY2FydG9jZG4uY29tL2RhcmtfYWxsL3t6fS97eH0ve3l9e3J9LnBuZycsCiAgICAgICAgICAgICAgICBsaWdodDogJ2h0dHBzOi8ve3N9LmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9hbGwve3p9L3t4fS97eX17cn0ucG5nJwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgbWFwID0gTC5tYXAoZWwsIHsKICAgICAgICAgICAgICAgIHNjcm9sbFdoZWVsWm9vbTogc2Nyb2xsCiAgICAgICAgICAgIH0pLnNldFZpZXcoW2NlbnRlckxhdCwgY2VudGVyTG5nXSwgem9vbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBMLnRpbGVMYXllcihsYXllcnNbbGF5ZXJdIHx8IGxheWVycy5vc20sIHsKICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJwogICAgICAgICAgICB9KS5hZGRUbyhtYXApOwoKICAgICAgICAgICAgbGV0IGhhc01hcmtlcnMgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIEdlc3Rpb24gZGVzIG1hcnF1ZXVycyBtdWx0aXBsZXMKICAgICAgICAgICAgaWYgKG1hcmtlcnNEYXRhICYmIG1hcmtlcnNEYXRhLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IG1hcmtlcnNEYXRhLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgICAgICBwb2ludHMuZm9yRWFjaChwID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXAudHJpbSgpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1MYXQgPSBwYXJzZUZsb2F0KHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbUxuZyA9IHBhcnNlRmxvYXQocGFydHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtVGV4dCA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oJywnKS50cmltKCk7IC8vIFJlam9pbnQgbGUgcmVzdGUgc2kgdmlyZ3VsZXMgZGFucyBsZSB0ZXh0ZQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihtTGF0KSAmJiAhaXNOYU4obUxuZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFttTGF0LCBtTG5nXSkuYWRkVG8obWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGV4dCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobVRleHQpOyAvLyBVbmlxdWVtZW50IGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWFya2VycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2kgYXVjdW4gbWFycXVldXIgbidhIMOpdMOpIGFqb3V0w6kgdmlhIGxhIGxpc3RlLCBvbiBtZXQgbGUgbWFycXVldXIgY2VudHJhbCBhdmVjIHNlcyBpbmZvcwogICAgICAgICAgICBpZiAoIWhhc01hcmtlcnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFtjZW50ZXJMYXQsIGNlbnRlckxuZ10pLmFkZFRvKG1hcCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFRvb2x0aXAgJiYgZGVmYXVsdFRvb2x0aXAudHJpbSgpICE9PSAiIikgewogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0VG9vbHRpcC50cmltKCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0UG9wdXAgJiYgZGVmYXVsdFBvcHVwLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTaSBvbiBhIHVuIHBhcmFtw6h0cmUgcG9wdXAsIG9uIGwndXRpbGlzZSBwb3VyIGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0UG9wdXAudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWwuZGF0YXNldC5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICBqUXVlcnkoaW5pdE1hcCk7CiAgICAgICAgaWYgKHR5cGVvZiBvbkFqYXhMb2FkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIG9uQWpheExvYWQoaW5pdE1hcCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdE1hcCk7CiAgICB9Cn0pKCk7Cjwvc2NyaXB0Pg==&#034;&gt;&lt;/div&gt; &lt;style&gt;
.spip-map-container { width: 100%; margin: 1.5rem auto; border-radius: 0.75rem; overflow: hidden; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); border: 1px solid #e5e7eb; background: #f9fafb;
} .spip-map-canvas { width: 100%; height: 100%; min-height: 350px; z-index: 1;
} @media (max-width: 640px) { .spip-map-container { aspect-ratio: 4/3 !important; border-radius: 0.5rem; } .spip-map-canvas { min-height: 250px; }
}
&lt;/style&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;map|lat=45.8326|lng=6.8651|zoom=13|layer=topo|popup=Le Mont Blanc&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mode Clair (Light)&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;spip-map-container &#034; style=&#034;max-width: 600px; aspect-ratio: 16/9;&#034;&gt; &lt;div id=&#034;map-39924&#034; class=&#034;spip-map-canvas&#034; data-lat=&#034;48.8566&#034; data-lng=&#034;2.3522&#034; data-zoom=&#034;12&#034; data-scroll=&#034;non&#034; data-layer=&#034;light&#034; data-popup=&#034;Paris en mode &#233;pur&#233;&#034; data-tooltip=&#034;&#034; data-markers=&#034;&#034;&gt; &lt;/div&gt;
&lt;/div&gt; &lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdD4KLyoqCiAqIE1vZMOobGUgU1BJUCA6IENhcnRlIGludGVyYWN0aXZlIExlYWZsZXQgYXZlYyBtdWx0aS1tYXJxdWV1cnMgKFZlcnNpb24gUm9idXN0ZSkKICovCihmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGxvYWRMZWFmbGV0KGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHdpbmRvdy5MKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlYWZsZXQtY3NzJykpIHsKICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICAgICAgbGluay5pZCA9ICdsZWFmbGV0LWNzcyc7CiAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICAgICAgICBsaW5rLmhyZWYgPSAnaHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldEAxLjkuNC9kaXN0L2xlYWZsZXQuY3NzJzsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsKICAgICAgICB9CgogICAgICAgIGlmICghd2luZG93LmxlYWZsZXRMb2FkaW5nKSB7CiAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS45LjQvZGlzdC9sZWFmbGV0LmpzJzsKICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xlYWZsZXQtbG9hZGVkJykpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xlYWZsZXQtbG9hZGVkJywgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcC0zOTkyNCcpOwogICAgICAgIGlmICghZWwgfHwgZWwuZGF0YXNldC5pbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIGxvYWRMZWFmbGV0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgY2VudGVyTGF0ID0gcGFyc2VGbG9hdChlbC5kYXRhc2V0LmxhdCkgfHwgNDUuNzU7CiAgICAgICAgICAgIGNvbnN0IGNlbnRlckxuZyA9IHBhcnNlRmxvYXQoZWwuZGF0YXNldC5sbmcpIHx8IDQuODU7CiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBwYXJzZUludChlbC5kYXRhc2V0Lnpvb20pIHx8IDEyOwogICAgICAgICAgICBjb25zdCBzY3JvbGwgPSBlbC5kYXRhc2V0LnNjcm9sbCA9PT0gJ291aSc7CiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZWwuZGF0YXNldC5sYXllciB8fCAnb3NtJzsKICAgICAgICAgICAgY29uc3QgbWFya2Vyc0RhdGEgPSBlbC5kYXRhc2V0Lm1hcmtlcnM7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQb3B1cCA9IGVsLmRhdGFzZXQucG9wdXA7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUb29sdGlwID0gZWwuZGF0YXNldC50b29sdGlwOwoKICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gewogICAgICAgICAgICAgICAgb3NtOiAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgdG9wbzogJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnRvcG9tYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICBkYXJrOiAnaHR0cHM6Ly97c30uYmFzZW1hcHMuY2FydG9jZG4uY29tL2RhcmtfYWxsL3t6fS97eH0ve3l9e3J9LnBuZycsCiAgICAgICAgICAgICAgICBsaWdodDogJ2h0dHBzOi8ve3N9LmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9hbGwve3p9L3t4fS97eX17cn0ucG5nJwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgbWFwID0gTC5tYXAoZWwsIHsKICAgICAgICAgICAgICAgIHNjcm9sbFdoZWVsWm9vbTogc2Nyb2xsCiAgICAgICAgICAgIH0pLnNldFZpZXcoW2NlbnRlckxhdCwgY2VudGVyTG5nXSwgem9vbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBMLnRpbGVMYXllcihsYXllcnNbbGF5ZXJdIHx8IGxheWVycy5vc20sIHsKICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJwogICAgICAgICAgICB9KS5hZGRUbyhtYXApOwoKICAgICAgICAgICAgbGV0IGhhc01hcmtlcnMgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIEdlc3Rpb24gZGVzIG1hcnF1ZXVycyBtdWx0aXBsZXMKICAgICAgICAgICAgaWYgKG1hcmtlcnNEYXRhICYmIG1hcmtlcnNEYXRhLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IG1hcmtlcnNEYXRhLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgICAgICBwb2ludHMuZm9yRWFjaChwID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXAudHJpbSgpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1MYXQgPSBwYXJzZUZsb2F0KHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbUxuZyA9IHBhcnNlRmxvYXQocGFydHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtVGV4dCA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oJywnKS50cmltKCk7IC8vIFJlam9pbnQgbGUgcmVzdGUgc2kgdmlyZ3VsZXMgZGFucyBsZSB0ZXh0ZQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihtTGF0KSAmJiAhaXNOYU4obUxuZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFttTGF0LCBtTG5nXSkuYWRkVG8obWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGV4dCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobVRleHQpOyAvLyBVbmlxdWVtZW50IGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWFya2VycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2kgYXVjdW4gbWFycXVldXIgbidhIMOpdMOpIGFqb3V0w6kgdmlhIGxhIGxpc3RlLCBvbiBtZXQgbGUgbWFycXVldXIgY2VudHJhbCBhdmVjIHNlcyBpbmZvcwogICAgICAgICAgICBpZiAoIWhhc01hcmtlcnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFtjZW50ZXJMYXQsIGNlbnRlckxuZ10pLmFkZFRvKG1hcCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFRvb2x0aXAgJiYgZGVmYXVsdFRvb2x0aXAudHJpbSgpICE9PSAiIikgewogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0VG9vbHRpcC50cmltKCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0UG9wdXAgJiYgZGVmYXVsdFBvcHVwLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTaSBvbiBhIHVuIHBhcmFtw6h0cmUgcG9wdXAsIG9uIGwndXRpbGlzZSBwb3VyIGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0UG9wdXAudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWwuZGF0YXNldC5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICBqUXVlcnkoaW5pdE1hcCk7CiAgICAgICAgaWYgKHR5cGVvZiBvbkFqYXhMb2FkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIG9uQWpheExvYWQoaW5pdE1hcCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdE1hcCk7CiAgICB9Cn0pKCk7Cjwvc2NyaXB0Pg==&#034;&gt;&lt;/div&gt; &lt;style&gt;
.spip-map-container { width: 100%; margin: 1.5rem auto; border-radius: 0.75rem; overflow: hidden; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); border: 1px solid #e5e7eb; background: #f9fafb;
} .spip-map-canvas { width: 100%; height: 100%; min-height: 350px; z-index: 1;
} @media (max-width: 640px) { .spip-map-container { aspect-ratio: 4/3 !important; border-radius: 0.5rem; } .spip-map-canvas { min-height: 250px; }
}
&lt;/style&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;map|lat=48.8566|lng=2.3522|layer=light|popup=Paris en mode &#233;pur&#233;&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mode Sombre (Dark)&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#034;spip-map-container &#034; style=&#034;max-width: 600px; aspect-ratio: 16/9;&#034;&gt; &lt;div id=&#034;map-85505&#034; class=&#034;spip-map-canvas&#034; data-lat=&#034;40.7128&#034; data-lng=&#034;-74.0060&#034; data-zoom=&#034;12&#034; data-scroll=&#034;non&#034; data-layer=&#034;dark&#034; data-popup=&#034;New York la nuit&#034; data-tooltip=&#034;&#034; data-markers=&#034;&#034;&gt; &lt;/div&gt;
&lt;/div&gt; &lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdD4KLyoqCiAqIE1vZMOobGUgU1BJUCA6IENhcnRlIGludGVyYWN0aXZlIExlYWZsZXQgYXZlYyBtdWx0aS1tYXJxdWV1cnMgKFZlcnNpb24gUm9idXN0ZSkKICovCihmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGxvYWRMZWFmbGV0KGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHdpbmRvdy5MKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlYWZsZXQtY3NzJykpIHsKICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICAgICAgbGluay5pZCA9ICdsZWFmbGV0LWNzcyc7CiAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICAgICAgICBsaW5rLmhyZWYgPSAnaHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldEAxLjkuNC9kaXN0L2xlYWZsZXQuY3NzJzsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsKICAgICAgICB9CgogICAgICAgIGlmICghd2luZG93LmxlYWZsZXRMb2FkaW5nKSB7CiAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS45LjQvZGlzdC9sZWFmbGV0LmpzJzsKICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xlYWZsZXQtbG9hZGVkJykpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xlYWZsZXQtbG9hZGVkJywgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcC04NTUwNScpOwogICAgICAgIGlmICghZWwgfHwgZWwuZGF0YXNldC5pbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIGxvYWRMZWFmbGV0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgY2VudGVyTGF0ID0gcGFyc2VGbG9hdChlbC5kYXRhc2V0LmxhdCkgfHwgNDUuNzU7CiAgICAgICAgICAgIGNvbnN0IGNlbnRlckxuZyA9IHBhcnNlRmxvYXQoZWwuZGF0YXNldC5sbmcpIHx8IDQuODU7CiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBwYXJzZUludChlbC5kYXRhc2V0Lnpvb20pIHx8IDEyOwogICAgICAgICAgICBjb25zdCBzY3JvbGwgPSBlbC5kYXRhc2V0LnNjcm9sbCA9PT0gJ291aSc7CiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZWwuZGF0YXNldC5sYXllciB8fCAnb3NtJzsKICAgICAgICAgICAgY29uc3QgbWFya2Vyc0RhdGEgPSBlbC5kYXRhc2V0Lm1hcmtlcnM7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQb3B1cCA9IGVsLmRhdGFzZXQucG9wdXA7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUb29sdGlwID0gZWwuZGF0YXNldC50b29sdGlwOwoKICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gewogICAgICAgICAgICAgICAgb3NtOiAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgdG9wbzogJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnRvcG9tYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICBkYXJrOiAnaHR0cHM6Ly97c30uYmFzZW1hcHMuY2FydG9jZG4uY29tL2RhcmtfYWxsL3t6fS97eH0ve3l9e3J9LnBuZycsCiAgICAgICAgICAgICAgICBsaWdodDogJ2h0dHBzOi8ve3N9LmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9hbGwve3p9L3t4fS97eX17cn0ucG5nJwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgbWFwID0gTC5tYXAoZWwsIHsKICAgICAgICAgICAgICAgIHNjcm9sbFdoZWVsWm9vbTogc2Nyb2xsCiAgICAgICAgICAgIH0pLnNldFZpZXcoW2NlbnRlckxhdCwgY2VudGVyTG5nXSwgem9vbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBMLnRpbGVMYXllcihsYXllcnNbbGF5ZXJdIHx8IGxheWVycy5vc20sIHsKICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJwogICAgICAgICAgICB9KS5hZGRUbyhtYXApOwoKICAgICAgICAgICAgbGV0IGhhc01hcmtlcnMgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIEdlc3Rpb24gZGVzIG1hcnF1ZXVycyBtdWx0aXBsZXMKICAgICAgICAgICAgaWYgKG1hcmtlcnNEYXRhICYmIG1hcmtlcnNEYXRhLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IG1hcmtlcnNEYXRhLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgICAgICBwb2ludHMuZm9yRWFjaChwID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXAudHJpbSgpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1MYXQgPSBwYXJzZUZsb2F0KHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbUxuZyA9IHBhcnNlRmxvYXQocGFydHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtVGV4dCA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oJywnKS50cmltKCk7IC8vIFJlam9pbnQgbGUgcmVzdGUgc2kgdmlyZ3VsZXMgZGFucyBsZSB0ZXh0ZQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihtTGF0KSAmJiAhaXNOYU4obUxuZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFttTGF0LCBtTG5nXSkuYWRkVG8obWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGV4dCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobVRleHQpOyAvLyBVbmlxdWVtZW50IGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWFya2VycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2kgYXVjdW4gbWFycXVldXIgbidhIMOpdMOpIGFqb3V0w6kgdmlhIGxhIGxpc3RlLCBvbiBtZXQgbGUgbWFycXVldXIgY2VudHJhbCBhdmVjIHNlcyBpbmZvcwogICAgICAgICAgICBpZiAoIWhhc01hcmtlcnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFtjZW50ZXJMYXQsIGNlbnRlckxuZ10pLmFkZFRvKG1hcCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFRvb2x0aXAgJiYgZGVmYXVsdFRvb2x0aXAudHJpbSgpICE9PSAiIikgewogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0VG9vbHRpcC50cmltKCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0UG9wdXAgJiYgZGVmYXVsdFBvcHVwLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTaSBvbiBhIHVuIHBhcmFtw6h0cmUgcG9wdXAsIG9uIGwndXRpbGlzZSBwb3VyIGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0UG9wdXAudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWwuZGF0YXNldC5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICBqUXVlcnkoaW5pdE1hcCk7CiAgICAgICAgaWYgKHR5cGVvZiBvbkFqYXhMb2FkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIG9uQWpheExvYWQoaW5pdE1hcCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdE1hcCk7CiAgICB9Cn0pKCk7Cjwvc2NyaXB0Pg==&#034;&gt;&lt;/div&gt; &lt;style&gt;
.spip-map-container { width: 100%; margin: 1.5rem auto; border-radius: 0.75rem; overflow: hidden; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); border: 1px solid #e5e7eb; background: #f9fafb;
} .spip-map-canvas { width: 100%; height: 100%; min-height: 350px; z-index: 1;
} @media (max-width: 640px) { .spip-map-container { aspect-ratio: 4/3 !important; border-radius: 0.5rem; } .spip-map-canvas { min-height: 250px; }
}
&lt;/style&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;map|lat=40.7128|lng=-74.0060|layer=dark|popup=New York la nuit&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Activation du zoom molette&lt;/strong&gt;&lt;br class='autobr' /&gt;
Par d&#233;faut, il est sur non. Si vous mettez oui, l'utilisateur pourra zoomer simplement en faisant rouler sa molette sur la carte.&lt;/p&gt;
&lt;div class=&#034;spip-map-container &#034; style=&#034;max-width: 600px; aspect-ratio: 16/9;&#034;&gt; &lt;div id=&#034;map-79327&#034; class=&#034;spip-map-canvas&#034; data-lat=&#034;43.6047&#034; data-lng=&#034;1.4442&#034; data-zoom=&#034;12&#034; data-scroll=&#034;oui&#034; data-layer=&#034;osm&#034; data-popup=&#034;Toulouse (Zoom molette activ&#233;)&#034; data-tooltip=&#034;&#034; data-markers=&#034;&#034;&gt; &lt;/div&gt;
&lt;/div&gt; &lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdD4KLyoqCiAqIE1vZMOobGUgU1BJUCA6IENhcnRlIGludGVyYWN0aXZlIExlYWZsZXQgYXZlYyBtdWx0aS1tYXJxdWV1cnMgKFZlcnNpb24gUm9idXN0ZSkKICovCihmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGxvYWRMZWFmbGV0KGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHdpbmRvdy5MKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlYWZsZXQtY3NzJykpIHsKICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICAgICAgbGluay5pZCA9ICdsZWFmbGV0LWNzcyc7CiAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICAgICAgICBsaW5rLmhyZWYgPSAnaHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldEAxLjkuNC9kaXN0L2xlYWZsZXQuY3NzJzsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsKICAgICAgICB9CgogICAgICAgIGlmICghd2luZG93LmxlYWZsZXRMb2FkaW5nKSB7CiAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS45LjQvZGlzdC9sZWFmbGV0LmpzJzsKICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xlYWZsZXQtbG9hZGVkJykpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xlYWZsZXQtbG9hZGVkJywgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcC03OTMyNycpOwogICAgICAgIGlmICghZWwgfHwgZWwuZGF0YXNldC5pbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIGxvYWRMZWFmbGV0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgY2VudGVyTGF0ID0gcGFyc2VGbG9hdChlbC5kYXRhc2V0LmxhdCkgfHwgNDUuNzU7CiAgICAgICAgICAgIGNvbnN0IGNlbnRlckxuZyA9IHBhcnNlRmxvYXQoZWwuZGF0YXNldC5sbmcpIHx8IDQuODU7CiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBwYXJzZUludChlbC5kYXRhc2V0Lnpvb20pIHx8IDEyOwogICAgICAgICAgICBjb25zdCBzY3JvbGwgPSBlbC5kYXRhc2V0LnNjcm9sbCA9PT0gJ291aSc7CiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZWwuZGF0YXNldC5sYXllciB8fCAnb3NtJzsKICAgICAgICAgICAgY29uc3QgbWFya2Vyc0RhdGEgPSBlbC5kYXRhc2V0Lm1hcmtlcnM7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQb3B1cCA9IGVsLmRhdGFzZXQucG9wdXA7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUb29sdGlwID0gZWwuZGF0YXNldC50b29sdGlwOwoKICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gewogICAgICAgICAgICAgICAgb3NtOiAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgdG9wbzogJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnRvcG9tYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICBkYXJrOiAnaHR0cHM6Ly97c30uYmFzZW1hcHMuY2FydG9jZG4uY29tL2RhcmtfYWxsL3t6fS97eH0ve3l9e3J9LnBuZycsCiAgICAgICAgICAgICAgICBsaWdodDogJ2h0dHBzOi8ve3N9LmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9hbGwve3p9L3t4fS97eX17cn0ucG5nJwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgbWFwID0gTC5tYXAoZWwsIHsKICAgICAgICAgICAgICAgIHNjcm9sbFdoZWVsWm9vbTogc2Nyb2xsCiAgICAgICAgICAgIH0pLnNldFZpZXcoW2NlbnRlckxhdCwgY2VudGVyTG5nXSwgem9vbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBMLnRpbGVMYXllcihsYXllcnNbbGF5ZXJdIHx8IGxheWVycy5vc20sIHsKICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJwogICAgICAgICAgICB9KS5hZGRUbyhtYXApOwoKICAgICAgICAgICAgbGV0IGhhc01hcmtlcnMgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIEdlc3Rpb24gZGVzIG1hcnF1ZXVycyBtdWx0aXBsZXMKICAgICAgICAgICAgaWYgKG1hcmtlcnNEYXRhICYmIG1hcmtlcnNEYXRhLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IG1hcmtlcnNEYXRhLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgICAgICBwb2ludHMuZm9yRWFjaChwID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXAudHJpbSgpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1MYXQgPSBwYXJzZUZsb2F0KHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbUxuZyA9IHBhcnNlRmxvYXQocGFydHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtVGV4dCA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oJywnKS50cmltKCk7IC8vIFJlam9pbnQgbGUgcmVzdGUgc2kgdmlyZ3VsZXMgZGFucyBsZSB0ZXh0ZQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihtTGF0KSAmJiAhaXNOYU4obUxuZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFttTGF0LCBtTG5nXSkuYWRkVG8obWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGV4dCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobVRleHQpOyAvLyBVbmlxdWVtZW50IGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWFya2VycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2kgYXVjdW4gbWFycXVldXIgbidhIMOpdMOpIGFqb3V0w6kgdmlhIGxhIGxpc3RlLCBvbiBtZXQgbGUgbWFycXVldXIgY2VudHJhbCBhdmVjIHNlcyBpbmZvcwogICAgICAgICAgICBpZiAoIWhhc01hcmtlcnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFtjZW50ZXJMYXQsIGNlbnRlckxuZ10pLmFkZFRvKG1hcCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFRvb2x0aXAgJiYgZGVmYXVsdFRvb2x0aXAudHJpbSgpICE9PSAiIikgewogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0VG9vbHRpcC50cmltKCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0UG9wdXAgJiYgZGVmYXVsdFBvcHVwLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTaSBvbiBhIHVuIHBhcmFtw6h0cmUgcG9wdXAsIG9uIGwndXRpbGlzZSBwb3VyIGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0UG9wdXAudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWwuZGF0YXNldC5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICBqUXVlcnkoaW5pdE1hcCk7CiAgICAgICAgaWYgKHR5cGVvZiBvbkFqYXhMb2FkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIG9uQWpheExvYWQoaW5pdE1hcCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdE1hcCk7CiAgICB9Cn0pKCk7Cjwvc2NyaXB0Pg==&#034;&gt;&lt;/div&gt; &lt;style&gt;
.spip-map-container { width: 100%; margin: 1.5rem auto; border-radius: 0.75rem; overflow: hidden; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); border: 1px solid #e5e7eb; background: #f9fafb;
} .spip-map-canvas { width: 100%; height: 100%; min-height: 350px; z-index: 1;
} @media (max-width: 640px) { .spip-map-container { aspect-ratio: 4/3 !important; border-radius: 0.5rem; } .spip-map-canvas { min-height: 250px; }
}
&lt;/style&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;map|lat=43.6047|lng=1.4442|scroll=oui|popup=Toulouse (Zoom molette activ&#233;)&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Texte au survol&lt;/strong&gt;&lt;br class='autobr' /&gt;
&#192; la diff&#233;rence de popup qui n&#233;cessite un clic, le tooltip appara&#238;t d&#232;s que la souris passe sur le marqueur.&lt;/p&gt;
&lt;div class=&#034;spip-map-container &#034; style=&#034;max-width: 600px; aspect-ratio: 16/9;&#034;&gt; &lt;div id=&#034;map-67968&#034; class=&#034;spip-map-canvas&#034; data-lat=&#034;44.8378&#034; data-lng=&#034;-0.5792&#034; data-zoom=&#034;12&#034; data-scroll=&#034;non&#034; data-layer=&#034;osm&#034; data-popup=&#034;Bienvenue dans la cit&#233; du vin&#034; data-tooltip=&#034;Bordeaux&#034; data-markers=&#034;&#034;&gt; &lt;/div&gt;
&lt;/div&gt; &lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdD4KLyoqCiAqIE1vZMOobGUgU1BJUCA6IENhcnRlIGludGVyYWN0aXZlIExlYWZsZXQgYXZlYyBtdWx0aS1tYXJxdWV1cnMgKFZlcnNpb24gUm9idXN0ZSkKICovCihmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGxvYWRMZWFmbGV0KGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHdpbmRvdy5MKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlYWZsZXQtY3NzJykpIHsKICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICAgICAgbGluay5pZCA9ICdsZWFmbGV0LWNzcyc7CiAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICAgICAgICBsaW5rLmhyZWYgPSAnaHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldEAxLjkuNC9kaXN0L2xlYWZsZXQuY3NzJzsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsKICAgICAgICB9CgogICAgICAgIGlmICghd2luZG93LmxlYWZsZXRMb2FkaW5nKSB7CiAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS45LjQvZGlzdC9sZWFmbGV0LmpzJzsKICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xlYWZsZXQtbG9hZGVkJykpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xlYWZsZXQtbG9hZGVkJywgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcC02Nzk2OCcpOwogICAgICAgIGlmICghZWwgfHwgZWwuZGF0YXNldC5pbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIGxvYWRMZWFmbGV0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgY2VudGVyTGF0ID0gcGFyc2VGbG9hdChlbC5kYXRhc2V0LmxhdCkgfHwgNDUuNzU7CiAgICAgICAgICAgIGNvbnN0IGNlbnRlckxuZyA9IHBhcnNlRmxvYXQoZWwuZGF0YXNldC5sbmcpIHx8IDQuODU7CiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBwYXJzZUludChlbC5kYXRhc2V0Lnpvb20pIHx8IDEyOwogICAgICAgICAgICBjb25zdCBzY3JvbGwgPSBlbC5kYXRhc2V0LnNjcm9sbCA9PT0gJ291aSc7CiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZWwuZGF0YXNldC5sYXllciB8fCAnb3NtJzsKICAgICAgICAgICAgY29uc3QgbWFya2Vyc0RhdGEgPSBlbC5kYXRhc2V0Lm1hcmtlcnM7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQb3B1cCA9IGVsLmRhdGFzZXQucG9wdXA7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUb29sdGlwID0gZWwuZGF0YXNldC50b29sdGlwOwoKICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gewogICAgICAgICAgICAgICAgb3NtOiAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgdG9wbzogJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnRvcG9tYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICBkYXJrOiAnaHR0cHM6Ly97c30uYmFzZW1hcHMuY2FydG9jZG4uY29tL2RhcmtfYWxsL3t6fS97eH0ve3l9e3J9LnBuZycsCiAgICAgICAgICAgICAgICBsaWdodDogJ2h0dHBzOi8ve3N9LmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9hbGwve3p9L3t4fS97eX17cn0ucG5nJwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgbWFwID0gTC5tYXAoZWwsIHsKICAgICAgICAgICAgICAgIHNjcm9sbFdoZWVsWm9vbTogc2Nyb2xsCiAgICAgICAgICAgIH0pLnNldFZpZXcoW2NlbnRlckxhdCwgY2VudGVyTG5nXSwgem9vbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBMLnRpbGVMYXllcihsYXllcnNbbGF5ZXJdIHx8IGxheWVycy5vc20sIHsKICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJwogICAgICAgICAgICB9KS5hZGRUbyhtYXApOwoKICAgICAgICAgICAgbGV0IGhhc01hcmtlcnMgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIEdlc3Rpb24gZGVzIG1hcnF1ZXVycyBtdWx0aXBsZXMKICAgICAgICAgICAgaWYgKG1hcmtlcnNEYXRhICYmIG1hcmtlcnNEYXRhLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IG1hcmtlcnNEYXRhLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgICAgICBwb2ludHMuZm9yRWFjaChwID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXAudHJpbSgpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1MYXQgPSBwYXJzZUZsb2F0KHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbUxuZyA9IHBhcnNlRmxvYXQocGFydHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtVGV4dCA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oJywnKS50cmltKCk7IC8vIFJlam9pbnQgbGUgcmVzdGUgc2kgdmlyZ3VsZXMgZGFucyBsZSB0ZXh0ZQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihtTGF0KSAmJiAhaXNOYU4obUxuZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFttTGF0LCBtTG5nXSkuYWRkVG8obWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGV4dCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobVRleHQpOyAvLyBVbmlxdWVtZW50IGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWFya2VycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2kgYXVjdW4gbWFycXVldXIgbidhIMOpdMOpIGFqb3V0w6kgdmlhIGxhIGxpc3RlLCBvbiBtZXQgbGUgbWFycXVldXIgY2VudHJhbCBhdmVjIHNlcyBpbmZvcwogICAgICAgICAgICBpZiAoIWhhc01hcmtlcnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFtjZW50ZXJMYXQsIGNlbnRlckxuZ10pLmFkZFRvKG1hcCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFRvb2x0aXAgJiYgZGVmYXVsdFRvb2x0aXAudHJpbSgpICE9PSAiIikgewogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0VG9vbHRpcC50cmltKCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0UG9wdXAgJiYgZGVmYXVsdFBvcHVwLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTaSBvbiBhIHVuIHBhcmFtw6h0cmUgcG9wdXAsIG9uIGwndXRpbGlzZSBwb3VyIGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0UG9wdXAudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWwuZGF0YXNldC5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICBqUXVlcnkoaW5pdE1hcCk7CiAgICAgICAgaWYgKHR5cGVvZiBvbkFqYXhMb2FkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIG9uQWpheExvYWQoaW5pdE1hcCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdE1hcCk7CiAgICB9Cn0pKCk7Cjwvc2NyaXB0Pg==&#034;&gt;&lt;/div&gt; &lt;style&gt;
.spip-map-container { width: 100%; margin: 1.5rem auto; border-radius: 0.75rem; overflow: hidden; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); border: 1px solid #e5e7eb; background: #f9fafb;
} .spip-map-canvas { width: 100%; height: 100%; min-height: 350px; z-index: 1;
} @media (max-width: 640px) { .spip-map-container { aspect-ratio: 4/3 !important; border-radius: 0.5rem; } .spip-map-canvas { min-height: 250px; }
}
&lt;/style&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;map|lat=44.8378|lng=-0.5792|tooltip=Bordeaux|popup=Bienvenue dans la cit&#233; du vin&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exemple complet&lt;/strong&gt;&lt;br class='autobr' /&gt;
Vous pouvez bien s&#251;r m&#233;langer tous les param&#232;tres dans un seul appel.&lt;/p&gt;
&lt;div class=&#034;spip-map-container &#034; style=&#034;max-width: 100%; aspect-ratio: 21/9;&#034;&gt; &lt;div id=&#034;map-62582&#034; class=&#034;spip-map-canvas&#034; data-lat=&#034;47.2184&#034; data-lng=&#034;-1.5536&#034; data-zoom=&#034;14&#034; data-scroll=&#034;oui&#034; data-layer=&#034;topo&#034; data-popup=&#034;Le ch&#226;teau des ducs de Bretagne&#034; data-tooltip=&#034;Survolez Nantes&#034; data-markers=&#034;&#034;&gt; &lt;/div&gt;
&lt;/div&gt; &lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdD4KLyoqCiAqIE1vZMOobGUgU1BJUCA6IENhcnRlIGludGVyYWN0aXZlIExlYWZsZXQgYXZlYyBtdWx0aS1tYXJxdWV1cnMgKFZlcnNpb24gUm9idXN0ZSkKICovCihmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIGxvYWRMZWFmbGV0KGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKHdpbmRvdy5MKSB7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xlYWZsZXQtY3NzJykpIHsKICAgICAgICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKICAgICAgICAgICAgbGluay5pZCA9ICdsZWFmbGV0LWNzcyc7CiAgICAgICAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICAgICAgICBsaW5rLmhyZWYgPSAnaHR0cHM6Ly91bnBrZy5jb20vbGVhZmxldEAxLjkuNC9kaXN0L2xlYWZsZXQuY3NzJzsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTsKICAgICAgICB9CgogICAgICAgIGlmICghd2luZG93LmxlYWZsZXRMb2FkaW5nKSB7CiAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICBzY3JpcHQuc3JjID0gJ2h0dHBzOi8vdW5wa2cuY29tL2xlYWZsZXRAMS45LjQvZGlzdC9sZWFmbGV0LmpzJzsKICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sZWFmbGV0TG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2xlYWZsZXQtbG9hZGVkJykpOwogICAgICAgICAgICAgICAgY2FsbGJhY2soKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2xlYWZsZXQtbG9hZGVkJywgY2FsbGJhY2spOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcC02MjU4MicpOwogICAgICAgIGlmICghZWwgfHwgZWwuZGF0YXNldC5pbml0aWFsaXplZCkgcmV0dXJuOwogICAgICAgIAogICAgICAgIGxvYWRMZWFmbGV0KCgpID0+IHsKICAgICAgICAgICAgY29uc3QgY2VudGVyTGF0ID0gcGFyc2VGbG9hdChlbC5kYXRhc2V0LmxhdCkgfHwgNDUuNzU7CiAgICAgICAgICAgIGNvbnN0IGNlbnRlckxuZyA9IHBhcnNlRmxvYXQoZWwuZGF0YXNldC5sbmcpIHx8IDQuODU7CiAgICAgICAgICAgIGNvbnN0IHpvb20gPSBwYXJzZUludChlbC5kYXRhc2V0Lnpvb20pIHx8IDEyOwogICAgICAgICAgICBjb25zdCBzY3JvbGwgPSBlbC5kYXRhc2V0LnNjcm9sbCA9PT0gJ291aSc7CiAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZWwuZGF0YXNldC5sYXllciB8fCAnb3NtJzsKICAgICAgICAgICAgY29uc3QgbWFya2Vyc0RhdGEgPSBlbC5kYXRhc2V0Lm1hcmtlcnM7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRQb3B1cCA9IGVsLmRhdGFzZXQucG9wdXA7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRUb29sdGlwID0gZWwuZGF0YXNldC50b29sdGlwOwoKICAgICAgICAgICAgY29uc3QgbGF5ZXJzID0gewogICAgICAgICAgICAgICAgb3NtOiAnaHR0cHM6Ly97c30udGlsZS5vcGVuc3RyZWV0bWFwLm9yZy97en0ve3h9L3t5fS5wbmcnLAogICAgICAgICAgICAgICAgdG9wbzogJ2h0dHBzOi8ve3N9LnRpbGUub3BlbnRvcG9tYXAub3JnL3t6fS97eH0ve3l9LnBuZycsCiAgICAgICAgICAgICAgICBkYXJrOiAnaHR0cHM6Ly97c30uYmFzZW1hcHMuY2FydG9jZG4uY29tL2RhcmtfYWxsL3t6fS97eH0ve3l9e3J9LnBuZycsCiAgICAgICAgICAgICAgICBsaWdodDogJ2h0dHBzOi8ve3N9LmJhc2VtYXBzLmNhcnRvY2RuLmNvbS9saWdodF9hbGwve3p9L3t4fS97eX17cn0ucG5nJwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgbWFwID0gTC5tYXAoZWwsIHsKICAgICAgICAgICAgICAgIHNjcm9sbFdoZWVsWm9vbTogc2Nyb2xsCiAgICAgICAgICAgIH0pLnNldFZpZXcoW2NlbnRlckxhdCwgY2VudGVyTG5nXSwgem9vbSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBMLnRpbGVMYXllcihsYXllcnNbbGF5ZXJdIHx8IGxheWVycy5vc20sIHsKICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnL2NvcHlyaWdodCI+T3BlblN0cmVldE1hcDwvYT4gY29udHJpYnV0b3JzJwogICAgICAgICAgICB9KS5hZGRUbyhtYXApOwoKICAgICAgICAgICAgbGV0IGhhc01hcmtlcnMgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIEdlc3Rpb24gZGVzIG1hcnF1ZXVycyBtdWx0aXBsZXMKICAgICAgICAgICAgaWYgKG1hcmtlcnNEYXRhICYmIG1hcmtlcnNEYXRhLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IG1hcmtlcnNEYXRhLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgICAgICBwb2ludHMuZm9yRWFjaChwID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXAudHJpbSgpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBwLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1MYXQgPSBwYXJzZUZsb2F0KHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbUxuZyA9IHBhcnNlRmxvYXQocGFydHNbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtVGV4dCA9IHBhcnRzLnNsaWNlKDIpLmpvaW4oJywnKS50cmltKCk7IC8vIFJlam9pbnQgbGUgcmVzdGUgc2kgdmlyZ3VsZXMgZGFucyBsZSB0ZXh0ZQogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihtTGF0KSAmJiAhaXNOYU4obUxuZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFttTGF0LCBtTG5nXSkuYWRkVG8obWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGV4dCAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFRvb2x0aXAobVRleHQpOyAvLyBVbmlxdWVtZW50IGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTWFya2VycyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gU2kgYXVjdW4gbWFycXVldXIgbidhIMOpdMOpIGFqb3V0w6kgdmlhIGxhIGxpc3RlLCBvbiBtZXQgbGUgbWFycXVldXIgY2VudHJhbCBhdmVjIHNlcyBpbmZvcwogICAgICAgICAgICBpZiAoIWhhc01hcmtlcnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlciA9IEwubWFya2VyKFtjZW50ZXJMYXQsIGNlbnRlckxuZ10pLmFkZFRvKG1hcCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFRvb2x0aXAgJiYgZGVmYXVsdFRvb2x0aXAudHJpbSgpICE9PSAiIikgewogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0VG9vbHRpcC50cmltKCkpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0UG9wdXAgJiYgZGVmYXVsdFBvcHVwLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTaSBvbiBhIHVuIHBhcmFtw6h0cmUgcG9wdXAsIG9uIGwndXRpbGlzZSBwb3VyIGxlIHN1cnZvbAogICAgICAgICAgICAgICAgICAgIG1hcmtlci5iaW5kVG9vbHRpcChkZWZhdWx0UG9wdXAudHJpbSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgZWwuZGF0YXNldC5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfSk7CiAgICB9CgogICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICBqUXVlcnkoaW5pdE1hcCk7CiAgICAgICAgaWYgKHR5cGVvZiBvbkFqYXhMb2FkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIG9uQWpheExvYWQoaW5pdE1hcCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaW5pdE1hcCk7CiAgICB9Cn0pKCk7Cjwvc2NyaXB0Pg==&#034;&gt;&lt;/div&gt; &lt;style&gt;
.spip-map-container { width: 100%; margin: 1.5rem auto; border-radius: 0.75rem; overflow: hidden; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); border: 1px solid #e5e7eb; background: #f9fafb;
} .spip-map-canvas { width: 100%; height: 100%; min-height: 350px; z-index: 1;
} @media (max-width: 640px) { .spip-map-container { aspect-ratio: 4/3 !important; border-radius: 0.5rem; } .spip-map-canvas { min-height: 250px; }
}
&lt;/style&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;map|lat=47.2184|lng=-1.5536|zoom=14|layer=topo|scroll=oui|tooltip=Survolez Nantes|popup=Le ch&#226;teau des ducs de Bretagne|width=100%|ratio=21/9&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Rappel des valeurs accept&#233;es :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; layer : osm (d&#233;faut), topo, light, dark&lt;/li&gt;&lt;li&gt; scroll : oui, non (d&#233;faut)&lt;/li&gt;&lt;li&gt; tooltip : N'importe quel texte (&#233;vitez les textes trop longs)&lt;/li&gt;&lt;li&gt; popup : N'importe quel texte (supporte quelques balises HTML simples)&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Aspects techniques&lt;/h2&gt;
&lt;p&gt;Le mod&#232;le a &#233;t&#233; pens&#233; pour &#234;tre performant et robuste :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; chargement asynchrone, sans blocage de l'affichage&lt;/li&gt;&lt;li&gt; compatibilit&#233; avec les rechargements Ajax&lt;/li&gt;&lt;li&gt; s&#233;curisation des donn&#233;es pour &#233;viter les erreurs li&#233;es aux caract&#232;res sp&#233;ciaux&lt;/li&gt;&lt;li&gt; adaptation automatique aux &#233;crans mobiles (responsive)&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Cas d'usage&lt;/h2&gt;
&lt;p&gt;Ce mod&#232;le permet de couvrir plusieurs besoins courants :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; afficher une localisation simple&lt;/li&gt;&lt;li&gt; pr&#233;senter un itin&#233;raire ou une zone g&#233;ographique&lt;/li&gt;&lt;li&gt; afficher plusieurs points d'int&#233;r&#234;t&lt;/li&gt;&lt;li&gt; proposer une carte immersive avec un format panoramique&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Ce mod&#232;le se veut simple, autonome et facilement int&#233;grable dans l'&#233;cosyst&#232;me SPIP. Il peut &#234;tre utilis&#233; tel quel ou servir de base pour des d&#233;veloppements plus avanc&#233;s, selon les besoins.&lt;br class='autobr' /&gt;
&lt;i&gt; &lt;strong&gt;Toute contribution ou am&#233;lioration reste la bienvenue.&lt;/strong&gt; &lt;/i&gt;&lt;/p&gt;
&lt;div class=&#034;comtaspip-container&#034; id=&#034;comtaspip-23&#034;&gt; &lt;a href=&#034;https://dev.chrysleg.fr/spip.php?action=comtar&amp;arg=23&amp;hash=136ac58d354701504bf1bd023a4eb2bff341ebed4b30aadec0c1f03a3c451f3d&amp;redirect=IMG%2Fzip%2Fmap.zip&#034; class=&#034;comtaspip-button&#034; title=&#034;T&#233;l&#233;charger Mod&#232;le Map&#034;&gt; &lt;span class=&#034;comtaspip-icon&#034;&gt; &lt;svg width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;none&#034; stroke=&#034;currentColor&#034; stroke-width=&#034;2.5&#034; stroke-linecap=&#034;round&#034; stroke-linejoin=&#034;round&#034;&gt; &lt;path d=&#034;M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2&#034;&gt;&lt;/path&gt; &lt;polyline points=&#034;7 11 12 16 17 11&#034;&gt;&lt;/polyline&gt; &lt;line x1=&#034;12&#034; y1=&#034;16&#034; x2=&#034;12&#034; y2=&#034;4&#034;&gt;&lt;/line&gt; &lt;/svg&gt; &lt;/span&gt; &lt;span class=&#034;comtaspip-label&#034;&gt; Mod&#232;le Map &lt;/span&gt; &lt;span class=&#034;comtaspip-badge&#034;&gt;6&lt;/span&gt; &lt;/a&gt; &lt;/div&gt;&lt;div class=&#034;mes-alert&#034;&gt; &lt;p&gt;&#9888;&#65039; ATTENTION : Contenu bas&#233; sur des exp&#233;rimentations, pas sur des pratiques professionnelles valid&#233;es. Peut contenir des erreurs ou des choix discutables. Testez, adaptez et v&#233;rifiez avant toute mise en production.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="https://dev.chrysleg.fr/IMG/zip/map.zip" length="2307" type="application/zip" />
		

	</item>
<item xml:lang="fr">
		<title>Mod&#232;le carousel SPIP accessible et responsive</title>
		<link>https://dev.chrysleg.fr/modele-carousel-spip-accessible-et-responsive</link>
		<guid isPermaLink="true">https://dev.chrysleg.fr/modele-carousel-spip-accessible-et-responsive</guid>
		<dc:date>2026-04-15T19:44:57Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Chrys</dc:creator>



		<description>&lt;p&gt;Un mod&#232;le carousel SPIP simple, accessible et responsive avec options avanc&#233;es et int&#233;gration facile&lt;/p&gt;

-
&lt;a href="https://dev.chrysleg.fr/-modeles-spip-" rel="directory"&gt;Mod&#232;les&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;D&#233;couvrez un mod&#232;le de carousel SPIP accessible, performant et simple &#224; int&#233;grer dans vos articles. Mis &#224; jour pour la derni&#232;re version de SPIP, il offre personnalisation, responsive et navigation fluide.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;div id=&#034;carousel_6a11cd92bf716&#034; class=&#034;spip-carousel-container ratio-libre&#034; data-autoplay=&#034;oui&#034; data-delay=&#034;4000&#034; role=&#034;region&#034; aria-roledescription=&#034;carousel&#034; aria-label=&#034;Carrousel d'images&#034;&gt; &lt;div class=&#034;spip-carousel-viewport&#034;&gt; &lt;ul class=&#034;spip-carousel-slides&#034;&gt; &lt;li class=&#034;spip-carousel-slide active&#034; id=&#034;carousel_6a11cd92bf716-slide-1&#034; role=&#034;group&#034; aria-roledescription=&#034;slide&#034; aria-label=&#034;1 sur 5&#034;&gt; &lt;div class=&#034;spip-carousel-image-wrapper&#034;&gt; &lt;img src='https://dev.chrysleg.fr/local/cache-vignettes/L500xH333/carousel-2-41551-41baf.jpg?1777451617' width='500' height='333' alt='Fond d'&#233;cran 1' loading='lazy' /&gt; &lt;/div&gt; &lt;div class=&#034;spip-carousel-caption&#034;&gt; &lt;h3 class=&#034;spip-carousel-title&#034;&gt;Fond d'&#233;cran 1&lt;/h3&gt; &lt;p class=&#034;spip-carousel-credits&#034;&gt;&#169; Moi&lt;/p&gt; &lt;/div&gt; &lt;/li&gt; &lt;li class=&#034;spip-carousel-slide &#034; id=&#034;carousel_6a11cd92bf716-slide-2&#034; role=&#034;group&#034; aria-roledescription=&#034;slide&#034; aria-label=&#034;2 sur 5&#034;&gt; &lt;div class=&#034;spip-carousel-image-wrapper&#034;&gt; &lt;img src='https://dev.chrysleg.fr/local/cache-vignettes/L500xH333/carousel-3-5a677-a2226.jpg?1777451617' width='500' height='333' alt='Fond d'&#233;cran 2' loading='lazy' /&gt; &lt;/div&gt; &lt;div class=&#034;spip-carousel-caption&#034;&gt; &lt;h3 class=&#034;spip-carousel-title&#034;&gt;Fond d'&#233;cran 2&lt;/h3&gt; &lt;p class=&#034;spip-carousel-credits&#034;&gt;&#169; Auteuse&lt;/p&gt; &lt;/div&gt; &lt;/li&gt; &lt;li class=&#034;spip-carousel-slide &#034; id=&#034;carousel_6a11cd92bf716-slide-3&#034; role=&#034;group&#034; aria-roledescription=&#034;slide&#034; aria-label=&#034;3 sur 5&#034;&gt; &lt;div class=&#034;spip-carousel-image-wrapper&#034;&gt; &lt;img src='https://dev.chrysleg.fr/local/cache-vignettes/L500xH333/carousel-1-9e5ae-9dc9f.jpg?1777451617' width='500' height='333' alt='Couch&#233; de soleil' loading='lazy' /&gt; &lt;/div&gt; &lt;div class=&#034;spip-carousel-caption&#034;&gt; &lt;h3 class=&#034;spip-carousel-title&#034;&gt;Couch&#233; de soleil&lt;/h3&gt; &lt;p class=&#034;spip-carousel-credits&#034;&gt;&#169; Auteur&lt;/p&gt; &lt;/div&gt; &lt;/li&gt; &lt;li class=&#034;spip-carousel-slide &#034; id=&#034;carousel_6a11cd92bf716-slide-4&#034; role=&#034;group&#034; aria-roledescription=&#034;slide&#034; aria-label=&#034;4 sur 5&#034;&gt; &lt;div class=&#034;spip-carousel-image-wrapper&#034;&gt; &lt;img src='https://dev.chrysleg.fr/local/cache-vignettes/L500xH307/carousel-4-66388-c61cc.jpg?1777451617' width='500' height='307' alt='Le gorille King Kong' loading='lazy' /&gt; &lt;/div&gt; &lt;div class=&#034;spip-carousel-caption&#034;&gt; &lt;h3 class=&#034;spip-carousel-title&#034;&gt;Le gorille King Kong&lt;/h3&gt; &lt;p class=&#034;spip-carousel-credits&#034;&gt;&#169; Natacha&lt;/p&gt; &lt;/div&gt; &lt;/li&gt; &lt;li class=&#034;spip-carousel-slide &#034; id=&#034;carousel_6a11cd92bf716-slide-5&#034; role=&#034;group&#034; aria-roledescription=&#034;slide&#034; aria-label=&#034;5 sur 5&#034;&gt; &lt;div class=&#034;spip-carousel-image-wrapper&#034;&gt; &lt;img src='https://dev.chrysleg.fr/local/cache-vignettes/L500xH333/carousel-5-6926e-ab493.jpg?1777451617' width='500' height='333' alt='Le lion' loading='lazy' /&gt; &lt;/div&gt; &lt;div class=&#034;spip-carousel-caption&#034;&gt; &lt;h3 class=&#034;spip-carousel-title&#034;&gt;Le lion&lt;/h3&gt; &lt;p class=&#034;spip-carousel-credits&#034;&gt;&#169; Bill&lt;/p&gt; &lt;/div&gt; &lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;button class=&#034;spip-carousel-prev&#034; aria-controls=&#034;carousel_6a11cd92bf716-slides&#034; aria-label=&#034;Image pr&#233;c&#233;dente&#034;&gt;&#8249;&lt;/button&gt; &lt;button class=&#034;spip-carousel-next&#034; aria-controls=&#034;carousel_6a11cd92bf716-slides&#034; aria-label=&#034;Image suivante&#034;&gt;&#8250;&lt;/button&gt; &lt;/div&gt; &lt;style&gt;
.spip-carousel-container { position: relative; width: 100%; max-width: 700px; margin: 2em auto; font-family: sans-serif; line-height: 1.5; z-index: 0; }
@media (max-width: 768px) { .spip-carousel-container { max-width: 100%; margin: 1em 0; }
}
.spip-carousel-container *, .spip-carousel-container ::before, .spip-carousel-container ::after { box-sizing: border-box; }
.spip-carousel-viewport { width: 100%; overflow: hidden; border-radius: 8px; }
.spip-carousel-slides { display: grid !important; grid-template-areas: &#034;stack&#034; !important; list-style: none !important; margin: 0 !important; padding: 0 !important; background: #000; }
.spip-carousel-slide { grid-area: stack; width: 100%; margin: 0 !important; padding: 0 !important; list-style: none !important; opacity: 0; visibility: hidden; transition: opacity 1.2s ease-in-out, transform 1.2s ease-in-out; z-index: 1; transform: scale(1.05);
}
.spip-carousel-slide.active { opacity: 1; visibility: visible; z-index: 2; transform: scale(1);
}
.spip-carousel-image-wrapper img { width: 100% !important; height: auto !important; display: block !important; transition: transform 10s linear !important; margin: 0 !important; }
.spip-carousel-slide.active img { transform: scale(1.1) !important; }
.spip-carousel-caption { padding: 20px 30px; background: linear-gradient(transparent, rgba(0,0,0,0.8)); color: #ffffff !important; position: absolute; bottom: 0; left: 0; right: 0; z-index: 3; text-align: left !important;
}
.spip-carousel-title { margin: 0 0 5px !important; font-size: 1.2em !important; color: #ffffff !important; font-weight: bold !important; text-transform: none !important; }
.spip-carousel-descriptif { font-size: 0.9em !important; opacity: 0.8 !important; margin: 0 !important; line-height: 1.2 !important; color: #ffffff !important; }
.spip-carousel-credits { font-size: 0.7em !important; margin: 0 !important; opacity: 0.6 !important; line-height: 1.2 !important; color: #ffffff !important; } /* Navigation */
.spip-carousel-prev, .spip-carousel-next { position: absolute; top: 50%; transform: translateY(-50%); background: rgba(255,255,255,0.7); border: none; width: 44px; height: 44px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; z-index: 10; font-size: 1.5em; opacity: 0; visibility: hidden; transition: all 0.3s ease; box-shadow: 0 2px 8px rgba(0,0,0,0.2);
}
.spip-carousel-container:hover .spip-carousel-prev, .spip-carousel-container:hover .spip-carousel-next { opacity: 1; visibility: visible; }
.spip-carousel-prev:hover, .spip-carousel-next:hover { background: rgba(255,255,255,1); transform: translateY(-50%) scale(1.1);
}
.spip-carousel-prev { left: 15px; }
.spip-carousel-next { right: 15px; }
.spip-carousel-dots { display: flex; justify-content: center; gap: 8px; margin-top: 10px; }
.spip-carousel-dot { width: 12px; height: 12px; border-radius: 50%; border: 1px solid #ccc; background: #fff; cursor: pointer; padding: 0; }
.spip-carousel-dot.active { background: #333; border-color: #333; } /* Ratios */
.ratio-16-9 .spip-carousel-image-wrapper { aspect-ratio: 16/9; }
.ratio-4-3 .spip-carousel-image-wrapper { aspect-ratio: 4/3; }
.ratio-carre .spip-carousel-image-wrapper { aspect-ratio: 1/1; }
.ratio-16-9 img, .ratio-4-3 img, .ratio-carre img { object-fit: cover; height: 100%; }
&lt;/style&gt; &lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdD4KKGZ1bmN0aW9uKCkgewoJZnVuY3Rpb24gaW5pdENhcm91c2VsKGVsKSB7CgkJY29uc3Qgc2xpZGVzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnLnNwaXAtY2Fyb3VzZWwtc2xpZGUnKTsKCQljb25zdCBkb3RzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnLnNwaXAtY2Fyb3VzZWwtZG90Jyk7CgkJY29uc3QgcHJldiA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5zcGlwLWNhcm91c2VsLXByZXYnKTsKCQljb25zdCBuZXh0ID0gZWwucXVlcnlTZWxlY3RvcignLnNwaXAtY2Fyb3VzZWwtbmV4dCcpOwoJCWxldCBjdXJyZW50ID0gMDsKCQlsZXQgdGltZXIgPSBudWxsOwoJCWNvbnN0IGF1dG9wbGF5ID0gZWwuZGF0YXNldC5hdXRvcGxheSA9PT0gJ291aSc7CgkJY29uc3QgZGVsYXkgPSBwYXJzZUludChlbC5kYXRhc2V0LmRlbGF5KSB8fCA1MDAwOwoKCQlmdW5jdGlvbiBzaG93KGluZGV4KSB7CgkJCXNsaWRlc1tjdXJyZW50XS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTsKCQkJaWYgKGRvdHNbY3VycmVudF0pIHsKCQkJCWRvdHNbY3VycmVudF0uY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7CgkJCQlkb3RzW2N1cnJlbnRdLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICdmYWxzZScpOwoJCQl9CgkJCQoJCQljdXJyZW50ID0gKGluZGV4ICsgc2xpZGVzLmxlbmd0aCkgJSBzbGlkZXMubGVuZ3RoOwoJCQkKCQkJc2xpZGVzW2N1cnJlbnRdLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpOwoJCQlpZiAoZG90c1tjdXJyZW50XSkgewoJCQkJZG90c1tjdXJyZW50XS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKCQkJCWRvdHNbY3VycmVudF0uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ3RydWUnKTsKCQkJfQoJCX0KCgkJaWYgKHByZXYpIHByZXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHNob3coY3VycmVudCAtIDEpOyByZXNldFRpbWVyKCk7IH0pOwoJCWlmIChuZXh0KSBuZXh0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4geyBzaG93KGN1cnJlbnQgKyAxKTsgcmVzZXRUaW1lcigpOyB9KTsKCQkKCQlkb3RzLmZvckVhY2goKGRvdCwgaSkgPT4gewoJCQlkb3QuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IHNob3coaSk7IHJlc2V0VGltZXIoKTsgfSk7CgkJfSk7CgoJCWZ1bmN0aW9uIHN0YXJ0VGltZXIoKSB7CgkJCWlmIChhdXRvcGxheSkgewoJCQkJdGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiBzaG93KGN1cnJlbnQgKyAxKSwgZGVsYXkpOwoJCQl9CgkJfQoKCQlmdW5jdGlvbiByZXNldFRpbWVyKCkgewoJCQlpZiAodGltZXIpIHsKCQkJCWNsZWFySW50ZXJ2YWwodGltZXIpOwoJCQkJc3RhcnRUaW1lcigpOwoJCQl9CgkJfQoKCQlzdGFydFRpbWVyKCk7CgoJCS8vIFN3aXBlIHN1cHBvcnQgc2ltcGxlCgkJbGV0IHN0YXJ0WCA9IDA7CgkJZWwuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGUgPT4gc3RhcnRYID0gZS50b3VjaGVzWzBdLmNsaWVudFgpOwoJCWVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgZSA9PiB7CgkJCWxldCBkaWZmID0gc3RhcnRYIC0gZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYOwoJCQlpZiAoTWF0aC5hYnMoZGlmZikgPiA1MCkgewoJCQkJc2hvdyhjdXJyZW50ICsgKGRpZmYgPiAwID8gMSA6IC0xKSk7CgkJCQlyZXNldFRpbWVyKCk7CgkJCX0KCQl9KTsKCX0KCglkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3BpcC1jYXJvdXNlbC1jb250YWluZXInKS5mb3JFYWNoKGluaXRDYXJvdXNlbCk7Cn0pKCk7Cjwvc2NyaXB0Pg==&#034;&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Un mod&#232;le de carrousel SPIP accessible et remis &#224; jour&lt;/h2&gt;
&lt;p&gt;Il y a trois ans, j'avais d&#233;velopp&#233; un mod&#232;le de carrousel pour SPIP avec un objectif simple : proposer une solution &#224; la fois &#233;l&#233;gante, performante et r&#233;ellement accessible. Avec les &#233;volutions r&#233;centes de SPIP, j'ai pris le temps de le remettre &#224; jour pour garantir sa compatibilit&#233; avec la derni&#232;re version&#8230; et en profiter pour affiner certains aspects.&lt;/p&gt;
&lt;p&gt;Aujourd'hui, je vous propose un retour sur ce mod&#232;le, sa philosophie et son utilisation.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Un mod&#232;le pens&#233; pour &#234;tre simple &#224; int&#233;grer&lt;/h2&gt;
&lt;p&gt;D&#232;s le d&#233;part, j'ai voulu quelque chose de facile &#224; d&#233;ployer. L'installation reste volontairement minimale : il suffit de d&#233;poser un fichier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;carousel.html&lt;/code&gt; dans le dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;squelettes/modeles/&lt;/code&gt;. Rien de plus.&lt;/p&gt;
&lt;p&gt;Le mod&#232;le s'appuie sur les fonctionnalit&#233;s natives de SPIP, notamment le plugin Images (d&#233;j&#224; pr&#233;sent par d&#233;faut), ce qui permet de b&#233;n&#233;ficier du redimensionnement automatique sans configuration suppl&#233;mentaire.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Une utilisation directe dans les articles&lt;/h2&gt;
&lt;p&gt;L'un des points cl&#233;s, c'est l'int&#233;gration dans le flux &#233;ditorial. Pas besoin de passer par des configurations complexes : tout se fait directement dans le texte de l'article.&lt;/p&gt;
&lt;p&gt;Deux approches sont possibles :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Automatique&lt;/strong&gt; : r&#233;cup&#233;rer toutes les images li&#233;es &#224; un article&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;carousel|id_article=XX&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Manuelle&lt;/strong&gt; : s&#233;lectionner pr&#233;cis&#233;ment les images &#224; afficher&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;carousel|images=12,15,18&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cette flexibilit&#233; permet de couvrir la majorit&#233; des cas sans alourdir le workflow.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Un syst&#232;me de param&#232;tres complet mais lisible&lt;/h2&gt;
&lt;p&gt;J'ai voulu &#233;viter les usines &#224; gaz, tout en offrant suffisamment de contr&#244;le. Le mod&#232;le accepte plusieurs param&#232;tres combinables, qui permettent d'ajuster finement le comportement du carrousel.&lt;/p&gt;
&lt;p&gt;Par exemple :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;carousel|id_article=12|autoplay=oui|delay=4000|ratio=16:9|legendes=non&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;carousel|images=12,15,18&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Voici les principaux r&#233;glages :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;autoplay&lt;/strong&gt; : active le d&#233;filement automatique&lt;/li&gt;&lt;li&gt; &lt;strong&gt;delay&lt;/strong&gt; : contr&#244;le l'intervalle entre les images&lt;/li&gt;&lt;li&gt; &lt;strong&gt;legendes&lt;/strong&gt; : affiche ou masque les textes associ&#233;s&lt;/li&gt;&lt;li&gt; &lt;strong&gt;navigation&lt;/strong&gt; : choix entre fl&#232;ches, points, les deux ou aucun&lt;/li&gt;&lt;li&gt; &lt;strong&gt;ratio&lt;/strong&gt; : impose un format d'image (16:9, 4:3, carr&#233; ou libre)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;L'id&#233;e est de rester explicite et lisible, m&#234;me pour quelqu'un qui d&#233;couvre le mod&#232;le.&lt;/p&gt;
&lt;p&gt;Le plus simple (toutes les images de l'article) :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;carousel|id_article=#ID_ARTICLE&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;S&#233;lection pr&#233;cise d'images :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;carousel|images=15,16,17,18,19&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Mode diaporama automatique (toutes les 3 secondes) :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;carousel|id_article=#ID_ARTICLE|autoplay=oui|delay=3000&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Format Cin&#233;ma (16:9) sans l&#233;gendes :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;carousel|id_article=#ID_ARTICLE|ratio=16:9|legendes=non&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Format Carr&#233; avec navigation compl&#232;te (fl&#232;ches + points) :&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;carousel|id_article=#ID_ARTICLE|ratio=carre|navigation=les-deux&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Une gestion propre des l&#233;gendes&lt;/h2&gt;
&lt;p&gt;Plut&#244;t que d'inventer un syst&#232;me parall&#232;le, je me suis appuy&#233; sur ce que SPIP fait d&#233;j&#224; tr&#232;s bien : la gestion des documents.&lt;/p&gt;
&lt;p&gt;Les textes sont directement saisis dans l'espace priv&#233; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;Titre&lt;/strong&gt; : utilis&#233; comme titre principal&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Descriptif&lt;/strong&gt; : affich&#233; comme description&lt;/li&gt;&lt;li&gt; &lt;strong&gt;Cr&#233;dits&lt;/strong&gt; : utilis&#233; pour le copyright&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Cela permet aux r&#233;dacteurs de rester dans leur environnement habituel, sans apprentissage suppl&#233;mentaire.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Accessibilit&#233; et responsive : des priorit&#233;s, pas des options&lt;/h2&gt;
&lt;p&gt;Ce mod&#232;le n'est pas qu'un simple slider visuel. J'ai port&#233; une attention particuli&#232;re &#224; l'accessibilit&#233; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; navigation possible au clavier&lt;/li&gt;&lt;li&gt; attributs ARIA int&#233;gr&#233;s&lt;/li&gt;&lt;li&gt; comportement coh&#233;rent pour les lecteurs d'&#233;cran&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;C&#244;t&#233; responsive, le carrousel s'adapte naturellement &#224; toutes les tailles d'&#233;cran. Sur mobile, le support du geste de swipe permet une navigation fluide et intuitive.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Des performances ma&#238;tris&#233;es&lt;/h2&gt;
&lt;p&gt;Un carrousel peut vite devenir un point de friction en termes de performance. J'ai donc int&#233;gr&#233; du lazy-loading natif pour &#233;viter de charger inutilement les images hors &#233;cran.&lt;/p&gt;
&lt;p&gt;Les transitions restent l&#233;g&#232;res : un fondu doux accompagn&#233; d'un l&#233;ger zoom, suffisamment discret pour ne pas g&#234;ner la lecture.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Une mise &#224; jour pour la derni&#232;re version de SPIP&lt;/h2&gt;
&lt;p&gt;Cette mise &#224; jour n'est pas qu'une simple adaptation technique. J'en ai profit&#233; pour :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; am&#233;liorer la compatibilit&#233; globale&lt;/li&gt;&lt;li&gt; fiabiliser certains comportements&lt;/li&gt;&lt;li&gt; nettoyer le code pour le rendre plus maintenable&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Le mod&#232;le reste fid&#232;le &#224; son objectif initial : proposer une solution robuste, accessible et facile &#224; utiliser.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Un point &#224; ne pas oublier&lt;/h2&gt;
&lt;p&gt;Comme souvent avec SPIP, si vous modifiez le mod&#232;le ou les contenus et que rien ne semble changer&#8230; pensez &#224; vider le cache.&lt;/p&gt;
&lt;p&gt;C'est un r&#233;flexe simple, mais indispensable.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Ce mod&#232;le de carrousel s'inscrit dans une approche pragmatique : tirer parti de SPIP sans le complexifier, tout en respectant les bonnes pratiques modernes (accessibilit&#233;, responsive, performance).&lt;/p&gt;
&lt;p&gt;Trois ans apr&#232;s sa cr&#233;ation, je suis satisfait de voir qu'il reste pertinent, et surtout qu'il continue &#224; r&#233;pondre efficacement &#224; des besoins concrets.&lt;/p&gt;
&lt;p&gt;Si vous cherchez un carrousel simple, propre et int&#233;gr&#233; &#224; votre logique &#233;ditoriale, ce mod&#232;le devrait faire le travail sans surprise.&lt;/p&gt;
&lt;div class=&#034;comtaspip-container&#034; id=&#034;comtaspip-21&#034;&gt; &lt;a href=&#034;https://dev.chrysleg.fr/spip.php?action=comtar&amp;arg=21&amp;hash=18893d16444184ea19d765f7bdf26a454434b34c18e6c961e82cf3c51c8cea82&amp;redirect=IMG%2Fzip%2Fmodele_carousel.zip&#034; class=&#034;comtaspip-button&#034; title=&#034;T&#233;l&#233;charger Mod&#232;le Carousel&#034;&gt; &lt;span class=&#034;comtaspip-icon&#034;&gt; &lt;svg width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;none&#034; stroke=&#034;currentColor&#034; stroke-width=&#034;2.5&#034; stroke-linecap=&#034;round&#034; stroke-linejoin=&#034;round&#034;&gt; &lt;path d=&#034;M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2&#034;&gt;&lt;/path&gt; &lt;polyline points=&#034;7 11 12 16 17 11&#034;&gt;&lt;/polyline&gt; &lt;line x1=&#034;12&#034; y1=&#034;16&#034; x2=&#034;12&#034; y2=&#034;4&#034;&gt;&lt;/line&gt; &lt;/svg&gt; &lt;/span&gt; &lt;span class=&#034;comtaspip-label&#034;&gt; Mod&#232;le Carousel &lt;/span&gt; &lt;span class=&#034;comtaspip-badge&#034;&gt;4&lt;/span&gt; &lt;/a&gt; &lt;/div&gt;&lt;div class=&#034;mes-alert&#034;&gt; &lt;p&gt;&#9888;&#65039; ATTENTION : Contenu bas&#233; sur des exp&#233;rimentations, pas sur des pratiques professionnelles valid&#233;es. Peut contenir des erreurs ou des choix discutables. Testez, adaptez et v&#233;rifiez avant toute mise en production.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="https://dev.chrysleg.fr/IMG/zip/modele_carousel.zip" length="3295" type="application/zip" />
		

	</item>
<item xml:lang="fr">
		<title>Mod&#232;le SPIP pour int&#233;grer des vid&#233;os YouTube</title>
		<link>https://dev.chrysleg.fr/video</link>
		<guid isPermaLink="true">https://dev.chrysleg.fr/video</guid>
		<dc:date>2026-04-08T08:08:18Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Chrys</dc:creator>



		<description>&lt;p&gt;Int&#233;grez des vid&#233;os YouTube dans SPIP avec un mod&#232;le responsive, propre et optimis&#233;&lt;/p&gt;

-
&lt;a href="https://dev.chrysleg.fr/-modeles-spip-" rel="directory"&gt;Mod&#232;les&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;J'ai con&#231;u un mod&#232;le SPIP simple et efficace pour int&#233;grer des vid&#233;os YouTube sans contrainte technique. Il garantit un affichage responsive, propre et respectueux des standards actuels.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;L'int&#233;gration de vid&#233;os est devenue essentielle dans un site &#233;ditorial. Pour r&#233;pondre &#224; ce besoin, j'ai con&#231;u le mod&#232;le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;video_player.html&lt;/code&gt;, qui permet d'ins&#233;rer des vid&#233;os YouTube de mani&#232;re propre, responsive et sans surcharge visuelle. Voici comment l'utiliser.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation du mod&#232;le&lt;/h2&gt;
&lt;p&gt;Pour que SPIP reconnaisse le mod&#232;le, je place le fichier &#224; cet emplacement :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;squelettes/modeles/video_player.html&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Une fois install&#233;, il est imm&#233;diatement op&#233;rationnel dans mes articles.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Utilisation de base avec YouTube&lt;/h2&gt;
&lt;p&gt;J'ins&#232;re une vid&#233;o directement dans le texte gr&#226;ce &#224; une balise simple.&lt;/p&gt;
&lt;p&gt;Avec une URL compl&#232;te :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;video_player|id=https://www.youtube.com/watch?v=dQw4w9WgXcQ&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Avec un identifiant de vid&#233;o :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;video_player|id=dQw4w9WgXcQ&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Le mod&#232;le d&#233;tecte automatiquement le format fourni et s'adapte sans configuration suppl&#233;mentaire.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Param&#232;tres disponibles&lt;/h2&gt;
&lt;p&gt;J'ai pr&#233;vu plusieurs param&#232;tres pour ajuster l'affichage selon mes besoins :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;strong&gt;id&lt;/strong&gt; : URL YouTube ou identifiant (obligatoire)&lt;/li&gt;&lt;li&gt; &lt;strong&gt;largeur&lt;/strong&gt; : largeur en pixels (600 par d&#233;faut)&lt;/li&gt;&lt;li&gt; &lt;strong&gt;hauteur&lt;/strong&gt; : calcul&#233;e automatiquement (ratio 16:9)&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Fonctionnalit&#233;s avanc&#233;es&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ratio automatique (16:9)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lorsque je modifie la largeur, la hauteur est recalcul&#233;e automatiquement pour conserver un format vid&#233;o optimal.&lt;/p&gt;
&lt;p&gt;Exemple :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;video_player|id=dQw4w9WgXcQ|largeur=800&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;La hauteur sera ajust&#233;e &#224; &lt;strong&gt;450 px&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design responsive&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;La vid&#233;o s'adapte automatiquement &#224; la taille de l'&#233;cran. Sur mobile et tablette, elle reste lisible et proportionn&#233;e, tout en respectant la largeur maximale d&#233;finie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design &#233;pur&#233;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;J'ai volontairement choisi un rendu minimaliste :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Aucun arrondi sur les angles&lt;/li&gt;&lt;li&gt; Pas d'ombres ni d'effets superflus&lt;/li&gt;&lt;li&gt; Int&#233;gration discr&#232;te dans le contenu &#233;ditorial&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Respect de la vie priv&#233;e&lt;/h2&gt;
&lt;p&gt;Le mod&#232;le utilise le domaine &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;youtube-nocookie.com&lt;/code&gt;, ce qui limite le d&#233;p&#244;t de cookies et am&#233;liore la protection des visiteurs.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Exemples d'utilisation&lt;/h2&gt;&lt;div class=&#034;video-conteneur &#034; style=&#034;max-width:600px; margin:1em auto; clear:both;&#034;&gt; &lt;div style=&#034;position:relative; padding-bottom:56.25%; height:0; overflow:hidden; background:#000;&#034;&gt; &lt;iframe src=&#034;https://www.youtube-nocookie.com/embed/c0yHDm1jNl8?rel=0&amp;start=0&#034; title=&#034;Vid&#233;o&#034; frameborder=&#034;0&#034; allow=&#034;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#034; allowfullscreen style=&#034;position:absolute; top:0; left:0; width:100%; height:100%; border:0;&#034;&gt; &lt;/iframe&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ici r&#233;duit a 400px&lt;/p&gt;
&lt;div class=&#034;video-conteneur &#034; style=&#034;max-width:400px; margin:1em auto; clear:both;&#034;&gt; &lt;div style=&#034;position:relative; padding-bottom:56.25%; height:0; overflow:hidden; background:#000;&#034;&gt; &lt;iframe src=&#034;https://www.youtube-nocookie.com/embed/YKtdEpItcRg?rel=0&amp;start=0&#034; title=&#034;Vid&#233;o&#034; frameborder=&#034;0&#034; allow=&#034;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#034; allowfullscreen style=&#034;position:absolute; top:0; left:0; width:100%; height:100%; border:0;&#034;&gt; &lt;/iframe&gt; &lt;/div&gt;
&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Avec ce mod&#232;le, je dispose d'une solution simple et fiable pour int&#233;grer des vid&#233;os YouTube dans SPIP. Il me permet de garder un rendu propre, coh&#233;rent et performant, tout en restant facile &#224; utiliser au quotidien.&lt;/p&gt;
&lt;div class=&#034;comtaspip-container&#034; id=&#034;comtaspip-22&#034;&gt; &lt;a href=&#034;https://dev.chrysleg.fr/spip.php?action=comtar&amp;arg=22&amp;hash=99eccf29efea5d32336e9123dfe590ba0d17ee5aeaa198947cef43b204439d0d&amp;redirect=IMG%2Fzip%2Fvideo_player.zip&#034; class=&#034;comtaspip-button&#034; title=&#034;T&#233;l&#233;charger Mod&#232;le Vid&#233;o player&#034;&gt; &lt;span class=&#034;comtaspip-icon&#034;&gt; &lt;svg width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;none&#034; stroke=&#034;currentColor&#034; stroke-width=&#034;2.5&#034; stroke-linecap=&#034;round&#034; stroke-linejoin=&#034;round&#034;&gt; &lt;path d=&#034;M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2&#034;&gt;&lt;/path&gt; &lt;polyline points=&#034;7 11 12 16 17 11&#034;&gt;&lt;/polyline&gt; &lt;line x1=&#034;12&#034; y1=&#034;16&#034; x2=&#034;12&#034; y2=&#034;4&#034;&gt;&lt;/line&gt; &lt;/svg&gt; &lt;/span&gt; &lt;span class=&#034;comtaspip-label&#034;&gt; Mod&#232;le Vid&#233;o player &lt;/span&gt; &lt;span class=&#034;comtaspip-badge&#034;&gt;8&lt;/span&gt; &lt;/a&gt; &lt;/div&gt;&lt;div class=&#034;mes-alert&#034;&gt; &lt;p&gt;&#9888;&#65039; ATTENTION : Contenu bas&#233; sur des exp&#233;rimentations, pas sur des pratiques professionnelles valid&#233;es. Peut contenir des erreurs ou des choix discutables. Testez, adaptez et v&#233;rifiez avant toute mise en production.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="https://dev.chrysleg.fr/IMG/zip/video_player.zip" length="1315" type="application/zip" />
		

	</item>
<item xml:lang="fr">
		<title>Mod&#232;le SPIP Lecteur audio</title>
		<link>https://dev.chrysleg.fr/lecteur-audio-compact-pour-spip</link>
		<guid isPermaLink="true">https://dev.chrysleg.fr/lecteur-audio-compact-pour-spip</guid>
		<dc:date>2026-04-05T09:15:05Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Chrys</dc:creator>



		<description>&lt;p&gt;Int&#233;grez facilement un lecteur audio compact SPIP avec lecture simple ou playlist multi fichiers&lt;/p&gt;

-
&lt;a href="https://dev.chrysleg.fr/-modeles-spip-" rel="directory"&gt;Mod&#232;les&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Ajoutez un lecteur audio compact et moderne &#224; vos articles SPIP en quelques &#233;tapes simples. Ce mod&#232;le permet de g&#233;rer aussi bien un fichier unique qu'une playlist compl&#232;te avec navigation fluide.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;J'ai d&#233;velopp&#233; un petit mod&#232;le de lecteur audio pour SPIP, avec l'id&#233;e de proposer quelque chose de &lt;strong&gt;simple &#224; int&#233;grer&lt;/strong&gt;, &lt;strong&gt;agr&#233;able &#224; utiliser&lt;/strong&gt; et &lt;strong&gt;visuellement propre&lt;/strong&gt;. Le r&#233;sultat est un lecteur au design sombre et compact, capable de g&#233;rer aussi bien un fichier unique que de vraies playlists.&lt;/p&gt;
&lt;p&gt;Pour illustrer son fonctionnement, je vous propose trois essais juste en dessous :&lt;/p&gt;
&lt;p&gt;Un &lt;strong&gt;lecteur simple&lt;/strong&gt; (un seul fichier audio)&lt;/p&gt;
&lt;link rel=&#034;stylesheet&#034; href='https://dev.chrysleg.fr/squelettes/css/audio_player.css' type=&#034;text/css&#034; /&gt;
&lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdCBzcmM9InNxdWVsZXR0ZXMvamF2YXNjcmlwdC9hdWRpb19wbGF5ZXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+&#034;&gt;&lt;/div&gt; &lt;div class=&#034;spip-audio-player-compact&#034; id=&#034;player-a87ff6&#034;&gt; &lt;div class=&#034;player-main-row&#034;&gt; &lt;button class=&#034;btn-play-compact&#034; title=&#034;Lire/Pause&#034;&gt; &lt;svg class=&#034;play-icon&#034; width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034;&gt;&lt;path d=&#034;M8 5v14l11-7z&#034;/&gt;&lt;/svg&gt; &lt;svg class=&#034;pause-icon&#034; width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034; style=&#034;display:none;&#034;&gt;&lt;path d=&#034;M6 19h4V5H6v14zm8-14v14h4V5h-4z&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;div class=&#034;player-info-controls&#034;&gt; &lt;div class=&#034;track-meta&#034;&gt; &lt;div class=&#034;track-text&#034;&gt; &lt;h3 class=&#034;track-title-compact&#034;&gt;&lt;/h3&gt; &lt;p class=&#034;track-artist-compact&#034;&gt;&lt;/p&gt; &lt;/div&gt; &lt;div class=&#034;compact-controls&#034;&gt; &lt;button class=&#034;btn-nav-compact btn-prev&#034; title=&#034;Pr&#233;c&#233;dent&#034;&gt; &lt;svg width=&#034;18&#034; height=&#034;18&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034;&gt;&lt;path d=&#034;M6 6h2v12H6zm3.5 6l8.5 6V6z&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;button class=&#034;btn-nav-compact btn-next&#034; title=&#034;Suivant&#034;&gt; &lt;svg width=&#034;18&#034; height=&#034;18&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034;&gt;&lt;path d=&#034;M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;button class=&#034;playlist-toggle&#034; title=&#034;Playlist&#034;&gt; &lt;svg width=&#034;18&#034; height=&#034;18&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;none&#034; stroke=&#034;currentColor&#034; stroke-width=&#034;2&#034;&gt;&lt;path d=&#034;M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class=&#034;progress-wrapper-compact&#034;&gt; &lt;div class=&#034;progress-container-compact&#034;&gt; &lt;div class=&#034;progress-bar-compact&#034;&gt;&lt;/div&gt; &lt;/div&gt; &lt;div class=&#034;time-compact&#034;&gt; &lt;span class=&#034;current-time&#034;&gt;&lt;/span&gt; &lt;span class=&#034;duration&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class=&#034;playlist-compact&#034; style=&#034;display:none;&#034;&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/mp3/hub_city_kids.mp3&#034; data-title=&#034;Hub City Kids&#034; data-artist=&#034;Dave LARUE&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;audio&gt;&lt;/audio&gt;
&lt;/div&gt;
&lt;/B_audio_check&gt;
&lt;p&gt;Un &lt;strong&gt;multi-lecteur avec playlist&lt;/strong&gt; (plusieurs pistes encha&#238;n&#233;es)&lt;/p&gt;
&lt;link rel=&#034;stylesheet&#034; href='https://dev.chrysleg.fr/squelettes/css/audio_player.css' type=&#034;text/css&#034; /&gt;
&lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdCBzcmM9InNxdWVsZXR0ZXMvamF2YXNjcmlwdC9hdWRpb19wbGF5ZXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+&#034;&gt;&lt;/div&gt; &lt;div class=&#034;spip-audio-player-compact&#034; id=&#034;player-eccbc8&#034;&gt; &lt;div class=&#034;player-main-row&#034;&gt; &lt;button class=&#034;btn-play-compact&#034; title=&#034;Lire/Pause&#034;&gt; &lt;svg class=&#034;play-icon&#034; width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034;&gt;&lt;path d=&#034;M8 5v14l11-7z&#034;/&gt;&lt;/svg&gt; &lt;svg class=&#034;pause-icon&#034; width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034; style=&#034;display:none;&#034;&gt;&lt;path d=&#034;M6 19h4V5H6v14zm8-14v14h4V5h-4z&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;div class=&#034;player-info-controls&#034;&gt; &lt;div class=&#034;track-meta&#034;&gt; &lt;div class=&#034;track-text&#034;&gt; &lt;h3 class=&#034;track-title-compact&#034;&gt;&lt;/h3&gt; &lt;p class=&#034;track-artist-compact&#034;&gt;&lt;/p&gt; &lt;/div&gt; &lt;div class=&#034;compact-controls&#034;&gt; &lt;button class=&#034;btn-nav-compact btn-prev&#034; title=&#034;Pr&#233;c&#233;dent&#034;&gt; &lt;svg width=&#034;18&#034; height=&#034;18&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034;&gt;&lt;path d=&#034;M6 6h2v12H6zm3.5 6l8.5 6V6z&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;button class=&#034;btn-nav-compact btn-next&#034; title=&#034;Suivant&#034;&gt; &lt;svg width=&#034;18&#034; height=&#034;18&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034;&gt;&lt;path d=&#034;M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;button class=&#034;playlist-toggle&#034; title=&#034;Playlist&#034;&gt; &lt;svg width=&#034;18&#034; height=&#034;18&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;none&#034; stroke=&#034;currentColor&#034; stroke-width=&#034;2&#034;&gt;&lt;path d=&#034;M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class=&#034;progress-wrapper-compact&#034;&gt; &lt;div class=&#034;progress-container-compact&#034;&gt; &lt;div class=&#034;progress-bar-compact&#034;&gt;&lt;/div&gt; &lt;/div&gt; &lt;div class=&#034;time-compact&#034;&gt; &lt;span class=&#034;current-time&#034;&gt;&lt;/span&gt; &lt;span class=&#034;duration&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class=&#034;playlist-compact&#034; style=&#034;display:none;&#034;&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/m4a/magnum.m4a&#034; data-title=&#034;Magnum&#034; data-artist=&#034;Chris RIME&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/mp3/french_kiss.mp3&#034; data-title=&#034;French Kiss&#034; data-artist=&#034;Dam Nco&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/mp3/signal.mp3&#034; data-title=&#034;Signal&#034; data-artist=&#034;Alain CARON&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/mp3/la_casbah_live_.mp3&#034; data-title=&#034;La Casbah (live)&#034; data-artist=&#034;Emmanuel BINET&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;audio&gt;&lt;/audio&gt;
&lt;/div&gt;
&lt;/B_audio_check&gt;
&lt;p&gt;Un &lt;strong&gt;multi-lecteur avec playlist&lt;/strong&gt; regroupant tous les audios de cette article&lt;/p&gt;
&lt;link rel=&#034;stylesheet&#034; href='https://dev.chrysleg.fr/squelettes/css/audio_player.css' type=&#034;text/css&#034; /&gt;
&lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdCBzcmM9InNxdWVsZXR0ZXMvamF2YXNjcmlwdC9hdWRpb19wbGF5ZXIuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+&#034;&gt;&lt;/div&gt; &lt;div class=&#034;spip-audio-player-compact&#034; id=&#034;player-eccbc8&#034;&gt; &lt;div class=&#034;player-main-row&#034;&gt; &lt;button class=&#034;btn-play-compact&#034; title=&#034;Lire/Pause&#034;&gt; &lt;svg class=&#034;play-icon&#034; width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034;&gt;&lt;path d=&#034;M8 5v14l11-7z&#034;/&gt;&lt;/svg&gt; &lt;svg class=&#034;pause-icon&#034; width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034; style=&#034;display:none;&#034;&gt;&lt;path d=&#034;M6 19h4V5H6v14zm8-14v14h4V5h-4z&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;div class=&#034;player-info-controls&#034;&gt; &lt;div class=&#034;track-meta&#034;&gt; &lt;div class=&#034;track-text&#034;&gt; &lt;h3 class=&#034;track-title-compact&#034;&gt;&lt;/h3&gt; &lt;p class=&#034;track-artist-compact&#034;&gt;&lt;/p&gt; &lt;/div&gt; &lt;div class=&#034;compact-controls&#034;&gt; &lt;button class=&#034;btn-nav-compact btn-prev&#034; title=&#034;Pr&#233;c&#233;dent&#034;&gt; &lt;svg width=&#034;18&#034; height=&#034;18&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034;&gt;&lt;path d=&#034;M6 6h2v12H6zm3.5 6l8.5 6V6z&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;button class=&#034;btn-nav-compact btn-next&#034; title=&#034;Suivant&#034;&gt; &lt;svg width=&#034;18&#034; height=&#034;18&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;currentColor&#034;&gt;&lt;path d=&#034;M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;button class=&#034;playlist-toggle&#034; title=&#034;Playlist&#034;&gt; &lt;svg width=&#034;18&#034; height=&#034;18&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;none&#034; stroke=&#034;currentColor&#034; stroke-width=&#034;2&#034;&gt;&lt;path d=&#034;M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01&#034;/&gt;&lt;/svg&gt; &lt;/button&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class=&#034;progress-wrapper-compact&#034;&gt; &lt;div class=&#034;progress-container-compact&#034;&gt; &lt;div class=&#034;progress-bar-compact&#034;&gt;&lt;/div&gt; &lt;/div&gt; &lt;div class=&#034;time-compact&#034;&gt; &lt;span class=&#034;current-time&#034;&gt;&lt;/span&gt; &lt;span class=&#034;duration&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class=&#034;playlist-compact&#034; style=&#034;display:none;&#034;&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/mp3/french_kiss.mp3&#034; data-title=&#034;French Kiss&#034; data-artist=&#034;Dam Nco&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/mp3/hub_city_kids.mp3&#034; data-title=&#034;Hub City Kids&#034; data-artist=&#034;Dave LARUE&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/mp3/la_casbah_live_.mp3&#034; data-title=&#034;La Casbah (live)&#034; data-artist=&#034;Emmanuel BINET&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/m4a/magnum.m4a&#034; data-title=&#034;Magnum&#034; data-artist=&#034;Chris RIME&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;div class=&#034;playlist-item-compact&#034; data-url=&#034;IMG/mp3/signal.mp3&#034; data-title=&#034;Signal&#034; data-artist=&#034;Alain CARON&#034;&gt; &lt;span class=&#034;title&#034;&gt;&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;audio&gt;&lt;/audio&gt;
&lt;/div&gt;
&lt;/B_audio_check&gt;&lt;h2 class=&#034;spip&#034;&gt;Installation&lt;/h2&gt;
&lt;p&gt;Rien de compliqu&#233; c&#244;t&#233; mise en place. Il suffit de d&#233;poser trois fichiers dans votre dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/squelettes/&lt;/code&gt; :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Le mod&#232;le HTML&lt;br class='autobr' /&gt;
&#8594; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/squelettes/modeles/audio_player.html&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Le fichier de style&lt;br class='autobr' /&gt;
&#8594; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/squelettes/css/audio_player.css&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Le script JavaScript&lt;br class='autobr' /&gt;
&#8594; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/squelettes/javascript/audio_player.js&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Si les dossiers n'existent pas encore, vous pouvez simplement les cr&#233;er.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Utilisation&lt;/h2&gt;
&lt;p&gt;Une fois en place, le lecteur s'ins&#232;re directement dans vos articles avec des raccourcis SPIP :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Pour un seul fichier audio :&lt;br class='autobr' /&gt;
&#8594; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;audio_player|id_document=123&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Pour une playlist personnalis&#233;e :&lt;br class='autobr' /&gt;
&#8594; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;audio_player|id_documents=5,8,14&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Pour lire tous les sons d'un article (ex : art45) :&lt;br class='autobr' /&gt;
&#8594; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;audio_player|id_article=45&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Pour afficher un nom d'artiste commun :&lt;br class='autobr' /&gt;
&#8594; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;audio_player|id_article=45|nom_artiste=Nom du Groupe&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Ce que fait le lecteur&lt;/h2&gt;
&lt;p&gt;J'ai essay&#233; de le rendre &#224; la fois discret et fonctionnel :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Si vous lancez un lecteur, les autres s'arr&#234;tent automatiquement&lt;/li&gt;&lt;li&gt; Une playlist peut &#234;tre affich&#233;e ou masqu&#233;e&lt;/li&gt;&lt;li&gt; Navigation facile avec pr&#233;c&#233;dent / suivant&lt;/li&gt;&lt;li&gt; Lecture automatique du morceau suivant&lt;/li&gt;&lt;li&gt; Aucun impact sur les r&#233;sum&#233;s SPIP (pas de pollution du #INTRODUCTION)&lt;/li&gt;&lt;li&gt; Format compact pour ne pas alourdir la page&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Personnalisation&lt;/h2&gt;
&lt;p&gt;Le style est modifiable assez facilement dans le fichier &lt;strong&gt;CSS&lt;/strong&gt;.&lt;br class='autobr' /&gt;
Quelques variables permettent d'ajuster rapidement les couleurs :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--player-bg&lt;/code&gt; : fond du lecteur&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--player-accent&lt;/code&gt; : couleur principale&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--player-text&lt;/code&gt; : texte principal&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;--player-text-muted&lt;/code&gt; : texte secondaire&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Vous pouvez aussi ajuster des d&#233;tails, comme la taille du nom de l'artiste directement dans le CSS.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;css&#034; class='spip_code spip_code_block language-css' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;/* Contr&#244;le sur le titre du morceau */ .track-title-compact { font-size: 16px; font-weight: 600; margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--player-text);} &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre data-language=&#034;css&#034; class='spip_code spip_code_block language-css' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;/* Contr&#244;le sur le nom de l'artiste */ .track-artist-compact { font-size: 12px; color: var(--player-text-muted); margin: 2px 0 0 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;} &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Petit rappel utile&lt;/h2&gt;
&lt;p&gt;Apr&#232;s chaque modification :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Pensez &#224; vider le cache de SPIP&lt;/li&gt;&lt;li&gt; Et &#224; forcer le rafra&#238;chissement de votre navigateur (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Ctrl + F5&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;Cmd + Shift + R&lt;/code&gt;)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Si vous voyez &#8220;Chargement&#8230;&#8221; ou des &#233;l&#233;ments &#233;tranges, c'est presque toujours li&#233; au cache.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;En r&#233;sum&#233;&lt;/h2&gt;
&lt;p&gt;Ce lecteur est pens&#233; comme un outil simple mais efficace pour int&#233;grer de l'audio dans SPIP, sans se compliquer la vie. Il peut rester tr&#232;s basique&#8230; ou devenir plus complet avec les playlists.&lt;/p&gt;
&lt;p&gt;N'h&#233;sitez pas &#224; tester les deux exemples ci-dessus pour voir la diff&#233;rence entre un usage simple et un usage multi-lecteurs.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;T&#233;l&#233;chargement&lt;/h2&gt;&lt;div class=&#034;comtaspip-container&#034; id=&#034;comtaspip-13&#034;&gt; &lt;a href=&#034;https://dev.chrysleg.fr/spip.php?action=comtar&amp;arg=13&amp;hash=9ffbfd0bbd323ca6271f8c67b7556b2b9b8a4c10c9457ac136db6a64bfd56731&amp;redirect=IMG%2Fzip%2Flecteur_audio.zip&#034; class=&#034;comtaspip-button&#034; title=&#034;T&#233;l&#233;charger Mod&#232;le lecteur audio&#034;&gt; &lt;span class=&#034;comtaspip-icon&#034;&gt; &lt;svg width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;none&#034; stroke=&#034;currentColor&#034; stroke-width=&#034;2.5&#034; stroke-linecap=&#034;round&#034; stroke-linejoin=&#034;round&#034;&gt; &lt;path d=&#034;M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2&#034;&gt;&lt;/path&gt; &lt;polyline points=&#034;7 11 12 16 17 11&#034;&gt;&lt;/polyline&gt; &lt;line x1=&#034;12&#034; y1=&#034;16&#034; x2=&#034;12&#034; y2=&#034;4&#034;&gt;&lt;/line&gt; &lt;/svg&gt; &lt;/span&gt; &lt;span class=&#034;comtaspip-label&#034;&gt; Mod&#232;le lecteur audio &lt;/span&gt; &lt;span class=&#034;comtaspip-badge&#034;&gt;11&lt;/span&gt; &lt;/a&gt; &lt;/div&gt;&lt;div class=&#034;mes-alert&#034;&gt; &lt;p&gt;&#9888;&#65039; ATTENTION : Contenu bas&#233; sur des exp&#233;rimentations, pas sur des pratiques professionnelles valid&#233;es. Peut contenir des erreurs ou des choix discutables. Testez, adaptez et v&#233;rifiez avant toute mise en production.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="https://dev.chrysleg.fr/IMG/mp3/hub_city_kids.mp3" length="15204232" type="audio/mpeg" />
		
		<enclosure url="https://dev.chrysleg.fr/IMG/m4a/magnum.m4a" length="9624209" type="audio/mp4a-latm" />
		
		<enclosure url="https://dev.chrysleg.fr/IMG/mp3/signal.mp3" length="7074701" type="audio/mpeg" />
		
		<enclosure url="https://dev.chrysleg.fr/IMG/mp3/french_kiss.mp3" length="24655473" type="audio/mpeg" />
		
		<enclosure url="https://dev.chrysleg.fr/IMG/mp3/la_casbah_live_.mp3" length="5203242" type="audio/mpeg" />
		
		<enclosure url="https://dev.chrysleg.fr/IMG/zip/lecteur_audio.zip" length="4690" type="application/zip" />
		

	</item>
<item xml:lang="fr">
		<title>Mod&#232;le SPIP - Sommaire d'article automatique</title>
		<link>https://dev.chrysleg.fr/modele-spip-d-ancre-d-article</link>
		<guid isPermaLink="true">https://dev.chrysleg.fr/modele-spip-d-ancre-d-article</guid>
		<dc:date>2026-03-13T12:20:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Chrys</dc:creator>



		<description>&lt;p&gt;Cr&#233;ez un sommaire automatique SPIP bas&#233; sur vos titres sans code ni manipulation complexe&lt;/p&gt;

-
&lt;a href="https://dev.chrysleg.fr/-modeles-spip-" rel="directory"&gt;Mod&#232;les&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Am&#233;liorez la lisibilit&#233; de vos articles avec un sommaire automatique sous SPIP. Le mod&#232;le Ancre g&#233;n&#232;re une table des mati&#232;res dynamique &#224; partir de vos intertitres. Simple &#224; installer et rapide &#224; utiliser il optimise la navigation et la structure de vos contenus.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;style&gt;
/* Robustesse maximale pour le site public */
.toc-container { background: #f8fafc !important; border: 1px solid #cbd5e1 !important; border-radius: 12px !important; padding: 1.5rem !important; margin: 2rem 0 !important; max-width: 480px !important; box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1) !important; font-family: system-ui, -apple-system, sans-serif !important; display: block !important; visibility: visible !important;
}
.toc-title { font-weight: 700 !important; color: #0f172a !important; text-transform: uppercase !important; font-size: 0.75rem !important; letter-spacing: 0.1em !important; border-bottom: 2px solid #e2e8f0 !important; padding-bottom: 0.75rem !important; margin-bottom: 1rem !important;
}
.toc-list { list-style: none !important; padding: 0 !important; margin: 0 !important; }
.toc-list li { margin-bottom: 0.75rem !important; line-height: 1.5 !important; }
.toc-list a { color: #2563eb !important; text-decoration: none !important; font-size: 0.95rem !important; font-weight: 500 !important; transition: all 0.2s ease !important;
}
.toc-list a:hover { color: #1d4ed8 !important; padding-left: 8px !important; } /* Correction du d&#233;filement */
html { scroll-behavior: smooth !important; }
[id] { scroll-margin-top: 6rem !important; } /* &#201;vite d'&#234;tre cach&#233; par un menu fixe */
&lt;/style&gt; &lt;div class=&#034;toc-container spip-toc-manual&#034; data-title=&#034;Exemple de Sommaire&#034;&gt; &lt;div class=&#034;toc-status&#034; style=&#034;font-size: 11px; opacity: 0.6; padding: 10px;&#034;&gt;Pr&#233;paration du sommaire...&lt;/div&gt;
&lt;/div&gt; &lt;div class=&#034;base64javascript13254725566a11cd92b97d92.03194150&#034; title=&#034;PHNjcmlwdD4KKGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gYnVpbGRUT0MoKSB7CiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zcGlwLXRvYy1tYW51YWw6bm90KC5yZW5kZXJlZCknKTsKICAgICAgICBpZiAoIWNvbnRhaW5lcnMubGVuZ3RoKSByZXR1cm47CgogICAgICAgIC8vIFpvbmVzIGRlIHJlY2hlcmNoZSDDqWxhcmdpZXMgcG91ciBwbHVzIGRlIGNvbXBhdGliaWxpdMOpCiAgICAgICAgY29uc3Qgem9uZXMgPSBbJy5wYWdlJywgJy5jb250ZW50JywgJy50ZXh0ZScsICcjdGV4dGUnLCAnLmFydGljbGUnLCAnYXJ0aWNsZScsICdtYWluJywgJy5lbnRyeS1jb250ZW50J107CiAgICAgICAgbGV0IGhlYWRlcnMgPSBbXTsKICAgICAgICBmb3IgKGxldCB6IG9mIHpvbmVzKSB7CiAgICAgICAgICAgIGxldCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioeik7CiAgICAgICAgICAgIGlmIChlbCkgewogICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZWwucXVlcnlTZWxlY3RvckFsbCgnaDIsIGgzJyk7CiAgICAgICAgICAgICAgICBpZiAoZm91bmQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IEFycmF5LmZyb20oZm91bmQpLmZpbHRlcihoID0+ICFoLmNsb3Nlc3QoJy50b2MtY29udGFpbmVyJykpOwogICAgICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghaGVhZGVycy5sZW5ndGgpIHsKICAgICAgICAgICAgY29udGFpbmVycy5mb3JFYWNoKGMgPT4gYy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY29udGFpbmVycy5mb3JFYWNoKGNvbnRhaW5lciA9PiB7CiAgICAgICAgICAgIGNvbnN0IHRpdGxlVGV4dCA9IGNvbnRhaW5lci5nZXRBdHRyaWJ1dGUoJ2RhdGEtdGl0bGUnKTsKICAgICAgICAgICAgY29uc3QgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7CiAgICAgICAgICAgIGxpc3QuY2xhc3NOYW1lID0gJ3RvYy1saXN0JzsKICAgICAgICAgICAgY29uc3Qgc2x1Z3MgPSB7fTsKCiAgICAgICAgICAgIGhlYWRlcnMuZm9yRWFjaChoID0+IHsKICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gaC5pbm5lclRleHQgfHwgaC50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgIGxldCBpZCA9IGguaWQgfHwgdGV4dC50b0xvd2VyQ2FzZSgpLnRyaW0oKS5ub3JtYWxpemUoIk5GRCIpLnJlcGxhY2UoL1tcdTAzMDAtXHUwMzZmXS9nLCAiIikucmVwbGFjZSgvW15hLXowLTldL2csICctJykucmVwbGFjZSgvLSsvZywgJy0nKS5yZXBsYWNlKC9eLXwtJC9nLCAnJyk7CiAgICAgICAgICAgICAgICBpZiAoIWguaWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2x1Z3NbaWRdKSB7IHNsdWdzW2lkXSsrOyBpZCArPSAnLScgKyBzbHVnc1tpZF07IH0gZWxzZSB7IHNsdWdzW2lkXSA9IDE7IH0KICAgICAgICAgICAgICAgICAgICBoLmlkID0gaWQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgICAgICAgICAgICAgaWYgKGgudGFnTmFtZSA9PT0gJ0gzJykgbGkuc3R5bGUuc2V0UHJvcGVydHkoJ21hcmdpbi1sZWZ0JywgJzI0cHgnLCAnaW1wb3J0YW50Jyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgICAgICAgICBhLmhyZWYgPSAnIycgKyBpZDsKICAgICAgICAgICAgICAgIGEudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAvLyBBbmltYXRpb24gZG91Y2UgZm9yY8OpZSBlbiBKUyBzaSBiZXNvaW4KICAgICAgICAgICAgICAgIGEub25jbGljayA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IDkwOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwb3MgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0IC0gb2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IHBvcywgYmVoYXZpb3I6ICdzbW9vdGgnIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShudWxsLCBudWxsLCAnIycgKyBpZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgbGkuYXBwZW5kQ2hpbGQoYSk7CiAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZENoaWxkKGxpKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgICAgIGlmICh0aXRsZVRleHQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGhlYWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIGhlYWQuY2xhc3NOYW1lID0gJ3RvYy10aXRsZSc7CiAgICAgICAgICAgICAgICBoZWFkLnRleHRDb250ZW50ID0gdGl0bGVUZXh0OwogICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGhlYWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsaXN0KTsKICAgICAgICAgICAgY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3JlbmRlcmVkJyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGJ1aWxkVE9DKTsKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgYnVpbGRUT0MpOwogICAgc2V0VGltZW91dChidWlsZFRPQywgNTAwKTsgCiAgICBzZXRUaW1lb3V0KGJ1aWxkVE9DLCAyMDAwKTsgLy8gUG91ciBsZSBjb250ZW51IHF1aSBhcnJpdmUgdGFyZAp9KSgpOwo8L3NjcmlwdD4=&#034;&gt;&lt;/div&gt;&lt;h2 class=&#034;spip&#034;&gt;Pr&#233;sentation&lt;/h2&gt;
&lt;p&gt;Pour am&#233;liorer la lisibilit&#233; des articles, ce mod&#232;le SPIP permet de cr&#233;er un sommaire automatique bas&#233; sur les intertitres. L'id&#233;e est simple : plus besoin de cr&#233;er des liens manuellement, le sommaire se construit automatiquement &#224; partir de la structure du texte.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Installation&lt;/h2&gt;
&lt;p&gt;L'installation ne se fait qu'une seule fois.&lt;/p&gt;
&lt;p&gt;Il suffit de r&#233;cup&#233;rer le fichier &lt;strong&gt;ancre.html&lt;/strong&gt; (fourni avec le mod&#232;le) et de le placer dans le dossier :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/squelettes/modeles/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Une fois le fichier en place, le mod&#232;le est imm&#233;diatement disponible dans vos contenus.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Utilisation dans les articles&lt;/h2&gt;
&lt;p&gt;L'utilisation est tr&#232;s simple : il suffit d'ins&#233;rer le raccourci &#224; l'endroit o&#249; le sommaire doit appara&#238;tre.&lt;/p&gt;
&lt;p&gt;Deux variantes sont possibles :&lt;/p&gt;
&lt;p&gt;Pour d&#233;finir un titre personnalis&#233; :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;ancre|titre=Plan de l'&#233;tude&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Le texte indiqu&#233; remplace le titre du bloc.&lt;/p&gt;
&lt;p&gt;Pour afficher uniquement la liste, sans titre :&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;ancre|titre=none&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Dans ce cas, seul le contenu du sommaire est affich&#233;.&lt;/p&gt;
&lt;p&gt;Le fonctionnement repose sur les intertitres SPIP (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{{{ }}}&lt;/code&gt;, &#233;quivalents des niveaux H2 et H3). S'il n'y a pas d'intertitres dans le texte, aucun sommaire ne sera g&#233;n&#233;r&#233;.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Personnalisation&lt;/h2&gt;
&lt;p&gt;Le design peut &#234;tre ajust&#233; directement dans le fichier &lt;strong&gt;ancre.html&lt;/strong&gt;, notamment via la balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;style&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Quelques &#233;l&#233;ments facilement modifiables :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Couleur principale (ex : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#3b82f6&lt;/code&gt;),&lt;/li&gt;&lt;li&gt; Largeur du bloc (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;max-width&lt;/code&gt; ou 100%),&lt;/li&gt;&lt;li&gt; Ombres (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;box-shadow&lt;/code&gt;),&lt;/li&gt;&lt;li&gt; Espacements et typographie.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Le mod&#232;le est enti&#232;rement personnalisable. Un d&#233;veloppeur peut adapter aussi bien le design que le comportement selon les besoins du projet.&lt;/p&gt;
&lt;h2 class=&#034;spip&#034;&gt;Fonctionnalit&#233;s&lt;/h2&gt;
&lt;p&gt;Le mod&#232;le inclut plusieurs optimisations utiles :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; D&#233;filement fluide vers les sections,&lt;/li&gt;&lt;li&gt; Marge de s&#233;curit&#233; pour &#233;viter que les titres soient coll&#233;s en haut de l'&#233;cran,&lt;/li&gt;&lt;li&gt; Syst&#232;me anti-doublon pour emp&#234;cher l'affichage multiple du sommaire,&lt;/li&gt;&lt;li&gt; Liens propres sans changement de couleur apr&#232;s clic.&lt;/li&gt;&lt;/ul&gt;&lt;h2 class=&#034;spip&#034;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Ce mod&#232;le vise &#224; simplifier la mise en forme des articles tout en am&#233;liorant leur lisibilit&#233;. Une fois install&#233;, il s'int&#232;gre naturellement dans le flux de r&#233;daction.&lt;/p&gt;
&lt;div class=&#034;comtaspip-container&#034; id=&#034;comtaspip-20&#034;&gt; &lt;a href=&#034;https://dev.chrysleg.fr/spip.php?action=comtar&amp;arg=20&amp;hash=b579db9d002b4bbd01eed2c1feab7d128141f049d0dff103593554172792b02e&amp;redirect=IMG%2Fzip%2Fmodele_ancre.zip&#034; class=&#034;comtaspip-button&#034; title=&#034;T&#233;l&#233;charger Mod&#232;le Ancres&#034;&gt; &lt;span class=&#034;comtaspip-icon&#034;&gt; &lt;svg width=&#034;20&#034; height=&#034;20&#034; viewBox=&#034;0 0 24 24&#034; fill=&#034;none&#034; stroke=&#034;currentColor&#034; stroke-width=&#034;2.5&#034; stroke-linecap=&#034;round&#034; stroke-linejoin=&#034;round&#034;&gt; &lt;path d=&#034;M4 17v2a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2&#034;&gt;&lt;/path&gt; &lt;polyline points=&#034;7 11 12 16 17 11&#034;&gt;&lt;/polyline&gt; &lt;line x1=&#034;12&#034; y1=&#034;16&#034; x2=&#034;12&#034; y2=&#034;4&#034;&gt;&lt;/line&gt; &lt;/svg&gt; &lt;/span&gt; &lt;span class=&#034;comtaspip-label&#034;&gt; Mod&#232;le Ancres &lt;/span&gt; &lt;span class=&#034;comtaspip-badge&#034;&gt;17&lt;/span&gt; &lt;/a&gt; &lt;/div&gt;
&lt;p&gt;Il constitue une base solide, tout en restant enti&#232;rement adaptable pour des besoins sp&#233;cifiques.&lt;/p&gt;
&lt;div class=&#034;mes-alert&#034;&gt; &lt;p&gt;&#9888;&#65039; ATTENTION : Contenu bas&#233; sur des exp&#233;rimentations, pas sur des pratiques professionnelles valid&#233;es. Peut contenir des erreurs ou des choix discutables. Testez, adaptez et v&#233;rifiez avant toute mise en production.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		
		<enclosure url="https://dev.chrysleg.fr/IMG/zip/modele_ancre.zip" length="2387" type="application/zip" />
		

	</item>



</channel>

</rss>
