templates/page/page.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %} {{ publication.title }} | WorkDispo {% endblock %}
  3. {% block meta_date_desc %}
  4.     <script type="application/ld+json">
  5.         {
  6.             "@context" : "https://schema.org",
  7.             "@type" : "WebSite",
  8.             "name" : "WorkDispo",
  9.             "url" : "https://www.workdispo.com/",
  10.         {% if publication and publication.getCreatedAt() is not empty %}
  11.                       "datePublished": "{{ publication.getCreatedAt()|date('c') }}",
  12.                     {% endif %}
  13.                     {% if publication and publication.getUpdatedAt() is not empty %}
  14.                       "dateModified": "{{ publication.getUpdatedAt()|date('c') }}"
  15.                     {% endif %}
  16.         }
  17.     </script>
  18. {% endblock %}
  19. {% block meta %}
  20.     <meta charset="utf-8">
  21.     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=3">
  22.     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
  23.     <script type="text/javascript">(window.NREUM || (NREUM = {})).init = {ajax: {deny_list: ["bam.nr-data.net"]}};
  24.         (window.NREUM || (NREUM = {})).loader_config = {
  25.             licenseKey: "NRJS-8c6c895b97ea60d5ee0",
  26.             applicationID: "1333848373"
  27.         };
  28.         window.NREUM || (NREUM = {}), __nr_require = function (t, e, n) {
  29.             function r(n) {
  30.                 if (!e[n]) {
  31.                     var i = e[n] = {exports: {}};
  32.                     t[n][0].call(i.exports, function (e) {
  33.                         var i = t[n][1][e];
  34.                         return r(i || e)
  35.                     }, i, i.exports)
  36.                 }
  37.                 return e[n].exports
  38.             }
  39.             if ("function" == typeof __nr_require) return __nr_require;
  40.             for (var i = 0; i < n.length; i++) r(n[i]);
  41.             return r
  42.         }({
  43.             1: [function (t, e, n) {
  44.                 function r() {
  45.                 }
  46.                 function i(t, e, n, r) {
  47.                     return function () {
  48.                         return s.recordSupportability("API/" + e + "/called"), o(t + e, [u.now()].concat(c(arguments)), n ? null : this, r), n ? void 0 : this
  49.                     }
  50.                 }
  51.                 var o = t("handle"), a = t(9), c = t(10), f = t("ee").get("tracer"), u = t("loader"), s = t(4),
  52.                     d = NREUM;
  53.                 "undefined" == typeof window.newrelic && (newrelic = d);
  54.                 var p = ["setPageViewName", "setCustomAttribute", "setErrorHandler", "finished", "addToTrace", "inlineHit", "addRelease"],
  55.                     l = "api-", v = l + "ixn-";
  56.                 a(p, function (t, e) {
  57.                     d[e] = i(l, e, !0, "api")
  58.                 }), d.addPageAction = i(l, "addPageAction", !0), d.setCurrentRouteName = i(l, "routeName", !0), e.exports = newrelic, d.interaction = function () {
  59.                     return (new r).get()
  60.                 };
  61.                 var m = r.prototype = {
  62.                     createTracer: function (t, e) {
  63.                         var n = {}, r = this, i = "function" == typeof e;
  64.                         return o(v + "tracer", [u.now(), t, n], r), function () {
  65.                             if (f.emit((i ? "" : "no-") + "fn-start", [u.now(), r, i], n), i) try {
  66.                                 return e.apply(this, arguments)
  67.                             } catch (t) {
  68.                                 throw f.emit("fn-err", [arguments, this, t], n), t
  69.                             } finally {
  70.                                 f.emit("fn-end", [u.now()], n)
  71.                             }
  72.                         }
  73.                     }
  74.                 };
  75.                 a("actionText,setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","), function (t, e) {
  76.                     m[e] = i(v, e)
  77.                 }), newrelic.noticeError = function (t, e) {
  78.                     "string" == typeof t && (t = new Error(t)), s.recordSupportability("API/noticeError/called"), o("err", [t, u.now(), !1, e])
  79.                 }
  80.             }, {}], 2: [function (t, e, n) {
  81.                 function r(t) {
  82.                     if (NREUM.init) {
  83.                         for (var e = NREUM.init, n = t.split("."), r = 0; r < n.length - 1; r++) if (e = e[n[r]], "object" != typeof e) return;
  84.                         return e = e[n[n.length - 1]]
  85.                     }
  86.                 }
  87.                 e.exports = {getConfiguration: r}
  88.             }, {}], 3: [function (t, e, n) {
  89.                 var r = !1;
  90.                 try {
  91.                     var i = Object.defineProperty({}, "passive", {
  92.                         get: function () {
  93.                             r = !0
  94.                         }
  95.                     });
  96.                     window.addEventListener("testPassive", null, i), window.removeEventListener("testPassive", null, i)
  97.                 } catch (o) {
  98.                 }
  99.                 e.exports = function (t) {
  100.                     return r ? {passive: !0, capture: !!t} : !!t
  101.                 }
  102.             }, {}], 4: [function (t, e, n) {
  103.                 function r(t, e) {
  104.                     var n = [a, t, {name: t}, e];
  105.                     return o("storeMetric", n, null, "api"), n
  106.                 }
  107.                 function i(t, e) {
  108.                     var n = [c, t, {name: t}, e];
  109.                     return o("storeEventMetrics", n, null, "api"), n
  110.                 }
  111.                 var o = t("handle"), a = "sm", c = "cm";
  112.                 e.exports = {
  113.                     constants: {SUPPORTABILITY_METRIC: a, CUSTOM_METRIC: c},
  114.                     recordSupportability: r,
  115.                     recordCustom: i
  116.                 }
  117.             }, {}], 5: [function (t, e, n) {
  118.                 function r() {
  119.                     return c.exists && performance.now ? Math.round(performance.now()) : (o = Math.max((new Date).getTime(), o)) - a
  120.                 }
  121.                 function i() {
  122.                     return o
  123.                 }
  124.                 var o = (new Date).getTime(), a = o, c = t(11);
  125.                 e.exports = r, e.exports.offset = a, e.exports.getLastTimestamp = i
  126.             }, {}], 6: [function (t, e, n) {
  127.                 function r(t, e) {
  128.                     var n = t.getEntries();
  129.                     n.forEach(function (t) {
  130.                         "first-paint" === t.name ? l("timing", ["fp", Math.floor(t.startTime)]) : "first-contentful-paint" === t.name && l("timing", ["fcp", Math.floor(t.startTime)])
  131.                     })
  132.                 }
  133.                 function i(t, e) {
  134.                     var n = t.getEntries();
  135.                     if (n.length > 0) {
  136.                         var r = n[n.length - 1];
  137.                         if (u && u < r.startTime) return;
  138.                         var i = [r], o = a({});
  139.                         o && i.push(o), l("lcp", i)
  140.                     }
  141.                 }
  142.                 function o(t) {
  143.                     t.getEntries().forEach(function (t) {
  144.                         t.hadRecentInput || l("cls", [t])
  145.                     })
  146.                 }
  147.                 function a(t) {
  148.                     var e = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
  149.                     if (e) return e.type && (t["net-type"] = e.type), e.effectiveType && (t["net-etype"] = e.effectiveType), e.rtt && (t["net-rtt"] = e.rtt), e.downlink && (t["net-dlink"] = e.downlink), t
  150.                 }
  151.                 function c(t) {
  152.                     if (t instanceof y && !w) {
  153.                         var e = Math.round(t.timeStamp), n = {type: t.type};
  154.                         a(n), e <= v.now() ? n.fid = v.now() - e : e > v.offset && e <= Date.now() ? (e -= v.offset, n.fid = v.now() - e) : e = v.now(), w = !0, l("timing", ["fi", e, n])
  155.                     }
  156.                 }
  157.                 function f(t) {
  158.                     "hidden" === t && (u = v.now(), l("pageHide", [u]))
  159.                 }
  160.                 if (!("init" in NREUM && "page_view_timing" in NREUM.init && "enabled" in NREUM.init.page_view_timing && NREUM.init.page_view_timing.enabled === !1)) {
  161.                     var u, s, d, p, l = t("handle"), v = t("loader"), m = t(8), g = t(3), y = NREUM.o.EV;
  162.                     if ("PerformanceObserver" in window && "function" == typeof window.PerformanceObserver) {
  163.                         s = new PerformanceObserver(r);
  164.                         try {
  165.                             s.observe({entryTypes: ["paint"]})
  166.                         } catch (h) {
  167.                         }
  168.                         d = new PerformanceObserver(i);
  169.                         try {
  170.                             d.observe({entryTypes: ["largest-contentful-paint"]})
  171.                         } catch (h) {
  172.                         }
  173.                         p = new PerformanceObserver(o);
  174.                         try {
  175.                             p.observe({type: "layout-shift", buffered: !0})
  176.                         } catch (h) {
  177.                         }
  178.                     }
  179.                     if ("addEventListener" in document) {
  180.                         var w = !1, b = ["click", "keydown", "mousedown", "pointerdown", "touchstart"];
  181.                         b.forEach(function (t) {
  182.                             document.addEventListener(t, c, g(!1))
  183.                         })
  184.                     }
  185.                     m(f)
  186.                 }
  187.             }, {}], 7: [function (t, e, n) {
  188.                 function r(t, e) {
  189.                     if (!i) return !1;
  190.                     if (t !== i) return !1;
  191.                     if (!o) return !1;
  192.                     for (var n = o.split("."), r = e.split("."), a = 0; a < r.length; a++) if (r[a] !== n[a]) return !1;
  193.                     return !0
  194.                 }
  195.                 var i = null, o = null, a = /Version\/(\S+)\s+Safari/;
  196.                 if (navigator.userAgent) {
  197.                     var c = navigator.userAgent, f = c.match(a);
  198.                     f && c.indexOf("Chrome") === -1 && c.indexOf("Chromium") === -1 && (i = "Safari", o = f[1])
  199.                 }
  200.                 e.exports = {agent: i, version: o, match: r}
  201.             }, {}], 8: [function (t, e, n) {
  202.                 function r(t) {
  203.                     function e() {
  204.                         t(c && document[c] ? document[c] : document[o] ? "hidden" : "visible")
  205.                     }
  206.                     "addEventListener" in document && a && document.addEventListener(a, e, i(!1))
  207.                 }
  208.                 var i = t(3);
  209.                 e.exports = r;
  210.                 var o, a, c;
  211.                 "undefined" != typeof document.hidden ? (o = "hidden", a = "visibilitychange", c = "visibilityState") : "undefined" != typeof document.msHidden ? (o = "msHidden", a = "msvisibilitychange") : "undefined" != typeof document.webkitHidden && (o = "webkitHidden", a = "webkitvisibilitychange", c = "webkitVisibilityState")
  212.             }, {}], 9: [function (t, e, n) {
  213.                 function r(t, e) {
  214.                     var n = [], r = "", o = 0;
  215.                     for (r in t) i.call(t, r) && (n[o] = e(r, t[r]), o += 1);
  216.                     return n
  217.                 }
  218.                 var i = Object.prototype.hasOwnProperty;
  219.                 e.exports = r
  220.             }, {}], 10: [function (t, e, n) {
  221.                 function r(t, e, n) {
  222.                     e || (e = 0), "undefined" == typeof n && (n = t ? t.length : 0);
  223.                     for (var r = -1, i = n - e || 0, o = Array(i < 0 ? 0 : i); ++r < i;) o[r] = t[e + r];
  224.                     return o
  225.                 }
  226.                 e.exports = r
  227.             }, {}], 11: [function (t, e, n) {
  228.                 e.exports = {exists: "undefined" != typeof window.performance && window.performance.timing && "undefined" != typeof window.performance.timing.navigationStart}
  229.             }, {}], ee: [function (t, e, n) {
  230.                 function r() {
  231.                 }
  232.                 function i(t) {
  233.                     function e(t) {
  234.                         return t && t instanceof r ? t : t ? u(t, f, a) : a()
  235.                     }
  236.                     function n(n, r, i, o, a) {
  237.                         if (a !== !1 && (a = !0), !l.aborted || o) {
  238.                             t && a && t(n, r, i);
  239.                             for (var c = e(i), f = m(n), u = f.length, s = 0; s < u; s++) f[s].apply(c, r);
  240.                             var p = d[w[n]];
  241.                             return p && p.push([b, n, r, c]), c
  242.                         }
  243.                     }
  244.                     function o(t, e) {
  245.                         h[t] = m(t).concat(e)
  246.                     }
  247.                     function v(t, e) {
  248.                         var n = h[t];
  249.                         if (n) for (var r = 0; r < n.length; r++) n[r] === e && n.splice(r, 1)
  250.                     }
  251.                     function m(t) {
  252.                         return h[t] || []
  253.                     }
  254.                     function g(t) {
  255.                         return p[t] = p[t] || i(n)
  256.                     }
  257.                     function y(t, e) {
  258.                         l.aborted || s(t, function (t, n) {
  259.                             e = e || "feature", w[n] = e, e in d || (d[e] = [])
  260.                         })
  261.                     }
  262.                     var h = {}, w = {}, b = {
  263.                         on: o,
  264.                         addEventListener: o,
  265.                         removeEventListener: v,
  266.                         emit: n,
  267.                         get: g,
  268.                         listeners: m,
  269.                         context: e,
  270.                         buffer: y,
  271.                         abort: c,
  272.                         aborted: !1
  273.                     };
  274.                     return b
  275.                 }
  276.                 function o(t) {
  277.                     return u(t, f, a)
  278.                 }
  279.                 function a() {
  280.                     return new r
  281.                 }
  282.                 function c() {
  283.                     (d.api || d.feature) && (l.aborted = !0, d = l.backlog = {})
  284.                 }
  285.                 var f = "nr@context", u = t("gos"), s = t(9), d = {}, p = {}, l = e.exports = i();
  286.                 e.exports.getOrSetContext = o, l.backlog = d
  287.             }, {}], gos: [function (t, e, n) {
  288.                 function r(t, e, n) {
  289.                     if (i.call(t, e)) return t[e];
  290.                     var r = n();
  291.                     if (Object.defineProperty && Object.keys) try {
  292.                         return Object.defineProperty(t, e, {value: r, writable: !0, enumerable: !1}), r
  293.                     } catch (o) {
  294.                     }
  295.                     return t[e] = r, r
  296.                 }
  297.                 var i = Object.prototype.hasOwnProperty;
  298.                 e.exports = r
  299.             }, {}], handle: [function (t, e, n) {
  300.                 function r(t, e, n, r) {
  301.                     i.buffer([t], r), i.emit(t, e, n)
  302.                 }
  303.                 var i = t("ee").get("handle");
  304.                 e.exports = r, r.ee = i
  305.             }, {}], id: [function (t, e, n) {
  306.                 function r(t) {
  307.                     var e = typeof t;
  308.                     return !t || "object" !== e && "function" !== e ? -1 : t === window ? 0 : a(t, o, function () {
  309.                         return i++
  310.                     })
  311.                 }
  312.                 var i = 1, o = "nr@id", a = t("gos");
  313.                 e.exports = r
  314.             }, {}], loader: [function (t, e, n) {
  315.                 function r() {
  316.                     if (!M++) {
  317.                         var t = T.info = NREUM.info, e = m.getElementsByTagName("script")[0];
  318.                         if (setTimeout(u.abort, 3e4), !(t && t.licenseKey && t.applicationID && e)) return u.abort();
  319.                         f(x, function (e, n) {
  320.                             t[e] || (t[e] = n)
  321.                         });
  322.                         var n = a();
  323.                         c("mark", ["onload", n + T.offset], null, "api"), c("timing", ["load", n]);
  324.                         var r = m.createElement("script");
  325.                         0 === t.agent.indexOf("http://") || 0 === t.agent.indexOf("https://") ? r.src = t.agent : r.src = l + "://" + t.agent, e.parentNode.insertBefore(r, e)
  326.                     }
  327.                 }
  328.                 function i() {
  329.                     "complete" === m.readyState && o()
  330.                 }
  331.                 function o() {
  332.                     c("mark", ["domContent", a() + T.offset], null, "api")
  333.                 }
  334.                 var a = t(5), c = t("handle"), f = t(9), u = t("ee"), s = t(7), d = t(2), p = t(3),
  335.                     l = d.getConfiguration("ssl") === !1 ? "http" : "https", v = window, m = v.document,
  336.                     g = "addEventListener", y = "attachEvent", h = v.XMLHttpRequest, w = h && h.prototype, b = !1;
  337.                 NREUM.o = {
  338.                     ST: setTimeout,
  339.                     SI: v.setImmediate,
  340.                     CT: clearTimeout,
  341.                     XHR: h,
  342.                     REQ: v.Request,
  343.                     EV: v.Event,
  344.                     PR: v.Promise,
  345.                     MO: v.MutationObserver
  346.                 };
  347.                 var E = "" + location, x = {
  348.                     beacon: "bam.nr-data.net",
  349.                     errorBeacon: "bam.nr-data.net",
  350.                     agent: "js-agent.newrelic.com/nr-1216.min.js"
  351.                 }, O = h && w && w[g] && !/CriOS/.test(navigator.userAgent), T = e.exports = {
  352.                     offset: a.getLastTimestamp(),
  353.                     now: a,
  354.                     origin: E,
  355.                     features: {},
  356.                     xhrWrappable: O,
  357.                     userAgent: s,
  358.                     disabled: b
  359.                 };
  360.                 if (!b) {
  361.                     t(1), t(6), m[g] ? (m[g]("DOMContentLoaded", o, p(!1)), v[g]("load", r, p(!1))) : (m[y]("onreadystatechange", i), v[y]("onload", r)), c("mark", ["firstbyte", a.getLastTimestamp()], null, "api");
  362.                     var M = 0
  363.                 }
  364.             }, {}], "wrap-function": [function (t, e, n) {
  365.                 function r(t, e) {
  366.                     function n(e, n, r, f, u) {
  367.                         function nrWrapper() {
  368.                             var o, a, s, p;
  369.                             try {
  370.                                 a = this, o = d(arguments), s = "function" == typeof r ? r(o, a) : r || {}
  371.                             } catch (l) {
  372.                                 i([l, "", [o, a, f], s], t)
  373.                             }
  374.                             c(n + "start", [o, a, f], s, u);
  375.                             try {
  376.                                 return p = e.apply(a, o)
  377.                             } catch (v) {
  378.                                 throw c(n + "err", [o, a, v], s, u), v
  379.                             } finally {
  380.                                 c(n + "end", [o, a, p], s, u)
  381.                             }
  382.                         }
  383.                         return a(e) ? e : (n || (n = ""), nrWrapper[p] = e, o(e, nrWrapper, t), nrWrapper)
  384.                     }
  385.                     function r(t, e, r, i, o) {
  386.                         r || (r = "");
  387.                         var c, f, u, s = "-" === r.charAt(0);
  388.                         for (u = 0; u < e.length; u++) f = e[u], c = t[f], a(c) || (t[f] = n(c, s ? f + r : r, i, f, o))
  389.                     }
  390.                     function c(n, r, o, a) {
  391.                         if (!v || e) {
  392.                             var c = v;
  393.                             v = !0;
  394.                             try {
  395.                                 t.emit(n, r, o, e, a)
  396.                             } catch (f) {
  397.                                 i([f, n, r, o], t)
  398.                             }
  399.                             v = c
  400.                         }
  401.                     }
  402.                     return t || (t = s), n.inPlace = r, n.flag = p, n
  403.                 }
  404.                 function i(t, e) {
  405.                     e || (e = s);
  406.                     try {
  407.                         e.emit("internal-error", t)
  408.                     } catch (n) {
  409.                     }
  410.                 }
  411.                 function o(t, e, n) {
  412.                     if (Object.defineProperty && Object.keys) try {
  413.                         var r = Object.keys(t);
  414.                         return r.forEach(function (n) {
  415.                             Object.defineProperty(e, n, {
  416.                                 get: function () {
  417.                                     return t[n]
  418.                                 }, set: function (e) {
  419.                                     return t[n] = e, e
  420.                                 }
  421.                             })
  422.                         }), e
  423.                     } catch (o) {
  424.                         i([o], n)
  425.                     }
  426.                     for (var a in t) l.call(t, a) && (e[a] = t[a]);
  427.                     return e
  428.                 }
  429.                 function a(t) {
  430.                     return !(t && t instanceof Function && t.apply && !t[p])
  431.                 }
  432.                 function c(t, e) {
  433.                     var n = e(t);
  434.                     return n[p] = t, o(t, n, s), n
  435.                 }
  436.                 function f(t, e, n) {
  437.                     var r = t[e];
  438.                     t[e] = c(r, n)
  439.                 }
  440.                 function u() {
  441.                     for (var t = arguments.length, e = new Array(t), n = 0; n < t; ++n) e[n] = arguments[n];
  442.                     return e
  443.                 }
  444.                 var s = t("ee"), d = t(10), p = "nr@original", l = Object.prototype.hasOwnProperty, v = !1;
  445.                 e.exports = r, e.exports.wrapFunction = c, e.exports.wrapInPlace = f, e.exports.argsToArray = u
  446.             }, {}]
  447.         }, {}, ["loader"]);</script>
  448.     <meta property="og:type" content="WorkDispo"/>
  449.     <meta property="og:image"
  450.           content="{{ asset( publication.publicationImage ? 'uploads/img/'~publication.publicationImage.path : 'images/blog-04.jpg') }}">
  451.     <meta name="description" content="{{ publication.description }}">
  452.     <meta name="keywords" content="{{ publication.keywodrs }}">
  453.     <meta property="og:title" content="{{ publication.title }}"/>
  454.     {% if publication.updatedAt %}
  455.         <meta name="revised" content="{{ publication.updatedAt|date('d/m/Y') }}"/>
  456.     {% else %}
  457.         <meta name="revised" content="{{ publication.createdAt|date('d/m/Y') }}"/>
  458.     {% endif %}
  459. {% endblock %}
  460. {% block stylesheets %}
  461.     <style>
  462.         .blog-post-content h1 {
  463.             color: black !important;
  464.         }
  465.         .mobile-device {
  466.             display: none;
  467.         }
  468.         .large-device {
  469.             display: block;
  470.         }
  471.         .ez-toc-link {
  472.             position: relative;
  473.             padding-left: 24px; /* Adjust based on the width of the icon */
  474.             text-decoration: none; /* Remove underline */
  475.             color: blue; /* Default color */
  476.         }
  477.         .ez-toc-link .icon {
  478.             position: absolute;
  479.             left: 0;
  480.             top: 50%;
  481.             transform: translateY(-50%);
  482.             display: none; /* Hide icon by default */
  483.             fill: #2a41e8;
  484.         }
  485.         .ez-toc-link.active .icon,
  486.         .ez-toc-link.visited .icon {
  487.             display: block; /* Show icon when active or visited */
  488.         }
  489.         .ez-toc-link.active {
  490.             color: blue; /* Color when active */
  491.         }
  492.         .ez-toc-link.active a {
  493.             color: #2a41e8;
  494.         }
  495.         .ez-toc-link.visited {
  496.             color: gray; /* Color when visited */
  497.         }
  498.         .sidebar-sticky {
  499.             overflow-y: hidden;
  500.         }
  501.         .toc-title {
  502.             color: #000000;
  503.             font-size: 1.8rem;
  504.             font-weight: 700;
  505.             text-align: center;
  506.             margin-bottom: 1.5rem;
  507.         }
  508.         .ez-toc-container-direction {
  509.             display: flex;
  510.             flex-direction: column;
  511.             height: 100%;
  512.         }
  513.         .toc-content {
  514.             overflow: hidden; /* Cache la scrollbar horizontale */
  515.         }
  516.         .ez-toc-list {
  517.             max-height: 200px; /* Définissez la hauteur maximale de la liste défilante selon votre besoin */
  518.             overflow-y: auto; /* Permet le défilement vertical */
  519.             padding-right: 15px; /* Pour compenser la disparition de la scrollbar */
  520.             scrollbar-width: none; /* Cacher la scrollbar pour Firefox */
  521.         }
  522.         #sidebar-container::-webkit-scrollbar {
  523.             /*display: none; !* Cacher la scrollbar pour les navigateurs Webkit *!*/
  524.         }
  525.         .sidebar-sticky {
  526.             border: 3px solid #f1f1f1;
  527.             border-radius: 10px;
  528.             padding: 20px 0 10px 0;
  529.             margin-bottom: 8px;
  530.             position: sticky;
  531.             top: 14%;
  532.         }
  533.         #sidebar-container {
  534.             max-height: 230px !important;
  535.         }
  536.         .toc-container {
  537.             overflow-y: scroll;
  538.         }
  539.         .ez-toc-list::-webkit-scrollbar {
  540.             display: none;
  541.         }
  542.         .ez-toc-list li {
  543.             list-style: none;
  544.             position: relative;
  545.             padding-left: 25px;
  546.             margin-bottom: 10px;
  547.         }
  548.         .ez-toc-page-1 a.ez-toc-link {
  549.             color: gray;
  550.             text-decoration: none; /* Enlève la décoration du texte (soulignement) */
  551.             font-size: medium;
  552.         }
  553.         .ez-toc-page-1 a.ez-toc-link.active {
  554.             color: #2a41e8;
  555.         }
  556.         div.clicked-link a {
  557.             color: grey;
  558.             opacity: 0.8;
  559.         }
  560.         /*.ez-toc-list li:before {*/
  561.         /*    content: "\f00c"; !* Code Unicode pour l'icône de coche de Font Awesome *!*/
  562.         /*    font-family: "Font Awesome 5 Free"; !* Police de Font Awesome *!*/
  563.         /*    font-weight: 900; !* Pour la version solide de l'icône *!*/
  564.         /*    color: green; !* Couleur de l'icône, vous pouvez la changer selon vos besoins *!*/
  565.         /*    position: absolute;*/
  566.         /*    left: 0;*/
  567.         /*    top: 0;*/
  568.         /*}*/
  569.         .widget-content {
  570.             position: relative;
  571.         }
  572.         .breadcrumb-container {
  573.             font-size: 11px;
  574.             color: white;
  575.             position: absolute;
  576.             top: 0px; /* Ajustez la valeur selon votre besoin */
  577.             left: 10px; /* Ajustez la valeur selon votre besoin */
  578.             z-index: 100; /* Assurez-vous que cette valeur est plus élevée que celle de l'image */
  579.         }
  580.         .breadcrumb {
  581.             /*background-color: white;*/
  582.             padding: 10px 16px;
  583.             list-style: none;
  584.             display: flex;
  585.             align-items: center;
  586.             border-radius: 5px; /* Ajoutez des bordures arrondies si nécessaire */
  587.         }
  588.         .breadcrumb-item a {
  589.             color: white; /* Couleur du texte du lien */
  590.             text-decoration: none; /* Supprime le soulignement du lien */
  591.             cursor: pointer; /* Assure que le curseur devient une main */
  592.         }
  593.         .breadcrumb-item a:hover {
  594.             text-decoration: none; /* Soulignement au survol */
  595.         }
  596.         .breadcrumb-item.active {
  597.             color: white; /* Couleur du texte pour l'élément actif */
  598.             font-size: 12px;
  599.             text-decoration: underline;
  600.             text-decoration-color: blue; /* Couleur du soulignement */
  601.             text-decoration-thickness: 2px; /* Épaisseur du soulignement */
  602.             text-underline-offset: 4px; /* Espace entre le texte et le soulignement */
  603.         }
  604.         .breadcrumb-item.active a {
  605.             text-decoration: none; /* Supprime le soulignement pour l'élément actif */
  606.             cursor: default; /* Coursur de texte pour l'élément actif */
  607.         }
  608.         .blog-post-content ol {
  609.             margin: 0 0 0 20px !important;
  610.         }
  611.         .blog-post-content h2 {
  612.             font-weight: bold;
  613.             scroll-margin-top: 80px; /* Pour que le scroll auto s'arrête juste au début du h2 */
  614.         }
  615.         .blog-post-content h3 {
  616.             color: black !important;
  617.             font-size: 20px !important;
  618.             font-weight: bold;
  619.             display: inline-block; /* Assure que l'élément h3 ne prend que la largeur nécessaire */
  620.             text-decoration: underline; /* Soulignement du texte */
  621.             text-decoration-color: #2a41e8; /* Couleur du soulignement */
  622.             text-underline-position: under;
  623.         }
  624.         .closeButtonContainer {
  625.             display: flex;
  626.             justify-content: flex-end;
  627.         }
  628.         .scroll-block {
  629.             position: fixed;
  630.             bottom: 0; /* Initially hidden below the screen */
  631.             left: 5%;
  632.             width: 90%;
  633.             background-color: #333;
  634.             color: #fff;
  635.             padding: 12px 20px 41px 20px;
  636.             transition: bottom 0.3s ease; /* Smooth transition for hiding */
  637.             transform: translateY(100%); /* Le bloc est déplacé vers le bas de l'écran */
  638.             display: none;
  639.         }
  640.         .visible {
  641.             transform: translateY(0);
  642.         }
  643.         .hidden {
  644.             transform: translateY(100%);
  645.         }
  646.         .hidden_btn {
  647.             transform: translateY(100%) !important;
  648.         }
  649.         @media only screen and (max-width: 500px) {
  650.             #wrapper {
  651.                 width: -webkit-fill-available;
  652.             }
  653.             .sidebar-sticky {
  654.                 position: static !important;
  655.                 margin-bottom: 1rem;
  656.             }
  657.             .ez-toc-list li {
  658.                 list-style-type: none !important; /* Remove bullets from the list */
  659.                 padding-left: 9px !important; /* Remove padding from the list */
  660.             }
  661.             .mobile-device {
  662.                 display: block;
  663.             }
  664.             .large-device {
  665.                 display: none;
  666.             }
  667.             .scroll-block {
  668.                 display: block;
  669.                 border-radius: 20px;
  670.                 background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(https://www.abcportage.fr/wp-content/themes/abcportage/assets/build/img/img_cta_right_small.jpg);
  671.                 background-size: cover;
  672.                 color: white;
  673.                 z-index: 200 !important;
  674.                 flex-direction: column;
  675.                 margin-bottom: -12px;
  676.             }
  677.         }
  678.         .btn-mission-spec {
  679.             border-radius: 50px !important;
  680.             padding: 12px 24px !important;
  681.             font-size: 20px !important;
  682.             font-weight: 500 !important;
  683.             background-clip: padding-box;
  684.             background-color: rgb(33 99 139) !important;
  685.         }
  686.         .btn-mission-spec-flottant {
  687.             border-radius: 50px !important;
  688.             padding: 10px 24px !important;
  689.             font-size: 20px !important;
  690.             font-weight: 500 !important;
  691.             background-clip: padding-box;
  692.             background-color: #2a41e8 !important;
  693.         }
  694.         #breadcrumbs {
  695.             transform: translateY(-190%);
  696.             right: 1.2% !important;
  697.         }
  698.         #breadcrumbs ul {
  699.             display: flex;
  700.         }
  701.         .btn-mission-spec:hover {
  702.             background-color: #2a41e8 !important; /* Utilisation de RGBA avec une opacité de 1 (complètement opaque) */
  703.         }
  704.         .spec-breadcrumbs {
  705.             bottom: -5rem !important;
  706.             top: auto !important;
  707.         }
  708.         .end-list-crumbs::before {
  709.             display: none !important;
  710.         }
  711.         .blog-post-content ul {
  712.             list-style-type: none; /* Supprimer les puces par défaut */
  713.         }
  714.         .blog-post-content ul li::before {
  715.             content: "\2022"; /* Code Unicode pour un point (•) */
  716.             color: #2a41e8; /* Couleur bleue pour les puces */
  717.             display: inline-block;
  718.             width: 1em; /* Espacement entre la puce et le texte */
  719.             margin-left: -1em; /* Pour aligner la puce avec le texte */
  720.         }
  721.         .blog-post-content ol {
  722.             list-style-type: decimal; /* Style de numéro par défaut pour les listes ordonnées */
  723.         }
  724.         /* Styles pour les listes ordonnées */
  725.         .blog-post-content ol {
  726.             list-style-type: none; /* Supprimer les numéros par défaut */
  727.             margin: 0; /* Supprimer les marges */
  728.             padding: 0; /* Supprimer les paddings */
  729.         }
  730.         .blog-post-content ol::marker {
  731.             color: #2a41e8; /* Couleur bleue pour les numéros */
  732.         }
  733.         .blog-post-content ol > li {
  734.             counter-increment: my-counter;
  735.         }
  736.         .blog-post-content ol > li::before {
  737.             content: counter(my-counter) "."; /* Utiliser le compteur pour les listes ordonnées avec un point */
  738.             color: #2a41e8; /* Couleur bleue pour les numéros */
  739.             font-weight: bold; /* Pour rendre les numéros en gras */
  740.             margin-right: 0.5em; /* Espacement entre le numéro et le texte */
  741.         }
  742.         .blog-post-content ol > li > *:first-child {
  743.             display: contents; /* Appliquer display: contents; à la première balise enfant de chaque li */
  744.         }
  745.         .blog-post-content h1,
  746.         .blog-post-content h2,
  747.         .blog-post-content h3 {
  748.             color: #2a41e8;
  749.         }
  750.         .widget-content.active:before, .widget-content:hover:before {
  751.             opacity: 0.8 !important;
  752.         }
  753.         @media (max-width: 980px) {
  754.             .spec {
  755.                 flex-basis: 100% !important;
  756.                 max-width: 100% !important;
  757.             }
  758.             .spec:last-child {
  759.                 margin-top: 16px !important; /* Ajoute une marge supérieure de 16px uniquement au dernier élément spécifique */
  760.             }
  761.             .spec-breadcrumbs {
  762.                 bottom: auto !important;
  763.                 top: 50% !important;
  764.             }
  765.             .article-right-flottant {
  766.                 max-width: 100% !important;
  767.                 margin: 0 !important;
  768.                 padding: 1rem 2rem !important;
  769.             }
  770.             .blog-post.single-post.spec {
  771.                 margin: 3rem 0rem !important;
  772.             }
  773.             #breadcrumbs {
  774.                 transform: translateY(-20%) translateX(-26px);
  775.             }
  776.             .blog-post.single-post .blog-post-thumbnail {
  777.                 width: 100%;
  778.                 height: 250px;
  779.             }
  780.         }
  781.         @media screen and (max-width: 500px) {
  782.             .blog-post-content h1 {
  783.                 font-size: 46px !important;
  784.             }
  785.             .blog-post-content {
  786.                 padding: 32px;
  787.             }
  788.             .blog-post-content ul {
  789.                 padding-inline-start: 20px;
  790.             }
  791.             .blog-post, .single-page-header .header-image {
  792.                 box-shadow: none !important;
  793.             }
  794.             #breadcrumbs {
  795.                 font-size: 12px !important;
  796.             }
  797.             .blog-post.single-post.spec {
  798.                 margin: 0 !important;
  799.             }
  800.             .blog-post-content {
  801.                 padding: 20px 2rem !important;
  802.             }
  803.         }
  804.     </style>
  805. {% endblock %}
  806. {% block body %}
  807.     <div class="container">
  808.         <div class="row">
  809.             <div class="col-md-12 margin-bottom-16 margin-top-16" style="padding: 0 32px;">
  810.                 <div class="widget-content active text-center" style="border-radius: 20px;position:relative">
  811.                     <img src={{ asset('uploads/img/6287a440d1176.jpg') }} alt="">
  812.                     <div class="overlay"></div>
  813.                     <nav aria-label="breadcrumb" class="breadcrumb-container">
  814.                         <ol class="breadcrumb">
  815.                             <li class="breadcrumb-item"><a href="{{ path('homepage') }}">Accueil</a></li>
  816.                             &nbsp;>&nbsp;
  817.                             <li class="breadcrumb-item active" aria-current="page">{{ publication.breadcrumbs }}</li>
  818.                         </ol>
  819.                     </nav>
  820.                     <div class="widget-text">
  821.                         <p style="font-size: 30px; line-height: 45px; color: white; font-weight: 600;">Offres d'emploi et missions freelance sans commission en France</p>
  822.                         <a href="{{ not is_granted('ROLE_ADMIN') and is_granted('ROLE_FREELANCE') and app.user.uniqueProfile.id == null ? '#complete-cv-dialog' : path('offre_search') }}">
  823.                             <span class="btn-mission-spec">Voir les offres</span>
  824.                         </a>
  825.                     </div>
  826.                 </div>
  827.             </div>
  828.             {#             <div class="col-md-12"> #}
  829.             {#                 <nav id="breadcrumbs" class="dark spec-breadcrumbs" #}
  830.             {#                      style="top: 0;right: 16px;bottom: -5rem;"> #}
  831.             {#                     <ul> #}
  832.             {#                         <li><a href="/">Accueil</a></li> #}
  833.             {#                         {% if publication.breadcrumbs %} #}
  834.             {#                             <li>{{ publication.breadcrumbs }}</li> #}
  835.             {#                         {% endif %} #}
  836.             {#                     </ul> #}
  837.             {#                 </nav> #}
  838.             {#             </div> #}
  839.         </div>
  840.         <div class="row d-flex flex-wrap margin-bottom-16">
  841.             <div class="blog-post single-post spec"
  842.                  style="border-radius: 20px; flex: 2; margin: 0 1rem; -webkit-box-flex: 2;max-width: calc(66.666% - 2rem);">
  843.                 <!-- Blog Post Content -->
  844.                 <div class="blog-post-content">
  845.                     <h1 class="margin-bottom-10"
  846.                         style="line-height: 1.2;font-size: 50px">{{ publication.bigtitle }}</h1>
  847.                     <div class="blog-post-info-list margin-bottom-20">
  848.                             <span class="meta-date blog-post-info "
  849.                                   style="width: fit-content;font-size: 12px;padding: 1px 5px;"><svg
  850.                                     style="margin-right: 5px;vertical-align: sub;opacity: 0.3" width="16"
  851.                                     height="16"
  852.                                     xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path
  853.                                         d="M152 24c0-13.3-10.7-24-24-24s-24 10.7-24 24V64H64C28.7 64 0 92.7 0 128v16 48V448c0 35.3 28.7 64 64 64H384c35.3 0 64-28.7 64-64V192 144 128c0-35.3-28.7-64-64-64H344V24c0-13.3-10.7-24-24-24s-24 10.7-24 24V64H152V24zM48 192H400V448c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V192z"/></svg> <span> {% set trans_month_hash = {
  854.                                         "January": "Janvier",
  855.                                         "February": "Février",
  856.                                         "March": "Mars",
  857.                                         "April": "Avril",
  858.                                         "May": "Mai",
  859.                                         "June": "Juin",
  860.                                         "July": "Juillet",
  861.                                         "August": "Août",
  862.                                         "September": "Septembre",
  863.                                         "October": "Octobre",
  864.                                         "November": "Novembre",
  865.                                         "December": "Décembre"
  866.                                     } %}{% if publication.getUpdatedAt() is empty or publication.getCreatedAt() == publication.getUpdatedAt() %}Publiée le {{ publication.getCreatedAt()|date("d") }} {{ trans_month_hash[publication.getCreatedAt()|date("F")] }} {{ publication.getCreatedAt()|date("Y") }}{% else %}Mis à jour le {{ publication.getUpdatedAt()|date("d") }} {{ trans_month_hash[publication.getUpdatedAt()|date("F")] }} {{ publication.getUpdatedAt()|date("Y") }}{% endif %}</span></span>
  867.                         <span class="meta-views blog-post-info "
  868.                               style="width: fit-content;font-size: 12px;padding: 1px 5px;"><svg
  869.                                 style="margin-right: 5px;vertical-align: sub;opacity: 0.3" width="16"
  870.                                 height="16"
  871.                                 xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path
  872.                                     d="M288 32c-80.8 0-145.5 36.8-192.6 80.6C48.6 156 17.3 208 2.5 243.7c-3.3 7.9-3.3 16.7 0 24.6C17.3 304 48.6 356 95.4 399.4C142.5 443.2 207.2 480 288 480s145.5-36.8 192.6-80.6c46.8-43.5 78.1-95.4 93-131.1c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C433.5 68.8 368.8 32 288 32zM144 256a144 144 0 1 1 288 0 144 144 0 1 1 -288 0zm144-64c0 35.3-28.7 64-64 64c-7.1 0-13.9-1.2-20.3-3.3c-5.5-1.8-11.9 1.6-11.7 7.4c.3 6.9 1.3 13.8 3.2 20.7c13.7 51.2 66.4 81.6 117.6 67.9s81.6-66.4 67.9-117.6c-11.1-41.5-47.8-69.4-88.6-71.1c-5.8-.2-9.2 6.1-7.4 11.7c2.1 6.4 3.3 13.2 3.3 20.3z"/></svg><span>{{ publication.view }} vues</span></span>
  873.                         <span class="meta-rtime blog-post-info "
  874.                               style="width: fit-content;font-size: 12px;padding: 1px 5px;"><svg
  875.                                 style="margin-right: 5px;vertical-align: sub;opacity: 0.3" width="16"
  876.                                 height="16"
  877.                                 xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--><path
  878.                                     d="M464 256A208 208 0 1 1 48 256a208 208 0 1 1 416 0zM0 256a256 256 0 1 0 512 0A256 256 0 1 0 0 256zM232 120V256c0 8 4 15.5 10.7 20l96 64c11 7.4 25.9 4.4 33.3-6.7s4.4-25.9-6.7-33.3L280 243.2V120c0-13.3-10.7-24-24-24s-24 10.7-24 24z"/></svg><span>{{ publication.rtTime }}min</span></span>
  879.                     </div>
  880.                     <div class="sidebar-sticky mobile-device" style="height: 260px;">
  881.                         <div id="sidebar-container" class="sidebar-content toc-wrapper">
  882.                             <div class="toc-title-container">
  883.                                 <p class="toc-title">
  884.                                     Sommaire
  885.                                 </p>
  886.                             </div>
  887.                             <div id="toc-container" class="toc-content">
  888.                                 <div id="ez-toc-container"
  889.                                      class="ez-toc-v2_0_37 counter-flat ez-toc-counter ez-toc-grey ez-toc-container-direction">
  890.                                     <div class="ez-toc-title-container">
  891.                                                      <span class="ez-toc-title-toggle"><a
  892.                                                              class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle"
  893.                                                              style="display: none;"><span
  894.                                                                  style="display: flex;align-items: center;width: 35px;height: 30px;justify-content: center;"><svg
  895.                                                                      style="fill: #999;color:#999"
  896.                                                                      xmlns="http://www.w3.org/2000/svg"
  897.                                                                      class="list-377408" width="20px" height="20px"
  898.                                                                      viewBox="0 0 24 24"
  899.                                                                      fill="none"><path
  900.                                                                          d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z"
  901.                                                                          fill="currentColor"></path></svg><svg
  902.                                                                      style="fill: #999;color:#999"
  903.                                                                      class="arrow-unsorted-368013"
  904.                                                                      xmlns="http://www.w3.org/2000/svg" width="10px"
  905.                                                                      height="10px"
  906.                                                                      viewBox="0 0 24 24" version="1.2"
  907.                                                                      baseProfile="tiny"><path
  908.                                                                          d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"></path></svg></span></a></span>
  909.                                     </div>
  910.                                     <nav>
  911.                                         {% set h2_titles = publication.content|extract_h2 %}
  912.                                         <ul class="ez-toc-list ez-toc-list-level-1"
  913.                                             style="margin-bottom: 0 !important;    padding-left: 0 !important;">
  914.                                             {% for title in h2_titles %}
  915.                                                 {% set anchor = title|slugify %}
  916.                                                 <li class="ez-toc-page-1">
  917.                                                     <a onclick="applyStyle(this)" class="ez-toc-link"
  918.                                                        href="#{{ anchor }}"
  919.                                                        title="{{ title }}">
  920.                                                         <svg class="icon" style="fill: #2a41e8 ;margin-right: 5px"
  921.                                                              width="16" height="16"
  922.                                                              xmlns="http://www.w3.org/2000/svg"
  923.                                                              viewBox="0 0 448 512">
  924.                                                             <!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
  925.                                                             <path
  926.                                                                 d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/>
  927.                                                         </svg> {% if title|length > 30 %}
  928.                                                             {{ title|slice(0, 30) }}...
  929.                                                         {% else %}
  930.                                                             {{ title }}
  931.                                                         {% endif %}</a>
  932.                                                 </li>
  933.                                             {% endfor %}
  934.                                         </ul>
  935.                                     </nav>
  936.                                 </div>
  937.                             </div>
  938.                             <div class="toc-footer">
  939.                                 <div class="social-section">
  940.                                     <a href="https://www.linkedin.com/sharing/share-offsite/?url=https://reassurez-moi.fr/guide/banque"
  941.                                        target="_blank">
  942.                                         <i class="fa-brands fa-linkedin-in" aria-hidden="true"></i>
  943.                                     </a>
  944.                                     <a href="https://twitter.com/share?url=https://reassurez-moi.fr/guide/banque"
  945.                                        target="_blank">
  946.                                         <i class="fa-brands fa-twitter" aria-hidden="true"></i>
  947.                                     </a>
  948.                                 </div>
  949.                             </div>
  950.                         </div>
  951.                         <div id="fix-sidebar-content" class="mt-2"></div>
  952.                         <div id="sidebar-advertblock-container" class="mt-2"></div>
  953.                     </div>
  954.                     <!-- Post Thumbnail -->
  955.                     <div class="blog-post-thumbnail">
  956.                         <div class="blog-post-thumbnail-inner">
  957.                             <img
  958.                                 src="{{ asset( publication.publicationImage ? 'uploads/img/'~publication.publicationImage.path : 'images/blog-04.jpg') }}"
  959.                                 alt="{{ publication.publicationImage ? publication.publicationImage.name : '' }}">
  960.                         </div>
  961.                     </div>
  962.                     <!--  Post Content -->
  963.                     {% set publication_content_with_anchors =publication.content|add_h2_anchors %}
  964.                     <!-- Blog Post Content -->
  965.                     {{ publication_content_with_anchors  | replace({'<li><p>': '<li>', '</p></li>': '</li>'})
  966.                     | replace({'https://www.freelance-dispo.fr': 'https://www.workdispo.com'})
  967.                     | raw }}
  968.                     {#                    {{ publication.content | replace({'<li><p>': '<li>', '</p></li>': '</li>'}) | raw }} #}
  969.                     <!-- Share Buttons -->
  970.                     {% include 'common/social_share.html.twig' %}
  971.                 </div>
  972.             </div>
  973.             <div class="article-right-flottant"
  974.                  style="border-radius: 20px; flex: 1; margin: 0; -webkit-box-flex: 1;max-width: calc(33.333% - 2rem);padding:  0;position: relative;">
  975.                 <div class="margin-bottom-4">
  976.                     <script src="https://platform.linkedin.com/in.js"
  977.                             type="text/javascript"> lang: fr_FR</script>
  978.                     <script type="IN/FollowCompany" data-id="35595945"
  979.                             data-counter="right"></script>
  980.                 </div>
  981.                 <div class="sidebar-sticky large-device" style="height: 260px;">
  982.                     <div id="sidebar-container" class="sidebar-content toc-wrapper">
  983.                         <div class="toc-title-container">
  984.                             <p class="toc-title">
  985.                                 Sommaire
  986.                             </p>
  987.                         </div>
  988.                         <div id="toc-container" class="toc-content">
  989.                             <div id="ez-toc-container"
  990.                                  class="ez-toc-v2_0_37 counter-flat ez-toc-counter ez-toc-grey ez-toc-container-direction">
  991.                                 <div class="ez-toc-title-container">
  992.                                                      <span class="ez-toc-title-toggle"><a
  993.                                                              class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle"
  994.                                                              style="display: none;"><span
  995.                                                                  style="display: flex;align-items: center;width: 35px;height: 30px;justify-content: center;"><svg
  996.                                                                      style="fill: #999;color:#999"
  997.                                                                      xmlns="http://www.w3.org/2000/svg"
  998.                                                                      class="list-377408" width="20px" height="20px"
  999.                                                                      viewBox="0 0 24 24"
  1000.                                                                      fill="none"><path
  1001.                                                                          d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z"
  1002.                                                                          fill="currentColor"></path></svg><svg
  1003.                                                                      style="fill: #999;color:#999"
  1004.                                                                      class="arrow-unsorted-368013"
  1005.                                                                      xmlns="http://www.w3.org/2000/svg" width="10px"
  1006.                                                                      height="10px"
  1007.                                                                      viewBox="0 0 24 24" version="1.2"
  1008.                                                                      baseProfile="tiny"><path
  1009.                                                                          d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"></path></svg></span></a></span>
  1010.                                 </div>
  1011.                                 <nav>
  1012.                                     {% set h2_titles = publication.content|extract_h2 %}
  1013.                                     <ul class="ez-toc-list ez-toc-list-level-1"
  1014.                                         style="margin-bottom: 0 !important;    padding-left: 0 !important;">
  1015.                                         {% for title in h2_titles %}
  1016.                                             {% set anchor = title|slugify %}
  1017.                                             <li class="ez-toc-page-1">
  1018.                                                 <a onclick="applyStyle(this)" class="ez-toc-link"
  1019.                                                    href="#{{ anchor }}"
  1020.                                                    title="{{ title }}">
  1021.                                                     <svg class="icon" style="fill: #2a41e8 ;margin-right: 5px"
  1022.                                                          width="16" height="16"
  1023.                                                          xmlns="http://www.w3.org/2000/svg"
  1024.                                                          viewBox="0 0 448 512">
  1025.                                                         <!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
  1026.                                                         <path
  1027.                                                             d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/>
  1028.                                                     </svg> {% if title|length > 30 %}
  1029.                                                         {{ title|slice(0, 30) }}...
  1030.                                                     {% else %}
  1031.                                                         {{ title }}
  1032.                                                     {% endif %}</a>
  1033.                                             </li>
  1034.                                         {% endfor %}
  1035.                                     </ul>
  1036.                                 </nav>
  1037.                             </div>
  1038.                         </div>
  1039.                         <div class="toc-footer">
  1040.                             <div class="social-section">
  1041.                                 <a href="https://www.linkedin.com/sharing/share-offsite/?url=https://reassurez-moi.fr/guide/banque"
  1042.                                    target="_blank">
  1043.                                     <i class="fa-brands fa-linkedin-in" aria-hidden="true"></i>
  1044.                                 </a>
  1045.                                 <a href="https://twitter.com/share?url=https://reassurez-moi.fr/guide/banque"
  1046.                                    target="_blank">
  1047.                                     <i class="fa-brands fa-twitter" aria-hidden="true"></i>
  1048.                                 </a>
  1049.                             </div>
  1050.                         </div>
  1051.                     </div>
  1052.                     <div id="fix-sidebar-content" class="mt-2"></div>
  1053.                     <div id="sidebar-advertblock-container" class="mt-2"></div>
  1054.                 </div>
  1055.                 <div class="blog-post single-post sticky-bottom"
  1056.                      style="margin-bottom: 0;display: none; flex-direction: column; padding: 12px; border-radius: 20px; position: sticky; top: 53%; background-image: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url(https://www.abcportage.fr/wp-content/themes/abcportage/assets/build/img/img_cta_right_small.jpg); background-size: cover; color: white;">
  1057.                     {# <div class="blog-post single-post" style=";display: flex;flex-direction: column;padding: 12px;border-radius: 20px;position: sticky;top: 50%;background-image: url('{{ absolute_url(asset('images/anthony-riera-kylWNDQFd5A-unsplash.jpg')) }}');background-size:cover;color:white;"> #}
  1058.                     <h3 style="text-align: center;margin: 1rem;color:white;font-size:23px;">Missions et emplois
  1059.                         disponibles</h3>
  1060.                     <div class="d-flex align-items-center" style="padding-left: 24px;margin: 5px 0;">
  1061.                         <svg style="fill: #2a41e8 ;margin-right: 5px" width="16" height="16"
  1062.                              xmlns="http://www.w3.org/2000/svg"
  1063.                              viewBox="0 0 448 512">
  1064.                             <!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
  1065.                             <path
  1066.                                 d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/>
  1067.                         </svg>
  1068.                         </span>
  1069.                         <span>Emplois et missions freelance</span>
  1070.                     </div>
  1071.                     <div class="d-flex align-items-center" style="padding-left: 24px;margin: 5px 0;">
  1072.                         <svg style="fill: #2a41e8 ;margin-right: 5px" width="16" height="16"
  1073.                              xmlns="http://www.w3.org/2000/svg"
  1074.                              viewBox="0 0 448 512">
  1075.                             <!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
  1076.                             <path
  1077.                                 d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/>
  1078.                         </svg>
  1079.                         </span>
  1080.                         <span>Emplois et missions avec du télétravail</span>
  1081.                     </div>
  1082.                     <div class="d-flex align-items-center" style="padding-left: 24px;margin: 5px 0;">
  1083.                         <svg style="fill: #2a41e8 ;margin-right: 5px" width="16" height="16"
  1084.                              xmlns="http://www.w3.org/2000/svg"
  1085.                              viewBox="0 0 448 512">
  1086.                             <!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
  1087.                             <path
  1088.                                 d="M438.6 105.4c12.5 12.5 12.5 32.8 0 45.3l-256 256c-12.5 12.5-32.8 12.5-45.3 0l-128-128c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0L160 338.7 393.4 105.4c12.5-12.5 32.8-12.5 45.3 0z"/>
  1089.                         </svg>
  1090.                         </span>
  1091.                         <span>Des offres sur toute la France</span>
  1092.                     </div>
  1093.                     <span style="margin: 1rem auto"><a
  1094.                             href="{{ not is_granted('ROLE_ADMIN') and is_granted('ROLE_FREELANCE') and app.user.uniqueProfile.id == null ? '#complete-cv-dialog' : path('offre_search') }}"><span
  1095.                                 class="btn-mission-spec-flottant"
  1096.                                 style="color: #FFFFFF">Voir les offres</span></a></span>
  1097.                 </div>
  1098.             </div>
  1099.         </div>
  1100.         <!-- Scroll detection block -->
  1101.         <div id="scrollBlock" class="scroll-block hidden"
  1102.             {# style="padding: 12px;display: flex;flex-direction: column;margin-bottom: -12px;" #}
  1103.         >
  1104.             <div style="text-align:center;">
  1105.                 <div class="closeButtonContainer">
  1106.                     <button onclick="closeScrollBlock()" id="closeButton">&times;</button>
  1107.                 </div>
  1108.                 <p style="color:white;font-size:20px;font-weight:700;margin-bottom: 32px;">Mission WorkDisponibles</p>
  1109.                 <span style="margin: 2rem auto">
  1110.                     <a
  1111.                         href="{{ not is_granted('ROLE_ADMIN') and is_granted('ROLE_FREELANCE')
  1112.                         and app.user.uniqueProfile.id == null ? '#complete-cv-dialog' : path('mission_search_default') }}"
  1113.                     >
  1114.                         <span class="btn-mission-spec-flottant" style="color: #FFFFFF">Voir les missions</span>
  1115.                     </a>
  1116.                 </span>
  1117.             </div>
  1118.         </div>
  1119.     </div>
  1120. {% endblock %}
  1121. {% block javascripts %}
  1122.     <script>
  1123.         document.addEventListener("DOMContentLoaded", function () {
  1124.             // JavaScript to handle scroll event
  1125.             window.addEventListener('scroll', function () {
  1126.                 // Get the scroll position
  1127.                 var scrollPosition = window.scrollY;
  1128.                 // Define the threshold to show the block
  1129.                 var threshold = 300; // Adjust as needed
  1130.                 // Get the scroll block element
  1131.                 var scrollBlock = document.getElementById('scrollBlock');
  1132.                 // Show or hide the block based on scroll position
  1133.                 if (scrollPosition > threshold) {
  1134.                     scrollBlock.classList.remove('hidden');
  1135.                     scrollBlock.classList.add('visible');
  1136.                 } else {
  1137.                     scrollBlock.classList.remove('visible');
  1138.                     scrollBlock.classList.add('hidden');
  1139.                 }
  1140.             });
  1141.         });
  1142.         // Fonction pour fermer le bloc de détection du défilement
  1143.         function closeScrollBlock() {
  1144.             console.log("Fermeture du bloc de détection du défilement");
  1145.             var scrollBlock = document.getElementById('scrollBlock');
  1146.             scrollBlock.classList.remove('visible');
  1147.             scrollBlock.classList.add('hidden_btn');
  1148.         }
  1149.         document.addEventListener('scroll', function () {
  1150.             const container = document.querySelector('.article-right-flottant');
  1151.             const stickyBottom = document.querySelector('.sticky-bottom');
  1152.             const containerRect = container.getBoundingClientRect();
  1153.             const windowHeight = window.innerHeight;
  1154.             const contentHeight = containerRect.height;
  1155.             // Assuming scrollPosition is the current vertical scroll position
  1156.             const scrollPosition = window.scrollY;
  1157.             // Fixed threshold of 250 pixels
  1158.             const fixedThreshold = 5;
  1159.             // Calculate how close we are to the bottom of the content
  1160.             const distanceToBottom = contentHeight - (scrollPosition + windowHeight);
  1161.             console.log(Math.abs(distanceToBottom))
  1162.             if (distanceToBottom < 0) {
  1163.                 if (Math.abs(distanceToBottom) >= 357 || window.scrollY <= 199) {
  1164.                     stickyBottom.style.display = 'none';
  1165.                 } else {
  1166.                     stickyBottom.style.display = 'flex';
  1167.                 }
  1168.             } else {
  1169.                 // Check if we are within 250 pixels from the bottom
  1170.                 if (distanceToBottom <= fixedThreshold || window.scrollY <= 199) {
  1171.                     stickyBottom.style.display = 'none';
  1172.                 } else {
  1173.                     stickyBottom.style.display = 'flex';
  1174.                 }
  1175.             }
  1176.         });
  1177.         function applyStyle(element) {
  1178.             // Supprimer la classe 'active' de tous les liens
  1179.             const links = document.querySelectorAll('.large-device .ez-toc-link');
  1180.             links.forEach(link => link.classList.remove('active'));
  1181.             if (window.innerWidth <= 500) {
  1182.                 const links_mobile = document.querySelectorAll('.mobile-device .ez-toc-link');
  1183.                 links_mobile.forEach(link => link.classList.remove('active'));
  1184.             }
  1185.             // Ajouter la classe 'active' au lien cliqué
  1186.             element.classList.add('active');
  1187.             // Appliquez le style à l'élément <a> lorsque le lien est cliqué
  1188.             // element.style.color = 'grey';
  1189.             // element.style.opacity = '0.8';
  1190.             element.classList.add('clicked-link');
  1191.         }
  1192.         // Sélectionnez tous les liens de votre sommaire
  1193.         const links = document.querySelectorAll('.large-device .ez-toc-link');
  1194.         const headings = Array.from(links).map(link => {
  1195.             const id = link.getAttribute('href').substring(1);
  1196.             return document.getElementById(id);
  1197.         });
  1198.         let currentActiveSection = null;
  1199.         let isScrollingToLink = false;
  1200.         function scrollToElement(element, container) {
  1201.             if (!isElementInViewport(element, container) && !isScrollingToLink) {
  1202.                 isScrollingToLink = true;
  1203.                 document.body.style.overflow = 'hidden';
  1204.                 element.scrollIntoView({ behavior: 'smooth', block: 'start' });
  1205.                 setTimeout(() => {
  1206.                     document.body.style.overflow = '';
  1207.                     isScrollingToLink = false;
  1208.                 }, 500);
  1209.             }
  1210.         }
  1211.         function isElementInViewport(element, container) {
  1212.             var elementRect = element.getBoundingClientRect();
  1213.             var containerRect = container.getBoundingClientRect();
  1214.             return (
  1215.                 elementRect.top >= containerRect.top &&
  1216.                 elementRect.left >= containerRect.left &&
  1217.                 elementRect.bottom <= containerRect.bottom &&
  1218.                 elementRect.right <= containerRect.right
  1219.             );
  1220.         }
  1221.         function updateActiveLink() {
  1222.             let indexToActivate = -1;
  1223.             // Parcours du bas vers le haut
  1224.             for (let i = headings.length - 1; i >= 0; i--) {
  1225.                 const heading = headings[i];
  1226.                 if (heading) {
  1227.                     const rect = heading.getBoundingClientRect();
  1228.                     if (rect.top <= 0) { // 0px du haut de la fenêtre
  1229.                         indexToActivate = i;
  1230.                         break;
  1231.                     }
  1232.                 }
  1233.             }
  1234.             links.forEach(link => link.classList.remove('active'));
  1235.             if (indexToActivate !== -1) {
  1236.                 links[indexToActivate].classList.add('active');
  1237.                 // Scroll le menu pour garder le lien actif visible
  1238.                 const activeLink = links[indexToActivate];
  1239.                 const tocList = activeLink.closest('.ez-toc-list');
  1240.                 if (tocList && activeLink) {
  1241.                     const linkRect = activeLink.getBoundingClientRect();
  1242.                     const listRect = tocList.getBoundingClientRect();
  1243.                     if (linkRect.top < listRect.top || linkRect.bottom > listRect.bottom) {
  1244.                         tocList.scrollTop += linkRect.top - listRect.top - listRect.height / 2 + linkRect.height / 2;
  1245.                     }
  1246.                 }
  1247.             }
  1248.         }
  1249.         window.addEventListener('scroll', updateActiveLink);
  1250.         document.addEventListener('DOMContentLoaded', () => {
  1251.             const links = document.querySelectorAll('.large-device .ez-toc-link');
  1252.             if (links.length > 0) {
  1253.                 links[0].classList.add('active');
  1254.             }
  1255.             if (window.innerWidth <= 500) {
  1256.                 const links_mobile = document.querySelectorAll('.mobile-device .ez-toc-link');
  1257.                 if (links_mobile.length > 0) {
  1258.                     links_mobile[0].classList.add('active');
  1259.                 }
  1260.             }
  1261.         });
  1262.         // window.addEventListener('scroll', () => {
  1263.         //     const stickyBottom = document.querySelector('.sticky-bottom');
  1264.         //     // console.log(window.scrollY); // ou window.pageYOffset
  1265.         //
  1266.         // });
  1267.     </script>
  1268. {% endblock %}