<!DOCTYPE html>
<html lang="fr">
<head>
<!-- Informations techniques -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- SEO principal -->
<title>Focus Création - Cheminées design haut de gamme</title>
<meta name="description" content="Focus Création conçoit des cheminées design et cheminées modernes : cheminée d’intérieur, cheminée centrale, cheminée suspendue, cheminée murale, cheminée pivotante, poêle suspendu et poêles modernes pour sublimer votre intérieur.">
<link rel="canonical" href="https://focus-creation.com/" />
<!-- Indexation -->
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
<!-- Langues (hreflang alternates) -->
<link rel="alternate" href="https://focus-creation.com/" hreflang="fr-FR" />
<link rel="alternate" href="https://focus-creation.com/?lang=en" hreflang="en-GB" />
<link rel="alternate" href="https://focus-creation.com/?lang=de" hreflang="de-DE" />
<link rel="alternate" href="https://focus-creation.com/?lang=it" hreflang="it-IT" />
<link rel="alternate" href="https://focus-creation.com/?lang=es" hreflang="es-ES" />
<!-- Version par défaut -->
<link rel="alternate" href="https://focus-creation.com/" hreflang="x-default" />
<!-- Open Graph -->
<meta property="og:locale" content="fr_FR" />
<meta property="og:locale:alternate" content="fr_FR" />
<meta property="og:locale:alternate" content="en_GB" />
<meta property="og:locale:alternate" content="de_DE" />
<meta property="og:locale:alternate" content="it_IT" />
<meta property="og:locale:alternate" content="es_ES" />
<meta property="og:type" content="website" />
<meta property="og:title" content="Focus Création – Cheminées contemporaine et poêle design haut de gamme" />
<meta property="og:description" content="Découvrez les cheminées sur mesure Focus Création : bois, gaz, bioéthanol et holographiques. Fabrication française labellisée EPV, design contemporain d’exception." />
<meta property="og:url" content="https://focus-creation.com/" />
<meta property="og:site_name" content="Focus Création" />
<meta property="og:image:width" content="1204" />
<meta property="og:image:height" content="573" />
<meta property="og:image" content="https://focus-creation.com/medias/logo_focus_b.jpg" />
<meta property="og:image:type" content="image/jpeg" />
<meta property="og:image:secure_url" content="https://focus-creation.com/medias/logo_focus_b.jpg" />
<meta property="og:image:alt" content="Logo Focus Création" />
<link rel="shortcut icon" href="/images/favicon.ico" type="image/vnd.microsoft.icon" />
<!-- Feuilles de style -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Marcellus&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/base.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" integrity="sha384-…" crossorigin="anonymous">
<!-- Données structurées JSON-LD -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://focus-creation.com#organization",
"name": "Focus - Atelier Dominique Imbert",
"url": "https://focus-creation.com/",
"logo": {
"@type": "ImageObject",
"url": "https://focus-creation.com/medias/logo_focus_b.jpg"
},
"telephone": "+33467550193",
"address": {
"@type": "PostalAddress",
"streetAddress": "3, impasse Claque Patin - Le Fort",
"postalCode": "34380",
"addressLocality": "Viols-le-Fort",
"addressCountry": "FR"
},
"sameAs": [
"https://www.facebook.com/FocusCreation.FR",
"https://www.instagram.com/focuscreation/",
"https://www.linkedin.com/company/focus-creation",
"https://www.youtube.com/@FocusCreation-f8t",
"https://www.pinterest.fr/FocusCreation/"
]
},
{
"@type": "WebSite",
"@id": "https://focus-creation.com#website",
"url": "https://focus-creation.com/",
"name": "Cheminées design Focus",
"inLanguage": "fr-FR",
"publisher": {
"@id": "https://focus-creation.com#organization"
},
"potentialAction": {
"@type": "SearchAction",
"target": "https://focus-creation.com/recherche.php?q={search_term_string}",
"query-input": "required name=search_term_string"
}
},
{
"@type": "WebPage",
"@id": "https://focus-creation.com/#webpage",
"url": "https://focus-creation.com/",
"name": "Cheminées design Focus",
"inLanguage": "fr-FR",
"description": "Découvrez les cheminées sur mesure Focus Création : bois, gaz, bioéthanol et holographiques. Fabrication française labellisée EPV, design contemporain d’exception.",
"isPartOf": {
"@id": "https://focus-creation.com#website"
},
"about": {
"@id": "https://focus-creation.com#organization"
}
}
]
}</script>
</head>
<body>
<!-- menu -->
<header class="site-header">
<button class="menu-toggle" aria-label="Ouvrir le menu">
<span class="burger_menu">☰ </span><span class="titre_menu">Menu</span>
</button>
<div class="logo">
<a href="/">
<img src="medias/logo_focus.svg" class="logo_header">
</a>
</div>
<div class="user-menu">
<span class="drap_lang">
<img src="images/autres/map.png" class="map_style" alt="Map">
<form method="get" id="langForm" class="lang-select-form">
<input type="hidden" name="lang" id="langHidden" value="fr">
<div class="lang-dd" id="langDd" data-open="false">
<button type="button" class="lang-dd__btn" id="langBtn" aria-haspopup="listbox" aria-expanded="false">
<img class="lang-dd__flag" id="langBtnFlag" src="medias/drapeaux/fr.png" alt="">
<span class="lang-dd__label" id="langBtnLabel">Français</span>
<span class="lang-dd__chev" aria-hidden="true"></span>
</button>
<ul class="lang-dd__list" id="langList" role="listbox" tabindex="-1" aria-label="Choisir la langue">
<li
role="option"
data-value="fr"
data-label="Français"
aria-selected="true"
class="lang-dd__opt is-selected"
>
<img src="medias/drapeaux/fr.png" alt="">
<span>Français</span>
</li>
<li
role="option"
data-value="en"
data-label="Anglais"
aria-selected="false"
class="lang-dd__opt"
>
<img src="medias/drapeaux/en.png" alt="">
<span>Anglais</span>
</li>
<li
role="option"
data-value="de"
data-label="Allemand"
aria-selected="false"
class="lang-dd__opt"
>
<img src="medias/drapeaux/de.png" alt="">
<span>Allemand</span>
</li>
<li
role="option"
data-value="es"
data-label="Espagnol"
aria-selected="false"
class="lang-dd__opt"
>
<img src="medias/drapeaux/es.png" alt="">
<span>Espagnol</span>
</li>
<li
role="option"
data-value="it"
data-label="Italien"
aria-selected="false"
class="lang-dd__opt"
>
<img src="medias/drapeaux/it.png" alt="">
<span>Italien</span>
</li>
<li class="lang-dd__sep" role="presentation" aria-hidden="true"></li>
<!-- --> </ul>
</div>
<noscript>
<select name="lang">
<option value="fr" selected>
Français </option>
<option value="en" >
Anglais </option>
<option value="de" >
Allemand </option>
<option value="es" >
Espagnol </option>
<option value="it" >
Italien </option>
</select>
<button type="submit">OK</button>
</noscript>
</form>
</span>
<a href="https://pro.focus-creation.com" class="user-btn" aria-label="Mon compte" target="_blank">
<img src="images/autres/login.png" height="25" alt="User">
</a>
</div>
<style>
.lang-dd{ position:relative; display:inline-block; }
.lang-dd__btn{
display:inline-flex; align-items:center; gap:8px;
padding:2px 8px;
border:0px solid #cfcfcf;
border-radius:999px;
background:#fff;
cursor:pointer;
font:inherit;
margin-top: 5px;
}
.lang-dd__flag,
.lang-dd__list img{
width:30px; height:30px;
object-fit:cover;
border-radius:50%;
flex:0 0 auto;
}
.lang-dd__chev{
width:0;height:0;
border-left:5px solid transparent;
border-right:5px solid transparent;
border-top:6px solid #333;
}
.lang-dd__list{
position:absolute;
left:0; top:calc(100% + 6px);
min-width:100%;
margin:0; padding:6px;
list-style:none;
border:0px solid #cfcfcf;
/* border-radius:12px;*/
background:#fff;
box-shadow:0 6px 18px rgba(0,0,0,.12);
display:none;
z-index:9999;
}
.lang-dd[data-open="true"] .lang-dd__list{ display:block; }
.lang-dd__opt{
display:flex; align-items:center; gap:10px;
padding:8px 10px;
border-radius:10px;
cursor:pointer;
user-select:none;
}
.lang-dd__opt:hover,
.lang-dd__opt.is-active{ background:#f2f2f2; }
.lang-dd__opt.is-selected{ font-weight:600; }
.lang-dd__btn:focus,
.lang-dd__list:focus{
outline:0px solid #333;
outline-offset:2px;
}
@media (max-width:768px){
.lang-dd__btn{ padding:0px 5px; }
.lang-dd__flag, .lang-dd__list img{ width:22px; height:22px; left:0; top:calc(100%);}
}
.user-menu {
position: relative;
display: inline-block;
}
.user-menu .dropdown {
display: none;
position: absolute;
top: 25px;
right: 0;
background: #fff;
border: 1px solid #ccc;
padding: 5px 10px;
width: 180px;
z-index: 1000;
}
.user-menu .dropdown a {
display: block;
/* padding: 5px 0;*/
text-decoration: none;
color: #333;
padding: 10px;
}
.site-header {
width: 100vw;
}
.site-header {
width: -moz-available;
}
.choose_lang{
display:inline-block;
text-align:center;
}
.choose_lang img{
display:block; /* <- fait passer les liens dessous */
margin:0 auto 4px; /* centre l’image + petit espace */
}
.choose_lang {
display: inline-block;
text-align: center;
position: absolute;
right: 70px;
width: max-content;
top: -20px;
}
.map_style {
width: 65px;
}
/* l’image au-dessus */
.drap_lang img{
display: block;
margin: 0px; /* espace sous la map */
}
/* les langues en dessous, centrées */
.drap_lang .lang-links{
display: flex;
justify-content: center;
gap: 8px;
}
/* tes styles de liens */
a.choose_lang_link{
text-decoration: none;
color: #000;
font-weight: bold;
}
a.active-lang,
a.choose_lang_link:hover{
color: #c43c2c;
font-style: italic;
}
</style>
</header>
<!-- menu -->
<!-- le bandeau menu blanc, caché par défaut -->
<div id="main-banner" class="main-banner"></div>
<!-- overlay pour le menu principal -->
<div id="menu-overlay"></div>
<aside class="offcanvas-menu">
<div class="sidebar" style="z-index: 2 !important;">
<button class="close-menu" aria-label="Fermer le menu" style="color: #000;">×</button>
<br />
<ul class="menu">
<style>
.sidebar {
overflow-y: auto !important;
}
/* --- Style du select langue --- */
.lang-select {
position: relative;
display: inline-block;
}
.lang-select select {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
padding: 5px 35px 5px 40px;
font-size: 16px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
background-repeat: no-repeat;
background-position: 8px center;
background-size: 24px 24px;
cursor: pointer;
}
/* Flèche personnalisée (compatible cross-browser) */
.lang-select::after {
content: "▼";
font-size: 10px;
color: #555;
position: absolute;
right: 10px;
top: 50%;
transform: translateY(-50%);
pointer-events: none;
}
/* Drapeaux */
.lang-select.fr select { background-image: url('medias/drapeaux/fr.png'); }
.lang-select.en select { background-image: url('medias/drapeaux/en.png'); }
.lang-select.es select { background-image: url('medias/drapeaux/es.png'); }
.lang-select.de select { background-image: url('medias/drapeaux/de.png'); }
.lang-select.it select { background-image: url('medias/drapeaux/it.png'); }
.menu li:hover>a:after {
right: 10px;
}
</style>
<!-- <div class="lang-select fr">
<form method="get" onchange="this.submit()">
<select name="lang">
<option value="fr" selected>
Français </option>
<option value="en" >
English </option>
<option value="es" >
Español </option>
<option value="de" >
Deutsch </option>
<option value="it" >
Italiano </option>
</select>
</form>
</div>
-->
<script>
(function(){
const form = document.getElementById('langForm');
const dd = document.getElementById('langDd');
const btn = document.getElementById('langBtn');
const list = document.getElementById('langList');
const hidden = document.getElementById('langHidden');
const btnFlag = document.getElementById('langBtnFlag');
const btnLabel = document.getElementById('langBtnLabel');
if (!form || !dd || !btn || !list || !hidden) return;
const opts = Array.from(list.querySelectorAll('.lang-dd__opt'));
function open(){
dd.setAttribute('data-open','true');
btn.setAttribute('aria-expanded','true');
list.focus();
setActiveByValue(hidden.value);
}
function close(){
dd.setAttribute('data-open','false');
btn.setAttribute('aria-expanded','false');
clearActive();
}
function isOpen(){
return dd.getAttribute('data-open') === 'true';
}
function clearActive(){
opts.forEach(o => o.classList.remove('is-active'));
}
function setActive(index){
clearActive();
if (opts[index]) opts[index].classList.add('is-active');
list.dataset.activeIndex = String(index);
}
function setActiveByValue(val){
const idx = Math.max(0, opts.findIndex(o => o.dataset.value === val));
setActive(idx);
}
function activeIndex(){
const n = parseInt(list.dataset.activeIndex || '0', 10);
return Number.isFinite(n) ? n : 0;
}
function select(val){
hidden.value = val;
// Update bouton
btnFlag.src = 'medias/drapeaux/' + val + '.png';
btnLabel.textContent = val.toUpperCase();
// aria-selected + classes
opts.forEach(o => {
const sel = (o.dataset.value === val);
o.setAttribute('aria-selected', sel ? 'true' : 'false');
o.classList.toggle('is-selected', sel);
});
close();
form.submit();
}
// Toggle bouton
btn.addEventListener('click', () => (isOpen() ? close() : open()));
// Click options
opts.forEach((o, i) => {
o.addEventListener('click', () => select(o.dataset.value));
o.addEventListener('mousemove', () => setActive(i));
});
// Click dehors
document.addEventListener('click', (e) => {
if (!dd.contains(e.target)) close();
});
// Clavier sur bouton
btn.addEventListener('keydown', (e) => {
if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
open();
}
});
// Clavier sur liste
list.addEventListener('keydown', (e) => {
const i = activeIndex();
if (e.key === 'Escape') { e.preventDefault(); close(); btn.focus(); return; }
if (e.key === 'ArrowDown') { e.preventDefault(); setActive(Math.min(opts.length-1, i+1)); return; }
if (e.key === 'ArrowUp') { e.preventDefault(); setActive(Math.max(0, i-1)); return; }
if (e.key === 'Home') { e.preventDefault(); setActive(0); return; }
if (e.key === 'End') { e.preventDefault(); setActive(opts.length-1); return; }
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
const o = opts[activeIndex()];
if (o) select(o.dataset.value);
return;
}
if (e.key === 'Tab') { close(); }
});
})();
</script>
<li class="marcellus-32">Localisation</li>
<li><a href="index.php" >Focus Monde <img src="https://focus-creation.com/images/autres/map.png" class="map_monde"></a></li>
<li><a href="https://focus-fireplaces.us" >Focus North America <img src="https://focus-creation.com/images/autres/map-usa.png" class="usa"></a></li>
<li class="marcellus-32">Notre catalogue</li>
<!-- <li class="marcellus-32">
<a href="collection.php" style="font-family: 'Marcellus'; padding-top: 10px;">Notre catalogue</a>
</li> -->
<li class="has-submenu">
<a href="#" id="menu-design-block">Design</a>
<div class="submenu produit" style="z-index: 1 !important; border-radius: 0px 10px 0px 0px;">
<div class="grid-images" >
<!-- Bloc large (prend 3 colonnes) -->
<div class="grid-item grid-large">
<a href="#">
<img src="images/autres/design-menu.jpg" alt="La philosophie du design">
</a>
<div class="txt-img-design-menu">
<p class="titre-philo-design">La philosophie du design</p>
<p>Une collection d’une vingtaine de designs iconiques intemporels</p>
</div>
</div>
<div><a href="collection-design.php?famille=all&energie=all&modele=agorafocus%2Bedofocus&poses=all"><img src="medias/modeles/agorafocus.png" alt="Image 1"></a></div>
<div><a href="collection-design.php?famille=all&energie=all&modele=bathyscafocus%2Bemifocus&poses=all"><img src="medias/modeles/bathyscafocus.png" alt="Image 3"></a></div>
<div><a href="collection-design.php?famille=all&energie=all&modele=bathyscafocus%2Bemifocus&poses=all"><img src="medias/modeles/bathyscafocus-hublot.png" alt="Image 4"></a></div>
<div><a href="collection-design.php?modele=boafocus"><img src="medias/modeles/boafocus.png" alt="Image 5"></a></div>
<div><a href="collection-design.php?famille=3"><img src="medias/modeles/bubble.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?modele=curvifocus"><img src="medias/modeles/curvifocus.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?famille=all&energie=all&modele=domofocus%2Bmagmafocus&poses=all"><img src="medias/modeles/domofocus.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?famille=all&energie=all&modele=ergofocus%2Bpaxfocus&poses=all"><img src="medias/modeles/ergofocus.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?modele=eurofocus"><img src="medias/modeles/eurofocus.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?modele=filiofocus"><img src="medias/modeles/filiofocus.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?modele=grappus"><img src="medias/modeles/grappus.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?modele=gyrofocus"><img src="medias/modeles/gyrofocus.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?modele=meijifocus"><img src="medias/modeles/meijifocus.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?modele=slimfocus"><img src="medias/modeles/slimfocus.png" alt="Image 6"></a></div>
<div><a href="collection-design.php?famille=all&energie=all&modele=ANTEFOCUS%2BPROMETHEE%2BMAGNIFOCUS%2BHETEROFOCUS&poses=all"><img src="medias/modeles/heterofocus.png" alt="Image 6" class="picto-sculture"></a></div>
</div>
</div>
</li>
<li class="has-submenu">
<a href="#" >Collections</a>
<div class="submenu collect" style="overflow-y: auto; border-radius: 0px 10px 10px 0px;">
<div class="image-collection-menu">
<img src="images/autres/collection-menu.jpg" class="img-menu-petit">
<div class="txt-img-flamme-reinvente">
<p class="titre-flamme-reinvente">La flamme réinventée</p>
<p>Les collectors réédités avec des nouvelles flammes</p>
</div>
</div>
<a href="gamme-chauffage" style="padding: 0px; text-decoration: none; color: #000; margin: 0;">
<div class="li_sub_menu bt-menu-580-extend" style="padding: 10px; margin-bottom: 10px;">
<span class="sub_text" style="text-transform: uppercase; top: 1px; ">Chauffage</span>
</div>
</a>
<a href="gamme-decorative" style="padding: 0px; text-decoration: none; color: #000; margin: 0;">
<div class="li_sub_menu bt-menu-580-extend" style="padding: 10px; margin-bottom: 10px;">
<span class="sub_text" style="text-transform: uppercase; top: 1px; ">Décorative</span>
</div>
</a>
<a href="gamme-outdoor" style="padding: 0px; text-decoration: none; color: #000; margin: 0;">
<div class="li_sub_menu bt-menu-580-extend" style="padding: 10px; margin-bottom: 10px;">
<span class="sub_text" style="text-transform: uppercase; top: 1px; ">Outdoor</span>
</div>
</a>
<a href="accessoires" style="padding: 0px; text-decoration: none; color: #000; margin: 0;">
<div class="li_sub_menu bt-menu-580-extend" style="padding: 10px;">
<span class="sub_text" style="text-transform: uppercase; top: 1px; ">Accessoires</span>
</div>
</a>
</div>
</li>
<li class="has-submenu">
<a href="#" >Énergies</a>
<div class="submenu collect" style="overflow-y: auto; border-radius: 0px 10px 10px 0px;">
<div class="">
<div class="img-4flammes-menu">
<img src="images/autres/4flammes.jpg" class="img-menu-petit">
</div>
<a href="collection.php?famille=1&energie=1" style="padding: 0px; text-decoration: none; color: #000; margin: 0;">
<div class="li_sub_menu bt-menu-580-extend" style="padding: 10px; margin-bottom: 10px;">
<img src="medias/energie/bois_b.png" alt="Image 4" style="width: 25px; display: inline;margin-right: 20px;position: relative;"><span class="sub_text" >Bois</span>
<span class="lib_sub_menu_accroche" >L'authenticité pure</span>
</div>
</a>
<a href="collection.php?energie=2" style="padding: 0px; text-decoration: none; color: #000; margin: 0;">
<div class="li_sub_menu bt-menu-580-extend" style="padding: 10px; margin-bottom: 10px;">
<img src="medias/energie/gaz_b.png" alt="Image 3" style="width: 25px; display: inline;margin-right: 20px;position: relative;"><span class="sub_text" >Gaz</span>
<span class="lib_sub_menu_accroche" >La passion maîtrisée</span>
</div>
</a>
<a href="collection.php?famille=2&energie=3" style="padding: 0px; text-decoration: none; color: #000; margin: 0;">
<div class="li_sub_menu bt-menu-580-extend" style="padding: 10px; margin-bottom: 10px;">
<img src="medias/energie/bio_b.png" alt="Image 1" style="width: 25px; display: inline;margin-right: 20px;position: relative;"><span class="sub_text" >Bioéthanol</span>
<span class="lib_sub_menu_accroche" >Un air de liberté</span>
</div>
</a>
<a href="collection.php?famille=2&energie=4" style="padding: 0px; text-decoration: none; color: #000; margin: 0;">
<div class="li_sub_menu bt-menu-580-extend" style="padding: 10px; margin-bottom: 10px;">
<img src="medias/energie/holo_b.png" alt="Image 2" style="width: 25px; display: inline;margin-right: 20px;position: relative;"><span class="sub_text" >Holographik<small>®</small></span>
<span class="lib_sub_menu_accroche" >L‘esprit du feu</span>
</div>
</a>
</div>
</div>
</li>
<li><a href="collection.php" >Tous les designs</a></li>
<li class="marcellus-32">Explorer</li>
<li><a href="realisation.php" >Inspiration</a></li>
<li><a href="telechargement.php" >Brochures</a></li>
<li><a href="points-de-vente.php" >Points de vente</a></li>
<li class="marcellus-32">La marque</li>
<li><a href="histoire.php" >Genèse</a></li>
<li><a href="actualites.php" >Actualités</a></li>
<li><a href="distinctions.php" >Distinctions</a></li>
<li class="marcellus-32">Professionnels</li>
<li><a href="hospitality.php" >Hospitalité</a></li>
<li><a href="architectes.php" >Architectes</a></li>
<li><a href="espace-presse" >Espace Presse</a></li>
<li><a href="https://pro.focus-creation.com" target="_blank" >Espace Revendeur</a></li>
<li> </li>
<!--
<li><a href="realite-augmente.php" >Réalité augmenté </a></li> -->
<li> </li>
<li> </li>
</ul>
</div>
<div class="menu-panel menu-overlay">
<button class="close-menu" aria-label="Fermer le menu" style="color: #000;">×</button>
</div>
</aside>
<style>
/* --- Pictos flottants --- */
.quick-actions{
position: fixed;
right: 0px;
bottom: 18px;
z-index: 99999; /* toujours devant */
display: flex;
flex-direction: column;
gap: 10px;
/* le container ne bloque pas les clics autour */
pointer-events: none;
}
/* Boutons */
.quick-actions .qa-btn{
pointer-events: auto; /* les boutons restent cliquables */
width: 46px;
height: 46px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
text-decoration: none;
}
/* Icônes */
.quick-actions .qa-btn img.qa-ico{
width: 47px;
height: 47px;
display: block;
transition: filter .2s ease, transform .2s ease;
filter: none; /* par défaut */
}
.quick-actions .qa-btn:hover img.qa-ico{
transform: scale(1.06);
}
/* Inversion appliquée DIRECTEMENT sur l'image par le script */
.quick-actions .qa-btn img.qa-ico.is-invert{
filter: invert(1);
}
/* Mobile */
@media (max-width: 700px){
.quick-actions{
right: 12px;
bottom: 12px;
gap: 8px;
}
.quick-actions .qa-btn{
width: 50px;
height: 50px;
}
.quick-actions .qa-btn img.qa-ico{
width: 47px;
height: 47px;
}
}
/* Pendant la détection, on "désactive" tout le bloc pour que elementFromPoint voie le fond */
.quick-actions.hit-test-off,
.quick-actions.hit-test-off *{
pointer-events: none !important;
}
</style>
<!-- Pictos flottants (call / mail / lien) -->
<div class="quick-actions" id="quickActions" aria-label="Actions rapides">
<!-- <a class="qa-btn" href="tel:+14155550123" aria-label="Appeler">
<img class="qa-ico" src="medias/pictos/tel.png" alt="">
</a>
-->
<a class="qa-btn" href="#" aria-label="Envoyer un email" data-bs-toggle="modal" data-bs-target="#contactModal">
<img class="qa-ico" src="medias/pictos/mail.png" alt="">
</a>
<a class="qa-btn" href="points-de-vente.php" target="_blank" rel="noopener" aria-label="Ouvrir le lien">
<img class="qa-ico" src="medias/pictos/map.png" alt="">
</a>
</div>
<script>
(function () {
const actions = document.getElementById('quickActions');
if (!actions) return;
const buttons = actions.querySelectorAll('.qa-btn');
if (!buttons.length) return;
function parseRgb(rgb) {
const m = rgb && rgb.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/i);
return m ? { r: +m[1], g: +m[2], b: +m[3] } : null;
}
function luminance({ r, g, b }) {
return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;
}
function getEffectiveBgColor(el) {
while (el && el !== document.documentElement) {
const bg = getComputedStyle(el).backgroundColor;
if (bg && bg !== 'transparent' && bg !== 'rgba(0, 0, 0, 0)') return bg;
el = el.parentElement;
}
return getComputedStyle(document.body).backgroundColor || 'rgb(255,255,255)';
}
let ticking = false;
function updateInvert() {
ticking = false;
buttons.forEach((btn) => {
const ico = btn.querySelector('img.qa-ico');
if (!ico) return;
const r = btn.getBoundingClientRect();
const x = Math.floor(r.left + r.width / 2);
const y = Math.floor(r.top + r.height / 2);
// IMPORTANT : on désactive le hit-test du bloc (et enfants) pour voir le fond derrière
actions.classList.add('hit-test-off');
const under = document.elementFromPoint(x, y);
actions.classList.remove('hit-test-off');
const bg = getEffectiveBgColor(under || document.body);
const rgb = parseRgb(bg);
const isDark = rgb ? (luminance(rgb) < 0.45) : false;
ico.classList.toggle('is-invert', isDark);
});
}
function requestUpdate() {
if (ticking) return;
ticking = true;
requestAnimationFrame(updateInvert);
}
window.addEventListener('scroll', requestUpdate, { passive: true });
window.addEventListener('resize', requestUpdate);
requestUpdate();
})();
</script>
<section class="hero">
<video
class="hero-video"
id="heroVideo"
autoplay
muted
loop
playsinline
poster="/medias/poster.jpg"
preload="none"
data-src="/medias/videos/intro-sans-texte.mp4">
</video>
<div class="video-text" id="text1">Légende du design</div>
<div class="video-text" id="text2">Marque pionnière</div>
<div class="video-text" id="text3">Cheminée suspendue</div>
<div class="video-text" id="text4">Métallique et pivotante</div>
<div class="video-text texte-black-video" id="text5">Iconique depuis 1968</div>
<script>
document.addEventListener("DOMContentLoaded", () => {
const video = document.getElementById("heroVideo");
const src = video.dataset.src;
// On attend que la page soit chargée (images, CSS…)
window.addEventListener('load', () => {
if (!src) return;
const source = document.createElement('source');
source.src = src;
source.type = 'video/mp4';
video.appendChild(source);
// Quand la vidéo est prête, on la lance (si l’autoplay est autorisé)
video.addEventListener('canplay', () => {
video.play().catch(() => {});
});
});
});
</script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const video = document.getElementById("heroVideo");
const texts = [
{ el: document.getElementById("text1"), start: 0, end: 11 },
{ el: document.getElementById("text2"), start: 14, end: 22 },
{ el: document.getElementById("text3"), start: 25, end: 33 },
{ el: document.getElementById("text4"), start: 36, end: 41 },
{ el: document.getElementById("text5"), start: 45, end: 54 },
];
// Forcer la lecture dès que possible
video.addEventListener("loadeddata", () => {
video.play().catch(() => {});
});
// Écoute classique de progression
function updateTexts(t) {
texts.forEach(({ el, start, end }) => {
el.classList.toggle("show", t >= start && t <= end);
});
}
video.addEventListener("timeupdate", () => {
updateTexts(video.currentTime);
});
// Fallback : Chrome Windows bug parfois sur timeupdate
let lastTime = -1;
setInterval(() => {
if (!video.paused && video.currentTime !== lastTime) {
lastTime = video.currentTime;
updateTexts(video.currentTime);
}
}, 250);
// Si la vidéo ne démarre pas automatiquement → on tente un play manuel
video.addEventListener("pause", () => {
if (video.currentTime === 0) {
video.play().catch(() => {});
}
});
});
</script>
<a href="#main" class="scroll-down" aria-label="Scroll down">
<svg viewbox="0 0 24 24">
<circle cx="12" cy="12" r="10.5" stroke="white" fill="none"/>
<path d="M8 10l4 4 4-4" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
</section>
<!-- SECTION NOIRE -->
<div class="prim-part-acc">
<div class="prim-content">
<div class="prim-text">
<h1 class="titre_overwrite_index">EN CE MOMENT</h1>
<h2 class="sstitre_overwrite_index" style="color: #fff">Le design iconique Focus désormais disponible au bioéthanol !</h2>
<a href="collection.php?famille=all&energie=3" class="btn-prim">DéCOUVRIR</a>
</div>
<div class="prim-photo">
<video class="prim-video" poster="medias/videos/accueil.mp4" autoplay muted loop playsinline preload="metadata" aria-label="Vidéo d'accueil : Focus cheminée">
<source src="medias/videos/accueil.mp4" type="video/mp4" />
<img src="medias/videos/placeholder-video-accueil.jpg" alt="Focus cheminée" />
</video>
</div>
</div>
</div>
<!-- Bloc “fantôme” pour garder la place dans le flux -->
<div class="prim-placeholder"></div>
<!-- 2 SECTION -->
<section class="prim-next-section">
<div class="text-block">
<h1 class="titre_overwrite_index">LE DESIGN</h1>
<h2 class="sstitre_overwrite_index">Les icônes du feu,<br> la flamme de l’innovation</h2>
</div>
</section>
<!-- 3 SECTION -->
<section class="slide-fire">
<button class="slide-nav slide-prev">‹</button>
<div class="slide-track">
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/bubble.png" alt="bubble" class="slide-img default">
<img src="medias/spec/Bubble-hover.jpg" alt="Le Bubble est un brasero design fonctionnant au bois" class="slide-img hover">
<a href="collection.php?famille=3" class="slide-btn">Découvrir</a>
</div>
<p>Bubble</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/curvifocus.png" alt="curvifocus" class="slide-img default">
<img src="medias/spec/Curvifocus-hover.jpg" alt="Premier foyer au monde à la façade concave, le Curvifocus offre une visibilité exceptionnelle des flammes et sait faire confluer vers elles tous les regards" class="slide-img hover">
<a href="modele.php?slug=curvifocus" class="slide-btn">Découvrir</a>
</div>
<p>Curvifocus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/eurofocus.png" alt="Eurofocus" class="slide-img default">
<img src="medias/spec/Eurofocus-hover.jpg" alt="Eurofocus poêle central sur pied à bois avec une grande surface vitrée" class="slide-img hover">
<a href="modele.php?slug=eurofocus-951" class="slide-btn">Découvrir</a>
</div>
<p>Eurofocus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/grappus.png" alt="Grappus" class="slide-img default">
<img src="medias/spec/Grappus-hover.jpg" alt="Grappus est plus qu’un poêle, c’est une structure qui rythme, sublime le feu et compose l’espace" class="slide-img hover">
<a href="modele.php?slug=grappus" class="slide-btn">Découvrir</a>
</div>
<p>Grappus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/filiofocus.png" alt="Filiofocus" class="slide-img default">
<img src="medias/spec/Filiofocus-hover.jpg" alt="Le Filiofocus a marqué l’histoire en remportant la médaille d’or aux 'Trophées du Design' lors du Salon Batimat à Paris, ainsi que la médaille d’argent du design à Stuttgart" class="slide-img hover">
<a href="collection.php?modele=filiofocus" class="slide-btn">Découvrir</a>
</div>
<p>Filiofocus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/meijifocus.png" alt="Meijifocus" class="slide-img default">
<img src="medias/spec/Meijifocus-hover.jpg" alt="Meijifocus" class="slide-img hover">
<a href="modele.php?slug=meijifocus" class="slide-btn">Découvrir</a>
</div>
<p>Meijifocus</p>
</div>
<div class="slide-item slide-active">
<div class="slide-img-container">
<img src="medias/spec/gyrofocus.png" alt="Gyrofocus" class="slide-img default">
<img src="medias/spec/Gyrofocus-hover.jpg" alt="Gyrofocus" class="slide-img hover">
<a href="collection.php?modele=gyrofocus" class="slide-btn">Découvrir</a>
</div>
<p>Gyrofocus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/domofocus.png" alt="Domomfocus" class="slide-img default">
<img src="medias/spec/domofocus-hover.jpg" alt="Domomfocus" class="slide-img hover">
<a href="collection.php?modele=domofocus+magmafocus" class="slide-btn">Découvrir</a>
</div>
<p>Domofocus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/ergofocus.png" alt="Ergofocus" class="slide-img default">
<img src="medias/spec/Ergofocus-hover.jpg" alt="Ergofocus" class="slide-img hover">
<a href="collection.php?modele=ergofocus+paxfocus" class="slide-btn">Découvrir</a>
</div>
<p>Ergofocus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/agorafocus.png" alt="Agorafocus" class="slide-img default">
<img src="medias/spec/Agorafocus-hover.jpg" alt="Agorafocus" class="slide-img hover">
<a href="collection.php?modele=agorafocus+edofocus" class="slide-btn">Découvrir</a>
</div>
<p>Agorafocus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/bathyscafocus-hublot.png" alt="Bathyscafocus" class="slide-img default">
<img src="medias/spec/Bathyscafocus-hublot-hover.jpg" alt="Bathyscafocus" class="slide-img hover">
<a href="collection.php?modele=bathyscafocus+emifocus" class="slide-btn">Découvrir</a>
</div>
<p>Bathyscafocus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/boafocus.png" alt="Boafocus" class="slide-img default">
<img src="medias/spec/Boafocus-hover.jpg" alt="Boafocus" class="slide-img hover">
<a href="modele.php?slug=boafocus-central" class="slide-btn">Découvrir</a>
</div>
<p>Boafocus</p>
</div>
<div class="slide-item">
<div class="slide-img-container">
<img src="medias/spec/slimfocus.png" alt="Slimfocus" class="slide-img default">
<img src="medias/spec/Slimfocus-hover.jpg" alt="Slimfocus" class="slide-img hover">
<a href="collection.php?modele=slimfocus" class="slide-btn">Découvrir</a>
</div>
<p>Slimfocus</p>
</div>
</div>
<button class="slide-nav slide-next">›</button>
</section>
<!-- 4 SECTION -->
<section class="prim-next-section-4">
<div class="text-block">
<h1 class="titre_overwrite_index">ÉNERGIES</h1>
<h2 class="sstitre_overwrite_index">La flamme dans tous ses états</h2>
</div>
</section>
<!-- 5 SECTION -->
<section class="prim-next-section-5 cards-energies">
<article class="poster-energie">
<a href="collection.php?famille=1&energie=1" style="text-decoration: none !important; text-align: left;">
<img src="medias/gamme/focus-bois.jpg" alt="Focus Bois" class="poster-energie-css">
<div class="poster-overlay"></div>
<div class="poster-caption">
<img src="medias/energie/ENERGY_WOOD_w.png" alt="" class="poster-picto-energie">
<p class="descript-energie">Focus Bois</p>
<p class="hover-texte">L'authenticité pure</p>
</a>
</div>
</article>
<article class="poster-energie">
<a href="collection.php?famille=all&energie=2" style="text-decoration: none !important; text-align: left;">
<img src="medias/gamme/focus-gaz.jpg" alt="Focus Gaz" class="poster-energie-css">
<div class="poster-overlay"></div>
<div class="poster-caption">
<img src="medias/energie/ENERGY_GAS_w.png" alt="" class="poster-picto-energie">
<p class="descript-energie">Focus Gaz</p>
<p class="hover-texte">La passion maîtrisée</p>
</a>
</div>
</article>
<article class="poster-energie">
<a href="collection.php?famille=all&energie=4" style="text-decoration: none !important; text-align: left;">
<img src="medias/gamme/focus-holo.jpg" alt="Focus Holographik" class="poster-energie-css">
<div class="poster-overlay"></div>
<div class="poster-caption">
<img src="medias/energie/ENERGY_HOLOGRAPHIC_w.png" alt="" class="poster-picto-energie">
<p class="descript-energie">Focus Holographik</p>
<p class="hover-texte">L‘esprit du feu</p>
</a>
</div>
</article>
<article class="poster-energie">
<a href="collection.php?famille=all&energie=3" style="text-decoration: none !important; text-align: left;">
<img src="medias/gamme/focus-bio.jpg" alt="Focus Bioéthanol" class="poster-energie-css">
<div class="poster-overlay"></div>
<div class="poster-caption">
<img src="medias/energie/ENERGY_BIOETHANOL_w.png" alt="" class="poster-picto-energie">
<p class="descript-energie">Focus Bioéthanol</p>
<p class="hover-texte">Un air de liberté</p>
</a>
</div>
</article>
</section>
<section class="prim-next-section-6">
<div class="collections-container">
<!-- Colonne texte -->
<div class="collections-text">
<h1 class="titre_overwrite_index">NOS COLLECTIONS</h1>
<h2 class="sstitre_overwrite_index">Le feu dans toutes<br>ses expressions</h2>
<div class="collections-buttons">
<a href="collection.php?famille=1">
<button class="btn-collection" data-tooltip="Les modèles de la gamme chauffage sont des foyers fermés – au bois ou au gaz – dotés de performances énergétiques et environnementales. Leur excellent rendement en fait des solutions idéales pour chauffer durablement l’habitat." data-filter="chauffage">
Chauffage </button>
</a>
<a href="collection.php?famille=2">
<button class="btn-collection" data-tooltip="Les modèles de la Collection Décorative sont des modèles d'agréments destinés aux habitations déjà équipées d'un appareil de chauffage principal. Leur chaleur restituée varie de faible à forte selon l’énergie du modèle : bois, gaz, électricité ou bioéthanol. Dans ces deux dernières énergies, ils s’invitent là où une cheminée traditionnelle est impossible." data-filter="decorative">
Décorative </button>
</a>
<a href="collection.php?famille=3">
<button class="btn-collection" data-tooltip="Focus décline son design emblématique en version outdoor pour prolonger l’art du feu en plein air. Cheminées d’extérieur et braseros composent cette collection pensée pour des instants mémorables, été comme hiver." data-filter="outdoor">
Outdoor </button>
</a>
</div>
<div class="box-tooltip">
<div class="tooltip-box" id="tooltip-box"></div>
</div>
<script>
const buttons = document.querySelectorAll('.btn-collection');
const tooltip = document.getElementById('tooltip-box');
buttons.forEach(btn => {
btn.addEventListener('mouseenter', e => {
tooltip.textContent = btn.dataset.tooltip;
tooltip.style.display = 'block';
const rect = btn.getBoundingClientRect();
tooltip.style.left = rect.left + 'px';
tooltip.style.top = (rect.top - 40) + 'px'; // au-dessus du bouton
});
btn.addEventListener('mouseleave', () => {
tooltip.style.display = 'none';
});
});
</script>
</div>
<!-- Colonne images -->
<div class="collections-images">
<a href="collection.php?famille=1" class="collection-card chauffage active">
<img src="/medias/gamme/chauffage.jpg" alt="Gamme Chauffage">
<span class="collection-label">Chauffage</span>
<span class="collection-subtext">La performance énergétique au cœur de nos modèles</span>
</a>
<a href="collection.php?famille=2" class="collection-card decorative">
<img src="/medias/gamme/decorative.jpg" alt="Gamme Decorative">
<span class="collection-label">Décorative</span>
<span class="collection-subtext">Le design au service du feu </span>
</a>
<a href="collection.php?famille=3" class="collection-card outdoor">
<img src="/medias/gamme/outdoor.jpg" alt="Gamme Outdoor">
<span class="collection-label">Outdoor</span>
<span class="collection-subtext">Le design Focus pour le plein air</span>
</a>
</div>
</div>
</section>
<section class="prim-next-section-7">
<!-- injection de la video sur la section -->
<video class="fabfr-video-bg" muted loop playsinline preload="metadata">
<source src="/medias/videos/manufacture.mp4" type="video/mp4">
</video>
<div class="collections-container">
<!-- Colonne texte -->
<div class="collections-textfabfr">
<h1 class="titre_overwrite_index">LE SAVOIR FAIRE</h1>
<h2 class="sstitre_overwrite_index" style="color: #fff;">Fabrication<br>française</h2>
<p>Depuis plus de 50 ans, Focus a fait le choix exigeant de maintenir sur son sol français l’ensemble de sa fabrication. Une décision stratégique prise dès les origines par Dominique Imbert, artiste et fondateur de Focus, et perpétuée par la direction actuelle, reflet d’un engagement fort pour la qualité, l’innovation, et la pérennité de savoir-faire d’exception.</p>
<div class="collections-buttons-fabfr">
<a href="manufacture.php" style="text-decoration: none !important;">
<button class="btn-collection-fabfr" data-filter="chauffage">Découvrir</button>
</a>
</div>
</div>
<div class="collections-images-logo">
<img src="/medias/divers/fab_ligne_gauche_rvb.png" alt="Fabrication française" class="collection-card-fabfr"><img src="/medias/divers/EPV.png" alt="EPV" class="collection-card-epv">
</div>
</div>
</section>
<section class="prim-next-section-8">
<div class="text-block">
<h1 class="titre_overwrite_index">à PROPOS</h1>
<h2 class="sstitre_overwrite_index" >Beyond Focus</h2>
</div>
<div class="full-width">
<div class="beyond-bloc-1">
<a href="fondateur.php">
<img src="images/autres/di.jpg">
<div class="titre-image-beyond">Le fondateur</div>
<div class="discover">Découvrir <span>></span></div>
</a>
</div>
<div class="beyond-bloc-1">
<a href="histoire.php">
<img src="images/autres/di-histoire.jpg">
<div class="titre-image-beyond">L'histoire</div>
<div class="discover">Découvrir <span>></span></div>
</a>
</div>
<div class="beyond-bloc-1">
<a href="icone.php">
<img src="images/autres/di-icone.jpg">
<div class="titre-image-beyond">L'icône</div>
<div class="discover">Découvrir <span>></span></div>
</a>
</div>
</div>
</section>
<section class="prim-next-section-9">
<div class="contact-container">
<div class="contact-image">
<img src="images/autres/img-information.jpg" alt="Besoin d'informations">
</div>
<div class="contact-content">
<h1 class="titre_overwrite_index">CONTACT</h1>
<h2 class="sstitre_overwrite_index" >Vous avez besoin<br>d’informations ?</h2>
<p>Prenez contact avec nos équipes, nous reviendrons vers vous dans les plus brefs délais.</p>
<div class="contact-buttons">
<a href="#" class="btn-contact" data-bs-toggle="modal" data-bs-target="#contactModal">Je souhaite être contacté<span>></span></a>
<a href="demande-devis.php" class="btn-contact">DEMANDER UN DEVIS<span>></span></a>
<a href="points-de-vente.php" class="btn-contact">Trouver un revendeur<span>></span></a>
</div>
</div>
</div>
</section>
<style type="text/css">
.headquarter {
width: 100%;
text-align: right;
}
</style>
<footer class="footer">
<div class="footer-inner">
<div class="footer-top">
<!-- Logo -->
<div class="footer-logo">
<!-- <img src="medias/logo_focus.svg" alt="Focus logo"> -->
</div>
<!-- Colonnes -->
<div class="footer-links">
<div class="footer-column">
<h1 class="footer-h1">Catalogue</h1>
<ul>
<li><a href="collection.php?famille=1" class="footer-link">Collection Chauffage</a></li>
<li><a href="collection.php?famille=2" class="footer-link">Collection Décorative</a></li>
<li><a href="collection.php?famille=3" class="footer-link">Collection Outdoor</a></li>
</ul>
</div>
<div class="footer-column">
<h1 class="footer-h1">Explorer</h1>
<ul>
<li><a href="realisation.php" class="footer-link">Inspiration</a></li>
<li><a href="telechargement.php" class="footer-link">Brochures</a></li>
<li><a href="revendeurs.php" class="footer-link">Revendeurs</a></li>
</ul>
</div>
<div class="footer-column">
<h1 class="footer-h1">La marque</h1>
<ul>
<li><a href="histoire.php" class="footer-link">Genèse</a></li>
<li><a href="actualites.php" class="footer-link">Actualités</a></li>
<li><a href="manufacture.php" class="footer-link">Made in France</a></li>
</ul>
</div>
<div class="footer-column">
<h1 class="footer-h1">Professionnels</h1>
<ul>
<li><a href="hospitality.php" class="footer-link">Hospitalité</a></li>
<li><a href="architectes.php" class="footer-link">Architectes</a></li>
<li><a href="presse.php" class="footer-link">Espace Presse</a></li>
</ul>
</div>
<!-- Newsletter + Contact -->
<div class="footer-column newsletter">
<h1 class="footer-h1">Newsletter</h1>
<form class="newsletter-form" id="newsletter-form">
<input type="email" name="email" placeholder="email" required>
<button type="submit" class="footer-contact-btn">JE M’ABONNE</button>
<p id="newsletter-message"></p>
</form>
<hr>
<h1 class="footer-h1">Contact</h1>
<a href="#" class="footer-contact-btn" data-bs-toggle="modal" data-bs-target="#contactModal">JE SOUHAITE êTRE CONTACTé ></a>
</div>
</div>
</div>
<!-- Modal de contact -->
<div class="modal fade" id="contactModal" tabindex="-1" aria-labelledby="contactModalLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<form id="contactForm" method="POST" action="contact_process.php">
<input type="hidden" name="form_time" id="form_time">
<div class="modal-header">
<h5 class="modal-title" id="contactModalLabel">Contactez-nous</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer" style="color: #fff; font-size: 2rem; position: relative; top: -10px;">X</button>
</div>
<div class="modal-body">
<div class="mb-3">
<input type="text" name="nom" class="form-control" placeholder="Nom*" required>
</div>
<div class="mb-3">
<input type="text" name="prenom" class="form-control" placeholder="Prénom*" required>
</div>
<div class="mb-3">
<input type="email" name="email" class="form-control" placeholder="Courriel *" required>
</div>
<div class="mb-3">
<input type="text" name="telephone" class="form-control" placeholder="Téléphone">
</div>
<div class="mb-3">
<input type="text" name="pays" class="form-control" placeholder="Pays " required>
</div>
<div class="mb-3">
<input type="hidden" name="lang" class="form-control" value="fr">
</div>
<div class="mb-3">
<textarea name="message" class="form-control" rows="3" placeholder="Message *" required></textarea>
</div>
<!-- CAPTCHA -->
<div class="mb-3 text-center">
<img src="captcha.php" alt="captcha" id="captcha-img" style="height:50px;cursor:pointer;" title="Cliquez pour rafraîchir">
<button type="button" id="reload-captcha" class="btn btn-light btn-sm" style="padding: 10px; font-size: 19px;">↻</button>
<input class="form-control mt-2" type="text" name="captcha" maxlength="5" required placeholder="CAPTCHA" style="width: 190px; margin: 0 auto; text-align: center;text-transform: capitalize;">
<small id="captcha-status" style="margin-left:8px;"></small>
</div>
<div class="form-check mb-3 overwrite-modal-rgpd">
<input class="form-check-input" type="checkbox" name="rgpd" id="rgpd" required>
<label class="form-check-label" for="rgpd" style="color: #000;">
J'accepte la politique de confidentialité (RGPD) </label>
</div>
<div id="contact-status" class="alert d-none" role="alert"></div>
</div>
<div class="modal-footer">
<button type="submit" id="submit-btn" class="btn btn-primary">
<span class="spinner-border spinner-border-sm d-none" id="submit-spinner"></span>
<span id="submit-text">Envoyer</span>
</button>
</div>
</form>
</div>
</div>
</div>
<!-- Modal de feedback -->
<div class="modal fade" id="feedbackModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content text-center p-4">
<div id="feedbackMessage"></div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function () {
const form = document.getElementById('contactForm');
const submitBtn = document.getElementById('submit-btn');
const spinner = document.getElementById('submit-spinner');
const submitText = document.getElementById('submit-text');
const statusBox = document.getElementById('contact-status');
const captchaImg = document.getElementById('captcha-img');
const captchaStatus = document.getElementById('captcha-status');
const modalContactEl = document.getElementById('contactModal');
// Quand la modale s'ouvre → définir form_time + reset messages
modalContactEl.addEventListener('shown.bs.modal', function () {
document.getElementById('form_time').value = Math.floor(Date.now() / 1000);
captchaStatus.textContent = "";
captchaStatus.className = "";
statusBox.classList.add('d-none');
statusBox.innerHTML = '';
});
// Fonction refresh du captcha
function refreshCaptcha() {
captchaImg.src = 'captcha.php?d=' + Date.now();
}
// Reload manuel du captcha
const reloadBtn = document.getElementById('reload-captcha');
if (reloadBtn) {
reloadBtn.addEventListener('click', refreshCaptcha);
}
captchaImg.addEventListener('click', refreshCaptcha);
// Soumission du formulaire (UN SEUL listener)
form.addEventListener('submit', function (e) {
e.preventDefault();
// Désactiver le bouton + spinner
submitBtn.disabled = true;
spinner.classList.remove('d-none');
submitText.textContent = 'Envoi...';
// Reset du message d'état dans la modale
statusBox.classList.add('d-none');
statusBox.innerHTML = '';
const formData = new FormData(form);
fetch('contact_process.php', {
method: 'POST',
body: formData,
credentials: 'same-origin' // important pour le captcha
})
.then(response => response.json())
.then(data => {
// Reset affichage captcha
captchaStatus.textContent = "";
captchaStatus.className = "";
// Cas CAPTCHA incorrect
if (!data.success && data.message && data.message.includes("CAPTCHA")) {
captchaStatus.textContent = "❌ CAPTCHA incorrect";
captchaStatus.classList.add("text-danger");
refreshCaptcha();
if (form.captcha) {
form.captcha.value = "";
}
return; // on ne continue pas plus loin
}
// Affichage du message dans la modale de contact
statusBox.classList.remove('d-none', 'alert-success', 'alert-danger');
statusBox.classList.add(data.success ? 'alert-success' : 'alert-danger');
statusBox.innerHTML = data.message;
const feedbackModalEl = document.getElementById('feedbackModal');
const feedbackModal = bootstrap.Modal.getOrCreateInstance(feedbackModalEl);
const msgBox = document.getElementById('feedbackMessage');
// Autres erreurs (non liées au captcha)
if (!data.success) {
msgBox.textContent = data.message;
msgBox.className = 'text-danger';
feedbackModal.show();
return;
}
// Succès
form.reset();
refreshCaptcha();
msgBox.textContent = data.message;
msgBox.className = 'text-success';
// Fermer la modale de contact
const contactModal = bootstrap.Modal.getInstance(modalContactEl);
if (contactModal) contactModal.hide();
// Afficher la modale de feedback
feedbackModal.show();
// Fermer le feedback + nettoyer le message après 3 sec
setTimeout(() => {
feedbackModal.hide();
statusBox.classList.add('d-none');
statusBox.innerHTML = '';
}, 3000);
})
.catch(error => {
console.error('Erreur AJAX :', error);
// Message dans la modale de contact
statusBox.classList.remove('d-none', 'alert-success');
statusBox.classList.add('alert-danger');
statusBox.innerHTML = "Erreur réseau. Veuillez réessayer.";
// Et dans le feedbackModal
const feedbackModalEl = document.getElementById('feedbackModal');
const feedbackModal = bootstrap.Modal.getOrCreateInstance(feedbackModalEl);
const msgBox = document.getElementById('feedbackMessage');
msgBox.textContent = "Une erreur est survenue. Veuillez réessayer.";
msgBox.className = "text-danger";
feedbackModal.show();
})
.finally(() => {
// Réactiver bouton + enlever spinner
submitBtn.disabled = false;
spinner.classList.add('d-none');
submitText.textContent = 'Envoyer';
});
});
});
</script>
<!-- Réseaux sociaux -->
<div class="footer-bottom">
<div class="footer-socials">
<a href="https://www.pinterest.fr/FocusCreation/" target="_blank"><img src="medias/social/pinterest.svg" alt="Pinterest"></a>
<a href="https://www.instagram.com/focuscreation/" target="_blank"><img src="medias/social/instagram.svg" alt="Instagram"></a>
<a href="https://www.facebook.com/FocusCreation.FR" target="_blank"><img src="medias/social/facebook.svg" alt="Facebook"></a>
<a href="https://www.linkedin.com/company/focus-creation" target="_blank"><img src="medias/social/linkedin.svg" alt="LinkedIn"></a>
<a href="https://www.youtube.com/channel/UChjGDFsWVNTmhxWV6-GSmdQ" target="_blank"><img src="medias/social/youtube.svg" alt="YouTube"></a>
</div>
<div class="footer-mentions">
<a href="rgpd.php" class="footer-mentions-link">Mentions légales - RGPD</a> - © Copyright FOCUS 2026 </div>
</div>
<div class="headquarter"><br><br><strong>Focus - Atelier Dominique Imbert</strong> - 3, impasse Claque Patin - Le Fort - 34380 Viols le Fort (France) - Tél. 00 33 (0)4 67 55 01 93</div>
</div>
</footer>
<!-- Tarteaucitron.js - RGPD Cookie Consent -->
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/tarteaucitronjs@latest/tarteaucitron.js"></script>
<link rel="stylesheet" href="css/rgpd.css">
<script>
document.querySelector('#newsletter-form').addEventListener('submit', function(e) {
e.preventDefault();
const form = e.target;
const email = form.email.value;
const message = document.getElementById('newsletter-message');
fetch('newsletter.php', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: 'email=' + encodeURIComponent(email)
})
.then(r => r.json())
.then(data => {
if (data.success) {
message.textContent = "Inscription réussie" + (data.message || "");
form.reset();
} else {
message.textContent = "❌ " + (data.error || "Erreur lors de l’inscription.");
}
})
.catch(() => message.textContent = "⚠️ Impossible de contacter le serveur.");
});
</script>
<script type="text/javascript">
tarteaucitron.init({
"privacyUrl": "/V2/privacy-policy.php", /* Lien vers ta politique de confidentialité */
"hashtag": "#tarteaucitron", /* Ouvre la boîte de gestion avec ce hashtag */
"cookieName": "RGPD-GRPD-Focus-création", /* Nom du cookie de consentement */
"useExternalCss": true, // Active le mode "sans CSS par défaut"
"showIcon": false, // <--- Ne pas afficher le widget flottant
"orientation": "bottom", /* bottom (par défaut) ou top */
"showAlertSmall": true, /* Affiche le petit bandeau en bas */
"cookieslist": true, /* Affiche la liste des cookies */
"closePopup": false, /* Désactive la croix de fermeture */
"showIcon": true, /* Affiche le widget flottant pour rouvrir le bandeau */
"iconPosition": "BottomRight",
"adblocker": false,
"DenyAllCta" : true, /* Affiche le bouton "Tout refuser" */
"AcceptAllCta" : true, /* Affiche le bouton "Tout accepter" */
"highPrivacy": true, /* Mode haute protection (aucun script tiers chargé avant consentement) */
"handleBrowserDNTRequest": false,
"removeCredit": true, /* Enlève la mention "tarteaucitron.js" */
"moreInfoLink": true, /* Affiche le lien "En savoir plus" */
"readmoreLink": "/V2/privacy-policy" /* Lien "En savoir plus" */
});
</script>
<script type="text/javascript">
// Attend que Tarteaucitron soit vraiment prêt
function waitForTarteaucitron(cb) {
if (typeof tarteaucitron !== 'undefined' &&
tarteaucitron.userInterface &&
typeof tarteaucitron.userInterface.openPanel === "function") {
cb();
} else {
setTimeout(function() { waitForTarteaucitron(cb); }, 100);
}
}
// Quand la page est chargée...
document.addEventListener('DOMContentLoaded', function() {
var btnAlert = document.getElementById('show-tarteaucitron-alert');
var btn = document.getElementById('open-tarteaucitron');
if (!btn) return;
btn.addEventListener('click', function(e) {
e.preventDefault();
waitForTarteaucitron(function() {
tarteaucitron.userInterface.openPanel();
});
});
});
</script>
<script>
document.addEventListener('DOMContentLoaded', function() {
const captchaInput = document.querySelector('input[name="captcha"]');
const captchaStatus = document.getElementById('captcha-status');
let timer = null;
captchaInput.addEventListener('input', function() {
clearTimeout(timer);
captchaStatus.textContent = "";
captchaStatus.className = "";
const value = captchaInput.value.trim();
if (value.length < 5) return;
timer = setTimeout(() => {
fetch("captcha_validate.php?captcha=" + encodeURIComponent(value), {
method: "GET",
credentials: "same-origin"
})
.then(response => response.json())
.then(data => {
if (data.success) {
captchaStatus.textContent = "✓ Correct";
captchaStatus.classList.add("text-success");
} else {
captchaStatus.textContent = "✗ Incorrect";
captchaStatus.classList.add("text-danger");
}
});
}, 300);
});
});
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-T8LXQ724RQ"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-T8LXQ724RQ');
</script>
<script>
(() => {
const videos = Array.from(document.querySelectorAll('video[data-autoplay="inview"]'));
if (videos.length === 0) return;
// Respecte la préférence "réduire les animations"
const reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
// Observer: joue si ≥ 50% visible, pause sinon
const io = 'IntersectionObserver' in window ? new IntersectionObserver((entries) => {
entries.forEach((entry) => {
const v = entry.target;
const inView = entry.isIntersecting && entry.intersectionRatio >= 0.5;
if (!reduceMotion && inView) {
v.play().catch(() => {}); // évite l'erreur si l’autoplay est bloqué
} else {
v.pause();
}
});
}, {
threshold: [0, 0.5, 1],
rootMargin: '0px 0px -20% 0px' // commence un peu avant le centre si tu veux
}) : null;
if (io) {
videos.forEach(v => io.observe(v));
} else {
// Fallback sans IntersectionObserver
const check = () => {
videos.forEach((v) => {
const r = v.getBoundingClientRect();
const vh = window.innerHeight || document.documentElement.clientHeight;
const inView = r.top < vh * 0.8 && r.bottom > vh * 0.2; // ~60% à l’écran
if (!reduceMotion && inView) v.play().catch(() => {}); else v.pause();
});
};
['scroll','resize','orientationchange'].forEach(ev => window.addEventListener(ev, check, {passive: true}));
check();
}
// Mets en pause si l’onglet est caché
document.addEventListener('visibilitychange', () => {
videos.forEach(v => {
if (document.hidden) v.pause();
});
});
})();
</script>
<script>
const slidesContainer = document.querySelector('.slide-track');
const slides = Array.from(document.querySelectorAll('.slide-item'));
const prevBtn = document.querySelector('.slide-prev');
const nextBtn = document.querySelector('.slide-next');
let activeIndex = slides.findIndex(slide => slide.classList.contains('slide-active'));
function updateSlides() {
slides.forEach((slide, i) => slide.classList.toggle('slide-active', i === activeIndex));
const windowWidth = window.innerWidth;
const activeSlide = slides[activeIndex];
const slideRect = activeSlide.getBoundingClientRect();
const slideCenter = slideRect.left + slideRect.width / 2;
// Écart entre le centre du slide et le centre de la fenêtre
const diff = (windowWidth / 2) - slideCenter;
// On récupère la position actuelle du track
const currentTransform = getComputedStyle(slidesContainer).transform;
let currentX = 0;
if (currentTransform !== 'none') {
const matrix = new DOMMatrix(currentTransform);
currentX = matrix.m41;
}
// Nouvelle translation = ancienne + correction
const newTranslate = currentX + diff;
slidesContainer.style.transform = `translateX(${newTranslate}px)`;
}
// S’assurer d’un calcul après chargement (images, etc.)
window.addEventListener('load', updateSlides);
window.addEventListener('resize', updateSlides);
function nextSlide() {
activeIndex = (activeIndex + 1) % slides.length;
updateSlides();
}
function prevSlide() {
activeIndex = (activeIndex - 1 + slides.length) % slides.length;
updateSlides();
}
nextBtn.addEventListener('click', nextSlide);
prevBtn.addEventListener('click', prevSlide);
window.addEventListener('resize', updateSlides);
updateSlides();
</script>
<script>
// Fonction pour rafraîchir la page
function refreshPage() {
location.reload();
}
// Écoutez les changements sur les liens de langue
document.querySelectorAll('a[href*="lang="]').forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
const url = new URL(this.href, window.location.href);
const lang = url.searchParams.get('lang');
// On laisse le header PHP décider où aller,
// on passe juste ?lang=xx et on navigue :
window.location.href = '?lang=' + lang;
});
});
document.addEventListener('DOMContentLoaded', function() {
const primPart = document.querySelector('.prim-part-acc');
const scrollBtn = document.querySelector('.scroll-down');
const hero = document.querySelector('.hero');
const heroHeight = hero.offsetHeight;
if (!primPart || !scrollBtn || !hero) return;
function updateParallax() {
const scrollY = window.scrollY;
const start = 0;
const end = heroHeight * 0.4; // montée rapide
const progress = Math.min(Math.max(scrollY / end, 0), 1);
// Ajustement de la montée selon la hauteur réelle
const translateY = 100 - (progress * (100 * (100 / 110))); // si 70vh,
primPart.style.transform = `translateY(${translateY}%)`;
}
// scroll = montée de la div noire
window.addEventListener('scroll', updateParallax);
// clic flèche = montée directe
scrollBtn.addEventListener('click', function(e) {
e.preventDefault();
window.scrollTo({ top: heroHeight * 0.4, behavior: 'smooth' });
});
primPart.style.transform = 'translateY(100%)';
});
</script>
<script>
document.addEventListener("DOMContentLoaded", () => {
const section = document.querySelector('.prim-next-section-7');
const video = section.querySelector('.fabfr-video-bg');
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
if (entry.isIntersecting) {
section.classList.add('active');
video.play();
} else {
section.classList.remove('active');
video.pause();
}
});
}, { threshold: 0.3 }); // déclenche quand 30% de la section est visible
observer.observe(section);
});
</script>
<script src="js/menu-toggle.js"></script>
</body>
</html>