1 2 3 <!DOCTYPE html> 4<html lang="fr-FR" data-website-id="1" data-main-object="ir.ui.view(1879,)"> 5 <head>
5<script>(function(w,i,g){w[g]=w[g]||[];if(typeof w[g].push=='function')w[g].push(i)}) 6(window,'GTM-M5N98GQP','google_tags_first_party');</script>
6<script>(function(w,d,s,l){w[l]=w[l]||[];(function(){w[l].push(arguments);})('set', 'developer_id.dYzg1YT', true); 7 w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 8 j=d.createElement(s);j.async=true;j.src='/x8hb/'; 9 f.parentNode.insertBefore(j,f); 10 })(window,document,'script','dataLayer');</script>
10 11 <meta charset="utf-8"/> 12 <meta http-equiv="X-UA-Compatible" content="IE=edge"/> 13 <meta name="viewport" content="width=device-width, initial-scale=1"/> 14 <meta name="generator" content="Odoo"/> 15 16 <meta property="og:type" content="website"/> 17 <meta property="og:title" content="Shopping Cart | La Scourtinerie 1882"/> 18 <meta property="og:site_name" content="La Scourtinerie 1882"/> 19 <meta property="og:url" content="https://www.scourtinerie.com/shop/cart"/> 20 <meta property="og:image" content="https://www.scourtinerie.com/web/image/website/1/logo?unique=91c2855"/> 21 22 <meta name="twitter:card" content="summary_large_image"/> 23 <meta name="twitter:title" content="Shopping Cart | La Scourtinerie 1882"/> 24 <meta name="twitter:image" content="https://www.scourtinerie.com/web/image/website/1/logo/300x300?unique=91c2855"/> 25 26 <link rel="alternate" hreflang="en" href="https://www.scourtinerie.com/en/shop/cart"/> 27 <link rel="alternate" hreflang="fr" href="https://www.scourtinerie.com/shop/cart"/> 28 <link rel="alternate" hreflang="x-default" href="https://www.scourtinerie.com/shop/cart"/> 29 <link rel="canonical" href="https://www.scourtinerie.com/shop/cart"/> 30 31 <link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin=""/> 32 <title>Shopping Cart | La Scourtinerie 1882</title> 33 <link type="image/x-icon" rel="shortcut icon" href="/web/image/website/1/favicon?unique=91c2855"/> 34 <link rel="preload" href="/web/static/src/libs/fontawesome/fonts/fontawesome-webfont.woff2?v=4.7.0" as="font" crossorigin=""/> 35 <link type="text/css" rel="stylesheet" href="/web/assets/1/9de6408/web.assets_frontend.min.css"/> 36
36<script id="web.layout.odooscript" type="text/javascript"> 37 var odoo = { 38 csrf_token: "95c0e73c82cad5439b5d59b45224be1897182cf6o1822594276", 39 debug: "", 40 }; 41(function () { 42 "use strict"; 43 44 // âââ CONFIG ââââââââââââââââââââââââââââââââââââââââââââââ 45 var CURRENCY = "EUR"; 46 var DEBUG = false; // true en test, false en prod 47 var DEDUPE_TTL_MS = 7000; 48 var DEBOUNCE_MS = 80; 49 50 // âââ STATE âââââââââââââââââââââââââââââââââââââââââââââââ 51 if (!window.__ga4) { window.__ga4 = {}; } 52 var G = window.__ga4; 53 if (!G.pending) { G.pending = null; } 54 if (!G.lastSent) { G.lastSent = null; } 55 if (!G.debounce) { G.debounce = null; } 56 if (!G.cfgSeed) { G.cfgSeed = null; } 57 if (!G.lastCartQty){ G.lastCartQty = null; } 58 59 // âââ UTILITIES âââââââââââââââââââââââââââââââââââââââââââ 60 61 function log() { 62 if (!DEBUG) { return; } 63 try { 64 var a = ["[GA4]"]; 65 for (var i = 0; i < arguments.length; i++) { a.push(arguments[i]); } 66 console.log.apply(console, a); 67 } catch (e) {} 68 } 69 70 function now() { return Date.now(); } 71 72 function trim(s) { 73 if (!s) { return ""; } 74 return String(s).replace(/^\s+|\s+$/g, ""); 75 } 76 77 function safeText(el) { 78 if (!el) { return ""; } 79 return trim(el.textContent || ""); 80 } 81 82 function parseMoney(str) { 83 if (!str) { return null; } 84 var s = String(str) 85 .replace(/\u00A0/g, "") 86 .replace(/\s/g, "") 87 .replace(",", "."); 88 var v = parseFloat(s); 89 return isNaN(v) ? null : v; 90 } 91 92 function roundMoney(v) { 93 if (v == null) { return null; } 94 return Math.round(v * 100) / 100; 95 } 96 97 function isPath(p) { 98 return (location.pathname || "") === p; 99 } 100 101 function pathStarts(p) { 102 return (location.pathname || "").indexOf(p) === 0; 103 } 104 105 function closest(node, sel) { 106 if (!node || !node.closest) { return null; } 107 return node.closest(sel); 108 } 109 110 // âââ [v2.2.3] ITEM_ID FALLBACK ââââââââââââââââââââââââââ 111 112 function slugify(str) { 113 if (!str) { return ""; } 114 return String(str).toLowerCase() 115 .replace(/[à áâãäå]/g, "a").replace(/[èéêë]/g, "e") 116 .replace(/[ìÃîï]/g, "i").replace(/[òóôõö]/g, "o") 117 .replace(/[ùúûü]/g, "u").replace(/[ýÿ]/g, "y") 118 .replace(/[ç]/g, "c").replace(/[ñ]/g, "n") 119 .replace(/[^a-z0-9]+/g, "-") 120 .replace(/^-+|-+$/g, "") 121 .substring(0, 80); 122 } 123 124 function ensureItemId(item) { 125 if (!item) { return item; } 126 if (item.item_id && String(item.item_id) !== "undefined" && trim(String(item.item_id)) !== "") { 127 return item; 128 } 129 if (item.item_name) { 130 item.item_id = "odoo_" + slugify(item.item_name); 131 } else { 132 item.item_id = "odoo_unknown"; 133 } 134 log("ensureItemId fallback â", item.item_id, "for", item.item_name || "(no name)"); 135 return item; 136 } 137 138 // âââ [v2.2.3] PURCHASE PAGE DETECTION ââââââââââââââââââââ 139 140 function isPurchasePage() { 141 return isPath("/shop/confirmation") || isPath("/payment/status"); 142 } 143 144 // âââ [v2.2.4] ITEM_CATEGORY EXTRACTION âââââââââââââââââââ 145 // Priority: 1) data-ga4-item-category attribute 2) catalog 3) breadcrumb 146 // Charlotte must add data-ga4-item-category on product DOM elements (see brief) 147 148 function extractCategoryFromElement(scope) { 149 if (!scope) { return ""; } 150 // Search on the element itself first, then traverse up, then search children 151 var el = null; 152 if (scope.getAttribute && scope.getAttribute("data-ga4-item-category")) { 153 return trim(scope.getAttribute("data-ga4-item-category")); 154 } 155 // Walk up to find a parent with the attribute 156 el = closest(scope, "[data-ga4-item-category]"); 157 if (el) { return trim(el.getAttribute("data-ga4-item-category")); } 158 // Search children (for cards, forms, etc.) 159 el = scope.querySelector("[data-ga4-item-category]"); 160 if (el) { return trim(el.getAttribute("data-ga4-item-category")); } 161 return ""; 162 } 163 164 function extractCategoryFromBreadcrumbs() { 165 var crumbs = document.querySelectorAll(".breadcrumb-item"); 166 if (!crumbs || crumbs.length < 2) { return ""; } 167 if (isPdp() && crumbs.length > 2) { 168 return safeText(crumbs[crumbs.length - 2]); 169 } 170 return safeText(crumbs[crumbs.length - 1]); 171 } 172 173 // [v2.2.4] Unified category resolution: data-attr â catalog â breadcrumb
174 function resolveCategory(scope, itemName) { 175 // 1. Data attribute (Odoo backend source of truth) 176 var cat = extractCategoryFromElement(scope || document); 177 if (cat) { return cat; } 178 // 2. Catalog (propagated from a previous event that had a good value) 179 if (itemName) { 180 var catalog = getCatalog(); 181 var stored = catalog[itemName]; 182 if (stored && stored.item_category) { return stored.item_category; } 183 } 184 // 3. Breadcrumb (last resort, unreliable) 185 return extractCategoryFromBreadcrumbs(); 186 } 187 188 // âââ dlPush (with auto item_id sanitization) âââââââââââââ 189 190 function dlPush(event, ecommerce, extra) { 191 if (!window.dataLayer) { window.dataLayer = []; } 192 window.dataLayer.push({ ecommerce: null }); 193 194 // [v2.2.3] Sanitize all items to guarantee item_id 195 if (ecommerce && ecommerce.items && ecommerce.items.length) { 196 for (var i = 0; i < ecommerce.items.length; i++) { 197 ecommerce.items[i] = ensureItemId(ecommerce.items[i]); 198 } 199 } 200 201 var obj = { event: event, ecommerce: ecommerce, _src: "ga4_custom" }; 202 if (extra) { 203 for (var k in extra) { 204 if (extra.hasOwnProperty(k)) { obj[k] = extra[k]; } 205 } 206 } 207 window.dataLayer.push(obj); 208 log(event, obj); 209 } 210 211 function dedupeKey(prefix, suffix) { 212 return prefix + ":" + (suffix || (location.pathname + (location.search || ""))); 213 } 214 215 function wasFired(key) { 216 try { return sessionStorage.getItem("__ga4_" + key) === "1"; } 217 catch (e) { return false; } 218 } 219 220 function markFired(key) { 221 try { sessionStorage.setItem("__ga4_" + key, "1"); } 222 catch (e) {} 223 } 224 225 function findQty(scope) { 226 if (!scope) { return 1; } 227 var sels = ["input[name='add_qty']", "input[name='quantity']", 228 "input.js_quantity", "input[name='qty']"]; 229 for (var i = 0; i < sels.length; i++) { 230 var el = scope.querySelector(sels[i]); 231 if (el && el.value) { 232 var v = parseFloat(el.value); 233 if (!isNaN(v) && v > 0) { return v; } 234 } 235 } 236 return 1; 237 } 238 239 // âââ PAGE DETECTION ââââââââââââââââââââââââââââââââââââââ 240 241 function isPdp() { 242 return !!document.querySelector("#product_detail, #product_details"); 243 } 244 245 function isListingPage() { 246 if (!pathStarts("/shop")) { return false; } 247 if (isPdp()) { return false; } 248 var skip = ["/shop/cart", "/shop/checkout", "/shop/payment", 249 "/shop/confirmation", "/shop/address"]; 250 for (var i = 0; i < skip.length; i++) { 251 if (isPath(skip[i])) { return false; } 252 } 253 return !!document.querySelector("#o_wsale_products_grid"); 254 } 255 256 // âââ ITEM CATALOG (session storage) ââââââââââââââââââââ [v2.1] 257 258 function getCatalog() { 259 try { 260 var r = sessionStorage.getItem("__ga4_item_catalog"); 261 return r ? JSON.parse(r) : {}; 262 } catch (e) { return {}; } 263 } 264 265 function saveCatalogEntry(item) { 266 if (!item || !item.item_name) { return; } 267 try { 268 var catalog = getCatalog(); 269 var key = item.item_name; 270 var existing = catalog[key] || {}; 271 var fields = ["item_id", "item_name", "item_variant", "item_category", "price"]; 272 for (var i = 0; i < fields.length; i++) { 273 var f = fields[i]; 274 if (item[f] !== undefined && item[f] !== "" && item[f] !== null) { 275 existing[f] = item[f]; 276 } 277 } 278 catalog[key] = existing; 279 sessionStorage.setItem("__ga4_item_catalog", JSON.stringify(catalog)); 280 } catch (e) {} 281 } 282 283 function enrichFromCatalog(item) { 284 if (!item || !item.item_name) { return item; } 285 try { 286 var catalog = getCatalog(); 287 var stored = catalog[item.item_name]; 288 if (!stored) { return item; } 289 if (!item.item_id && stored.item_id) { item.item_id = stored.item_id; } 290 if (!item.item_variant && stored.item_variant) { item.item_variant = stored.item_variant; } 291 if (!item.item_category && stored.item_category) { item.item_category = stored.item_category; } 292 if (item.price == null && stored.price != null) { item.price = stored.price; } 293 } catch (e) {} 294 return item; 295 } 296 297 // âââ VARIANT EXTRACTION ââââââââââââââââââââââââââââââââââ 298 299 function extractVariantPdp() { 300 var parts = []; 301 var root = document.querySelector("ul.o_wsale_product_page_variants") || 302 document.querySelector("#product_details") || document; 303 var attrs = root.querySelectorAll("li[name='variant_attribute']"); 304 for (var i = 0; i < attrs.length; i++) { 305 var li = attrs[i]; 306 var attrName = li.getAttribute("data-attribute-name") || ""; 307 if (!attrName) { 308 var ns = li.querySelector("h6.attribute_name span, .attribute_name span"); 309 if (ns) { attrName = safeText(ns); } 310 } 311 var val = ""; 312 var vs = li.querySelector("span.attribute_value[name='attribute_value']");
313 if (vs) { val = safeText(vs); } 314 if (!val) { 315 var act = li.querySelector("label.css_attribute_color.active, label.active[title]"); 316 if (act) { 317 val = act.getAttribute("title") || ""; 318 if (!val) { 319 var ci = act.querySelector("input:checked, input"); 320 if (ci) { val = ci.getAttribute("data-value-name") || ci.getAttribute("title") || ""; } 321 } 322 } 323 } 324 if (!val) { 325 var cr = li.querySelector("input[type='radio']:checked, input.js_variant_change:checked"); 326 if (cr) { val = cr.getAttribute("data-value-name") || cr.getAttribute("title") || ""; } 327 } 328 if (val) { parts.push(attrName ? (attrName + ": " + val) : val); } 329 } 330 return parts.join(" | "); 331 } 332 333 function extractVariantConfigurator(modal) { 334 if (!modal) { return ""; } 335 var parts = []; 336 var blocks = modal.querySelectorAll("div[name='ptal']"); 337 for (var i = 0; i < blocks.length; i++) { 338 var b = blocks[i]; 339 var attrName = ""; 340 var lab = b.querySelector("label.fw-bold"); 341 if (lab) { attrName = safeText(lab); } 342 var val = ""; 343 var sel = b.querySelector("label.active[title]"); 344 if (sel) { val = sel.getAttribute("title") || ""; } 345 if (!val) { 346 var inp = b.querySelector("input[type='radio']:checked"); 347 if (inp) { 348 var pl = closest(inp, "label"); 349 if (pl) { val = pl.getAttribute("title") || safeText(pl); } 350 } 351 } 352 if (val) { parts.push(attrName ? (attrName + ": " + val) : val); } 353 } 354 return parts.join(" | "); 355 } 356 357 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 358 // 1. VIEW_ITEM_LIST 359 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 360 361 function fireViewItemList() { 362 if (!isListingPage()) { return; } 363 var key = dedupeKey("vil"); 364 if (wasFired(key)) { return; } 365 markFired(key); 366 367 var items = []; 368 // [v2.2.4] Breadcrumb only as last-resort fallback for listing-level category 369 var listCategoryBreadcrumb = extractCategoryFromBreadcrumbs(); 370 var cards = document.querySelectorAll("#o_wsale_products_grid .oe_product"); 371 for (var i = 0; i < cards.length; i++) { 372 var card = cards[i]; 373 var form = card.querySelector("form.oe_product_cart"); 374 if (!form) { continue; } 375 var btn = form.querySelector("button[data-ga4-item-template-id], button[data-ga4-item-name]"); 376 var pidIn = form.querySelector("input[name='product_id']"); 377 var ptidIn = form.querySelector("input[name='product_template_id']"); 378 var nameEl = form.querySelector("h2.o_wsale_products_item_title a span"); 379 var priceEl = form.querySelector(".product_price .oe_currency_value"); 380 381 var itemId = ""; 382 if (pidIn && pidIn.value) { itemId = pidIn.value; } 383 else if (ptidIn && ptidIn.value) { itemId = ptidIn.value; } 384 if (!itemId && btn) { 385 var dpid = btn.getAttribute("data-product-id"); 386 if (dpid) { itemId = dpid; } 387 } 388 389 var itemName = safeText(nameEl); 390 if (!itemName && btn) { itemName = btn.getAttribute("data-ga4-item-name") || ""; } 391 392 var price = priceEl ? parseMoney(safeText(priceEl)) : undefined; 393 if (price == null && btn) { 394 var pu = btn.getAttribute("data-ga4-unit-price"); 395 if (pu) { price = parseMoney(pu); } 396 } 397 398 // [v2.2.4] Category: per-product data-attr â catalog â listing breadcrumb 399 var category = extractCategoryFromElement(card); 400 if (!category && itemName) { 401 var catalog = getCatalog(); 402 var st = catalog[itemName]; 403 if (st && st.item_category) { category = st.item_category; } 404 } 405 if (!category) { category = listCategoryBreadcrumb; } 406 407 var item = { 408 item_id: itemId || undefined, 409 item_name: itemName || undefined, 410 item_category: category || undefined, 411 price: (price != null) ? price : undefined, 412 index: i 413 }; 414 items.push(item); 415 saveCatalogEntry(item); 416 } 417 if (!items.length) { return; } 418 419 var listName = listCategoryBreadcrumb || "Boutique"; 420 421 dlPush("view_item_list", { 422 currency: CURRENCY, 423 item_list_id: location.pathname, 424 item_list_name: listName, 425 items: items 426 }); 427 } 428 429 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 430 // 2. SELECT_ITEM 431 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 432 433 function installSelectItemListener() { 434 if (!isListingPage()) { return; } 435 document.addEventListener("click", function (ev) { 436 if (!ev.target || !ev.target.closest) { return; } 437 var link = ev.target.closest("a.oe_product_image_link, h2.o_wsale_products_item_title a, a.text-decoration-none"); 438 if (!link) { return; } 439 var card = closest(link, ".oe_product"); 440 if (!card) { return; } 441 var form = card.querySelector("form.oe_product_cart"); 442 if (!form) { return; } 443 var nameEl = form.querySelector("h2.o_wsale_products_item_title a span"); 444 var priceEl = form.querySelector(".product_price .oe_currency_value"); 445 var pidIn = form.querySelector("input[name='product_id']"); 446 var ptidIn = form.querySelector("input[name='product_template_id']"); 447 448 var itemId = ""; 449 if (pidIn && pidIn.value) { itemId = pidIn.value; } 450 else if (ptidIn && ptidIn.value) { itemId = ptidIn.value; } 451 452 var itemName = safeText(nameEl) || "";
453 // [v2.2.4] Category via resolveCategory 454 var category = resolveCategory(card, itemName); 455 456 dlPush("select_item", { 457 currency: CURRENCY, 458 items: [{ 459 item_id: itemId || undefined, 460 item_name: itemName || undefined, 461 item_category: category || undefined, 462 price: priceEl ? parseMoney(safeText(priceEl)) : undefined 463 }] 464 }); 465 }, true); 466 } 467 468 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 469 // 3. VIEW_ITEM 470 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 471 472 function fireViewItem() { 473 if (!isPdp()) { return; } 474 var key = dedupeKey("vi"); 475 if (wasFired(key)) { return; } 476 markFired(key); 477 478 var pidEl = document.querySelector("input[name='product_id']"); 479 var ptidEl = document.querySelector("input[name='product_template_id']"); 480 var pid = (pidEl && pidEl.value) ? pidEl.value : ""; 481 var ptid = (ptidEl && ptidEl.value) ? ptidEl.value : ""; 482 var itemId = pid || ptid; 483 484 var h1 = document.querySelector("h1"); 485 var itemName = h1 ? safeText(h1) : ""; 486 487 var priceEl = document.querySelector(".oe_price .oe_currency_value"); 488 if (!priceEl) { priceEl = document.querySelector("#product_details .oe_currency_value"); } 489 if (!priceEl) { priceEl = document.querySelector(".product_price .oe_currency_value"); } 490 var price = priceEl ? parseMoney(safeText(priceEl)) : undefined; 491 492 var variant = extractVariantPdp(); 493 494 // [v2.2.4] Category: data-attr on PDP â catalog â breadcrumb 495 var pdpRoot = document.querySelector("#product_detail, #product_details") || document; 496 var category = resolveCategory(pdpRoot, itemName); 497 498 var item = { 499 item_id: itemId || undefined, 500 item_name: itemName || undefined, 501 item_category: category || undefined, 502 price: (price != null) ? price : undefined, 503 quantity: 1 504 }; 505 if (variant) { item.item_variant = variant; } 506 507 saveCatalogEntry(item); 508 509 dlPush("view_item", { 510 currency: CURRENCY, 511 value: (price != null) ? price : undefined, 512 items: [item] 513 }); 514 } 515 516 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 517 // 4. ADD_TO_CART 518 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 519 520 function extractFromPdp(btn) { 521 var qty = findQty(document); 522 var pidEl = document.querySelector("input[name='product_id']"); 523 var ptidEl = document.querySelector("input[name='product_template_id']"); 524 var pid = (pidEl && pidEl.value) ? pidEl.value : ""; 525 var ptid = (ptidEl && ptidEl.value) ? ptidEl.value : ""; 526 var itemId = pid || ptid; 527 528 var h1 = document.querySelector("h1"); 529 var itemName = h1 ? safeText(h1) : ""; 530 531 var priceEl = document.querySelector(".oe_price .oe_currency_value"); 532 if (!priceEl) { priceEl = document.querySelector("#product_details .oe_currency_value"); } 533 if (!priceEl) { priceEl = document.querySelector(".product_price .oe_currency_value"); } 534 var unit = priceEl ? parseMoney(safeText(priceEl)) : null; 535 536 // [v2.2.4] Category via resolveCategory on PDP root 537 var pdpRoot = document.querySelector("#product_detail, #product_details") || document; 538 var category = resolveCategory(pdpRoot, itemName); 539 540 return { 541 source: "pdp", item_id: itemId, item_template_id: ptid, 542 item_name: itemName, item_variant: extractVariantPdp(), 543 item_category: category, 544 quantity: qty, price: unit, 545 value: (unit != null) ? roundMoney(unit * qty) : null, 546 ts: now() 547 }; 548 } 549 550 function extractFromCard(btn) { 551 var tmplId = "", itemId = "", itemName = "", unit = null; 552 if (btn) { 553 tmplId = btn.getAttribute("data-ga4-item-template-id") || 554 btn.getAttribute("data-product-template-id") || ""; 555 itemId = btn.getAttribute("data-product-id") || ""; 556 if (!itemId && tmplId) { itemId = tmplId; } 557 itemName = btn.getAttribute("data-ga4-item-name") || ""; 558 var pu = btn.getAttribute("data-ga4-unit-price"); 559 if (pu) { unit = parseMoney(pu); } 560 } 561 if (!itemName || unit == null) { 562 var card = btn ? closest(btn, ".oe_product, .o_wsale_product_grid_wrapper, .card, .o_wsale_product_information") : null; 563 if (!card) { card = document; } 564 if (!itemName) { 565 var ne = card.querySelector("h2.o_wsale_products_item_title a span, .o_wsale_product_name, .product_name"); 566 if (ne) { itemName = safeText(ne); } 567 } 568 if (unit == null) { 569 var pe = card.querySelector(".product_price .oe_currency_value"); 570 if (pe) { unit = parseMoney(safeText(pe)); } 571 } 572 } 573 if (!itemId) { 574 var form = btn ? closest(btn, "form") : null; 575 if (form) { 576 var pidIn = form.querySelector("input[name='product_id']"); 577 var ptidIn = form.querySelector("input[name='product_template_id']"); 578 if (pidIn && pidIn.value) { itemId = pidIn.value; } 579 else if (ptidIn && ptidIn.value) { itemId = ptidIn.value; } 580 } 581 } 582 583 // [v2.2.4] Category: data-attr on card/btn â catalog â breadcrumb 584 var cardScope = btn ? (closest(btn, ".oe_product, .o_wsale_product_grid_wrapper, .card") || document) : document;
585 var category = resolveCategory(cardScope, itemName); 586 587 return { 588 source: "listing", item_id: itemId, item_template_id: tmplId, 589 item_name: itemName, item_variant: "", 590 item_category: category, 591 quantity: 1, 592 price: unit, value: (unit != null) ? unit : null, ts: now() 593 }; 594 } 595 596 function extractFromConfigurator(btn) { 597 var modal = btn ? closest(btn, ".modal, .o_sale_product_configurator_dialog") : null; 598 if (!modal) { modal = document.querySelector(".o_sale_product_configurator_dialog"); } 599 if (!modal) { modal = document; } 600 601 var itemName = ""; 602 var nameEl = modal.querySelector("div[name='o_sale_product_configurator_name'] span"); 603 if (nameEl) { itemName = safeText(nameEl); } 604 605 var seed = G.cfgSeed; 606 var itemId = "", tmplId = "", unit = null, category = ""; 607 if (seed) { 608 if (seed.item_id) { itemId = seed.item_id; } 609 if (seed.item_template_id) { tmplId = seed.item_template_id; } 610 if (!itemName && seed.item_name) { itemName = seed.item_name; } 611 if (seed.price != null) { unit = seed.price; } 612 if (seed.item_category) { category = seed.item_category; } 613 } 614 615 // [v2.2.4] Category: data-attr on modal â seed â catalog â breadcrumb 616 if (!category) { 617 category = resolveCategory(modal, itemName); 618 } 619 620 var priceEl = modal.querySelector("span[name='sale_product_configurator_formatted_price'] .oe_currency_value"); 621 if (priceEl) { 622 var pp = parseMoney(safeText(priceEl)); 623 if (pp != null) { unit = pp; } 624 } 625 626 var totalEl = modal.querySelector("h6.o_configurator_price_total"); 627 var total = null; 628 if (totalEl) { 629 var tt = safeText(totalEl).replace(/^[^0-9]*/, ""); 630 total = parseMoney(tt); 631 } 632 633 var qty = 1; 634 var qtyEl = modal.querySelector("input[name='sale_quantity']"); 635 if (qtyEl && qtyEl.value) { 636 var qv = parseFloat(qtyEl.value); 637 if (!isNaN(qv) && qv > 0) { qty = qv; } 638 } 639 640 var val = null; 641 if (total != null) { val = roundMoney(total); } 642 else if (unit != null) { val = roundMoney(unit * qty); } 643 644 return { 645 source: "configurator", item_id: itemId, item_template_id: tmplId, 646 item_name: itemName, item_variant: extractVariantConfigurator(modal), 647 item_category: category, 648 quantity: qty, price: unit, value: val, ts: now() 649 }; 650 } 651 652 // --- Arm on click --- 653 document.addEventListener("click", function (ev) { 654 var t = ev.target; 655 if (!t || !t.closest) { return; } 656 657 var pdp = closest(t, "#add_to_cart"); 658 if (pdp) { G.pending = extractFromPdp(pdp); return; } 659 660 var buyNow = closest(t, "a.o_we_buy_now"); 661 if (buyNow) { 662 var p = extractFromPdp(buyNow); 663 p.source = "pdp_buy_now"; 664 pushNow(p, "pdp_buy_now"); 665 return; 666 } 667 668 var cfgPay = closest(t, "button[name='website_sale_product_configurator_checkout_button']"); 669 if (cfgPay) { 670 var cp = extractFromConfigurator(cfgPay); 671 cp.source = "configurator_pay_now"; 672 pushNow(cp, "configurator_pay_now"); 673 return; 674 } 675 676 var cfgAdd = closest(t, "button[name='website_sale_product_configurator_continue_button']"); 677 if (cfgAdd) { G.pending = extractFromConfigurator(cfgAdd); return; } 678 679 var cardBtn = closest(t, "button.o_wsale_product_btn_primary, button.js_add_cart, .js_add_cart"); 680 if (cardBtn) { 681 var cd = extractFromCard(cardBtn); 682 G.pending = cd; 683 G.cfgSeed = cd; 684 return; 685 } 686 687 var seedEl = closest(t, "[data-ga4-item-template-id], [data-ga4-item-name]"); 688 if (seedEl) { G.cfgSeed = extractFromCard(seedEl); } 689 }, true); 690 691 // --- Push immediately (buy-now paths) --- 692 function pushNow(pending, label) { 693 if (!pending) { return; } 694 var k = (pending.item_id || pending.item_name || "x") + ":" + (pending.quantity || 1); 695 if (pending.value != null) { k += ":" + pending.value; } 696 if (G.lastSent && G.lastSent.key === k && (now() - G.lastSent.ts) < 1200) { return; } 697 G.lastSent = { key: k, ts: now() }; 698 699 var ecom = { 700 currency: CURRENCY, 701 value: (pending.value != null) ? pending.value : undefined, 702 items: [{
703 item_id: pending.item_id || undefined, 704 item_name: pending.item_name || undefined, 705 item_variant: pending.item_variant || undefined, 706 item_category: pending.item_category || undefined, 707 price: (pending.price != null) ? pending.price : undefined, 708 quantity: pending.quantity || 1 709 }] 710 }; 711 dlPush("add_to_cart", ecom); 712 storeLastEcom(ecom); 713 saveCatalogEntry(ecom.items[0]); 714 } 715 716 // --- Push on cart badge change --- 717 function getCartQty() { 718 var el = document.querySelector(".my_cart_quantity") || 719 document.querySelector("a[href*='/shop/cart'] .badge") || 720 document.querySelector(".o_wsale_my_cart .badge") || 721 document.querySelector(".o_wsale_my_cart"); 722 if (!el) { return null; } 723 var m = safeText(el).match(/[0-9]+/); 724 return m ? parseInt(m[0], 10) : null; 725 } 726 727 function cartQtyChanged() { 728 var cur = getCartQty(); 729 if (cur == null) { return false; } 730 if (G.lastCartQty == null) { G.lastCartQty = cur; return false; } 731 if (cur !== G.lastCartQty) { G.lastCartQty = cur; return true; } 732 return false; 733 } 734 735 function pushOnCartChange() { 736 var p = G.pending; 737 if (!p) { return; } 738 if (!cartQtyChanged()) { return; } 739 if ((now() - p.ts) > DEDUPE_TTL_MS) { G.pending = null; return; } 740 741 var k = (p.item_id || p.item_name || "x") + ":" + (p.quantity || 1); 742 if (p.value != null) { k += ":" + p.value; } 743 if (G.lastSent && G.lastSent.key === k && (now() - G.lastSent.ts) < 1200) { 744 G.pending = null; return; 745 } 746 747 G.lastSent = { key: k, ts: now() }; 748 G.pending = null; 749 750 var ecom = { 751 currency: CURRENCY, 752 value: (p.value != null) ? p.value : undefined, 753 items: [{ 754 item_id: p.item_id || undefined, 755 item_name: p.item_name || undefined, 756 item_variant: p.item_variant || undefined, 757 item_category: p.item_category || undefined, 758 price: (p.price != null) ? p.price : undefined, 759 quantity: p.quantity || 1 760 }] 761 }; 762 dlPush("add_to_cart", ecom); 763 storeLastEcom(ecom); 764 saveCatalogEntry(ecom.items[0]); 765 G.cfgSeed = null; 766 } 767 768 function storeLastEcom(ecom) { 769 try { 770 sessionStorage.setItem("__ga4_last_ecom", JSON.stringify(ecom)); 771 } catch (e) {} 772 } 773 774 function installCartObserver() { 775 var targets = []; 776 var sels = [".my_cart_quantity", "a[href*='/shop/cart'] .badge", 777 ".o_wsale_my_cart", "header"]; 778 for (var i = 0; i < sels.length; i++) { 779 var el = document.querySelector(sels[i]); 780 if (el) { targets.push(el); } 781 } 782 if (document.body) { targets.push(document.body); } 783 784 var obs = new MutationObserver(function () { 785 if (G.debounce) { clearTimeout(G.debounce); } 786 G.debounce = setTimeout(pushOnCartChange, DEBOUNCE_MS); 787 }); 788 for (var j = 0; j < targets.length; j++) { 789 try { 790 obs.observe(targets[j], { childList: true, subtree: true, 791 characterData: true, attributes: true }); 792 } catch (e) {} 793 } 794 log("cart observer installed on", targets.length, "targets"); 795 } 796 797 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 798 // 5. BEGIN_CHECKOUT 799 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 800 801 function extractCartItemsFromCheckout() { 802 var items = []; 803 804 var table = document.querySelector(".o_cart_products_table"); 805 if (!table) { return items; } 806 807 var rows = table.querySelectorAll("tbody tr"); 808 for (var i = 0; i < rows.length; i++) { 809 var tr = rows[i]; 810 811 var nameEl = tr.querySelector("td.td-product_name span"); 812 if (!nameEl) { continue; } 813 var itemName = safeText(nameEl); 814 if (!itemName) { continue; } 815 816 var itemId = ""; 817 var imgSpan = tr.querySelector("td.td-img span[data-oe-model='product.product']"); 818 if (imgSpan) { itemId = imgSpan.getAttribute("data-oe-id") || ""; } 819 if (!itemId) { 820 var prodAttr = tr.getAttribute("data-product-id"); 821 if (prodAttr) { itemId = prodAttr; } 822 } 823 if (!itemId) { 824 var hiddenPid = tr.querySelector("input[name='product_id']"); 825 if (hiddenPid && hiddenPid.value) { itemId = hiddenPid.value; } 826 } 827 if (!itemId) { 828 var prodLink = tr.querySelector("td.td-product_name a[href*='/shop/']"); 829 if (prodLink) { 830 var href = prodLink.getAttribute("href") || ""; 831 var match = href.match(/-(\d+)(?:\?|#|$)/); 832 if (match) { itemId = match[1]; } 833 } 834 } 835 836 var priceEl = tr.querySelector("td.td-price .oe_currency_value"); 837 var linePrice = priceEl ? parseMoney(safeText(priceEl)) : null; 838 839 var qtyEl = tr.querySelector(".o_cart_item_count"); 840 var qty = 1; 841 if (qtyEl) { 842 var qv = parseInt(safeText(qtyEl), 10); 843 if (!isNaN(qv) && qv > 0) { qty = qv; } 844 } 845 846 var unitPrice = null; 847 if (linePrice != null && qty > 0) { 848 unitPrice = roundMoney(linePrice / qty); 849 } 850 851 // [v2.2.4] Category: data-attr on cart row â catalog â breadcrumb
852 var category = resolveCategory(tr, itemName); 853 854 var item = { 855 item_id: itemId || undefined, 856 item_name: itemName, 857 item_category: category || undefined, 858 price: (unitPrice != null) ? unitPrice : undefined, 859 quantity: qty 860 }; 861 862 item = enrichFromCatalog(item); 863 items.push(item); 864 } 865 return items; 866 } 867 868 function computeItemsValue(items) { 869 var total = 0; 870 var hasPrice = false; 871 for (var i = 0; i < items.length; i++) { 872 if (items[i].price != null) { 873 total += items[i].price * (items[i].quantity || 1); 874 hasPrice = true; 875 } 876 } 877 return hasPrice ? roundMoney(total) : undefined; 878 } 879 880 function fireBeginCheckout() { 881 if (!isPath("/shop/checkout")) { return; } 882 var key = dedupeKey("bc"); 883 if (wasFired(key)) { return; } 884 markFired(key); 885 886 var items = extractCartItemsFromCheckout(); 887 888 if (!items.length) { 889 try { 890 var raw = sessionStorage.getItem("__ga4_last_ecom"); 891 if (raw) { 892 var parsed = JSON.parse(raw); 893 if (parsed && parsed.items) { 894 items = parsed.items; 895 for (var i = 0; i < items.length; i++) { 896 items[i] = enrichFromCatalog(items[i]); 897 } 898 } 899 } 900 } catch (e) {} 901 } 902 903 var value = computeItemsValue(items); 904 905 try { 906 sessionStorage.setItem("__ga4_checkout_items", JSON.stringify(items)); 907 if (value != null) { sessionStorage.setItem("__ga4_checkout_value", String(value)); } 908 } catch (e) {} 909 910 dlPush("begin_checkout", { 911 currency: CURRENCY, 912 value: value, 913 items: items 914 }); 915 } 916 917 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 918 // 6. ADD_SHIPPING_INFO + 7. ADD_PAYMENT_INFO 919 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 920 921 function getStoredCheckoutItems() { 922 try { 923 var r = sessionStorage.getItem("__ga4_checkout_items"); 924 return r ? JSON.parse(r) : []; 925 } catch (e) { return []; } 926 } 927 928 function getStoredCheckoutValue() { 929 try { 930 var v = sessionStorage.getItem("__ga4_checkout_value"); 931 return v ? parseFloat(v) : undefined; 932 } catch (e) { return undefined; } 933 } 934 935 function installPaymentPageListeners() { 936 if (!isPath("/shop/payment")) { return; } 937 938 var shippingFired = false; 939 var paymentFired = false; 940 941 document.addEventListener("click", function (ev) { 942 if (!ev.target || !ev.target.closest) { return; } 943 944 var dm = ev.target.closest(".o_delivery_carrier_select, [name='o_delivery_method'], .o_delivery_carrier_label, .o_wsale_delivery_carrier_item"); 945 if (dm && !shippingFired) { 946 shippingFired = true; 947 var tier = ""; 948 var lbl = dm.querySelector(".o_delivery_carrier_label, .o_wsale_delivery_name, label, span"); 949 if (lbl) { tier = trim(safeText(lbl).split("\n")[0]); } 950 dlPush("add_shipping_info", { 951 currency: CURRENCY, 952 value: getStoredCheckoutValue(), 953 shipping_tier: tier || undefined, 954 items: getStoredCheckoutItems() 955 }); 956 } 957 958 var pp = ev.target.closest(".o_payment_option_card, [name='o_payment_option'], .o_payment_form .list-inline-item"); 959 if (pp && !paymentFired) { 960 paymentFired = true; 961 var ptype = ""; 962 var pn = pp.querySelector(".o_payment_option_name, .payment_option_name, span"); 963 if (pn) { ptype = trim(safeText(pn).split("\n")[0]); } 964 dlPush("add_payment_info", { 965 currency: CURRENCY, 966 value: getStoredCheckoutValue(), 967 payment_type: ptype || undefined, 968 items: getStoredCheckoutItems() 969 }); 970 } 971 }, true); 972 } 973 974 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 975 // 8. PURCHASE 976 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 977 978 function buildEcomFromOrderTracking() { 979 var el = document.querySelector("[data-order-tracking-info]"); 980 if (!el) { return null; } 981 var raw = el.getAttribute("data-order-tracking-info"); 982 if (!raw) { return null; } 983 var data = null; 984 try { data = JSON.parse(raw); } catch (e) { return null; } 985 if (!data) { return null; } 986 987 var ecom = {}; 988 if (data.transaction_id !== undefined) { ecom.transaction_id = data.transaction_id; } 989 if (data.affiliation !== undefined) { ecom.affiliation = data.affiliation; } 990 if (data.value !== undefined) { ecom.value = data.value; } 991 if (data.tax !== undefined) { ecom.tax = data.tax; } 992 if (data.shipping !== undefined) { ecom.shipping = data.shipping; } 993 ecom.currency = data.currency || CURRENCY; 994 ecom.items = data.items || []; 995
996 var tax = (typeof data.tax === "number") ? data.tax : 0; 997 if (tax > 0 && ecom.items.length > 0) { 998 var itemsTotalHt = 0; 999 for (var i = 0; i < ecom.items.length; i++) { 1000 var it = ecom.items[i]; 1001 itemsTotalHt += (it.price || 0) * (it.quantity || 1); 1002 } 1003 if (itemsTotalHt > 0) { 1004 var taxMultiplier = (itemsTotalHt + tax) / itemsTotalHt; 1005 for (var j = 0; j < ecom.items.length; j++) { 1006 if (ecom.items[j].price != null) { 1007 ecom.items[j].price = roundMoney(ecom.items[j].price * taxMultiplier); 1008 } 1009 } 1010 } 1011 } 1012 1013 for (var m = 0; m < ecom.items.length; m++) { 1014 ecom.items[m] = enrichFromCatalog(ecom.items[m]); 1015 } 1016 1017 return ecom; 1018 } 1019 1020 function firePurchase() { 1021 if (!isPurchasePage()) { return; } 1022 var key = dedupeKey("purchase"); 1023 if (wasFired(key)) { return; } 1024 markFired(key); 1025 1026 var ecom = buildEcomFromOrderTracking(); 1027 if (!ecom) { 1028 log("firePurchase: no data-order-tracking-info found on", location.pathname); 1029 return; 1030 } 1031 1032 try { 1033 var alreadyTx = sessionStorage.getItem("__ga4_purchase_fired_tx"); 1034 if (alreadyTx && ecom.transaction_id && String(alreadyTx) === String(ecom.transaction_id)) { 1035 log("firePurchase: skipped (already fired at payment click for tx", alreadyTx, ")"); 1036 try { 1037 sessionStorage.removeItem("__ga4_last_ecom"); 1038 sessionStorage.removeItem("__ga4_checkout_items"); 1039 sessionStorage.removeItem("__ga4_checkout_value"); 1040 sessionStorage.removeItem("__ga4_purchase_fired_tx"); 1041 sessionStorage.removeItem("__ga4_purchase_fired_at"); 1042 } catch (e) {} 1043 return; 1044 } 1045 } catch (e) {} 1046 1047 dlPush("purchase", ecom); 1048 1049 var ec = readEcFromSession() || {}; 1050 1051 if (window.__ec_user) { 1052 if (!ec.email && window.__ec_user.email) { ec.email = normalizeEmail(window.__ec_user.email); } 1053 if (!ec.phone && window.__ec_user.phone) { ec.phone = normalizePhone(window.__ec_user.phone); } 1054 } 1055 1056 if (!ec.email && !ec.first_name) { ec = null; } 1057 1058 if (ec) { 1059 if (!window.dataLayer) { window.dataLayer = []; } 1060 window.dataLayer.push({ 1061 event: "purchase_enhanced", 1062 ecommerce: ecom, 1063 ec: ec, 1064 _src: "ga4_custom" 1065 }); 1066 log("purchase_enhanced", { ecommerce: ecom, ec: ec }); 1067 } 1068 1069 try { 1070 sessionStorage.removeItem("__ga4_last_ecom"); 1071 sessionStorage.removeItem("__ga4_checkout_items"); 1072 sessionStorage.removeItem("__ga4_checkout_value"); 1073 } catch (e) {} 1074 } 1075 1076 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 1077 // 8bis. PURCHASE ON PAYMENT CLICK (pre-redirect) 1078 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 1079 1080 function getOrderDataFromTemplate() { 1081 var el = document.getElementById("ga4-payment-data"); 1082 if (!el) { return null; } 1083 var d = el.dataset || {}; 1084 return { 1085 orderReference: d.orderReference || "", 1086 orderId: d.orderId || "", 1087 amountTotal: d.orderAmountTotal ? parseFloat(d.orderAmountTotal) : null, 1088 amountUntaxed: d.orderAmountUntaxed ? parseFloat(d.orderAmountUntaxed) : null, 1089 amountTax: d.orderAmountTax ? parseFloat(d.orderAmountTax) : null, 1090 amountDelivery: d.orderAmountDelivery ? parseFloat(d.orderAmountDelivery) : null, 1091 currency: d.orderCurrency || CURRENCY, 1092 customer: { 1093 email: d.customerEmail || "", 1094 phone: d.customerPhone || "", 1095 name: d.customerName || "", 1096 street: d.customerStreet || "", 1097 street2: d.customerStreet2 || "", 1098 city: d.customerCity || "", 1099 zip: d.customerZip || "", 1100 country: d.customerCountry || "", 1101 isCompany: d.customerIsCompany === "1" 1102 } 1103 }; 1104 } 1105 1106 function getOrderReference() { 1107 var tpl = getOrderDataFromTemplate(); 1108 if (tpl && tpl.orderReference) { return tpl.orderReference; } 1109 return "provisional_" + now(); 1110 } 1111 1112 function buildEcFromTemplate() { 1113 var tpl = getOrderDataFromTemplate(); 1114 if (!tpl) { return null; } 1115 var c = tpl.customer; 1116 if (!c || (!c.email && !c.phone && !c.name)) { return null; } 1117 var ec = {}; 1118 if (c.email) { ec.email = normalizeEmail(c.email); } 1119 if (c.phone) { ec.phone = normalizePhone(c.phone); } 1120 if (c.name) { 1121 if (c.isCompany) { 1122 ec._is_company = true; 1123 ec._company_name = c.name; 1124 } else { 1125 var names = splitName(c.name); 1126 if (names.first_name) { ec.first_name = names.first_name; } 1127 if (names.last_name) { ec.last_name = names.last_name; } 1128 } 1129 } 1130 var fullStreet = trim((c.street || "") + " " + (c.street2 || "")); 1131 if (fullStreet) { ec.street = fullStreet; } 1132 if (c.city) { ec.city = c.city; } 1133 if (c.zip) { ec.postal_code = c.zip; } 1134 if (c.country) { ec.country = c.country; } 1135 return ec; 1136 } 1137 1138 function buildEcomFromStoredCheckout() { 1139 var items = getStoredCheckoutItems(); 1140 if (!items.length) {
1141 try { 1142 var raw = sessionStorage.getItem("__ga4_last_ecom"); 1143 if (raw) { 1144 var parsed = JSON.parse(raw); 1145 if (parsed && parsed.items) { items = parsed.items; } 1146 } 1147 } catch (e) {} 1148 } 1149 if (!items.length) { return null; } 1150 for (var i = 0; i < items.length; i++) { 1151 items[i] = enrichFromCatalog(items[i]); 1152 } 1153 var value = getStoredCheckoutValue(); 1154 if (value == null) { value = computeItemsValue(items); } 1155 return { items: items, value: value }; 1156 } 1157 1158 function firePurchaseAtPaymentClick() { 1159 var base = buildEcomFromStoredCheckout(); 1160 if (!base) { 1161 log("firePurchaseAtPaymentClick: no items in session, abort"); 1162 return; 1163 } 1164 1165 var tpl = getOrderDataFromTemplate(); 1166 var txId = getOrderReference(); 1167 1168 try { 1169 var already = sessionStorage.getItem("__ga4_purchase_fired_tx"); 1170 if (already && already === txId) { 1171 log("firePurchaseAtPaymentClick: already fired for", txId); 1172 return; 1173 } 1174 } catch (e) {} 1175 1176 var ecom = { 1177 transaction_id: txId, 1178 currency: tpl ? tpl.currency : CURRENCY, 1179 value: (tpl && tpl.amountTotal != null) ? tpl.amountTotal : base.value, 1180 items: base.items 1181 }; 1182 if (tpl && tpl.amountTax != null) { ecom.tax = tpl.amountTax; } 1183 if (tpl && tpl.amountDelivery != null && tpl.amountDelivery > 0) { 1184 ecom.shipping = roundMoney(tpl.amountDelivery); 1185 } 1186 1187 var selectedPm = document.querySelector(".o_payment_option_card.border-primary, .o_payment_option_card.active, input[name='o_payment_option']:checked"); 1188 if (selectedPm) { 1189 var pmName = selectedPm.querySelector(".o_payment_option_name, span"); 1190 if (pmName) { ecom.payment_type = trim(safeText(pmName).split("\n")[0]); } 1191 } 1192 1193 dlPush("purchase", ecom); 1194 1195 var ec = buildEcFromTemplate() || readEcFromSession() || {}; 1196 if (window.__ec_user) { 1197 if (!ec.email && window.__ec_user.email) { ec.email = normalizeEmail(window.__ec_user.email); } 1198 if (!ec.phone && window.__ec_user.phone) { ec.phone = normalizePhone(window.__ec_user.phone); } 1199 } 1200 if (ec.email || ec.first_name || ec._is_company) { 1201 if (!window.dataLayer) { window.dataLayer = []; } 1202 window.dataLayer.push({ 1203 event: "purchase_enhanced", 1204 ecommerce: ecom, 1205 ec: ec, 1206 _src: "ga4_custom" 1207 }); 1208 log("purchase_enhanced (at click)", { ecommerce: ecom, ec: ec }); 1209 } 1210 1211 try { 1212 sessionStorage.setItem("__ga4_purchase_fired_tx", txId); 1213 sessionStorage.setItem("__ga4_purchase_fired_at", String(now())); 1214 } catch (e) {} 1215 } 1216 1217 function installPurchaseAtPaymentListener() { 1218 if (!isPath("/shop/payment")) { return; } 1219 1220 var selector = [ 1221 "button[name='o_payment_submit_button']", 1222 "button#o_payment_form_pay", 1223 "button.o_payment_submit_button", 1224 "#o_payment_form button[type='submit']", 1225 "button.btn-primary[type='submit']" 1226 ].join(", "); 1227 1228 document.addEventListener("click", function (ev) { 1229 if (!ev.target || !ev.target.closest) { return; } 1230 var btn = ev.target.closest(selector); 1231 if (!btn) { return; } 1232 firePurchaseAtPaymentClick(); 1233 }, true); 1234 } 1235 1236 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 1237 // 9. ENHANCED CONVERSIONS (EC) 1238 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 1239 1240 function normalizeEmail(v) { 1241 return v ? trim(String(v)).toLowerCase() : ""; 1242 } 1243 1244 function normalizePhone(v) { 1245 if (!v) { return ""; } 1246 return String(v).replace(/[\s\u00A0()\-\.]/g, ""); 1247 } 1248 1249 function countryToIso(name) { 1250 if (!name) { return ""; } 1251 var s = trim(name).toLowerCase(); 1252 var map = { 1253 "france":"FR","allemagne":"DE","germany":"DE","espagne":"ES","spain":"ES", 1254 "italie":"IT","italy":"IT","belgique":"BE","belgium":"BE","suisse":"CH", 1255 "switzerland":"CH","pays-bas":"NL","netherlands":"NL","portugal":"PT", 1256 "royaume-uni":"GB","united kingdom":"GB","luxembourg":"LU","autriche":"AT", 1257 "austria":"AT","irlande":"IE","ireland":"IE","états-unis":"US","united states":"US", 1258 "canada":"CA","maroc":"MA","morocco":"MA","tunisie":"TN","algérie":"DZ" 1259 }; 1260 if (map[s]) { return map[s]; } 1261 if (/^[a-z]{2}$/.test(s)) { return s.toUpperCase(); } 1262 return s; 1263 } 1264 1265 function splitName(full) { 1266 var out = { first_name: "", last_name: "" }; 1267 var s = trim(full); 1268 if (!s) { return out; } 1269 var commaIdx = s.indexOf(","); 1270 if (commaIdx > -1) { s = trim(s.substring(commaIdx + 1)); } 1271 if (!s) { return out; } 1272 var parts = s.split(" "); 1273 if (parts.length < 2) { out.first_name = s; return out; } 1274 out.first_name = parts[0]; 1275 out.last_name = parts.slice(1).join(" "); 1276 return out; 1277 } 1278 1279 function readEcFromSession() { 1280 try { 1281 var r = sessionStorage.getItem("__ec_payload"); 1282 return r ? JSON.parse(r) : null; 1283 } catch (e) { return null; } 1284 } 1285 1286 function readStoredEc() { 1287 try { 1288 var r = sessionStorage.getItem("__ec_payload_plain"); 1289 return r ? JSON.parse(r) : {}; 1290 } catch (e) { return {}; } 1291 } 1292 1293 function saveStoredEc(obj) { 1294 try { sessionStorage.setItem("__ec_payload_plain", JSON.stringify(obj)); } 1295 catch (e) {} 1296 } 1297 1298 function installAddressCollector() { 1299 if (!isPath("/shop/address")) { return; } 1300 var form = document.querySelector("form[action*='/shop/address']") || 1301 document.querySelector("form"); 1302 if (!form) { return; } 1303 1304 function collect() { 1305 var v = function (s) { 1306 var e = document.querySelector(s); 1307 return (e && e.value) ? trim(e.value) : ""; 1308 }; 1309 var fullName = v("input[name='name']"); 1310 var names = splitName(fullName); 1311 var countryText = ""; 1312 var sel = document.querySelector("select[name='country_id']"); 1313 if (sel && sel.selectedIndex >= 0 && sel.options[sel.selectedIndex]) { 1314 countryText = trim(sel.options[sel.selectedIndex].text); 1315 } 1316 var fresh = { 1317 email: v("input[name='email']"), 1318 phone: v("input[name='phone']"), 1319 first_name: names.first_name, 1320 last_name: names.last_name, 1321 street: v("input[name='street']"), 1322 street2: v("input[name='street2']"), 1323 postal_code: v("input[name='zip']"), 1324 city: v("input[name='city']"), 1325 country: countryToIso(countryText) 1326 }; 1327 var old = readStoredEc(); 1328 for (var k in fresh) { if (fresh[k]) { old[k] = fresh[k]; } } 1329 saveStoredEc(old); 1330 log("EC stored from /shop/address", old); 1331 } 1332 1333 form.addEventListener("submit", collect, true); 1334 form.addEventListener("change", collect, true); 1335 } 1336 1337 function fireEcOnCheckout() { 1338 if (!isPath("/shop/checkout")) { return; } 1339 var key = dedupeKey("ec_ready"); 1340 if (wasFired(key)) { return; } 1341 markFired(key); 1342 1343 var stored = readStoredEc(); 1344 1345 function pickCard(container) { 1346 if (!container) { return null; } 1347 return container.querySelector(".o_address_card.bg-400, .o_address_card.border-primary") || 1348 container.querySelector(".o_address_card"); 1349 } 1350 function parseCard(card) { 1351 var d = { name: "", street: "", phone: "" }; 1352 if (!card) { return d; } 1353 var ne = card.querySelector("span[itemprop='name']"); 1354 if (ne) { d.name = safeText(ne); } 1355 var se = card.querySelector("span[itemprop='streetAddress']"); 1356 if (se) { d.street = safeText(se); } 1357 var te = card.querySelector("[itemprop='telephone']"); 1358 if (te) { d.phone = normalizePhone(safeText(te)); } 1359 return d; 1360 } 1361 1362 var addrList = document.querySelector("[name='address_list'], #delivery_address_list"); 1363 var billList = document.querySelector("#billing_address_list"); 1364 var del = parseCard(pickCard(addrList)); 1365 var bill = parseCard(pickCard(billList)); 1366 1367 var name = del.name || bill.name; 1368 var street = del.street || bill.street; 1369 var phone = del.phone || bill.phone; 1370 var names = splitName(name); 1371 1372 var sp = { street: "", postal_code: "", city: "", country: "" }; 1373 if (street) { 1374 var parts = street.split(","); 1375 if (parts.length > 1) { 1376 sp.country = countryToIso(parts[parts.length - 1]); 1377 } 1378 var streetParts = []; 1379 for (var si = 0; si < parts.length - 1; si++) { 1380 var seg = trim(parts[si]); 1381 var pm = seg.match(/^([0-9]{4,6})\s+(.+)$/); 1382 if (pm) { 1383 sp.postal_code = pm[1]; 1384 sp.city = trim(pm[2]); 1385 } else if (seg) { 1386 streetParts.push(seg); 1387 } 1388 } 1389 sp.street = streetParts.join(" "); 1390 } 1391 1392 var emailEl = document.querySelector("input[type='email'], input[name='email']"); 1393 var email = emailEl ? normalizeEmail(emailEl.value) : ""; 1394 1395 if (!email && !stored.email) {
1396 try { 1397 var sessionInfo = (window.odoo && window.odoo.session_info) || {}; 1398 if (sessionInfo.partner_email) { email = normalizeEmail(sessionInfo.partner_email); } 1399 if (!email && sessionInfo.username && sessionInfo.username.indexOf("@") > -1) { 1400 email = normalizeEmail(sessionInfo.username); 1401 } 1402 } catch (e) {} 1403 } 1404 if (!phone && !stored.phone) { 1405 try { 1406 var si = (window.odoo && window.odoo.session_info) || {}; 1407 if (si.partner_phone) { phone = normalizePhone(si.partner_phone); } 1408 } catch (e) {} 1409 } 1410 1411 function pick(pv, sk) { return pv || stored[sk] || undefined; } 1412 1413 var ec = { 1414 email: pick(email, "email"), 1415 phone: pick(phone, "phone"), 1416 first_name: pick(names.first_name, "first_name"), 1417 last_name: pick(names.last_name, "last_name"), 1418 street: pick(sp.street, "street"), 1419 city: pick(sp.city, "city"), 1420 postal_code: pick(sp.postal_code, "postal_code"), 1421 country: pick(sp.country, "country") 1422 }; 1423 1424 if (!window.dataLayer) { window.dataLayer = []; } 1425 window.dataLayer.push({ event: "enhanced_conversions_ready", ec: ec }); 1426 log("enhanced_conversions_ready", ec); 1427 1428 try { sessionStorage.setItem("__ec_payload", JSON.stringify(ec)); } 1429 catch (e) {} 1430 } 1431 1432 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 1433 // INIT 1434 // âââââââââââââââââââââââââââââââââââââââââââââââââââââââ 1435 1436 function init() { 1437 log("v2.2.5 init", location.pathname); 1438 installCartObserver(); 1439 fireViewItemList(); 1440 installSelectItemListener(); 1441 fireViewItem(); 1442 fireBeginCheckout(); 1443 installPaymentPageListeners(); 1444 installPurchaseAtPaymentListener(); 1445 firePurchase(); 1446 installAddressCollector(); 1447 fireEcOnCheckout(); 1448 } 1449 1450 if (document.readyState === "loading") { 1451 document.addEventListener("DOMContentLoaded", init); 1452 } else { 1453 init(); 1454 } 1455})(); 1456</script>
1456 1457
1457<script type="text/javascript"> 1458 odoo.__session_info__ = {"is_admin": false, "is_system": false, "is_public": true, "is_internal_user": false, "is_website_user": true, "uid": null, "registry_hash": "e29bf94748c589927a32d9a7de8fda6b5ab3e9cc5c694ed65547e11b22d65001", "is_frontend": true, "profile_session": null, "profile_collectors": null, "profile_params": null, "show_effect": true, "currencies": {"125": {"name": "EUR", "symbol": "\u20ac", "position": "after", "digits": [69, 2]}}, "quick_login": true, "bundle_params": {"lang": "fr_FR", "website_id": 1}, "test_mode": false, "websocket_worker_version": "19.0-2", "translationURL": "/website/translations", "geoip_country_code": "US", "geoip_phone_code": 1, "lang_url_code": "fr", "turnstile_site_key": "0x4AAAAAAA5TyZEaozvLxqAs", "add_to_cart_action": "stay"}; 1459 if (!/(^|;\s)tz=/.test(document.cookie)) { 1460 const userTZ = Intl.DateTimeFormat().resolvedOptions().timeZone; 1461 document.cookie = `tz=${userTZ}; path=/`; 1462 } 1463 </script>
1463 1464
1464<script type="text/javascript" defer="defer" src="/web/assets/1/335ac23/web.assets_frontend_minimal.min.js" onerror="__odooAssetError=1"></script>
1464 1465
1465<script type="text/javascript" data-src="/web/assets/1/b46208f/web.assets_frontend_lazy.min.js" onerror="__odooAssetError=1"></script>
1465 1466 1467
1467<script id="plausible_script" name="plausible" defer="defer" data-domain="la-scourtinerie-1882.odoo.com" src="https://download.odoo.com/js/plausi_saas.js"></script>
1467 1468 1469
1469<script type="application/ld+json"> 1470{ 1471 "@context": "http://schema.org", 1472 "@type": "Organization", 1473 "name": "La Scourtinerie 1882", 1474 "logo": "https://www.scourtinerie.com/logo.png?company=1", 1475 "url": "https://www.scourtinerie.com" 1476} 1477 </script>
1477 1478 1479 1480 <meta name="google-site-verification" content="uBWt-tBBWXFl-3xtyAdYQEzTqoqNMvi-iDxZsGVkyEs" /> 1481<!-- Google Tag Manager -->
1482<script>!function(){"use strict";function l(e){for(var t=e,r=0,n=document.cookie.split(";");r<n.length;r++){var o=n[r].split("=");if(o[0].trim()===t)return o[1]}}function s(e){return localStorage.getItem(e)}function u(e){return window[e]}function A(e,t){e=document.querySelector(e);return t?null==e?void 0:e.getAttribute(t):null==e?void 0:e.textContent}var e=window,t=document,r="script",n="dataLayer",o="https://s.scourtinerie.com",a="https://load.s.scourtinerie.com",i="2oplowrph",c="ab5=ARRPMDshXSJdPktPKD0gSR5NQFleShQBVQMRGBoeBAYGFQAeCkITAAU%3D",g="cookie",v="_ga",E="",d=!1;try{var d=!!g&&(m=navigator.userAgent,!!(m=new RegExp("Version/([0-9._]+)(.*Mobile)?.*Safari.*").exec(m)))&&16.4<=parseFloat(m[1]),f="stapeUserId"===g,I=d&&!f?function(e,t,r){void 0===t&&(t="");var n={cookie:l,localStorage:s,jsVariable:u,cssSelector:A},t=Array.isArray(t)?t:[t];if(e&&n[e])for(var o=n[e],a=0,i=t;a<i.length;a++){var c=i[a],c=r?o(c,r):o(c);if(c)return c}else console.warn("invalid uid source",e)}(g,v,E):void 0;d=d&&(!!I||f)}catch(e){console.error(e)}var m=e,g=(m[n]=m[n]||[],m[n].push({"gtm.start":(new Date).getTime(),event:"gtm.js"}),t.getElementsByTagName(r)[0]),v=I?"&bi="+encodeURIComponent(I):"",E=t.createElement(r),f=(d&&(i=8<i.length?i.replace(/([a-z]{8}$)/,"kp$1"):"kp"+i),!d&&a?a:o);E.async=!0,E.src=f+"/"+i+".js?"+c+v,null!=(e=g.parentNode)&&e.insertBefore(E,g)}();</script>
1482 1483<!-- End Google Tag Manager --> 1484<!-- Meta verification --> 1485<meta name="facebook-domain-verification" content="nr3luo9p9zylsgrn4j9coand83ztgx" /> 1486<!-- End Meta verification --> 1487 </head> 1488 <body class="o_website_sale_checkout"> 1489 1490 1491 1492 1493 <div id="wrapwrap" class=" o_footer_effect_enable"> 1494 <a class="o_skip_to_content btn btn-primary rounded-0 visually-hidden-focusable position-absolute start-0" href="#wrap">Se rendre au contenu</a> 1495 <header id="top" data-anchor="true" data-name="Header" data-extra-items-toggle-aria-label="Bouton d'éléments supplémentaires" class=" o_header_standard o_hoverable_dropdown" style=" "> 1496 <nav data-name="Navbar" aria-label="Main" class="navbar navbar-expand-lg navbar-light o_colored_level o_cc d-none d-lg-block pt-3 shadow-sm "> 1497 1498 1499 <div id="o_main_nav" class="o_main_nav flex-wrap container"> 1500 <div class="o_header_hide_on_scroll d-grid align-items-center w-100 o_grid_header_3_cols pb-3"> 1501 <ul class="navbar-nav align-items-center gap-1"> 1502 1503 <li class=""> 1504 <div class="modal fade css_editable_mode_hidden" id="o_search_modal" aria-hidden="true" tabindex="-1"> 1505 <div class="modal-dialog modal-lg pt-5"> 1506 <div class="modal-content mt-5"> 1507 <form method="get" class="o_searchbar_form s_searchbar_input " action="/website/search" data-snippet="s_searchbar_input"> 1508 <div role="search" class="input-group input-group-lg"> 1509 <input type="search" name="search" class="search-query form-control oe_search_box border border-end-0 p-3 border-0 bg-light" placeholder="Rechercherâ¦" data-search-type="all" data-limit="5" data-display-image="true" data-display-description="true" data-display-extra-link="true" data-display-detail="true" data-order-by="name asc"/> 1510 <button type="submit" aria-label="Rechercher" title="Rechercher" class="btn oe_search_button border border-start-0 px-4 bg-o-color-4"> 1511 <i class="oi oi-search"></i> 1512 </button> 1513 </div> 1514 1515 <input name="order" type="hidden" class="o_search_order_by oe_unremovable" value="name asc"/> 1516 1517 </form> 1518 </div> 1519 </div> 1520 </div> 1521 <a data-bs-target="#o_search_modal" data-bs-toggle="modal" role="button" title="Rechercher" href="#" class="btn rounded-circle p-1 lh-1 o_navlink_background text-reset o_not_editable"> 1522 <i class="oi oi-search fa-stack lh-lg"></i> 1523 </a> 1524 </li> 1525 1526 <li class=""> 1527 <div class="o_header_social_links "> 1528 <div class="s_social_media o_not_editable oe_unmovable oe_unremovable no_icon_color text-center" data-snippet="s_social_media" data-name="Social Media"> 1529 <h5 class="s_social_media_title d-none">Suivez-nous</h5> 1530<a href="/website/social/instagram" class="s_social_media_instagram o_nav-link_secondary nav-link m-0 p-0 text-decoration-none" target="_blank" aria-label="Instagram"> 1531 <i class="fa fa-instagram p-1 o_editable_media text-o-color-3 ms-auto float-end fa-stack" style="padding: 1px !important; background-color: rgba(255, 0, 0, 0);"></i> 1532 </a> 1533<a href="/website/social/facebook" class="s_social_media_facebook o_nav-link_secondary nav-link m-0 p-0 text-decoration-none" target="_blank" aria-label="Facebook"> 1534 <i class="fa fa-facebook p-1 o_editable_media text-o-color-3 fa-stack" style="background-color: rgba(255, 0, 0, 0);"></i> 1535 </a> 1536</div> 1537 </div> 1538 </li> 1539 1540 <li class=""> 1541 <div data-name="Text" class="s_text_block "> 1542 <a href="/cdn-cgi/l/email-protection#47252832332e363222073424283235332e2922352e226924282a" class="nav-link o_nav-link_secondary p-2" target="_blank"> 1543 <i class="fa fa-envelope-o fa-fw me-1 fa-1x text-o-color-3"></i></a> 1544 </div> 1545 </li> 1546 </ul> 1547 1548 <a data-name="Navbar Logo" href="/" class="navbar-brand logo mx-auto mw-100"> 1549
1550 <span role="img" aria-label="Logo of La Scourtinerie 1882" title="La Scourtinerie 1882"><img src="/web/image/website/1/logo/La%20Scourtinerie%201882?unique=91c2855" class="img img-fluid" width="95" height="40" alt="La Scourtinerie 1882" loading="lazy"/></span> 1551 </a> 1552 1553 <ul class="navbar-nav align-items-center gap-1 flex-wrap justify-content-end ms-auto"> 1554 1555 <li class=" divider d-none"></li> 1556 <li class="o_wsale_my_cart "> 1557 <a href="/shop/cart" aria-label="Panier eCommerce" class="o_navlink_background btn position-relative rounded-circle p-1 text-reset"> 1558 <div class=""> 1559 <i class="fa fa-shopping-cart fa-stack"></i> 1560 <sup class="my_cart_quantity badge bg-primary position-absolute top-0 end-0 mt-n1 me-n1 rounded-pill d-none">0</sup> 1561 </div> 1562 </a> 1563 </li> 1564 1565 1566 <li data-name="Language Selector" class="o_header_language_selector "> 1567 <div class="js_language_selector dropdown d-print-none small o_prevent_link_editor"> 1568 <div role="menu" class="dropdown-menu-end list-inline"> 1569 <a class="js_change_lang list-inline-item" role="menuitem" href="/en/shop/cart" data-url_code="en" title="English (UK)"> 1570 <img class="o_lang_flag m-2" src="/base/static/img/country_flags/gb.png?height=25" alt="" loading="lazy"/> 1571 </a> 1572 <a class="js_change_lang active list-inline-item" role="menuitem" href="/shop/cart" data-url_code="fr" title=" Français"> 1573 <img class="o_lang_flag m-2" src="/base/static/img/country_flags/fr.png?height=25" alt="" loading="lazy"/> 1574 </a> 1575 </div> 1576 </div> 1577 </li> 1578 1579 </ul> 1580 <a class="logo-navbar-scroll" href="/"> 1581 <img class="img-fluid" style="height: 80px;" src="/web/image/website/1/logo" alt="Logo of La Scourtinerie 1882" loading="lazy"/> 1582 </a> 1583 </div> 1584 <div class="d-flex w-100 justify-content-center"> 1585 1586 1587 <ul role="menu" id="top_menu" class="nav navbar-nav top_menu o_menu_loading pb-0 "> 1588 1589 1590 1591 <li role="presentation" class="nav-item dropdown"> 1592 <a href="#" data-bs-toggle="dropdown" data-bs-auto-close="outside" role="menuitem" class="dropdown-toggle nav-link "> 1593 <span>Nos produits</span> 1594 </a> 1595 1596 1597 <ul role="menu" class="dropdown-menu "> 1598 1599 <li role="presentation" class=" "> 1600 <a role="menuitem" href="/scourtins-de-provence" class="dropdown-item "> 1601 <span>Scourtins décoratifs </span> 1602 </a> 1603 </li> 1604 1605 <li role="presentation" class=" "> 1606 <a role="menuitem" href="/ombriere-nyons" class="dropdown-item "> 1607 <span>Ombrières de Provence</span> 1608 </a> 1609 </li> 1610 1611 <li role="presentation" class=" "> 1612 <a role="menuitem" href="https://www.scourtinerie.com/produits-regionaux" class="dropdown-item "> 1613 <span>Produits régionaux</span> 1614 </a> 1615 </li> 1616 1617 <li role="presentation" class=" "> 1618 <a role="menuitem" href="/shop/category/matelas-et-coussins-3" class="dropdown-item "> 1619 <span>Nos Matelas</span> 1620 </a> 1621 </li> 1622 1623 <li role="presentation" class=" "> 1624 <a role="menuitem" href="/artisanat-indien" class="dropdown-item "> 1625 <span>Artisanat Indien</span> 1626 </a> 1627 </li> 1628 1629 <li role="presentation" class=" "> 1630 <a role="menuitem" href="/poteries-not" class="dropdown-item "> 1631 <span>Poteries Not</span> 1632 </a> 1633 </li> 1634 1635 <li role="presentation" class=" "> 1636 <a role="menuitem" href="/le-vrac" class="dropdown-item "> 1637 <span>Vrac</span> 1638 </a> 1639 </li> 1640 1641 <li role="presentation" class=" "> 1642 <a role="menuitem" href="/les-cosmetiques" class="dropdown-item "> 1643 <span>Cosmétiques</span> 1644 </a> 1645 </li> 1646 1647 <li role="presentation" class=" "> 1648 <a role="menuitem" href="/scourtins-filtres" class="dropdown-item ">
1649 <span>Scourtin Filtres</span> 1650 </a> 1651 </li> 1652 1653 <li role="presentation" class=" "> 1654 <a role="menuitem" href="/piqueuse" class="dropdown-item "> 1655 <span>Piqueuse à olives</span> 1656 </a> 1657 </li> 1658 </ul> 1659 1660 </li> 1661 1662 <li role="presentation" class="nav-item "> 1663 <a role="menuitem" href="/shop" class="nav-link "> 1664 <span>Boutique en ligne</span> 1665 </a> 1666 </li> 1667 1668 <li role="presentation" class="nav-item dropdown"> 1669 <a href="#" data-bs-toggle="dropdown" data-bs-auto-close="outside" role="menuitem" class="dropdown-toggle nav-link "> 1670 <span>La Scourtinerie</span> 1671 </a> 1672 1673 1674 <ul role="menu" class="dropdown-menu "> 1675 1676 <li role="presentation" class=" "> 1677 <a role="menuitem" href="/nous-rendre-visite" class="dropdown-item "> 1678 <span>Nous rendre visite</span> 1679 </a> 1680 </li> 1681 1682 <li role="presentation" class=" "> 1683 <a role="menuitem" href="/musee-du-scourtin" class="dropdown-item "> 1684 <span>Musée du Scourtin</span> 1685 </a> 1686 </li> 1687 1688 <li role="presentation" class=" "> 1689 <a role="menuitem" href="/shop" class="dropdown-item "> 1690 <span>Boutique en ligne</span> 1691 </a> 1692 </li> 1693 1694 <li role="presentation" class=" "> 1695 <a role="menuitem" href="/boutique-de-nyons" class="dropdown-item "> 1696 <span>Boutique de Nyons</span> 1697 </a> 1698 </li> 1699 1700 <li role="presentation" class=" "> 1701 <a role="menuitem" href="/savoir-faire" class="dropdown-item "> 1702 <span>Savoir Faire</span> 1703 </a> 1704 </li> 1705 1706 <li role="presentation" class=" "> 1707 <a role="menuitem" href="/histoire" class="dropdown-item "> 1708 <span>Histoire</span> 1709 </a> 1710 </li> 1711 </ul> 1712 1713 </li> 1714 1715 <li role="presentation" class="nav-item "> 1716 <a role="menuitem" href="/ombrieres-de-provence" class="nav-link "> 1717 <span>Les Ombrières de Provence</span> 1718 </a> 1719 </li> 1720 1721 <li role="presentation" class="nav-item "> 1722 <a role="menuitem" href="/contact" class="nav-link "> 1723 <span>Contact</span> 1724 </a> 1725 </li> 1726 1727 <li role="presentation" class="nav-item "> 1728 <a role="menuitem" href="/blog" class="nav-link "> 1729 <span>Blog</span> 1730 </a> 1731 </li> 1732 1733 </ul> 1734 1735 </div> 1736 </div> 1737 1738 </nav> 1739 1740 <nav data-name="Navbar" aria-label="Mobile" class="navbar navbar-light o_colored_level o_cc o_header_mobile d-block d-lg-none shadow-sm "> 1741 1742 1743 <div class="o_main_nav container flex-wrap justify-content-between"> 1744 <div class="d-flex flex-grow-1"> 1745 1746 <a data-name="Navbar Logo" href="/" class="navbar-brand logo "> 1747 1748 <span role="img" aria-label="Logo of La Scourtinerie 1882" title="La Scourtinerie 1882"><img src="/web/image/website/1/logo/La%20Scourtinerie%201882?unique=91c2855" class="img img-fluid" width="95" height="40" alt="La Scourtinerie 1882" loading="lazy"/></span> 1749 </a> 1750 1751 <ul class="o_header_mobile_buttons_wrap navbar-nav d-flex flex-row align-items-center gap-2 mb-0 ms-auto"> 1752 <li class=" divider d-none"></li> 1753 <li class="o_wsale_my_cart "> 1754 <a href="/shop/cart" aria-label="Panier eCommerce" class="o_navlink_background_hover btn position-relative rounded-circle border-0 p-1 text-reset"> 1755 <div class=""> 1756 <i class="fa fa-shopping-cart fa-stack"></i> 1757 <sup class="my_cart_quantity badge bg-primary position-absolute top-0 end-0 mt-n1 me-n1 rounded-pill d-none">0</sup> 1758 </div> 1759 </a> 1760 </li></ul> 1761 </div> 1762 <button class="nav-link btn p-2 o_not_editable" type="button" data-bs-toggle="offcanvas" data-bs-target="#top_menu_collapse_mobile" aria-controls="top_menu_collapse_mobile" aria-expanded="false" aria-label="Basculer la navigation"> 1763 <span class="navbar-toggler-icon"></span> 1764 </button> 1765 <div id="top_menu_collapse_mobile" class="offcanvas offcanvas-end o_navbar_mobile"> 1766 <div class="offcanvas-header justify-content-end o_not_editable"> 1767 <button type="button" class="nav-link btn-close" data-bs-dismiss="offcanvas" aria-label="Fermer"></button> 1768 </div> 1769 <div class="offcanvas-body d-flex flex-column justify-content-between h-100 w-100 pt-0"> 1770 <ul class="navbar-nav"> 1771 1772 <li class=""> 1773 <form method="get" class="o_searchbar_form s_searchbar_input " action="/website/search" data-snippet="s_searchbar_input"> 1774 <div role="search" class="input-group mb-3"> 1775 <input type="search" name="search" class="search-query form-control oe_search_box rounded-start-pill text-bg-light ps-3 border-0 bg-light" placeholder="Rechercherâ¦" data-search-type="all" data-limit="0" data-display-image="true" data-display-description="true" data-display-extra-link="true" data-display-detail="true" data-order-by="name asc"/> 1776 <button type="submit" aria-label="Rechercher" title="Rechercher" class="btn oe_search_button rounded-end-pill bg-o-color-3 pe-3"> 1777 <i class="oi oi-search"></i> 1778 </button> 1779 </div> 1780 1781 <input name="order" type="hidden" class="o_search_order_by oe_unremovable" value="name asc"/> 1782 1783 </form> 1784 </li> 1785 1786 <li> 1787 <ul role="menu" class="nav navbar-nav top_menu o_mega_menu_is_offcanvas mx-n3 text-center "> 1788 1789 1790 1791 <li role="presentation" class="nav-item border-top accordion accordion-flush"> 1792 1793 1794 <div class="accordion-item"> 1795 <a href="#" data-bs-toggle="collapse" aria-expanded="false" class="nav-link p-3 text-wrap accordion-button collapsed" data-bs-target=".o_accordion_target_52" aria-controls="o_accordion_target_52">
1796 <span>Nos produits</span> 1797 </a> 1798 <div class="o_accordion_target_52 accordion-collapse collapse" aria-labelledby="o_accordion_target_52" data-bs-parent="#top_menu_collapse_mobile"> 1799 <ul class="show list-group list-unstyled py-0" role="menu"> 1800 1801 <li role="presentation" class=" px-0"> 1802 <a role="menuitem" href="/scourtins-de-provence" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1803 <span>Scourtins décoratifs </span> 1804 </a> 1805 </li> 1806 1807 <li role="presentation" class=" px-0"> 1808 <a role="menuitem" href="/ombriere-nyons" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1809 <span>Ombrières de Provence</span> 1810 </a> 1811 </li> 1812 1813 <li role="presentation" class=" px-0"> 1814 <a role="menuitem" href="https://www.scourtinerie.com/produits-regionaux" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1815 <span>Produits régionaux</span> 1816 </a> 1817 </li> 1818 1819 <li role="presentation" class=" px-0"> 1820 <a role="menuitem" href="/shop/category/matelas-et-coussins-3" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1821 <span>Nos Matelas</span> 1822 </a> 1823 </li> 1824 1825 <li role="presentation" class=" px-0"> 1826 <a role="menuitem" href="/artisanat-indien" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1827 <span>Artisanat Indien</span> 1828 </a> 1829 </li> 1830 1831 <li role="presentation" class=" px-0"> 1832 <a role="menuitem" href="/poteries-not" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1833 <span>Poteries Not</span> 1834 </a> 1835 </li> 1836 1837 <li role="presentation" class=" px-0"> 1838 <a role="menuitem" href="/le-vrac" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1839 <span>Vrac</span> 1840 </a> 1841 </li> 1842 1843 <li role="presentation" class=" px-0"> 1844 <a role="menuitem" href="/les-cosmetiques" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1845 <span>Cosmétiques</span> 1846 </a> 1847 </li> 1848 1849 <li role="presentation" class=" px-0"> 1850 <a role="menuitem" href="/scourtins-filtres" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1851 <span>Scourtin Filtres</span> 1852 </a> 1853 </li> 1854 1855 <li role="presentation" class=" px-0"> 1856 <a role="menuitem" href="/piqueuse" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1857 <span>Piqueuse à olives</span> 1858 </a> 1859 </li> 1860 </ul> 1861 </div> 1862 </div> 1863 1864 </li> 1865 1866 <li role="presentation" class="nav-item border-top px-0"> 1867 <a role="menuitem" href="/shop" class="nav-link p-3 text-wrap "> 1868 <span>Boutique en ligne</span> 1869 </a> 1870 </li> 1871 1872 <li role="presentation" class="nav-item border-top accordion accordion-flush"> 1873 1874 1875 <div class="accordion-item"> 1876 <a href="#" data-bs-toggle="collapse" aria-expanded="false" class="nav-link p-3 text-wrap accordion-button collapsed" data-bs-target=".o_accordion_target_62" aria-controls="o_accordion_target_62"> 1877 <span>La Scourtinerie</span> 1878 </a> 1879 <div class="o_accordion_target_62 accordion-collapse collapse" aria-labelledby="o_accordion_target_62" data-bs-parent="#top_menu_collapse_mobile"> 1880 <ul class="show list-group list-unstyled py-0" role="menu"> 1881 1882 <li role="presentation" class=" px-0"> 1883 <a role="menuitem" href="/nous-rendre-visite" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1884 <span>Nous rendre visite</span> 1885 </a> 1886 </li> 1887 1888 <li role="presentation" class=" px-0"> 1889 <a role="menuitem" href="/musee-du-scourtin" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap ">
1890 <span>Musée du Scourtin</span> 1891 </a> 1892 </li> 1893 1894 <li role="presentation" class=" px-0"> 1895 <a role="menuitem" href="/shop" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1896 <span>Boutique en ligne</span> 1897 </a> 1898 </li> 1899 1900 <li role="presentation" class=" px-0"> 1901 <a role="menuitem" href="/boutique-de-nyons" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1902 <span>Boutique de Nyons</span> 1903 </a> 1904 </li> 1905 1906 <li role="presentation" class=" px-0"> 1907 <a role="menuitem" href="/savoir-faire" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1908 <span>Savoir Faire</span> 1909 </a> 1910 </li> 1911 1912 <li role="presentation" class=" px-0"> 1913 <a role="menuitem" href="/histoire" class="nav-link list-group-item list-group-item-action border-0 rounded-0 px-4 text-wrap "> 1914 <span>Histoire</span> 1915 </a> 1916 </li> 1917 </ul> 1918 </div> 1919 </div> 1920 1921 </li> 1922 1923 <li role="presentation" class="nav-item border-top px-0"> 1924 <a role="menuitem" href="/ombrieres-de-provence" class="nav-link p-3 text-wrap "> 1925 <span>Les Ombrières de Provence</span> 1926 </a> 1927 </li> 1928 1929 <li role="presentation" class="nav-item border-top px-0"> 1930 <a role="menuitem" href="/contact" class="nav-link p-3 text-wrap "> 1931 <span>Contact</span> 1932 </a> 1933 </li> 1934 1935 <li role="presentation" class="nav-item border-top border-bottom px-0"> 1936 <a role="menuitem" href="/blog" class="nav-link p-3 text-wrap "> 1937 <span>Blog</span> 1938 </a> 1939 </li> 1940 1941 </ul> 1942 </li> 1943 1944 <li class=""> 1945 <div data-name="Text" class="s_text_block mt-2 text-center"> 1946 <a href="/cdn-cgi/l/email-protection#cba9a4bebfa2babeae8bb8a8a4beb9bfa2a5aeb9a2aee5a8a4a6" class="nav-link o_nav-link_secondary p-2" target="_blank"> 1947 <i class="fa fa-envelope-o fa-fw me-1 fa-1x text-o-color-3"></i></a> 1948 </div> 1949 </li> 1950 1951 <li class=""> 1952 <div class="o_header_social_links mt-2 text-center"> 1953 <div class="s_social_media o_not_editable oe_unmovable oe_unremovable no_icon_color text-center" data-snippet="s_social_media" data-name="Social Media"> 1954 <h5 class="s_social_media_title d-none">Suivez-nous</h5> 1955<a href="/website/social/instagram" class="s_social_media_instagram o_nav-link_secondary nav-link m-0 p-0 text-decoration-none" target="_blank" aria-label="Instagram"> 1956 <i class="fa fa-instagram p-1 o_editable_media text-o-color-3 ms-auto float-end fa-stack" style="padding: 1px !important; background-color: rgba(255, 0, 0, 0);"></i> 1957 </a> 1958<a href="/website/social/facebook" class="s_social_media_facebook o_nav-link_secondary nav-link m-0 p-0 text-decoration-none" target="_blank" aria-label="Facebook"> 1959 <i class="fa fa-facebook p-1 o_editable_media text-o-color-3 fa-stack" style="background-color: rgba(255, 0, 0, 0);"></i> 1960 </a> 1961</div> 1962 </div> 1963 </li> 1964 </ul> 1965 <ul class="navbar-nav gap-2 mt-3 w-100"> 1966 1967 <li data-name="Language Selector" class="o_header_language_selector "> 1968 <div class="js_language_selector dropup dropdown d-print-none small o_prevent_link_editor"> 1969 <div role="menu" class="w-100 list-inline"> 1970 <a class="js_change_lang list-inline-item" role="menuitem" href="/en/shop/cart" data-url_code="en" title="English (UK)"> 1971 <img class="o_lang_flag me-2" src="/base/static/img/country_flags/gb.png?height=25" alt="" loading="lazy"/> 1972 </a> 1973 <a class="js_change_lang active list-inline-item" role="menuitem" href="/shop/cart" data-url_code="fr" title=" Français"> 1974 <img class="o_lang_flag me-2" src="/base/static/img/country_flags/fr.png?height=25" alt="" loading="lazy"/> 1975 </a> 1976 </div> 1977 </div> 1978 </li> 1979 1980 1981 1982 </ul> 1983 </div> 1984 </div> 1985 </div> 1986 1987 </nav> 1988 </header> 1989 <main> 1990 1991 <div id="wrap" class="d-flex flex-column flex-grow-1"> 1992 <div class="oe_website_sale o_website_sale_checkout_container container d-flex flex-column flex-grow-1 py-lg-2"> 1993 <div class="row mb32"> 1994 <div class="col-12"> 1995 1996 <div class="o_wizard d-flex flex-wrap row-gap-2 my-3 small">
1997 <span class=" d-flex no-decoration"> 1998 <div name="step_name" class="d-flex align-items-center fw-bold"> 1999 <p class="text-center mb-0"> 2000 <span>Commande</span> 2001 </p> 2002 <span class="fa fa-angle-right d-inline-block align-middle mx-3 text-muted fs-5"></span> 2003 </div> 2004 </span> 2005 <span class="o_disabled d-flex no-decoration"> 2006 <div name="step_name" class="d-flex align-items-center text-muted"> 2007 <p class="text-center mb-0"> 2008 <span>Adresse</span> 2009 </p> 2010 <span class="fa fa-angle-right d-inline-block align-middle mx-3 text-muted fs-5"></span> 2011 </div> 2012 </span> 2013 <span class="o_disabled d-flex no-decoration"> 2014 <div name="step_name" class="d-flex align-items-center text-muted"> 2015 <p class="text-center mb-0"> 2016 <span>Paiement</span> 2017 </p> 2018 </div> 2019 </span> 2020 </div> 2021 </div> 2022 2023 <div class="oe_clear_stucture oe_cart col-12 "> 2024 2025 <div id="shop_cart" class="col"> 2026 <div class="d-flex align-items-center mb-3"> 2027 <h4 class="mb-0">Résumé de la commande</h4> 2028 <div class="ms-3 border-start ps-2"> 2029 <span title=" 2030 Se connecter pour recommander 2031 "> 2032 <button id="quick_reorder_button" type="button" class="btn btn-sm btn-link" data-bs-toggle="offcanvas" data-bs-target="#quick_reorder_sidebar" aria-controls="quick_reorder_sidebar" disabled="True"> 2033 <i class="fa fa-rotate-left me-2"></i>Commander à nouveau rapidement 2034 </button> 2035 </span> 2036 <div id="quick_reorder_sidebar" class="offcanvas offcanvas-end" aria-labelledby="quick_reorder_sidebar"> 2037 <div class="offcanvas-header"> 2038 <h5 class="offcanvas-title">Recommander rapidement</h5> 2039 <button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Fermer"></button> 2040 </div> 2041 <div class="offcanvas-body"> 2042 2043 </div> 2044 </div></div> 2045 </div> 2046 <div class="js_cart_lines w-100"> 2047 <div class="mt-5 mb-3"> 2048 <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100" viewBox="0 0 100 92" fill="none"> 2049 <style> 2050 .heartBeat { 2051 animation: heartBeat 1.3s ease-in-out forwards; 2052 animation-delay: 0.75s; 2053 transform-origin: 80.5px 28.5px; 2054 } 2055 .tilt { 2056 animation: tilt 1s ease forwards; 2057 animation-delay: 0.75s; 2058 transform-origin: bottom left; 2059 } 2060 @keyframes heartBeat { 2061 0% { 2062 transform: scale(1); 2063 } 2064 2065 14% { 2066 transform: scale(1.2); 2067 } 2068 2069 28% { 2070 transform: scale(1); 2071 } 2072 2073 42% { 2074 transform: scale(1.2); 2075 } 2076 2077 70% { 2078 transform: scale(1); 2079 } 2080 } 2081 @keyframes tilt { 2082 0% { 2083 transform: rotate(0deg); 2084 } 2085 50% { 2086 transform: rotate(-7deg); 2087 } 2088 100% { 2089 transform: rotate(0deg); 2090 } 2091 } 2092 </style> 2093 <path class="tilt" d="M40.3846 71.8461C40.3846 73.2211 39.8822 74.411 38.8774 75.4158C37.8726 76.4207 36.6827 76.9231 35.3077 76.9231C33.9327 76.9231 32.7428 76.4207 31.738 75.4158C30.7332 74.411 30.2308 73.2211 30.2308 71.8461C30.2308 70.4711 30.7332 69.2812 31.738 68.2764C32.7428 67.2716 33.9327 66.7692 35.3077 66.7692C36.6827 66.7692 37.8726 67.2716 38.8774 68.2764C39.8822 69.2812 40.3846 70.4711 40.3846 71.8461ZM75.9231 71.8461C75.9231 73.2211 75.4207 74.411 74.4159 75.4158C73.4111 76.4207 72.2212 76.9231 70.8462 76.9231C69.4712 76.9231 68.2812 76.4207 67.2764 75.4158C66.2716 74.411 65.7692 73.2211 65.7692 71.8461C65.7692 70.4711 66.2716 69.2812 67.2764 68.2764C68.2812 67.2716 69.4712 66.7692 70.8462 66.7692C72.2212 66.7692 73.4111 67.2716 74.4159 68.2764C75.4207 69.2812 75.9231 70.4711 75.9231 71.8461ZM81 28.6923V49C81 49.6346 80.7818 50.1965 80.3456 50.6857C79.9093 51.1749 79.3738 51.4591 78.7392 51.5384L37.3305 56.3774C37.6743 57.9639 37.8462 58.8894 37.8462 59.1538C37.8462 59.5769 37.5288 60.4231 36.8942 61.6923H73.3846C74.0721 61.6923 74.6671 61.9435 75.1695 62.4459C75.6719 62.9483 75.9231 63.5432 75.9231 64.2307C75.9231 64.9182 75.6719 65.5132 75.1695 66.0156C74.6671 66.518 74.0721 66.7692 73.3846 66.7692H32.7692C32.0817 66.7692 31.4868 66.518 30.9844 66.0156C30.482 65.5132 30.2308 64.9182 30.2308 64.2307C30.2308 63.9399 30.3365 63.5234 30.5481 62.9813C30.7596 62.4393 30.9712 61.9633 31.1827 61.5535C31.3942 61.1436 31.6785 60.6148 32.0355 59.9669C32.3924 59.3191 32.5974 58.9291 32.6502 58.7969L25.6298 26.1538H17.5385C16.851 26.1538 16.256 25.9026 15.7536 25.4002C15.2512 24.8978 15 24.3029 15 23.6154C15 22.9279 15.2512 22.3329 15.7536 21.8305C16.256 21.3281 16.851 21.0769 17.5385 21.0769H27.6923C28.1154 21.0769 28.4922 21.1628 28.8227 21.3347C29.1532 21.5066 29.4111 21.7115 29.5962 21.9495C29.7812 22.1875 29.9531 22.5114 30.1118 22.9213C30.2704 23.3311 30.3762 23.6749 30.4291 23.9525C30.482 24.2301 30.5547 24.6202 30.6472 25.1226C30.7398 25.625 30.7993 25.9687 30.8257 26.1538H78.4615C79.149 26.1538 79.744 26.405 80.2464 26.9074C80.7488 27.4098 81 28.0048 81 28.6923Z" fill="currentColor"></path> 2094 <circle class="heartBeat" cx="80.5" cy="28.5" r="11.5" fill="var(--o-color-1, #D9D9D9)" stroke="var(--body-bg, #F5F5F5)" stroke-width="3"></circle> 2095 <path class="heartBeat" d="M81.0014 33.1662C80.2997 33.1662 79.6974 32.9886 79.1946 32.6335C78.6946 32.2756 78.3097 31.7599 78.0398 31.0866C77.7727 30.4105 77.6392 29.5966 77.6392 28.6449C77.642 27.6932 77.777 26.8835 78.044 26.2159C78.3139 25.5455 78.6989 25.0341 79.1989 24.6818C79.7017 24.3295 80.3026 24.1534 81.0014 24.1534C81.7003 24.1534 82.3011 24.3295 82.804 24.6818C83.3068 25.0341 83.6918 25.5455 83.9588 26.2159C84.2287 26.8864 84.3636 27.696 84.3636 28.6449C84.3636 29.5994 84.2287 30.4148 83.9588 31.0909C83.6918 31.7642 83.3068 32.2784 82.804 32.6335C82.304 32.9886 81.7031 33.1662 81.0014 33.1662ZM81.0014 31.8324C81.5469 31.8324 81.9773 31.5639 82.2926 31.027C82.6108 30.4872 82.7699 29.6932 82.7699 28.6449C82.7699 27.9517 82.6974 27.3693 82.5526 26.8977C82.4077 26.4261 82.2031 26.071 81.9389 25.8324C81.6747 25.5909 81.3622 25.4702 81.0014 25.4702C80.4588 25.4702 80.0298 25.7401 79.7145 26.2798C79.3991 26.8168 79.2401 27.6051 79.2372 28.6449C79.2344 29.3409 79.304 29.9261 79.446 3
20950.4006C79.5909 30.875 79.7955 31.233 80.0597 31.4744C80.3239 31.7131 80.6378 31.8324 81.0014 31.8324Z" fill="var(--o-color-3, #000)"></path> 2096 </svg></div> 2097 <h5 class="mb-3" style="text-align: center;"> 2098 Votre panier est vide ! 2099 </h5> 2100 <p style="text-align: center;"> 2101 <a href="/shop" class="btn btn-primary"> 2102 Boutique 2103 </a> 2104 </p> 2105 </div> 2106 <div class="clearfix"></div> 2107 <div class="oe_structure" id="oe_structure_website_sale_cart_1"><section class="s_text_block o_colored_level pt0 pb0" data-snippet="s_text_block" data-name="Texte"> 2108 <div class="container s_allow_columns"> 2109 <p><span class="h5-fs"><strong>Livraison offerte dès 59 ⬠dâachat.</strong></span></p> 2110 </div> 2111 </section></div></div> 2112 2113 </div> 2114 2115 2116 <div class="o_wsale_shorter_cart_summary offset-xxl-1 col-lg-5 col-xxl-4"> 2117 2118 </div> 2119 2120 </div> 2121 2122 </div> 2123 2124 2125 2126 <div class="oe_structure" id="oe_structure_website_sale_cart_2"></div> 2127 2128 </div> 2129 2130 <div id="o_shared_blocks" class="oe_unremovable"></div> 2131 </main> 2132 <footer id="bottom" data-anchor="true" data-name="Footer" class="o_footer o_colored_level o_cc o_footer_slideout"> 2133 <div id="footer" class="oe_structure oe_structure_solo"> 2134 <section class="s_text_block pt0 pb32" data-snippet="s_text_block" data-name="Text" style="position: relative;" id="Infos-pratiques" data-anchor="true"> 2135 <div class="container"> 2136 <div class="row o_grid_mode" data-row-count="14"> 2137 2138 2139 2140 <div class="o_grid_item g-col-lg-4 o_colored_level col-lg-4 g-height-2" style="z-index: 5; grid-area: 1 / 1 / 3 / 5;"><h1 style="text-align: left;">I<span class="h2-fs">nfos pratiques</span></h1></div><div class="o_grid_item o_colored_level g-col-lg-5 g-height-7 col-lg-5" style="z-index: 6; grid-area: 3 / 1 / 10 / 6;"><h3><span class="h3-fs"><strong>Horaires d'ouverture</strong></span></h3><p><font class="text-900">â</font><font class="text-o-color-4">Du lundi au samedi.</font></p><p><font class="text-o-color-4"><strong>Avril à Septembre<span style="width: 26.9px; tab-size: 32.9375px;" class="oe-tabs"> </span>â<span style="width: 40px; tab-size: 40px;" class="oe-tabs"> </span></strong>9h-12h30 / 14h-18h30</font></p><p><font class="text-o-color-4"><strong>Octobre à Mars<span class="oe-tabs" style="width: 8px; tab-size: 14.0312px;"> </span>â<span class="oe-tabs" style="width: 40px; tab-size: 40px;"> </span>â</strong>9h-12h30 / 14h-18h</font></p><p><strong><font class="text-o-color-4">â</font></strong><br/></p><p><a class="btn btn-primary" href="https://s67ln.mjt.lu/wgt/s67ln/xjy8/form?c=1b16164a"><strong><span class="h5-fs">S'abonner à notre Newsletter</span></strong></a><br/></p></div><div class="o_grid_item o_colored_level g-col-lg-4 g-height-1 col-lg-4" style="z-index: 7; grid-area: 3 / 7 / 4 / 11;"><h3><span class="h3-fs"><strong>Coordonnées</strong></span><br/></h3><p style="margin-bottom: 0px;"><font class="text-o-color-4">Boutique / Atelier / Musée :</font></p><p style="margin-bottom: 0px;"><font class="text-o-color-4">â</font><br/></p><p style="margin-bottom: 0px;"><font class="text-o-color-4">36, rue de la Maladrerie </font></p><p><font class="text-o-color-4">26110 NYONS</font></p><p style="margin-bottom: 0px;"><font class="text-o-color-4"><strong>TÃL</strong> : </font><a href="tel://+33475260652"><font style="color: rgb(255, 239, 198);">+33 475 26 06 52<br/><font class="text-o-color-4"><strong>TÃL</strong> : </font></font></a><font style="color: rgb(255, 239, 198);"><a href="tel://+33475260652" class="o_translate_inline">+33 675 168 209</a></font></p><p style="margin-bottom: 0px;"><font class="text-o-color-4"><strong>E-MAIL</strong> : </font><a href="/cdn-cgi/l/email-protection#13717c66677a6266765360707c6661677a7d76617a763d707c7e"><font style="color: rgb(255, 239, 198);"><span class="__cf_email__" data-cfemail="54363b21203d2521311427373b2126203d3a31263d317a373b39">[email protected]</span></font></a></p><div class="s_hr pt32 pb32 d-lg-none o_snippet_desktop_invisible" data-snippet="s_hr" data-name="Séparateur" data-invisible="1"> 2141 <hr class="w-100 mx-auto"/> 2142 </div></div><div class="o_colored_level o_grid_item g-height-2 g-col-lg-4 col-lg-4 d-lg-none o_snippet_desktop_invisible col-12" style="--grid-item-padding-y: 0px; --grid-item-padding-x: 0px; z-index: 2; grid-area: 1 / 5 / 3 / 9;" data-invisible="1"> 2143 <h5 class="mb-3"><img src="/web/image/1157-d64ca9e3/Logo%20%2B%20La%20Scourtinerie%20%2B%20depuis%201882_blanc.png" alt="logo scourtinerie" class="img img-fluid o_we_custom_image mx-auto d-block" data-mimetype="image/png" data-original-id="1157" data-original-src="/web/image/1157-d64ca9e3/Logo%20%2B%20La%20Scourtinerie%20%2B%20depuis%201882_blanc.png" data-mimetype-before-conversion="image/png" style="width: 50% !important;" loading="lazy" data-attachment-id="1157"/></h5> 2144 </div><div id="connect" class="o_grid_item o_colored_level g-height-2 g-col-lg-3 col-lg-3 d-lg-none o_snippet_desktop_invisible" style="z-index: 3; grid-area: 1 / 10 / 3 / 13; --grid-item-padding-y: 0px; --grid-item-padding-x: 0px;" data-invisible="1"> 2145 <h5 class="mb-3" style="text-align: center;">Rejoignez-nous !</h5> 2146 <div class="s_social_media o_not_editable text-center" data-snippet="s_social_media" data-name="Social Media"> 2147 <h5 class="s_social_media_title d-none" style="text-align: center;">Suivez-nous</h5> 2148<a href="/website/social/instagram" class="s_social_media_instagram" target="_blank" aria-label="Instagram"> 2149 <i class="fa rounded-circle shadow-sm o_editable_media fa-instagram"></i> 2150 </a> 2151<a href="/website/social/facebook" class="s_social_media_facebook" target="_blank" aria-label="Facebook"> 2152 <i class="fa fa-facebook rounded-circle shadow-sm o_editable_media"></i> 2153 </a> 2154</div><ul class="list-unstyled"><br/></ul> 2155 2156 </div><div class="o_colored_level o_grid_item g-col-lg-3 g-height-4 col-lg-3 d-lg-none o_snippet_desktop_invisible" style="z-index: 1; grid-area: 1 / 1 / 5 / 4; --grid-item-padding-y: 0px; --grid-item-padding-x: 0px;" data-invisible="1"> 2157 <p class="mb-3" style="text-align: center;">Liens utiles</p><ul class="list-unstyled"> 2158 <li style="text-align: center;"><a href="https://cataloguescourtinerie.s3.eu-west-3.amazonaws.com/Catalogue-particulier-2024-2025.pdf"><font class="text-o-color-4">Télécharger notre catalogue</font></a></li><li style="text-align: center;"><a href="/mentions-legales"><font class="text-o-color-4">Mentions légales</font></a><br/>
2158</li> 2159 <li style="text-align: center;"><a href="/conditions-generales-de-vente"><font class="text-o-color-4">Conditions générales de vente</font></a><br/></li> 2160 <li style="text-align: center;"><a href="/politique-de-confidentialite"><font class="text-o-color-4">Politique de confidentialité</font></a></li></ul></div><div class="o_grid_item g-height-1 o_colored_level g-col-lg-6 col-lg-6 d-lg-none o_snippet_desktop_invisible" style="z-index: 4; grid-area: 4 / 1 / 5 / 7; text-align: center;" data-invisible="1"><span class="fa fa-copyright"></span><font class="text-400"> 2026 La Scourtinerie</font></div><div class="o_colored_level o_grid_item g-col-lg-5 g-height-5 col-lg-5" style="z-index: 0; grid-area: 10 / 1 / 15 / 6;"> 2161 <h5 class="mb-3">Liens utiles</h5><ul class="list-unstyled"> 2162 <li><a href="/blog"><font class="text-o-color-1">Blog</font></a></li><li><a href="/mentions-legales"><font class="text-o-color-4">Mentions légales</font></a><br/></li> 2163 <li><a href="/conditions-generales-de-vente"><font class="text-o-color-4">Conditions générales de vente</font></a><br/></li> 2164 <li><a href="/politique-de-confidentialite"><font class="text-o-color-4">Politique de confidentialité </font></a></li><li><a href="/odoo/documents/6eyP7aA0Tm6ZtPqNxw-Vcgo32" target="_blank"><font style="color: rgb(255, 255, 255);">Conseils d'entretien</font></a></li><li><a href="/odoo/documents/5sXtnFIAQruTy2QgH02mcQo33" class="o_translate_inline" data-attachment-id="21855"><font style="color: rgb(255, 255, 255);">Made in France</font></a></li></ul><p><br/></p></div><div class="o_colored_level o_grid_item d-lg-block d-none o_snippet_mobile_invisible g-col-lg-5 g-height-4 col-lg-5" style="--grid-item-padding-y: 0px; --grid-item-padding-x: 0px; z-index: 2; grid-area: 10 / 5 / 14 / 10;" data-invisible="1"> 2165 <h5 class="mb-3"><a href="/"><img src="/web/image/1157-d64ca9e3/Logo%20%2B%20La%20Scourtinerie%20%2B%20depuis%201882_blanc.png" alt="" class="img img-fluid o_we_custom_image mx-auto d-block" data-mimetype="image/png" data-original-id="1157" data-original-src="/web/image/1157-d64ca9e3/Logo%20%2B%20La%20Scourtinerie%20%2B%20depuis%201882_blanc.png" data-mimetype-before-conversion="image/png" style="width: 50% !important;" loading="lazy" data-attachment-id="1157" role="presentation"/></a></h5> 2166 </div><div class="o_grid_item g-height-1 o_colored_level d-lg-block d-none o_snippet_mobile_invisible g-col-lg-3 col-lg-3" style="text-align: right; z-index: 4; grid-area: 12 / 10 / 13 / 13;" data-invisible="1"><span class="fa fa-copyright"></span><font class="text-o-color-4"> 2026 - La Scourtinerie</font></div><div class="o_grid_item o_grid_item_image o_colored_level g-height-5 col-lg-2 g-col-lg-2" style="z-index: 8; grid-area: 1 / 9 / 6 / 11;"><a href="https://www.lesitedumadeinfrance.fr/"><img src="/web/image/22027-0899ed11/thumbnail.webp" alt="" data-attachment-id="22026" class="img img-fluid o_we_custom_image o_editable_media" data-format-mimetype="image/webp" data-original-id="22026" data-original-src="/web/image/22026-ce04cf4c/thumbnail.png" data-mimetype-before-conversion="image/png" data-resize-width="816" data-mimetype="image/webp" loading="lazy" role="presentation"/></a></div><div id="connect" class="o_grid_item o_colored_level g-col-lg-2 col-lg-2 g-height-5" style="z-index: 3; grid-area: 1 / 11 / 6 / 13;"> 2167 <p> <a href="https://www.marques-de-france.fr/listing/la-scourtinerie/"><img class="img-fluid" data-file-name="marques-de-france-badge-200.png" src="/web/image/19674-05983a54/marques-de-france-badge-200.png" loading="lazy" data-mimetype="image/png" data-original-id="19674" data-original-src="/web/image/19674-05983a54/marques-de-france-badge-200.png" data-mimetype-before-conversion="image/png" data-attachment-id="19674" alt="" role="presentation"/></a></p><p><br/></p><p><br/></p><h5 class="mb-3" style="text-align: right;"><a href="https://www.scourtinerie.com/blog/scourtinerie-2/le-prix-jacques-leon-quand-la-scourtinerie-est-distinguee-pour-tradition-provencale-et-modernite-7?_gl=1*1cuurgn*_ga*Nzg0ODAwNzIyLjE3MjgzMTc0OTg.*_ga_16BEFRTG7S*czE3NzEzMTU3NDEkbzE2JGcxJHQxNzcxMzE3OTI1JGo0OSRsMCRoMTc1NzQ3MTA2OQ.."><img class="img-fluid" data-file-name="image.png" src="/web/image/20862-82fe7d6f/image.png" loading="lazy" alt="" role="presentation"/></a></h5><h5 class="mb-3" style="text-align: right;">Rejoignez-nous !</h5> 2168 <div class="s_social_media o_not_editable text-end" data-snippet="s_social_media" data-name="Social Media"> 2169 <h5 class="s_social_media_title d-none">Suivez-nous</h5> 2170<a href="/website/social/instagram" class="s_social_media_instagram" target="_blank" aria-label="Instagram"> 2171 <i class="fa rounded-circle shadow-sm o_editable_media fa-instagram"></i> 2172 </a> 2173<a href="/website/social/facebook" class="s_social_media_facebook" target="_blank" aria-label="Facebook"> 2174 <i class="fa fa-facebook rounded-circle shadow-sm o_editable_media"></i> 2175 </a>
2176<a href="/website/social/youtube" class="s_social_media_youtube" target="_blank" aria-label="YouTube"> 2177 <i class="fa rounded-circle shadow-sm o_editable_media fa-youtube"></i> 2178 </a> 2179</div><ul class="list-unstyled"> 2180 <br/></ul> 2181 2182 </div></div> 2183 </div> 2184 </section> 2185 </div> 2186 </footer> 2187 </div> 2188 <!-- Google Tag Manager (noscript) --> 2189<noscript><iframe src="https://load.s.scourtinerie.com/ns.html?id=GTM-M5N98GQP" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 2190<!-- End Google Tag Manager (noscript) -->
vendor: 117 bytes, lines 2190-2191
2190 2191 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
2191<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"4c3f651b461940b3927235764b120abb","r":1,"spa":2}' crossorigin="anonymous"></script>
vendor: 1 bytes, line 2191
2191
2192<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a44e97fe480998c3',t:'MTc5MTA1ODI2Mg=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
2192</body> 2193</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.