Programme partenaires
Distribuez la nouvelle génération de cibles cognitives.
Rejoignez le réseau TamTarget et offrez à vos clients la technologie 3D réactive la plus avancée du marché. Nous vous accompagnons commercialement, techniquement et pédagogiquement.
/ 01
Marges protégées
/ 02
Formation certifiante
/ 03
Co-marketing
/ 04
Support technique 7j/7
<!-- ============================================================
TAMTARGET — Carte Revendeurs · Code Module Divi
COMMENT MODIFIER LES REVENDEURS :
Éditez uniquement le tableau window.DEALERS ci-dessous.
Chaque entrée = un point sur la carte + une ligne dans la liste.
Champs disponibles :
id : entier unique (obligatoire)
name : nom du revendeur
city : ville
country : pays (affiché dans la fiche)
code : code pays 2 lettres (affiché en petit)
lat/lng : coordonnées GPS (obligatoire)
type : "Revendeur officiel" ou "Revendeur"
since : année depuis laquelle il est partenaire
official : true → badge "Officiel" orange
phone : numéro de téléphone
web : domaine sans https:// (ex: "matfrance.com")
ASTUCE : obtenez lat/lng en cliquant droit sur Google Maps
→ "Copier les coordonnées"
============================================================ -->
/* ── Reset scope ── */
#tt-dealers-widget *{box-sizing:border-box;margin:0;padding:0}
#tt-dealers-widget{
--tt-bg:#0d0d0e;
--tt-bg2:#131314;
--tt-surf:#18181a;
--tt-surf2:#1f1f21;
--tt-brd:#2a2a2d;
--tt-brd2:#3a3a3e;
--tt-txt:#ece9e4;
--tt-dim:#a8a39c;
--tt-mute:#6e6963;
--tt-acc:oklch(0.74 0.16 55);
--tt-acc2:oklch(0.84 0.15 85);
--tt-ink:#1a0e02;
--tt-shadow:0 20px 60px rgba(0,0,0,.55);
--tt-r:4px;
--tt-rlg:8px;
font-size:15px;
line-height:1.55;
color:var(--tt-txt);
background:transparent;
-webkit-font-smoothing:antialiased;
}
/* ── Toolbar ── */
#tt-dealers-widget .tt-toolbar{
display:flex;align-items:center;gap:14px;
padding:13px 16px;
background:var(--tt-surf);
border:1px solid var(--tt-brd);
border-bottom:none;
border-radius:var(--tt-rlg) var(--tt-rlg) 0 0;
}
#tt-dealers-widget .tt-search{
flex:1;display:flex;align-items:center;gap:9px;
background:var(--tt-bg);
border:1px solid var(--tt-brd);
border-radius:var(--tt-r);
padding:7px 11px;
color:var(--tt-txt);font-size:14px;
transition:border-color .15s;
}
#tt-dealers-widget .tt-search:focus-within{border-color:rgba(var(--btn-background) / 1);}
#tt-dealers-widget .tt-search input{
flex:1;background:transparent;border:0;color:inherit;
font:inherit;font-size:14px;outline:none;
}
#tt-dealers-widget .tt-search input::placeholder{color:var(--tt-mute)}
#tt-dealers-widget .tt-search svg{color:var(--tt-mute);flex:none}
#tt-dealers-widget .tt-meta{
font-size:11px;color:var(--tt-mute);
letter-spacing:.06em;
display:flex;align-items:center;gap:7px;
white-space:nowrap;
}
#tt-dealers-widget .tt-meta .tt-dot{
width:6px;height:6px;border-radius:50%;
background:rgba(var(--btn-background) / 1);
box-shadow:0 0 0 3px rgba(var(--btn-background) / 0.18);
flex:none;
}
/* ── Frame carte + liste ── */
#tt-dealers-widget .tt-frame{
display:grid;
grid-template-columns:1fr 360px;
height:620px;
background:var(--tt-surf);
border:1px solid var(--tt-brd);
border-radius:0 0 var(--tt-rlg) var(--tt-rlg);
overflow:hidden;
position:relative;
}
#tt-dealers-widget .tt-map-wrap{
position:relative;
min-width:0;
}
#tt-dealers-widget .tt-map{
width:100%;height:100%;background:#0a0a0b;
}
/* ── Leaflet overrides (scopés) ── */
#tt-dealers-widget .leaflet-container{
background:#0a0a0b !important;
outline:none;
}
#tt-dealers-widget .leaflet-control-attribution{
background:rgba(13,13,14,.85) !important;
color:var(--tt-mute) !important;
border:1px solid var(--tt-brd);
font-size:10px !important;
padding:2px 8px !important;
border-radius:3px;
}
#tt-dealers-widget .leaflet-control-attribution a{color:var(--tt-dim) !important}
#tt-dealers-widget .leaflet-control-zoom{
border:1px solid var(--tt-brd) !important;
border-radius:var(--tt-r) !important;
overflow:hidden;box-shadow:none !important;
}
#tt-dealers-widget .leaflet-control-zoom a{
background:var(--tt-surf) !important;
color:var(--tt-txt) !important;
border-bottom:1px solid var(--tt-brd) !important;
font-weight:600 !important;
line-height:26px !important;
width:26px !important;height:26px !important;
}
#tt-dealers-widget .leaflet-control-zoom a:hover{
background:var(--tt-surf2) !important;
color:rgba(var(--btn-background) / 1) !important;
}
#tt-dealers-widget .leaflet-popup-content-wrapper{
background:var(--tt-surf) !important;
color:var(--tt-txt) !important;
border:1px solid var(--tt-brd2) !important;
border-radius:var(--tt-r) !important;
box-shadow:var(--tt-shadow) !important;
}
#tt-dealers-widget .
-tip{
background:var(--tt-surf) !important;
border:1px solid var(--tt-brd2) !important;
}
#tt-dealers-widget .leaflet-popup-content{
margin:13px 15px !important;
font-size:13px;line-height:1.5;
}
#tt-dealers-widget .leaflet-popup-close-button{
color:var(--tt-mute) !important;
padding:6px 8px 0 0 !important;
}
/* ── Marqueurs ── */
#tt-dealers-widget .tt-marker{
width:14px;height:14px;border-radius:50%;
background:rgba(var(--btn-background) / 1);
border:2px solid #111;
box-shadow: 0 0 0 4px rgba(var(--btn-background) / 0.18), 0 4px 8px rgba(0, 0, 0, .5);
cursor:pointer;
transition:transform .15s;
}
#tt-dealers-widget .tt-marker.active{
background:rgba(var(--btn-background) / 1);
transform:scale(1.45);
box-shadow:0 0 0 6px rgba(var(--btn-background) / 0.3),0 4px 14px rgba(0,0,0,.7);
}
/* ── Popup contenu ── */
#tt-dealers-widget .tt-pop{display:grid;gap:5px;min-width:210px}
#tt-dealers-widget .tt-pop h4{
font-size:14px;font-weight:700;letter-spacing:-.01em;color:white;
}
#tt-dealers-widget .tt-pop .tt-pmeta{font-size:12px;color:var(--tt-dim)}
#tt-dealers-widget .tt-pop .tt-prow{font-size:12px;color:var(--tt-dim)}
#tt-dealers-widget .tt-pop .tt-pcta{
margin-top:5px;color:rgba(var(--btn-background) / 1);
font-weight:600;font-size:12px;
display:inline-flex;align-items:center;gap:3px;
text-decoration:none;
}
#tt-dealers-widget .tt-pop .tt-pcta:hover{text-decoration:underline}
.leaflet-popup-tip-container {display:none;}
/* ── Liste revendeurs ── */
#tt-dealers-widget .tt-list{
background:var(--tt-bg2);
border-left:1px solid var(--tt-brd);
display:flex;flex-direction:column;
overflow:hidden;
}
#tt-dealers-widget .tt-list-head{
padding:13px 16px;
border-bottom:1px solid var(--tt-brd);
display:flex;align-items:center;justify-content:space-between;
flex-shrink:0;
}
#tt-dealers-widget .tt-list-head h3{
font-size:13px;letter-spacing:.05em;
text-transform:uppercase;font-weight:700;
}
#tt-dealers-widget .tt-list-head .tt-count{
font-size:11px;color:var(--tt-mute);
}
#tt-dealers-widget .tt-list-scroll{
flex:1;overflow-y:auto;overflow-x:hidden;
}
#tt-dealers-widget .tt-list-scroll::-webkit-scrollbar{width:6px}
#tt-dealers-widget .tt-list-scroll::-webkit-scrollbar-track{background:transparent}
#tt-dealers-widget .tt-list-scroll::-webkit-scrollbar-thumb{
background:var(--tt-brd);border-radius:3px;
}
#tt-dealers-widget .tt-list-scroll::-webkit-scrollbar-thumb:hover{
background:var(--tt-brd2);
}
/* ── Cards ── */
#tt-dealers-widget .tt-card{
padding:14px 16px;
border-bottom:1px solid var(--tt-brd);
cursor:pointer;
transition:background .12s;
display:grid;gap:5px;
border-left:2px solid transparent;
}
#tt-dealers-widget .tt-card:hover{background:var(--tt-surf)}
#tt-dealers-widget .tt-card.active{
background:var(--tt-surf);
border-left-color:rgba(var(--btn-background) / 1);
}
#tt-dealers-widget .tt-card-top{
display:flex;justify-content:space-between;align-items:baseline;gap:8px;
}
#tt-dealers-widget .tt-card h4{
padding-bottom:0px !important;font-weight:700;font-size:14px;letter-spacing:-.01em;color:white;
}
#tt-dealers-widget .tt-card .tt-code{
font-size:10px;color:var(--tt-mute);
letter-spacing:.1em;text-transform:uppercase;flex:none;
}
#tt-dealers-widget .tt-card .tt-city{
font-size:13px;color:var(--tt-dim);
}
#tt-dealers-widget .tt-card .tt-card-meta{
display:flex;gap:10px;font-size:12px;color:var(--tt-mute);margin-top:3px;
}
#tt-dealers-widget .tt-badge{
display:inline-flex;align-items:center;gap:4px;
font-size:9px;letter-spacing:.1em;text-transform:uppercase;
color:rgba(var(--btn-background) / 1);
padding:2px 6px;
border: 1px solid rgba(var(--btn-background) / 0.3);
border-radius:3px;
background:rgba(var(--btn-background) / .06);
margin-top:5px;
}
/* ── Vide ── */
#tt-dealers-widget .tt-empty{
padding:22px 16px;
color:var(--tt-mute);font-size:13px;
}
/* ── Responsive ── */
@media(max-width:900px){
#tt-dealers-widget .tt-frame{
grid-template-columns:1fr;
grid-template-rows:400px 1fr;
height:auto;
}
#tt-dealers-widget .tt-list{
border-left:none;
border-top:1px solid var(--tt-brd);
max-height:360px;
}
}
@media(max-width:540px){
#tt-dealers-widget .tt-toolbar{flex-wrap:wrap}
#tt-dealers-widget .tt-meta{display:none}
}
/* ============================================================
▼▼▼ MODIFIEZ UNIQUEMENT CE TABLEAU ▼▼▼
Pour ajouter un point : copiez un bloc { ... }, collez-le,
donnez-lui un id unique (entier), modifiez les champs.
lat/lng : clic droit sur Google Maps → "Copier les coordonnées"
============================================================ */
var TT_DEALERS = [
{ id:1, name:"MAT France", city:"Paris", country:"France", code:"FR", lat:48.8566, lng:2.3522, type:"Revendeur officiel", since:2021, official:true, phone:"+33 1 42 00 00 00", web:"matfrance.com" },
{ id:2, name:"Tactical Lyon", city:"Lyon", country:"France", code:"FR", lat:45.7640, lng:4.8357, type:"Revendeur", since:2022, official:false, phone:"+33 4 72 00 00 00", web:"tactical-lyon.fr" },
{ id:3, name:"Sud Défense", city:"Marseille", country:"France", code:"FR", lat:43.2965, lng:5.3698, type:"Revendeur", since:2023, official:false, phone:"+33 4 91 00 00 00", web:"suddefense.fr" },
{ id:4, name:"Iberian Tactical", city:"Madrid", country:"Espagne", code:"ES", lat:40.4168, lng:-3.7038, type:"Revendeur officiel", since:2022, official:true, phone:"+34 91 000 00 00", web:"iberiantactical.es" },
{ id:5, name:"Roma Shooting Co.", city:"Rome", country:"Italie", code:"IT", lat:41.9028, lng:12.4964, type:"Revendeur", since:2023, official:false, phone:"+39 06 0000 0000", web:"romashooting.it" },
{ id:6, name:"BerlinTac", city:"Berlin", country:"Allemagne", code:"DE", lat:52.5200, lng:13.4050, type:"Revendeur officiel", since:2021, official:true, phone:"+49 30 0000 0000", web:"berlintac.de" },
{ id:7, name:"London Range Pro", city:"Londres", country:"Royaume-Uni", code:"UK", lat:51.5074, lng:-0.1278, type:"Revendeur", since:2022, official:false, phone:"+44 20 0000 0000", web:"londonrangepro.uk" },
{ id:8, name:"Nordic Defense AS", city:"Oslo", country:"Norvège", code:"NO", lat:59.9139, lng:10.7522, type:"Revendeur", since:2024, official:false, phone:"+47 22 00 00 00", web:"nordicdefense.no" },
{ id:9, name:"Helvetia Tactical", city:"Zürich", country:"Suisse", code:"CH", lat:47.3769, lng:8.5417, type:"Revendeur officiel", since:2022, official:true, phone:"+41 44 000 00 00", web:"helvetiatac.ch" },
{ id:10, name:"Polonia Range", city:"Varsovie", country:"Pologne", code:"PL", lat:52.2297, lng:21.0122, type:"Revendeur", since:2023, official:false, phone:"+48 22 000 00 00", web:"poloniarange.pl" },
{ id:11, name:"Atlantic Tactical Inc.",city:"New York", country:"États-Unis", code:"US", lat:40.7128, lng:-74.0060, type:"Revendeur officiel", since:2022, official:true, phone:"+1 212 000 0000", web:"atlantictactical.com" },
{ id:12, name:"West Coast Range", city:"Los Angeles", country:"États-Unis", code:"US", lat:34.0522, lng:-118.2437, type:"Revendeur", since:2023, official:false, phone:"+1 310 000 0000", web:"westcoastrange.com" },
{ id:13, name:"Maple Defense", city:"Toronto", country:"Canada", code:"CA", lat:43.6532, lng:-79.3832, type:"Revendeur", since:2024, official:false, phone:"+1 416 000 0000", web:"mapledefense.ca" },
{ id:14, name:"Mexico Tactical", city:"Mexico", country:"Mexique", code:"MX", lat:19.4326, lng:-99.1332, type:"Revendeur", since:2024, official:false, phone:"+52 55 0000 0000", web:"mexicotactical.mx" },
{ id:15, name:"Emirates Range Co.", city:"Dubaï", country:"Émirats A.U.", code:"AE", lat:25.2048, lng:55.2708, type:"Revendeur officiel", since:2023, official:true, phone:"+971 4 000 0000", web:"emiratesrange.ae" },
{ id:16, name:"Tokyo Precision", city:"Tokyo", country:"Japon", code:"JP", lat:35.6762, lng:139.6503, type:"Revendeur", since:2024, official:false, phone:"+81 3 0000 0000", web:"tokyoprecision.jp" },
{ id:17, name:"Singapore Tactical", city:"Singapour", country:"Singapour", code:"SG", lat:1.3521, lng:103.8198, type:"Revendeur", since:2023, official:false, phone:"+65 6000 0000", web:"sgtactical.sg" },
{ id:18, name:"Cape Range Africa", city:"Le Cap", country:"Afrique du Sud", code:"ZA", lat:-33.9249, lng:18.4241, type:"Revendeur", since:2024, official:false, phone:"+27 21 000 0000", web:"caperange.za" },
{ id:19, name:"São Paulo Defense", city:"São Paulo", country:"Brésil", code:"BR", lat:-23.5505, lng:-46.6333, type:"Revendeur", since:2024, official:false, phone:"+55 11 0000 0000", web:"spdefense.br" },
{ id:20, name:"Sydney Range Pro", city:"Sydney", country:"Australie", code:"AU", lat:-33.8688, lng:151.2093, type:"Revendeur officiel", since:2023, official:true, phone:"+61 2 0000 0000", web:"sydneyrangepro.au" },
];
/* ▲▲▲ FIN DES DONNÉES ▲▲▲ */
/* ── Guard anti double-init Divi ── */
if (!window.__ttDealersLoaded) {
window.__ttDealersLoaded = true;
(function () {
/* Attend que Leaflet soit dispo (chargement async possible) */
function waitFor(fn, cb, ms) {
if (fn()) { cb(); return; }
setTimeout(function(){ waitFor(fn, cb, ms); }, ms || 80);
}
waitFor(function(){ return typeof L !== 'undefined'; }, init);
function init() {
var activeId = null;
var markers = {}; /* id → L.Marker */
var cardEls = {}; /* id → DOM node */
var filtered = TT_DEALERS.slice();
/* ── Carte ── */
var map = L.map('tt-map', {
center: [25, 10], zoom: 2,
minZoom: 2, maxZoom: 13,
worldCopyJump: true,
zoomControl: true,
attributionControl: true,
});
var TILES = {
dark: [
'https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png',
'https://{s}.basemaps.cartocdn.com/dark_only_labels/{z}/{x}/{y}{r}.png',
],
};
var activeLayers = [];
function applyStyle(style) {
activeLayers.forEach(function(l){ map.removeLayer(l); });
activeLayers = [];
(TILES[style] || TILES.dark).forEach(function(url){
var l = L.tileLayer(url, {
subdomains: 'abcd',
attribution: '© OSM · CARTO',
maxZoom: 19,
}).addTo(map);
activeLayers.push(l);
});
}
applyStyle('dark');
/* ── Crée un marqueur ── */
function makeMarker(d) {
var icon = L.divIcon({
className: '',
html: '',
iconSize: [14, 14],
iconAnchor: [7, 7],
});
var m = L.marker([d.lat, d.lng], { icon: icon }).addTo(map);
var html = '
Réseau mondial
—'
+ '
';
m.bindPopup(html, { closeButton: true, offset: [0, -4] });
m.on('click', function(){ activate(d.id, false); });
markers[d.id] = m;
}
TT_DEALERS.forEach(makeMarker);
/* ── Activation (source : 'map' ou 'list') ── */
function activate(id, fromList) {
/* Déselectionne l'ancien */
if (activeId !== null) {
var oldEl = document.querySelector('.tt-marker[data-ttid="' + activeId + '"]');
if (oldEl) oldEl.classList.remove('active');
if (cardEls[activeId]) cardEls[activeId].classList.remove('active');
}
if (activeId === id) {
/* Deuxième clic → déselectionne */
activeId = null;
return;
}
activeId = id;
var m = markers[id];
if (!m) return;
/* Marker */
var el = document.querySelector('.tt-marker[data-ttid="' + id + '"]');
if (el) el.classList.add('active');
/* Card */
if (cardEls[id]) {
cardEls[id].classList.add('active');
cardEls[id].scrollIntoView({ block: 'nearest', behavior: 'smooth' });
}
/* Carte : pan si click depuis liste, popup si click depuis carte */
if (fromList) {
map.flyTo(m.getLatLng(), Math.max(map.getZoom(), 4), { duration: 0.6 });
setTimeout(function(){ m.openPopup(); }, 400);
}
}
/* ── Recherche ── */
function applyFilter(q) {
q = q.trim().toLowerCase();
filtered = q
? TT_DEALERS.filter(function(d){
return d.name.toLowerCase().indexOf(q) > -1
|| d.city.toLowerCase().indexOf(q) > -1
|| d.country.toLowerCase().indexOf(q) > -1;
})
: TT_DEALERS.slice();
var filteredSet = {};
filtered.forEach(function(d){ filteredSet[d.id] = true; });
/* Masque/affiche marqueurs */
Object.keys(markers).forEach(function(id){
var mEl = markers[id].getElement();
if (mEl) mEl.style.display = filteredSet[id] ? '' : 'none';
});
renderList();
updateCounters();
}
/* ── Rendu liste ── */
function renderList() {
var scroll = document.getElementById('tt-list-scroll');
scroll.innerHTML = '';
cardEls = {};
if (filtered.length === 0) {
var empty = document.createElement('div');
empty.className = 'tt-empty';
empty.textContent = 'Aucun résultat. Essayez un autre nom ou pays.';
scroll.appendChild(empty);
return;
}
filtered.forEach(function(d){
var card = document.createElement('div');
card.className = 'tt-card' + (d.id === activeId ? ' active' : '');
card.innerHTML =
'' + escHtml(d.name) + '
' + '' + '' + escHtml(d.type) + ' · depuis ' + d.since + '
'
+ '' + escHtml(d.phone) + '
'
+ ''
+ escHtml(d.web) + ' →'
+ ''
+ '
'
+ '' + escHtml(d.name) + '
' + '' + escHtml(d.code) + '' + '' + escHtml(d.city) + ', ' + escHtml(d.country) + '
'
+ ''
+ (d.official
? ''
+ ''
+ ''
+ ' Officiel'
: '');
card.addEventListener('click', function(){ activate(d.id, true); });
cardEls[d.id] = card;
scroll.appendChild(card);
});
}
function updateCounters() {
var total = TT_DEALERS.length;
var n = filtered.length;
document.getElementById('tt-count-label').textContent =
n + ' / ' + total + ' revendeur' + (total > 1 ? 's' : '');
document.getElementById('tt-list-count').textContent =
n + ' résultat' + (n > 1 ? 's' : '');
}
/* ── Liaison searchbar ── */
var searchInput = document.getElementById('tt-search-input');
var debounceTimer;
searchInput.addEventListener('input', function(){
clearTimeout(debounceTimer);
debounceTimer = setTimeout(function(){ applyFilter(searchInput.value); }, 140);
});
/* ── Resize (Divi peut déclencher un layout après init) ── */
window.addEventListener('resize', function(){
map.invalidateSize();
});
setTimeout(function(){ map.invalidateSize(); }, 300);
setTimeout(function(){ map.invalidateSize(); }, 800);
/* ── Init ── */
renderList();
updateCounters();
}
/* ── Utilitaire XSS ── */
function escHtml(s) {
return String(s)
.replace(/&/g,'&')
.replace(/</g,'<')
.replace(/>/g,'>')
.replace(/"/g,'"');
}
})();
}
