{% extends 'base.html.twig' %}
{% set title = '' %}
{% set description = '' %}
{% for blog in blogs %}
{% set title = blog.title %}
{% set description = blog.description %}
{% endfor %}
{% block title %}{{ title }}{% endblock %}
{% block meta_date_desc %}
<script type="application/ld+json">
{
"@context" : "https://schema.org",
"@type" : "WebSite",
"name" : "WorkDispo",
"url" : "https://www.workdispo.com/",
{% if blogs and blogs[0].getCreatedAt() is not empty %}
"datePublished": "{{ blogs[0].getCreatedAt()|date('c') }}",
{% endif %}
{% if blogs and blogs[0].getUpdatedAt() is not empty %}
"dateModified": "{{ blogs[0].getUpdatedAt()|date('c') }}"
{% endif %}
}
</script>
{% endblock %}
{% block meta %}
<meta name="description" content="{{ description }}">
<meta name="keywords" content="{{ blogs[0].keywords }}">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=3">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<script type="text/javascript">(window.NREUM || (NREUM = {})).init = {ajax: {deny_list: ["bam.nr-data.net"]}};
(window.NREUM || (NREUM = {})).loader_config = {
licenseKey: "NRJS-8c6c895b97ea60d5ee0",
applicationID: "1333848373"
};
window.NREUM || (NREUM = {}), __nr_require = function (t, e, n) {
function r(n) {
if (!e[n]) {
var i = e[n] = {exports: {}};
t[n][0].call(i.exports, function (e) {
var i = t[n][1][e];
return r(i || e)
}, i, i.exports)
}
return e[n].exports
}
if ("function" == typeof __nr_require) return __nr_require;
for (var i = 0; i < n.length; i++) r(n[i]);
return r
}({
1: [function (t, e, n) {
function r() {
}
function i(t, e, n, r) {
return function () {
return s.recordSupportability("API/" + e + "/called"), o(t + e, [u.now()].concat(c(arguments)), n ? null : this, r), n ? void 0 : this
}
}
var o = t("handle"), a = t(9), c = t(10), f = t("ee").get("tracer"), u = t("loader"), s = t(4),
d = NREUM;
"undefined" == typeof window.newrelic && (newrelic = d);
var p = ["setPageViewName", "setCustomAttribute", "setErrorHandler", "finished", "addToTrace", "inlineHit", "addRelease"],
l = "api-", v = l + "ixn-";
a(p, function (t, e) {
d[e] = i(l, e, !0, "api")
}), d.addPageAction = i(l, "addPageAction", !0), d.setCurrentRouteName = i(l, "routeName", !0), e.exports = newrelic, d.interaction = function () {
return (new r).get()
};
var m = r.prototype = {
createTracer: function (t, e) {
var n = {}, r = this, i = "function" == typeof e;
return o(v + "tracer", [u.now(), t, n], r), function () {
if (f.emit((i ? "" : "no-") + "fn-start", [u.now(), r, i], n), i) try {
return e.apply(this, arguments)
} catch (t) {
throw f.emit("fn-err", [arguments, this, t], n), t
} finally {
f.emit("fn-end", [u.now()], n)
}
}
}
};
a("actionText,setName,setAttribute,save,ignore,onEnd,getContext,end,get".split(","), function (t, e) {
m[e] = i(v, e)
}), newrelic.noticeError = function (t, e) {
"string" == typeof t && (t = new Error(t)), s.recordSupportability("API/noticeError/called"), o("err", [t, u.now(), !1, e])
}
}, {}], 2: [function (t, e, n) {
function r(t) {
if (NREUM.init) {
for (var e = NREUM.init, n = t.split("."), r = 0; r < n.length - 1; r++) if (e = e[n[r]], "object" != typeof e) return;
return e = e[n[n.length - 1]]
}
}
e.exports = {getConfiguration: r}
}, {}], 3: [function (t, e, n) {
var r = !1;
try {
var i = Object.defineProperty({}, "passive", {
get: function () {
r = !0
}
});
window.addEventListener("testPassive", null, i), window.removeEventListener("testPassive", null, i)
} catch (o) {
}
e.exports = function (t) {
return r ? {passive: !0, capture: !!t} : !!t
}
}, {}], 4: [function (t, e, n) {
function r(t, e) {
var n = [a, t, {name: t}, e];
return o("storeMetric", n, null, "api"), n
}
function i(t, e) {
var n = [c, t, {name: t}, e];
return o("storeEventMetrics", n, null, "api"), n
}
var o = t("handle"), a = "sm", c = "cm";
e.exports = {
constants: {SUPPORTABILITY_METRIC: a, CUSTOM_METRIC: c},
recordSupportability: r,
recordCustom: i
}
}, {}], 5: [function (t, e, n) {
function r() {
return c.exists && performance.now ? Math.round(performance.now()) : (o = Math.max((new Date).getTime(), o)) - a
}
function i() {
return o
}
var o = (new Date).getTime(), a = o, c = t(11);
e.exports = r, e.exports.offset = a, e.exports.getLastTimestamp = i
}, {}], 6: [function (t, e, n) {
function r(t, e) {
var n = t.getEntries();
n.forEach(function (t) {
"first-paint" === t.name ? l("timing", ["fp", Math.floor(t.startTime)]) : "first-contentful-paint" === t.name && l("timing", ["fcp", Math.floor(t.startTime)])
})
}
function i(t, e) {
var n = t.getEntries();
if (n.length > 0) {
var r = n[n.length - 1];
if (u && u < r.startTime) return;
var i = [r], o = a({});
o && i.push(o), l("lcp", i)
}
}
function o(t) {
t.getEntries().forEach(function (t) {
t.hadRecentInput || l("cls", [t])
})
}
function a(t) {
var e = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
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
}
function c(t) {
if (t instanceof y && !w) {
var e = Math.round(t.timeStamp), n = {type: t.type};
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])
}
}
function f(t) {
"hidden" === t && (u = v.now(), l("pageHide", [u]))
}
if (!("init" in NREUM && "page_view_timing" in NREUM.init && "enabled" in NREUM.init.page_view_timing && NREUM.init.page_view_timing.enabled === !1)) {
var u, s, d, p, l = t("handle"), v = t("loader"), m = t(8), g = t(3), y = NREUM.o.EV;
if ("PerformanceObserver" in window && "function" == typeof window.PerformanceObserver) {
s = new PerformanceObserver(r);
try {
s.observe({entryTypes: ["paint"]})
} catch (h) {
}
d = new PerformanceObserver(i);
try {
d.observe({entryTypes: ["largest-contentful-paint"]})
} catch (h) {
}
p = new PerformanceObserver(o);
try {
p.observe({type: "layout-shift", buffered: !0})
} catch (h) {
}
}
if ("addEventListener" in document) {
var w = !1, b = ["click", "keydown", "mousedown", "pointerdown", "touchstart"];
b.forEach(function (t) {
document.addEventListener(t, c, g(!1))
})
}
m(f)
}
}, {}], 7: [function (t, e, n) {
function r(t, e) {
if (!i) return !1;
if (t !== i) return !1;
if (!e) return !0;
if (!o) return !1;
for (var n = o.split("."), r = e.split("."), a = 0; a < r.length; a++) if (r[a] !== n[a]) return !1;
return !0
}
var i = null, o = null, a = /Version\/(\S+)\s+Safari/;
if (navigator.userAgent) {
var c = navigator.userAgent, f = c.match(a);
f && c.indexOf("Chrome") === -1 && c.indexOf("Chromium") === -1 && (i = "Safari", o = f[1])
}
e.exports = {agent: i, version: o, match: r}
}, {}], 8: [function (t, e, n) {
function r(t) {
function e() {
t(c && document[c] ? document[c] : document[o] ? "hidden" : "visible")
}
"addEventListener" in document && a && document.addEventListener(a, e, i(!1))
}
var i = t(3);
e.exports = r;
var o, a, c;
"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")
}, {}], 9: [function (t, e, n) {
function r(t, e) {
var n = [], r = "", o = 0;
for (r in t) i.call(t, r) && (n[o] = e(r, t[r]), o += 1);
return n
}
var i = Object.prototype.hasOwnProperty;
e.exports = r
}, {}], 10: [function (t, e, n) {
function r(t, e, n) {
e || (e = 0), "undefined" == typeof n && (n = t ? t.length : 0);
for (var r = -1, i = n - e || 0, o = Array(i < 0 ? 0 : i); ++r < i;) o[r] = t[e + r];
return o
}
e.exports = r
}, {}], 11: [function (t, e, n) {
e.exports = {exists: "undefined" != typeof window.performance && window.performance.timing && "undefined" != typeof window.performance.timing.navigationStart}
}, {}], ee: [function (t, e, n) {
function r() {
}
function i(t) {
function e(t) {
return t && t instanceof r ? t : t ? u(t, f, a) : a()
}
function n(n, r, i, o, a) {
if (a !== !1 && (a = !0), !l.aborted || o) {
t && a && t(n, r, i);
for (var c = e(i), f = m(n), u = f.length, s = 0; s < u; s++) f[s].apply(c, r);
var p = d[w[n]];
return p && p.push([b, n, r, c]), c
}
}
function o(t, e) {
h[t] = m(t).concat(e)
}
function v(t, e) {
var n = h[t];
if (n) for (var r = 0; r < n.length; r++) n[r] === e && n.splice(r, 1)
}
function m(t) {
return h[t] || []
}
function g(t) {
return p[t] = p[t] || i(n)
}
function y(t, e) {
l.aborted || s(t, function (t, n) {
e = e || "feature", w[n] = e, e in d || (d[e] = [])
})
}
var h = {}, w = {}, b = {
on: o,
addEventListener: o,
removeEventListener: v,
emit: n,
get: g,
listeners: m,
context: e,
buffer: y,
abort: c,
aborted: !1
};
return b
}
function o(t) {
return u(t, f, a)
}
function a() {
return new r
}
function c() {
(d.api || d.feature) && (l.aborted = !0, d = l.backlog = {})
}
var f = "nr@context", u = t("gos"), s = t(9), d = {}, p = {}, l = e.exports = i();
e.exports.getOrSetContext = o, l.backlog = d
}, {}], gos: [function (t, e, n) {
function r(t, e, n) {
if (i.call(t, e)) return t[e];
var r = n();
if (Object.defineProperty && Object.keys) try {
return Object.defineProperty(t, e, {value: r, writable: !0, enumerable: !1}), r
} catch (o) {
}
return t[e] = r, r
}
var i = Object.prototype.hasOwnProperty;
e.exports = r
}, {}], handle: [function (t, e, n) {
function r(t, e, n, r) {
i.buffer([t], r), i.emit(t, e, n)
}
var i = t("ee").get("handle");
e.exports = r, r.ee = i
}, {}], id: [function (t, e, n) {
function r(t) {
var e = typeof t;
return !t || "object" !== e && "function" !== e ? -1 : t === window ? 0 : a(t, o, function () {
return i++
})
}
var i = 1, o = "nr@id", a = t("gos");
e.exports = r
}, {}], loader: [function (t, e, n) {
function r() {
if (!M++) {
var t = T.info = NREUM.info, e = m.getElementsByTagName("script")[0];
if (setTimeout(u.abort, 3e4), !(t && t.licenseKey && t.applicationID && e)) return u.abort();
f(x, function (e, n) {
t[e] || (t[e] = n)
});
var n = a();
c("mark", ["onload", n + T.offset], null, "api"), c("timing", ["load", n]);
var r = m.createElement("script");
0 === t.agent.indexOf("http://") || 0 === t.agent.indexOf("https://") ? r.src = t.agent : r.src = l + "://" + t.agent, e.parentNode.insertBefore(r, e)
}
}
function i() {
"complete" === m.readyState && o()
}
function o() {
c("mark", ["domContent", a() + T.offset], null, "api")
}
var a = t(5), c = t("handle"), f = t(9), u = t("ee"), s = t(7), d = t(2), p = t(3),
l = d.getConfiguration("ssl") === !1 ? "http" : "https", v = window, m = v.document,
g = "addEventListener", y = "attachEvent", h = v.XMLHttpRequest, w = h && h.prototype, b = !1;
NREUM.o = {
ST: setTimeout,
SI: v.setImmediate,
CT: clearTimeout,
XHR: h,
REQ: v.Request,
EV: v.Event,
PR: v.Promise,
MO: v.MutationObserver
};
var E = "" + location, x = {
beacon: "bam.nr-data.net",
errorBeacon: "bam.nr-data.net",
agent: "js-agent.newrelic.com/nr-1216.min.js"
}, O = h && w && w[g] && !/CriOS/.test(navigator.userAgent), T = e.exports = {
offset: a.getLastTimestamp(),
now: a,
origin: E,
features: {},
xhrWrappable: O,
userAgent: s,
disabled: b
};
if (!b) {
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");
var M = 0
}
}, {}], "wrap-function": [function (t, e, n) {
function r(t, e) {
function n(e, n, r, f, u) {
function nrWrapper() {
var o, a, s, p;
try {
a = this, o = d(arguments), s = "function" == typeof r ? r(o, a) : r || {}
} catch (l) {
i([l, "", [o, a, f], s], t)
}
c(n + "start", [o, a, f], s, u);
try {
return p = e.apply(a, o)
} catch (v) {
throw c(n + "err", [o, a, v], s, u), v
} finally {
c(n + "end", [o, a, p], s, u)
}
}
return a(e) ? e : (n || (n = ""), nrWrapper[p] = e, o(e, nrWrapper, t), nrWrapper)
}
function r(t, e, r, i, o) {
r || (r = "");
var c, f, u, s = "-" === r.charAt(0);
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))
}
function c(n, r, o, a) {
if (!v || e) {
var c = v;
v = !0;
try {
t.emit(n, r, o, e, a)
} catch (f) {
i([f, n, r, o], t)
}
v = c
}
}
return t || (t = s), n.inPlace = r, n.flag = p, n
}
function i(t, e) {
e || (e = s);
try {
e.emit("internal-error", t)
} catch (n) {
}
}
function o(t, e, n) {
if (Object.defineProperty && Object.keys) try {
var r = Object.keys(t);
return r.forEach(function (n) {
Object.defineProperty(e, n, {
get: function () {
return t[n]
}, set: function (e) {
return t[n] = e, e
}
})
}), e
} catch (o) {
i([o], n)
}
for (var a in t) l.call(t, a) && (e[a] = t[a]);
return e
}
function a(t) {
return !(t && t instanceof Function && t.apply && !t[p])
}
function c(t, e) {
var n = e(t);
return n[p] = t, o(t, n, s), n
}
function f(t, e, n) {
var r = t[e];
t[e] = c(r, n)
}
function u() {
for (var t = arguments.length, e = new Array(t), n = 0; n < t; ++n) e[n] = arguments[n];
return e
}
var s = t("ee"), d = t(10), p = "nr@original", l = Object.prototype.hasOwnProperty, v = !1;
e.exports = r, e.exports.wrapFunction = c, e.exports.wrapInPlace = f, e.exports.argsToArray = u
}, {}]
}, {}, ["loader"]);</script>
<meta property="og:image"
content="{{ blogs and blogs[0].blogimage ? asset('uploads/img/' ~ blogs[0].blogimage.path) : absolute_url(asset('images/logo_freelance_new.png')) }}">
<meta property="og:image:secure_url"
content="{{ blogs and blogs[0].blogimage ? asset('uploads/img/' ~ blogs[0].blogimage.path) : absolute_url(asset('images/logo_freelance_new.png')) }}">
<meta property="og:title"
content="Freelance: missions {{ 'now'|date('Y') }} sur toute la France | WorkDispo"/>
<meta property="og:type" content="WorkDispo"/>
<meta property="og:url" content="{{ app.request.getBaseURL() }}"/>
<meta name="Content-Language" content="fr">
<meta name="author" content="www.workdispo.com">
<meta name="revisit-after" content="revisit-after">
<meta name="pragma" content="no-cache">
<meta name="classification" content="WorkDispo: des missions sans commission">
<meta property="og:site_name" data-js-id="meta-og_site_name" content="WorkDispo">
<meta http-equiv="Cache-Control" content="max-age=31536000">
{% endblock %}
{% block stylesheets %}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css"
integrity="sha384-jLKHWMFR2JTbi9pi0bwyzQFsL53L3Y9fz2A3bQ7NVK/Ee5TV04R5tT7/3Xi4XlGZ" crossorigin="anonymous">
<style>
.blog-post-content h1 {
color: black;
}
.mobile-device {
display: none;
}
.large-device {
display: block;
}
.ez-toc-link {
position: relative;
padding-left: 24px; /* Adjust based on the width of the icon */
text-decoration: none; /* Remove underline */
color: blue; /* Default color */
}
.ez-toc-link .icon {
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
display: none; /* Hide icon by default */
fill: #2a41e8;
}
.ez-toc-link.active .icon,
.ez-toc-link.visited .icon {
display: block; /* Show icon when active or visited */
}
.ez-toc-link.active {
color: blue; /* Color when active */
}
.ez-toc-link.active a {
color: #2a41e8;
}
.ez-toc-link.visited {
color: gray; /* Color when visited */
}
.sidebar-sticky {
overflow-y: hidden;
}
.toc-title {
color: #000000;
font-size: 1.8rem;
font-weight: 700;
text-align: center;
margin-bottom: 1.5rem;
}
.ez-toc-container-direction {
display: flex;
flex-direction: column;
height: 100%;
}
.toc-content {
overflow: hidden; /* Cache la scrollbar horizontale */
}
.ez-toc-list {
max-height: 200px; /* Définissez la hauteur maximale de la liste défilante selon votre besoin */
overflow-y: auto; /* Permet le défilement vertical */
padding-right: 15px; /* Pour compenser la disparition de la scrollbar */
scrollbar-width: none; /* Cacher la scrollbar pour Firefox */
}
#sidebar-container::-webkit-scrollbar {
/*display: none; !* Cacher la scrollbar pour les navigateurs Webkit *!*/
}
.sidebar-sticky {
border: 3px solid #f1f1f1;
border-radius: 10px;
padding: 20px 0 10px 0;
margin-bottom: 8px;
position: sticky;
top: 14%;
}
#sidebar-container {
max-height: 230px !important;
}
.toc-container {
overflow-y: scroll;
}
.ez-toc-list::-webkit-scrollbar {
display: none;
}
.ez-toc-list li {
list-style: none;
position: relative;
padding-left: 25px;
margin-bottom: 10px;
}
.ez-toc-page-1 a.ez-toc-link {
color: gray;
text-decoration: none; /* Enlève la décoration du texte (soulignement) */
font-size: medium;
}
.ez-toc-page-1 a.ez-toc-link.active {
color: #2a41e8;
}
div.clicked-link a {
color: grey;
opacity: 0.8;
}
/*.ez-toc-list li:before {*/
/* content: "\f00c"; !* Code Unicode pour l'icône de coche de Font Awesome *!*/
/* font-family: "Font Awesome 5 Free"; !* Police de Font Awesome *!*/
/* font-weight: 900; !* Pour la version solide de l'icône *!*/
/* color: green; !* Couleur de l'icône, vous pouvez la changer selon vos besoins *!*/
/* position: absolute;*/
/* left: 0;*/
/* top: 0;*/
/*}*/
.widget-content {
position: relative;
}
.breadcrumb-container {
font-size: 11px;
color: white;
position: absolute;
top: 0px; /* Ajustez la valeur selon votre besoin */
left: 10px; /* Ajustez la valeur selon votre besoin */
z-index: 100; /* Assurez-vous que cette valeur est plus élevée que celle de l'image */
}
.breadcrumb {
/*background-color: white;*/
padding: 10px 16px;
list-style: none;
display: flex;
align-items: center;
border-radius: 5px; /* Ajoutez des bordures arrondies si nécessaire */
}
.breadcrumb-item a {
color: white; /* Couleur du texte du lien */
text-decoration: none; /* Supprime le soulignement du lien */
cursor: pointer; /* Assure que le curseur devient une main */
}
.breadcrumb-item a:hover {
text-decoration: none; /* Soulignement au survol */
}
.breadcrumb-item.active {
color: white; /* Couleur du texte pour l'élément actif */
font-size: 12px;
text-decoration: underline;
text-decoration-color: blue; /* Couleur du soulignement */
text-decoration-thickness: 2px; /* Épaisseur du soulignement */
text-underline-offset: 4px; /* Espace entre le texte et le soulignement */
}
.breadcrumb-item.active a {
text-decoration: none; /* Supprime le soulignement pour l'élément actif */
cursor: default; /* Coursur de texte pour l'élément actif */
}
.blog-post-content ol {
margin: 0 0 0 20px !important;
}
.blog-post-content h2 {
font-weight: bold;
scroll-margin-top: 80px; /* Pour que le scroll auto s'arrête juste au début du h2 */
}
.blog-post-content h3 {
color: black !important;
font-size: 20px !important;
font-weight: bold;
display: inline-block; /* Assure que l'élément h3 ne prend que la largeur nécessaire */
text-decoration: underline; /* Soulignement du texte */
text-decoration-color: #2a41e8; /* Couleur du soulignement */
text-underline-position: under;
}
.closeButtonContainer {
display: flex;
justify-content: flex-end;
}
.scroll-block {
position: fixed;
bottom: 0; /* Initially hidden below the screen */
left: 5%;
width: 90%;
background-color: #333;
color: #fff;
padding: 12px 20px 41px 20px;
transition: bottom 0.3s ease; /* Smooth transition for hiding */
transform: translateY(100%); /* Le bloc est déplacé vers le bas de l'écran */
display: none;
}
.visible {
transform: translateY(0);
}
.hidden {
transform: translateY(100%);
}
.hidden_btn {
transform: translateY(100%) !important;
}
@media only screen and (max-width: 500px) {
#wrapper {
width: -webkit-fill-available;
}
.sidebar-sticky {
position: static !important;
margin-bottom: 1rem;
}
.ez-toc-list li {
list-style-type: none !important; /* Remove bullets from the list */
padding-left: 9px !important; /* Remove padding from the list */
}
.mobile-device {
display: block;
}
.large-device {
display: none;
}
.scroll-block {
display: block;
border-radius: 20px;
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;
z-index: 200 !important;
flex-direction: column;
margin-bottom: -12px;
}
}
.btn-mission-spec {
border-radius: 50px !important;
padding: 12px 24px !important;
font-size: 20px !important;
font-weight: 500 !important;
background-clip: padding-box;
background-color: rgb(33 99 139) !important;
}
.btn-mission-spec-flottant {
border-radius: 50px !important;
padding: 10px 24px !important;
font-size: 20px !important;
font-weight: 500 !important;
background-clip: padding-box;
background-color: #2a41e8 !important;
}
#breadcrumbs {
transform: translateY(-190%);
right: 1.2% !important;
}
#breadcrumbs ul {
display: flex;
}
.btn-mission-spec:hover {
background-color: #2a41e8 !important; /* Utilisation de RGBA avec une opacité de 1 (complètement opaque) */
}
.spec-breadcrumbs {
bottom: -5rem !important;
top: auto !important;
}
.end-list-crumbs::before {
display: none !important;
}
.blog-post-content ul {
list-style-type: none; /* Supprimer les puces par défaut */
}
.blog-post-content ul li::before {
content: "\2022"; /* Code Unicode pour un point (•) */
color: #2a41e8; /* Couleur bleue pour les puces */
display: inline-block;
width: 1em; /* Espacement entre la puce et le texte */
margin-left: -1em; /* Pour aligner la puce avec le texte */
}
.blog-post-content ol {
list-style-type: decimal; /* Style de numéro par défaut pour les listes ordonnées */
}
/* Styles pour les listes ordonnées */
.blog-post-content ol {
list-style-type: none; /* Supprimer les numéros par défaut */
margin: 0; /* Supprimer les marges */
padding: 0; /* Supprimer les paddings */
}
.blog-post-content ol::marker {
color: #2a41e8; /* Couleur bleue pour les numéros */
}
.blog-post-content ol > li {
counter-increment: my-counter;
}
.blog-post-content ol > li::before {
content: counter(my-counter) "."; /* Utiliser le compteur pour les listes ordonnées avec un point */
color: #2a41e8; /* Couleur bleue pour les numéros */
font-weight: bold; /* Pour rendre les numéros en gras */
margin-right: 0.5em; /* Espacement entre le numéro et le texte */
}
.blog-post-content ol > li > *:first-child {
display: contents; /* Appliquer display: contents; à la première balise enfant de chaque li */
}
.blog-post-content h2,
.blog-post-content h3 {
color: #2a41e8;
}
.widget-content.active:before, .widget-content:hover:before {
opacity: 0.8 !important;
}
@media (max-width: 980px) {
.spec {
flex-basis: 100% !important;
max-width: 100% !important;
}
.spec:last-child {
margin-top: 16px !important; /* Ajoute une marge supérieure de 16px uniquement au dernier élément spécifique */
}
.spec-breadcrumbs {
bottom: auto !important;
top: 50% !important;
}
.article-right-flottant {
max-width: 100% !important;
margin: 0 !important;
padding: 1rem 2rem !important;
}
.blog-post.single-post.spec {
margin: 3rem 0rem !important;
}
#breadcrumbs {
transform: translateY(-20%) translateX(-26px);
}
.blog-post.single-post .blog-post-thumbnail {
width: 100%;
height: 250px;
}
}
@media screen and (max-width: 500px) {
.container {
padding: 0;
overflow-x: hidden;
}
.blog-post-content h1 {
font-size: 46px !important;
}
.blog-post-content {
padding: 32px;
}
.blog-post-content ul {
padding-inline-start: 20px;
}
.blog-post, .single-page-header .header-image {
box-shadow: none !important;
}
#breadcrumbs {
font-size: 12px !important;
}
.blog-post.single-post.spec {
margin: 0 !important;
}
.blog-post-content {
padding: 20px 2rem !important;
}
}
</style>
{% endblock %}
{% block body %}
<div class="container">
<div class="row">
<div class="col-md-12 margin-bottom-16 margin-top-16" style="padding: 0 32px;">
<div class="widget-content active text-center" style="border-radius: 20px; position: relative;">
<img src="{{ asset('uploads/img/6287a440d1176.jpg') }}" alt="" class="widget-image">
<div class="overlay"></div>
{% for blog in blogs %}
<nav aria-label="breadcrumb" class="breadcrumb-container">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{{ path('blog') }}">Blog</a></li>
>
<li class="breadcrumb-item active" aria-current="page">{{ blog.breadcrumb }}</li>
</ol>
</nav>
{% endfor %}
<div class="widget-text">
<p style="font-size: 30px; line-height: 45px; color: white; font-weight: 600;">Offres d'emploi
et missions freelance sans commission en France</p>
<a href="{{ not is_granted('ROLE_ADMIN') and is_granted('ROLE_FREELANCE') and app.user.uniqueProfile.id == null ? '#complete-cv-dialog' : path('offre_search') }}">
<span class="btn-mission-spec">Voir les offres</span>
</a>
</div>
</div>
</div>
{# <div class="col-md-12"> #}
{# {% for blog in blogs %} #}
{# <nav id="breadcrumbs" class="dark spec-breadcrumbs" #}
{# style="top: 0;right: 16px;bottom: -5rem;"> #}
{# <ul> #}
{# <li><a href="{{ path('blog') }}">Blog</a></li> #}
{# <li>{{ blog.breadcrumb }}</li> #}
{# </ul> #}
{# </nav> #}
{# {% endfor %} #}
{# </div> #}
</div>
<div class="row d-flex flex-wrap margin-bottom-16">
<div class="blog-post single-post spec"
style="border-radius: 20px; flex: 2; margin: 0 1rem; -webkit-box-flex: 2;max-width: calc(66.666% - 2rem);">
<!-- Blog Post Content -->
<div class="blog-post-content">
{% for blog in blogs %}
<h1 class="margin-bottom-10" style="line-height: 1.2;font-size: 50px">{{ blog.bigtitle }}</h1>
<div class="blog-post-info-list margin-bottom-20">
<span class="meta-date blog-post-info "
style="width: fit-content;font-size: 12px;padding: 1px 5px;"><svg
style="margin-right: 5px;vertical-align: sub;opacity: 0.3" width="13"
height="13"
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
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 = {
"January": "Janvier",
"February": "Février",
"March": "Mars",
"April": "Avril",
"May": "Mai",
"June": "Juin",
"July": "Juillet",
"August": "Août",
"September": "Septembre",
"October": "Octobre",
"November": "Novembre",
"December": "Décembre"
} %}{% if blog.getUpdatedAt() is empty or blog.getUpdatedAt()==blog.getCreatedAt() %}Publiée le {{ blog.getCreatedAt()|date("d") }} {{ trans_month_hash[blog.getCreatedAt()|date("F")] }} {{ blog.getCreatedAt()|date("Y") }}{% else %}Mis à jour le {{ blog.getUpdatedAt()|date("d") }} {{ trans_month_hash[blog.getUpdatedAt()|date("F")] }} {{ blog.getUpdatedAt()|date("Y") }}{% endif %}</span></span>
<span class="meta-views blog-post-info "
style="width: fit-content;font-size: 12px;padding: 1px 5px;"><svg
style="margin-right: 5px;vertical-align: sub;opacity: 0.3" width="13"
height="13"
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
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>{{ blog.view }} vues</span></span>
<span class="meta-rtime blog-post-info "
style="width: fit-content;font-size: 12px;padding: 1px 5px;"><svg
style="margin-right: 5px;vertical-align: sub;opacity: 0.3" width="13"
height="13"
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
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>{{ blog.rtTime }}min</span></span>
</div>
<div class="sidebar-sticky mobile-device" style="height: 260px;">
<div id="sidebar-container" class="sidebar-content toc-wrapper">
<div class="toc-title-container">
<p class="toc-title">
Sommaire
</p>
</div>
<div id="toc-container" class="toc-content">
<div id="ez-toc-container"
class="ez-toc-v2_0_37 counter-flat ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<span class="ez-toc-title-toggle"><a
class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle"
style="display: none;"><span
style="display: flex;align-items: center;width: 35px;height: 30px;justify-content: center;"><svg
style="fill: #999;color:#999"
xmlns="http://www.w3.org/2000/svg"
class="list-377408" width="20px" height="20px"
viewBox="0 0 24 24"
fill="none"><path
d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z"
fill="currentColor"></path></svg><svg
style="fill: #999;color:#999"
class="arrow-unsorted-368013"
xmlns="http://www.w3.org/2000/svg" width="10px"
height="10px"
viewBox="0 0 24 24" version="1.2"
baseProfile="tiny"><path
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>
</div>
<nav>
{% set h2_titles = blogs[0].content|extract_h2 %}
<ul class="ez-toc-list ez-toc-list-level-1"
style="margin-bottom: 0 !important; padding-left: 0 !important;">
{% for title in h2_titles %}
{% set anchor = title|slugify|lower %}
<li class="ez-toc-page-1">
<a onclick="applyStyle(this)" class="ez-toc-link"
href="#{{ anchor }}"
title="{{ title }}">
<svg class="icon" style="fill: #2a41e8 ;margin-right: 5px"
width="16" height="16"
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
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"/>
</svg> {% if title|length > 30 %}
{{ title|slice(0, 30) }}...
{% else %}
{{ title }}
{% endif %}</a>
</li>
{% endfor %}
</ul>
</nav>
</div>
</div>
<div class="toc-footer">
<div class="social-section">
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://reassurez-moi.fr/guide/banque"
target="_blank">
<i class="fa-brands fa-linkedin-in" aria-hidden="true"></i>
</a>
<a href="https://twitter.com/share?url=https://reassurez-moi.fr/guide/banque"
target="_blank">
<i class="fa-brands fa-twitter" aria-hidden="true"></i>
</a>
</div>
</div>
</div>
<div id="fix-sidebar-content" class="mt-2"></div>
<div id="sidebar-advertblock-container" class="mt-2"></div>
</div>
<!-- Blog Post Thumbnail -->
<div class="blog-post-thumbnail">
<div class="blog-post-thumbnail-inner">
<img
src="{{ asset( blog.blogimage ? 'uploads/img/'~blog.blogimage.path : 'images/blog-04.jpg') }}"
alt="{{ blog.blogimage ? blog.blogimage.name : '' }}">
</div>
</div>
{% set blog_content_with_anchors = blog.content|add_h2_anchors %}
<!-- Blog Post Content -->
{{ blog_content_with_anchors | replace({'<li><p>': '<li>', '</p></li>': '</li>'})
| replace({'https://www.freelance-dispo.fr': 'https://www.workdispo.com'})
| raw }}
<!-- Share Buttons -->
{% include 'common/social_share.html.twig' %}
<div class="task-tags d-flex col-md-12" style="gap: 2px;flex-wrap: wrap">
{% if blog.getSousThematique() is not empty %}
{% for sous_thematique in blog.getSousThematique() %}
<a style="background-color: rgba(42, 65, 232, .07)"
href="{{ path('blog_show',{sousThematique:sous_thematique.getSlug()}) }}">
<span
style="color: #2a41e8 !important;font-size: 16px;">{{ sous_thematique.getName() }}</span>
</a>
{% endfor %}
{% else %}
{% for thematique in blog.getThematique() %}
<a style="background-color: rgba(42, 65, 232, .07)"
href="{{ path('blog_show',{thematique:thematique.getSlug()}) }}">
<span
style="color: #2a41e8 !important;font-size: 16px;"> {{ thematique.getName() }}</span>
</a>
{% endfor %}
{% endif %}
</div>
{% endfor %}
</div>
</div>
<div class="article-right-flottant"
style="border-radius: 20px; flex: 1; margin: 0; -webkit-box-flex: 1;max-width: calc(33.333% - 2rem);padding: 0;position: relative;">
<div class="margin-bottom-4">
<script src="https://platform.linkedin.com/in.js"
type="text/javascript"> lang: fr_FR</script>
<script type="IN/FollowCompany" data-id="35595945"
data-counter="right"></script>
</div>
<div class="sidebar-sticky large-device" style="height: 260px;">
<div id="sidebar-container" class="sidebar-content toc-wrapper">
<div class="toc-title-container">
<p class="toc-title">
Sommaire
</p>
</div>
<div id="toc-container" class="toc-content">
<div id="ez-toc-container"
class="ez-toc-v2_0_37 counter-flat ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<span class="ez-toc-title-toggle"><a
class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle"
style="display: none;"><span
style="display: flex;align-items: center;width: 35px;height: 30px;justify-content: center;"><svg
style="fill: #999;color:#999"
xmlns="http://www.w3.org/2000/svg"
class="list-377408" width="20px" height="20px"
viewBox="0 0 24 24"
fill="none"><path
d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z"
fill="currentColor"></path></svg><svg
style="fill: #999;color:#999"
class="arrow-unsorted-368013"
xmlns="http://www.w3.org/2000/svg" width="10px"
height="10px"
viewBox="0 0 24 24" version="1.2"
baseProfile="tiny"><path
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>
</div>
<nav>
{% set h2_titles = blogs[0].content|extract_h2 %}
<ul class="ez-toc-list ez-toc-list-level-1"
style="margin-bottom: 0 !important; padding-left: 0 !important;">
{% for title in h2_titles %}
{% set anchor = title|slugify|lower %}
<li class="ez-toc-page-1">
<a onclick="applyStyle(this)" class="ez-toc-link" href="#{{ anchor }}"
title="{{ title }}">
<svg class="icon" style="fill: #2a41e8 ;margin-right: 5px"
width="16" height="16"
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
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"/>
</svg> {% if title|length > 30 %}
{{ title|slice(0, 30) }}...
{% else %}
{{ title }}
{% endif %}</a>
</li>
{% endfor %}
</ul>
</nav>
</div>
</div>
<div class="toc-footer">
<div class="social-section">
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://reassurez-moi.fr/guide/banque"
target="_blank">
<i class="fa-brands fa-linkedin-in" aria-hidden="true"></i>
</a>
<a href="https://twitter.com/share?url=https://reassurez-moi.fr/guide/banque"
target="_blank">
<i class="fa-brands fa-twitter" aria-hidden="true"></i>
</a>
</div>
</div>
</div>
<div id="fix-sidebar-content" class="mt-2"></div>
<div id="sidebar-advertblock-container" class="mt-2"></div>
</div>
<div class="blog-post single-post sticky-bottom"
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;">
{# <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;"> #}
<h3 style="text-align: center;margin: 1rem;color:white;font-size:23px;">Missions et emplois
disponibles</h3>
<div class="d-flex align-items-center" style="padding-left: 24px;margin: 5px 0;">
<svg style="fill: #2a41e8 ;margin-right: 5px" width="16" height="16"
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
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"/>
</svg>
</span>
<span>Emplois et missions freelance</span>
</div>
<div class="d-flex align-items-center" style="padding-left: 24px;margin: 5px 0;">
<svg style="fill: #2a41e8 ;margin-right: 5px" width="16" height="16"
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
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"/>
</svg>
</span>
<span>Emplois et missions avec du télétravail</span>
</div>
<div class="d-flex align-items-center" style="padding-left: 24px;margin: 5px 0;">
<svg style="fill: #2a41e8 ;margin-right: 5px" width="16" height="16"
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
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"/>
</svg>
</span>
<span>Des offres sur toute la France</span>
</div>
<span style="margin: 1rem auto"><a
href="{{ not is_granted('ROLE_ADMIN') and is_granted('ROLE_FREELANCE') and app.user.uniqueProfile.id == null ? '#complete-cv-dialog' : path('offre_search') }}"><span
class="btn-mission-spec-flottant"
style="color: #FFFFFF">Voir les offres</span></a></span>
</div>
</div>
</div>
<!-- Scroll detection block -->
<div id="scrollBlock" class="scroll-block hidden"
{# style="padding: 12px;display: flex;flex-direction: column;margin-bottom: -12px;" #}
>
<div style="text-align:center;">
<div class="closeButtonContainer">
<button onclick="closeScrollBlock()" id="closeButton">×</button>
</div>
<p style="color:white;font-size:20px;font-weight:700;margin-bottom: 32px;">Missions freelance
disponibles</p>
<span style="margin: 2rem auto">
<a
href="{{ not is_granted('ROLE_ADMIN') and is_granted('ROLE_FREELANCE')
and app.user.uniqueProfile.id == null ? '#complete-cv-dialog' : path('mission_search_default') }}"
>
<span class="btn-mission-spec-flottant" style="color: #FFFFFF">Voir les missions</span>
</a>
</span>
</div>
</div>
</div>
{% endblock %}
{% block javascripts %}
<script>
document.addEventListener("DOMContentLoaded", function () {
// JavaScript to handle scroll event
window.addEventListener('scroll', function () {
// Get the scroll position
var scrollPosition = window.scrollY;
// Define the threshold to show the block
var threshold = 300; // Adjust as needed
// Get the scroll block element
var scrollBlock = document.getElementById('scrollBlock');
// Show or hide the block based on scroll position
if (scrollPosition > threshold) {
scrollBlock.classList.remove('hidden');
scrollBlock.classList.add('visible');
} else {
scrollBlock.classList.remove('visible');
scrollBlock.classList.add('hidden');
}
});
});
// Fonction pour fermer le bloc de détection du défilement
function closeScrollBlock() {
console.log("Fermeture du bloc de détection du défilement");
var scrollBlock = document.getElementById('scrollBlock');
scrollBlock.classList.remove('visible');
scrollBlock.classList.add('hidden_btn');
}
document.addEventListener('scroll', function () {
const container = document.querySelector('.article-right-flottant');
const stickyBottom = document.querySelector('.sticky-bottom');
const containerRect = container.getBoundingClientRect();
const windowHeight = window.innerHeight;
const contentHeight = containerRect.height;
// Assuming scrollPosition is the current vertical scroll position
const scrollPosition = window.scrollY;
// Fixed threshold of 250 pixels
const fixedThreshold = 5;
// Calculate how close we are to the bottom of the content
const distanceToBottom = contentHeight - (scrollPosition + windowHeight);
console.log(Math.abs(distanceToBottom))
if (distanceToBottom < 0) {
if (Math.abs(distanceToBottom) >= 357 || window.scrollY <= 199) {
stickyBottom.style.display = 'none';
} else {
stickyBottom.style.display = 'flex';
}
} else {
// Check if we are within 250 pixels from the bottom
if (distanceToBottom <= fixedThreshold || window.scrollY <= 199) {
stickyBottom.style.display = 'none';
} else {
stickyBottom.style.display = 'flex';
}
}
});
function applyStyle(element) {
// Supprimer la classe 'active' de tous les liens
const links = document.querySelectorAll('.large-device .ez-toc-link');
links.forEach(link => link.classList.remove('active'));
if (window.innerWidth <= 500) {
const links_mobile = document.querySelectorAll('.mobile-device .ez-toc-link');
links_mobile.forEach(link => link.classList.remove('active'));
}
// Ajouter la classe 'active' au lien cliqué
element.classList.add('active');
// Appliquez le style à l'élément <a> lorsque le lien est cliqué
// element.style.color = 'grey';
// element.style.opacity = '0.8';
element.classList.add('clicked-link');
}
// Sélectionnez tous les liens de votre sommaire
const links = document.querySelectorAll('.large-device .ez-toc-list a');
const sections = Array.from(links).map(link => {
const sectionId = link.getAttribute('href').substring(1);
return document.getElementById(sectionId);
});
let currentActiveSection = null;
let isScrollingToLink = false;
function scrollToElement(element, container) {
if (!isElementInViewport(element, container) && !isScrollingToLink) {
isScrollingToLink = true;
document.body.style.overflow = 'hidden';
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
setTimeout(() => {
document.body.style.overflow = '';
isScrollingToLink = false;
}, 100);
}
}
function isElementInViewport(element, container) {
var elementRect = element.getBoundingClientRect();
var containerRect = container.getBoundingClientRect();
return (
elementRect.top >= containerRect.top &&
elementRect.left >= containerRect.left &&
elementRect.bottom <= containerRect.bottom &&
elementRect.right <= containerRect.right
);
}
function updateActiveLink() {
if (isScrollingToLink) return;
const scrollPosition = window.scrollY || window.pageYOffset;
let newActiveSection = null;
sections.some(section => {
const sectionTop = section.offsetTop;
const sectionHeight = section.offsetHeight;
if (scrollPosition >= sectionTop && scrollPosition < sectionTop + sectionHeight) {
newActiveSection = section;
return true;
}
});
if (newActiveSection && newActiveSection !== currentActiveSection) {
currentActiveSection = newActiveSection;
links.forEach(link => {
const sectionId = link.getAttribute('href').substring(1);
const section = document.getElementById(sectionId);
const sommaire = document.querySelector('.large-device .ez-toc-list');
if (section === currentActiveSection) {
link.classList.add('active');
scrollToElement(link, sommaire);
} else {
link.classList.remove('active');
}
});
}
}
window.addEventListener('scroll', updateActiveLink);
document.addEventListener('DOMContentLoaded', () => {
const links = document.querySelectorAll('.large-device .ez-toc-link');
if (links.length > 0) {
links[0].classList.add('active');
}
if (window.innerWidth <= 500) {
const links_mobile = document.querySelectorAll('.mobile-device .ez-toc-link');
if (links_mobile.length > 0) {
links_mobile[0].classList.add('active');
}
}
});
// window.addEventListener('scroll', () => {
// const stickyBottom = document.querySelector('.sticky-bottom');
// // console.log(window.scrollY); // ou window.pageYOffset
//
// });
</script>
{% endblock %}