PageSourceSearch

https://www.scourtinerie.com/shop/cart

html scourtinerie.com collected 2026-10-03 20:11:18 UTC 103,896 bytes, 2,193 lines download raw bytes

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&#39;é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&nbsp;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&nbsp;:</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&#160;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&nbsp;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&nbsp;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">&nbsp;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&nbsp;de confidentialité&nbsp;</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">&nbsp;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>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<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.