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
    <!-- ============================================================ 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} }
    — revendeurs

    Réseau mondial

    —
    /* ============================================================ ▼▼▼ 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 = '
    ' + '

    ' + escHtml(d.name) + '

    ' + '
    ' + escHtml(d.city) + ', ' + escHtml(d.country) + '
    ' + '
    ' + escHtml(d.type) + ' · depuis ' + d.since + '
    ' + '
    ' + escHtml(d.phone) + '
    ' + '' + escHtml(d.web) + ' →' + '
    '; 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.code) + '' + '
    ' + '
    ' + escHtml(d.city) + ', ' + escHtml(d.country) + '
    ' + '
    ' + '' + escHtml(d.type) + '' + '· depuis ' + d.since + '' + '
    ' + (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,'"'); } })(); }