creation site static coupe du monde 2026 sans Hugo
This commit is contained in:
@@ -0,0 +1,292 @@
|
||||
:root{
|
||||
--ink:#1a0a38; /* deep indigo (logo wordmark) */
|
||||
--ink-2:#2a1257;
|
||||
--ink-3:#3a1c72;
|
||||
--blue:#2563e6; /* globe blue */
|
||||
--violet:#a81fc4; /* globe magenta */
|
||||
--teal:#10c79a; /* swoosh green-teal = GO/buy accent */
|
||||
--teal-d:#0aa982;
|
||||
--paper:#f5f4fb;
|
||||
--white:#ffffff;
|
||||
--muted:#6a6280;
|
||||
--line:rgba(26,10,56,.10);
|
||||
--grad:linear-gradient(100deg,var(--blue) 0%,var(--violet) 52%,var(--teal) 100%);
|
||||
--shadow:0 18px 50px -20px rgba(26,10,56,.45);
|
||||
--shadow-sm:0 8px 24px -12px rgba(26,10,56,.35);
|
||||
--r:18px;
|
||||
}
|
||||
*{box-sizing:border-box}
|
||||
html{scroll-behavior:smooth;scroll-padding-top:120px}
|
||||
body{
|
||||
margin:0;background:var(--paper);color:var(--ink);
|
||||
font-family:'Inter',system-ui,sans-serif;line-height:1.55;
|
||||
-webkit-font-smoothing:antialiased;overflow-x:hidden;
|
||||
}
|
||||
h1,h2,h3,.display{font-family:'Archivo',sans-serif;line-height:1.04;letter-spacing:-.02em;margin:0}
|
||||
.mono{font-family:'Space Mono',monospace}
|
||||
a{color:inherit;text-decoration:none}
|
||||
img{max-width:100%}
|
||||
.wrap{width:min(1180px,92vw);margin-inline:auto}
|
||||
.eyebrow{font-family:'Space Mono',monospace;font-size:.74rem;letter-spacing:.22em;text-transform:uppercase;color:var(--violet);font-weight:700}
|
||||
.grad-text{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
|
||||
section{padding:clamp(56px,8vw,104px) 0}
|
||||
|
||||
/* ---------- buttons ---------- */
|
||||
.btn{display:inline-flex;align-items:center;gap:.55em;font-family:'Archivo',sans-serif;font-weight:800;
|
||||
font-size:1.02rem;border:none;cursor:pointer;border-radius:999px;padding:1.05em 1.7em;line-height:1;
|
||||
transition:transform .15s ease,box-shadow .15s ease,background .15s ease}
|
||||
.btn-go{background:var(--teal);color:#04261d;box-shadow:0 12px 26px -8px rgba(16,199,154,.7)}
|
||||
.btn-go:hover{transform:translateY(-2px);box-shadow:0 18px 34px -8px rgba(16,199,154,.8);background:#16d6a7}
|
||||
.btn-go:active{transform:translateY(0)}
|
||||
.btn-ghost{background:transparent;color:var(--ink);border:1.5px solid var(--line);font-weight:700}
|
||||
.btn-ghost:hover{border-color:var(--ink);transform:translateY(-1px)}
|
||||
.btn-light{background:#fff;color:var(--ink);box-shadow:var(--shadow-sm)}
|
||||
.btn-light:hover{transform:translateY(-2px)}
|
||||
:focus-visible{outline:3px solid var(--teal);outline-offset:3px;border-radius:6px}
|
||||
|
||||
/* ---------- top urgency bar ---------- */
|
||||
.ubar{background:var(--ink);color:#efeaff;font-size:.86rem;text-align:center;padding:.6em 1em;
|
||||
display:flex;justify-content:center;align-items:center;gap:.9em;flex-wrap:wrap}
|
||||
.ubar b{color:#fff;font-weight:700}
|
||||
.ubar .uc{font-family:'Space Mono',monospace;color:var(--teal);font-weight:700;background:rgba(16,199,154,.13);
|
||||
padding:.15em .55em;border-radius:6px;white-space:nowrap}
|
||||
|
||||
/* ---------- header ---------- */
|
||||
header{position:sticky;top:0;z-index:60;background:rgba(245,244,251,.82);backdrop-filter:blur(12px);
|
||||
border-bottom:1px solid transparent;transition:border-color .2s,box-shadow .2s}
|
||||
header.scrolled{border-color:var(--line);box-shadow:0 6px 20px -16px rgba(26,10,56,.6)}
|
||||
.nav{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.7rem 0}
|
||||
.brand{display:flex;align-items:center;gap:.6rem;font-family:'Archivo';font-weight:900;font-size:1.1rem;letter-spacing:-.01em}
|
||||
.hd-logo{height:34px;width:auto;display:block}
|
||||
.brand small{display:block;font-family:'Space Mono';font-weight:400;font-size:.58rem;letter-spacing:.34em;color:var(--muted);margin-top:2px}
|
||||
.globe{width:38px;height:38px;flex:none}
|
||||
.navlinks{display:flex;gap:1.6rem;font-weight:600;font-size:.93rem}
|
||||
.navlinks a{color:var(--ink-2);position:relative;padding:.2em 0}
|
||||
.navlinks a::after{content:"";position:absolute;left:0;bottom:-2px;width:0;height:2px;background:var(--grad);transition:width .2s}
|
||||
.navlinks a:hover::after{width:100%}
|
||||
.navright{display:flex;align-items:center;gap:.8rem}
|
||||
.langsw{display:flex;gap:2px;background:#fff;border:1px solid var(--line);border-radius:999px;padding:3px}
|
||||
.langsw button{border:none;background:none;cursor:pointer;font-family:'Space Mono';font-size:.72rem;font-weight:700;
|
||||
color:var(--muted);padding:.35em .6em;border-radius:999px;text-transform:uppercase;transition:.15s}
|
||||
.langsw button.on{background:var(--ink);color:#fff}
|
||||
.nav .btn{padding:.75em 1.2em;font-size:.9rem}
|
||||
.burger{display:none;background:none;border:none;cursor:pointer;padding:6px}
|
||||
.burger span{display:block;width:24px;height:2.5px;background:var(--ink);margin:5px 0;border-radius:2px;transition:.2s}
|
||||
|
||||
/* ---------- hero ---------- */
|
||||
.hero{position:relative;background:#160827;color:#fff;overflow:hidden;padding:clamp(48px,7vw,86px) 0 clamp(60px,8vw,96px)}
|
||||
.hero-photo{position:absolute;inset:0;background-image:url("../images/image-fa4c0e097fea.jpg");background-size:cover;background-position:62% 26%;z-index:0}
|
||||
.hero-photo::after{content:"";position:absolute;inset:0;background:
|
||||
linear-gradient(96deg,rgba(18,7,38,.96) 0%,rgba(18,7,38,.86) 34%,rgba(20,9,46,.50) 72%,rgba(20,9,46,.30) 100%),
|
||||
linear-gradient(0deg,rgba(16,6,34,.85),transparent 55%)}
|
||||
.hero-grid{display:grid;grid-template-columns:1.15fr .85fr;gap:clamp(28px,5vw,60px);align-items:center;position:relative;z-index:2}
|
||||
.hero .eyebrow{color:#d9b8ff}
|
||||
.hero h1{font-size:clamp(2.5rem,6.2vw,4.7rem);font-weight:900;margin:.5rem 0 1rem}
|
||||
.hero p.sub{font-size:clamp(1.02rem,1.6vw,1.22rem);color:#d7cdf0;max-width:34ch;margin:0 0 1.8rem}
|
||||
.hero-cta{display:flex;gap:.8rem;flex-wrap:wrap;align-items:center}
|
||||
.trust{display:flex;gap:1.3rem;flex-wrap:wrap;margin-top:1.7rem;font-size:.84rem;color:#c8bce6}
|
||||
.trust span{display:inline-flex;align-items:center;gap:.45em}
|
||||
.trust svg{width:16px;height:16px;color:var(--teal)}
|
||||
|
||||
/* ---------- pass / signature ---------- */
|
||||
.pass{background:#fff;color:var(--ink);border-radius:22px;box-shadow:0 40px 80px -30px rgba(0,0,0,.6);
|
||||
position:relative;overflow:hidden}
|
||||
.pass .top{padding:22px 26px 18px}
|
||||
.pass-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
|
||||
.pass-head .who{display:flex;align-items:center;gap:.5rem;font-family:'Archivo';font-weight:800;font-size:.82rem}
|
||||
.pass-head .who .globe{width:26px;height:26px}
|
||||
.pass-tag{font-family:'Space Mono';font-size:.6rem;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
|
||||
background:var(--ink);color:#fff;padding:.4em .7em;border-radius:6px}
|
||||
.price-row{display:flex;align-items:flex-end;gap:.6rem;margin:14px 0 2px}
|
||||
.price{font-family:'Archivo';font-weight:900;font-size:clamp(3.4rem,9vw,4.6rem);line-height:.85;letter-spacing:-.04em}
|
||||
.price .cur{font-size:.42em;vertical-align:top;margin-left:.05em}
|
||||
.old{font-family:'Archivo';font-weight:700;color:var(--muted);text-decoration:line-through;text-decoration-color:var(--violet);font-size:1.3rem;padding-bottom:.5rem}
|
||||
.pass .incl{font-weight:600;font-size:.95rem;color:var(--ink-2);margin:2px 0 16px;display:flex;align-items:center;gap:.5em}
|
||||
.pass .incl svg{width:18px;height:18px;color:var(--teal);flex:none}
|
||||
.pass .top .btn-go{width:100%;justify-content:center}
|
||||
.perf{position:relative;border-top:2px dashed var(--line);margin:6px 18px 0}
|
||||
.perf::before,.perf::after{content:"";position:absolute;top:-12px;width:22px;height:22px;border-radius:50%;background:var(--ink)}
|
||||
.pass.hero-pass .perf::before,.pass.hero-pass .perf::after{background:#1a0a38}
|
||||
.perf::before{left:-29px}.perf::after{right:-29px}
|
||||
.stub{padding:14px 26px 20px;background:linear-gradient(180deg,#fbfaff,#f3f0fb)}
|
||||
.stub-row{display:flex;justify-content:space-between;align-items:center;gap:10px;font-family:'Space Mono';font-size:.7rem;color:var(--ink-2)}
|
||||
.stub-row .lbl{color:var(--muted);letter-spacing:.06em}
|
||||
.stub .exp{margin-top:10px;display:flex;align-items:center;justify-content:space-between;gap:10px}
|
||||
.exp .cd{font-family:'Space Mono';font-weight:700;font-size:1.02rem;color:var(--ink);letter-spacing:.02em}
|
||||
.barcode{height:34px;margin-top:14px;border-radius:4px;
|
||||
background:repeating-linear-gradient(90deg,var(--ink) 0 2px,transparent 2px 4px,var(--ink) 4px 5px,transparent 5px 9px,var(--ink) 9px 12px,transparent 12px 14px);opacity:.85}
|
||||
.pass .note{font-family:'Space Mono';font-size:.62rem;color:var(--muted);text-align:center;margin-top:10px;letter-spacing:.04em}
|
||||
|
||||
/* ---------- generic blocks ---------- */
|
||||
.center{text-align:center}
|
||||
.lead{font-size:clamp(1.7rem,3.4vw,2.5rem);font-weight:800;margin:.4rem 0 .7rem}
|
||||
.sub-lead{color:var(--muted);max-width:60ch;margin:0 auto;font-size:1.05rem}
|
||||
.section-head{margin-bottom:clamp(32px,5vw,52px)}
|
||||
.section-head.center{margin-inline:auto}
|
||||
|
||||
/* offer value */
|
||||
.offer{background:#fff}
|
||||
.offer-grid{display:grid;grid-template-columns:1.1fr 1fr;gap:clamp(28px,5vw,56px);align-items:center}
|
||||
.vlist{list-style:none;margin:0;padding:0;display:grid;gap:14px}
|
||||
.vlist li{display:flex;align-items:center;gap:.85rem;font-weight:600;font-size:1.05rem;
|
||||
background:var(--paper);border:1px solid var(--line);border-radius:14px;padding:.85rem 1.1rem}
|
||||
.vlist .ic{width:34px;height:34px;border-radius:9px;display:grid;place-items:center;flex:none;background:var(--grad);color:#fff}
|
||||
.vlist .ic svg{width:18px;height:18px}
|
||||
.vlist li.hl{background:linear-gradient(180deg,#062e23,#0a4a39);color:#eafff8;border-color:transparent}
|
||||
.vlist li.hl .ic{background:#fff;color:var(--teal-d)}
|
||||
.offer-card{background:linear-gradient(170deg,var(--ink),var(--ink-3));color:#fff;border-radius:24px;padding:34px;box-shadow:var(--shadow);text-align:center}
|
||||
.offer-card .big{font-family:'Archivo';font-weight:900;font-size:clamp(3.6rem,10vw,5.2rem);line-height:.85}
|
||||
.offer-card .big .cur{font-size:.4em;vertical-align:top}
|
||||
.offer-card .save{display:inline-block;background:var(--teal);color:#04261d;font-family:'Archivo';font-weight:800;
|
||||
font-size:.82rem;padding:.4em .9em;border-radius:999px;margin:14px 0 8px;letter-spacing:.02em}
|
||||
.offer-card .vs{color:#c9bdec;font-size:.95rem;margin:0 0 22px}
|
||||
.offer-card .btn-go{width:100%;justify-content:center}
|
||||
|
||||
/* academies */
|
||||
.acad{background:var(--paper)}
|
||||
.acad-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px}
|
||||
.acard{background:#fff;border-radius:22px;padding:30px;box-shadow:var(--shadow-sm);border:1px solid var(--line);position:relative;overflow:hidden}
|
||||
.acard::before{content:"";position:absolute;inset:0 0 auto 0;height:5px;background:var(--grad)}
|
||||
.acard .crest{width:54px;height:54px;border-radius:14px;display:grid;place-items:center;background:var(--ink);margin-bottom:14px}
|
||||
.acad-logo{height:60px;width:auto;max-width:82%;display:block;margin:2px 0 16px}
|
||||
.acard.foot .crest{background:#0d0d12}
|
||||
.acard .crest svg{width:30px;height:30px;color:#fff}
|
||||
.acard h3{font-size:1.5rem;font-weight:800}
|
||||
.acard .role{color:var(--muted);font-size:.92rem;margin:.35rem 0 1.2rem;min-height:2.6em}
|
||||
.acard .plabel{font-family:'Space Mono';font-size:.68rem;letter-spacing:.16em;text-transform:uppercase;color:var(--violet);font-weight:700;margin-bottom:10px}
|
||||
.acard ul{list-style:none;margin:0 0 18px;padding:0;display:grid;gap:9px}
|
||||
.acard ul li{display:flex;align-items:center;gap:.6rem;font-weight:500}
|
||||
.acard ul li svg{width:16px;height:16px;color:var(--teal);flex:none}
|
||||
.acard .unlock{font-family:'Space Mono';font-size:.66rem;color:var(--muted);border-top:1px dashed var(--line);padding-top:12px}
|
||||
|
||||
/* experts */
|
||||
.experts{background:var(--ink);color:#fff}
|
||||
.experts .eyebrow{color:#d9b8ff}
|
||||
.ex-grid{display:grid;grid-template-columns:1fr 1fr;gap:24px;margin-top:24px}
|
||||
.duo{margin:38px 0 0;position:relative;border-radius:22px;overflow:hidden;box-shadow:0 30px 60px -28px rgba(0,0,0,.7)}
|
||||
.duo img{display:block;width:100%;height:clamp(240px,38vw,440px);object-fit:cover;object-position:center 32%}
|
||||
.duo figcaption{position:absolute;left:0;right:0;bottom:0;padding:26px 24px 18px;
|
||||
background:linear-gradient(0deg,rgba(16,6,34,.92),transparent);font-family:'Space Mono';font-size:.8rem;color:#e9e1ff}
|
||||
.ex .ph{width:84px;height:84px;border-radius:16px;flex:none;display:grid;place-items:center;
|
||||
background:linear-gradient(150deg,rgba(168,31,196,.5),rgba(37,99,230,.5))}
|
||||
.ex .ph .globe{width:48px;height:48px}
|
||||
.ex h3{font-size:1.25rem;font-weight:800}
|
||||
.ex .tag{font-family:'Space Mono';font-size:.66rem;letter-spacing:.1em;color:var(--teal);text-transform:uppercase;margin:.25rem 0 .6rem}
|
||||
.ex p{color:#cfc6ea;font-size:.95rem;margin:0}
|
||||
|
||||
/* how */
|
||||
.how-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;margin-top:40px;counter-reset:s}
|
||||
.step{background:#fff;border:1px solid var(--line);border-radius:18px;padding:24px;position:relative;box-shadow:var(--shadow-sm)}
|
||||
.step .n{counter-increment:s;font-family:'Archivo';font-weight:900;font-size:1.1rem;width:42px;height:42px;border-radius:12px;
|
||||
background:var(--grad);color:#fff;display:grid;place-items:center;margin-bottom:14px}
|
||||
.step .n::before{content:counter(s)}
|
||||
.step h3{font-size:1.12rem;font-weight:800;margin-bottom:.4rem}
|
||||
.step p{color:var(--muted);font-size:.92rem;margin:0}
|
||||
.step:last-child{background:linear-gradient(170deg,#062e23,#0a4a39);border-color:transparent;color:#eafff8}
|
||||
.step:last-child .n{background:#fff;color:var(--teal-d)}
|
||||
.step:last-child p{color:#bdeede}
|
||||
|
||||
/* accessibility */
|
||||
.access{background:#fff}
|
||||
.acc-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:40px}
|
||||
.acc{padding:28px;border-radius:18px;background:var(--paper);border:1px solid var(--line)}
|
||||
.acc .ic{width:46px;height:46px;border-radius:13px;display:grid;place-items:center;background:var(--grad);color:#fff;margin-bottom:14px}
|
||||
.acc .ic svg{width:24px;height:24px}
|
||||
.acc h3{font-size:1.18rem;font-weight:800;margin-bottom:.4rem}
|
||||
.acc p{color:var(--muted);font-size:.95rem;margin:0}
|
||||
|
||||
/* compare */
|
||||
.compare{background:var(--paper)}
|
||||
.cmp-grid{display:grid;grid-template-columns:1fr auto 1fr;gap:0;align-items:stretch;max-width:880px;margin:40px auto 0;
|
||||
background:#fff;border-radius:22px;overflow:hidden;box-shadow:var(--shadow);border:1px solid var(--line)}
|
||||
.cmp{padding:34px 30px;text-align:center}
|
||||
.cmp.win{background:linear-gradient(170deg,var(--ink),var(--ink-3));color:#fff}
|
||||
.cmp .lbl{font-family:'Space Mono';font-size:.7rem;letter-spacing:.14em;text-transform:uppercase;opacity:.85}
|
||||
.cmp.win .lbl{color:var(--teal)}
|
||||
.cmp .amt{font-family:'Archivo';font-weight:900;font-size:clamp(2.8rem,7vw,3.6rem);line-height:1;margin:.5rem 0}
|
||||
.cmp .amt .cur{font-size:.4em;vertical-align:top}
|
||||
.cmp .desc{color:var(--muted);font-size:.92rem}
|
||||
.cmp.win .desc{color:#c9bdec}
|
||||
.cmp-vs{display:grid;place-items:center;font-family:'Archivo';font-weight:900;color:var(--violet);font-size:1rem;
|
||||
background:#fff;padding:0 6px;position:relative}
|
||||
.cmp-vs span{background:var(--paper);border:1px solid var(--line);width:46px;height:46px;border-radius:50%;display:grid;place-items:center}
|
||||
|
||||
/* faq */
|
||||
.faq{background:#fff}
|
||||
.faq-list{max-width:780px;margin:38px auto 0;display:grid;gap:12px}
|
||||
.qa{border:1px solid var(--line);border-radius:14px;overflow:hidden;background:var(--paper)}
|
||||
.qa button{width:100%;text-align:left;background:none;border:none;cursor:pointer;padding:18px 20px;
|
||||
font-family:'Archivo';font-weight:700;font-size:1.05rem;color:var(--ink);display:flex;justify-content:space-between;align-items:center;gap:1rem}
|
||||
.qa .chev{flex:none;width:22px;height:22px;transition:transform .2s;color:var(--violet)}
|
||||
.qa[open] .chev,.qa.open .chev{transform:rotate(180deg)}
|
||||
.qa .ans{padding:0 20px 18px;color:var(--muted);font-size:.97rem}
|
||||
|
||||
/* final */
|
||||
.final{background:
|
||||
radial-gradient(80% 120% at 50% -10%,rgba(16,199,154,.18),transparent 60%),
|
||||
linear-gradient(180deg,#1a0a38,#250f4d);color:#fff;text-align:center}
|
||||
.final h2{font-size:clamp(2.1rem,5.5vw,3.6rem);font-weight:900;margin:.6rem auto .8rem;max-width:18ch}
|
||||
.final p.sub{color:#d2c8ee;font-size:1.08rem;max-width:42ch;margin:0 auto 1.6rem}
|
||||
.final .cd-big{font-family:'Space Mono';font-weight:700;font-size:clamp(1.3rem,3.6vw,2rem);color:var(--teal);margin:0 0 1.8rem;letter-spacing:.04em}
|
||||
.final .eyebrow{color:#9be9cf}
|
||||
|
||||
/* footer */
|
||||
footer{background:var(--ink);color:#bcb1da;padding:56px 0 30px;font-size:.9rem}
|
||||
.foot-grid{display:grid;grid-template-columns:1.4fr 1fr 1fr;gap:32px}
|
||||
.foot-brand .brand{color:#fff;margin-bottom:.8rem}
|
||||
.foot-logo-wrap{display:inline-block;margin-bottom:1rem}
|
||||
.foot-logo{display:block;height:44px;width:auto}
|
||||
.foot-brand p{max-width:32ch;color:#a99fc9}
|
||||
footer h4{font-family:'Archivo';font-size:.78rem;letter-spacing:.14em;text-transform:uppercase;color:#fff;margin:0 0 14px}
|
||||
footer ul{list-style:none;margin:0;padding:0;display:grid;gap:9px}
|
||||
footer a:hover{color:#fff}
|
||||
.socials{display:flex;gap:12px;margin-top:6px}
|
||||
.socials a,.socials span{width:38px;height:38px;border-radius:10px;display:grid;place-items:center;background:rgba(255,255,255,.07);color:#fff;transition:.15s}
|
||||
.socials a:hover{background:var(--grad)}
|
||||
.socials [data-disabled="true"]{cursor:default;opacity:.45;pointer-events:none}
|
||||
.socials svg{width:18px;height:18px}
|
||||
.soon{font-family:'Space Mono';font-size:.6rem;color:var(--teal);opacity:.8}
|
||||
.foot-bottom{border-top:1px solid rgba(255,255,255,.1);margin-top:38px;padding-top:20px;display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;color:#8e84ad;font-size:.8rem}
|
||||
|
||||
/* sticky mobile cta */
|
||||
.mcta{position:fixed;left:0;right:0;bottom:0;z-index:70;display:none;gap:10px;align-items:center;justify-content:space-between;
|
||||
background:#fff;border-top:1px solid var(--line);padding:10px 16px;box-shadow:0 -10px 30px -16px rgba(26,10,56,.5)}
|
||||
.mcta .mp{font-family:'Archivo';font-weight:900}
|
||||
.mcta .mp small{display:block;font-family:'Space Mono';font-size:.58rem;color:var(--muted);font-weight:400}
|
||||
.mcta .btn{padding:.8em 1.2em;font-size:.92rem}
|
||||
|
||||
/* reveal */
|
||||
.rv{opacity:0;transform:translateY(22px);transition:opacity .6s ease,transform .6s ease}
|
||||
.rv.in{opacity:1;transform:none}
|
||||
|
||||
/* ---------- responsive ---------- */
|
||||
@media(max-width:920px){
|
||||
.hero-grid,.offer-grid,.acad-grid,.ex-grid{grid-template-columns:1fr}
|
||||
.hero-grid{gap:34px}
|
||||
.how-grid{grid-template-columns:1fr 1fr}
|
||||
.acc-grid{grid-template-columns:1fr}
|
||||
.navlinks,.nav .btn.btn-go.deskcta{display:none}
|
||||
.burger{display:block}
|
||||
header.menu-open .navlinks{display:flex;position:absolute;top:100%;left:0;right:0;flex-direction:column;
|
||||
background:var(--paper);border-bottom:1px solid var(--line);padding:18px 6vw;gap:1.1rem}
|
||||
.launch-page header.menu-open .navlinks{background:#100620;border-bottom-color:rgba(255,255,255,.12)}
|
||||
.launch-grid,.launch-cards{grid-template-columns:1fr}
|
||||
.launch-copy h1{max-width:12ch}
|
||||
}
|
||||
@media(max-width:600px){
|
||||
.how-grid{grid-template-columns:1fr}
|
||||
.cmp-grid{grid-template-columns:1fr}
|
||||
.cmp-vs span{margin:-8px auto}
|
||||
.foot-grid{grid-template-columns:1fr}
|
||||
.mcta{display:flex}
|
||||
body{padding-bottom:72px}
|
||||
.ubar{font-size:.76rem}
|
||||
.trust{gap:.9rem}
|
||||
.launch-clock{grid-template-columns:repeat(2,1fr)}
|
||||
.launch-logo{height:44px}
|
||||
}
|
||||
@media(prefers-reduced-motion:reduce){
|
||||
*{scroll-behavior:auto!important}
|
||||
.rv{opacity:1;transform:none;transition:none}
|
||||
.btn:hover{transform:none}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 69 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 61 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 122 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 112 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 95 KiB |
@@ -0,0 +1,505 @@
|
||||
/* ---------------- i18n ---------------- */
|
||||
const DICT = {
|
||||
fr: {
|
||||
pricing: "stripe-pricing-table",
|
||||
nav_offer: "L'offre",
|
||||
nav_acad: "Académies",
|
||||
nav_how: "Comment ça marche",
|
||||
nav_faq: "FAQ",
|
||||
nav_cta: "S'abonner — 7,90€",
|
||||
bar: "Offre Coupe du Monde : les 2 académies à 7,90€ au lieu de 80€ — fin le 19 juillet.",
|
||||
bar_ends: "Se termine dans",
|
||||
hero_eyebrow: "Offre Coupe du Monde — édition limitée",
|
||||
hero_h1a: "Tout le monde a le droit",
|
||||
hero_h1b: "aux experts.",
|
||||
hero_h1full: "Tout le monde a le droit aux experts.",
|
||||
hero_sub:
|
||||
"Les académies vidéo de Dimitri Payet et Yannick Dyduch. Football & kiné du sport, par ceux qui le font au plus haut niveau.",
|
||||
cta1: "Je profite de l'offre — 7,90€",
|
||||
cta2: "Voir le programme",
|
||||
trust1: "Précode immédiat",
|
||||
trust2: "Paiement sécurisé Stripe",
|
||||
trust3: "Accès aux 2 académies",
|
||||
pass_label: "Pass Coupe du Monde",
|
||||
pass_old: "au lieu de 80€",
|
||||
pass_incl: "Accès illimité · 2 académies",
|
||||
pass_valid_lbl: "VALABLE",
|
||||
pass_expires: "EXPIRE DANS",
|
||||
pass_note: "Précode reçu dès le paiement",
|
||||
offer_eyebrow: "L'offre",
|
||||
offer_title: "7,90€ pour tout. Pendant la Coupe du Monde.",
|
||||
offer_sub:
|
||||
"Un seul tarif, les deux académies, accès illimité. Après le 1er octobre, chaque académie repasse à 40€.",
|
||||
oi1: "Les 2 académies, accès illimité",
|
||||
oi2: "Précode reçu immédiatement",
|
||||
oi3: "Tout se débloque le 1er octobre 2026",
|
||||
oi4: "Sous-titré dans ta langue",
|
||||
oi5: "Paiement 100% sécurisé (Stripe)",
|
||||
oi6: "Tu économises 72€",
|
||||
save_badge: "−72€ · économie de 90%",
|
||||
vs_after: "À partir du 1er octobre : 40€ / académie (80€ les deux)",
|
||||
vs_until: "Offre valable jusqu'au 19 juillet 2026",
|
||||
acad_eyebrow: "Les académies",
|
||||
acad_title: "Deux experts. Deux programmes. Un seul accès.",
|
||||
payet_name: "La Payet Academy",
|
||||
payet_role:
|
||||
"Dimitri Payet — footballeur pro, légende de l'OM (740+ matchs)",
|
||||
physio_name: "La PhysioSport Academy",
|
||||
physio_role:
|
||||
"Yannick Dyduch — kiné D.E. & ostéo D.O. (Juventus, Équipe nationale de Belgique, ex-OM)",
|
||||
program_label: "Au programme",
|
||||
unlock_note: "Vidéos déblocables le 1er octobre 2026",
|
||||
p1: "La Passe",
|
||||
p2: "Le Contrôle de balle",
|
||||
p3: "La Conduite de balle",
|
||||
p4: "La Frappe",
|
||||
p5: "Le Coup franc direct",
|
||||
p6: "Les Coups de pied arrêtés",
|
||||
f1: "Le Strapping",
|
||||
f2: "La Mobilisation",
|
||||
f3: "Le Massage du sportif",
|
||||
f4: "Les Blessures musculaires",
|
||||
f5: "Les Blessures articulaires",
|
||||
f6: "Les Blessures inflammatoires",
|
||||
ex_eyebrow: "Pourquoi eux",
|
||||
ex_title: "Ceux qui le font. Pas ceux qui en parlent.",
|
||||
ex_payet_tag: "Football · La Payet Academy",
|
||||
ex_payet_bio:
|
||||
"Plus de 740 matchs professionnels, légende de l'Olympique de Marseille. Dimitri Payet partage enfin ses gestes : frappe, coups francs, contrôle, vision de jeu.",
|
||||
ex_physio_tag: "Kiné du sport · La PhysioSport Academy",
|
||||
ex_physio_bio:
|
||||
"Kinésithérapeute et ostéopathe des plus grands clubs (Juventus, Équipe nationale de Belgique, ex-OM). Yannick Dyduch transmet la kiné du sport : strapping, massage, prévention, prise en charge des blessures.",
|
||||
how_eyebrow: "Comment ça marche",
|
||||
how_title: "De l'inscription au déblocage",
|
||||
s1t: "Tu t'abonnes",
|
||||
s1d: "7,90€, paiement sécurisé en quelques secondes.",
|
||||
s2t: "Tu reçois ton précode",
|
||||
s2d: "Confirmation immédiate par e-mail.",
|
||||
s3t: "La Coupe du Monde",
|
||||
s3d: "On chauffe la communauté jusqu'au coup d'envoi.",
|
||||
s4t: "1er octobre 2026",
|
||||
s4d: "Toutes les vidéos se débloquent. À toi de jouer.",
|
||||
acc_eyebrow: "Notre raison d'être",
|
||||
acc_sub:
|
||||
"Le savoir des pros ne devrait pas être réservé à ceux qui ont les moyens, le bon code postal ou la bonne langue.",
|
||||
acc1t: "Accessible financièrement",
|
||||
acc1d:
|
||||
"Des abonnements low-cost. Le savoir des pros, sans le prix des stages.",
|
||||
acc2t: "Accessible partout",
|
||||
acc2d: "Un site et une appli. Où que tu sois, les experts sont là.",
|
||||
acc3t: "Accessible dans ta langue",
|
||||
acc3d: "Des tutoriels sous-titrés dans toutes les langues.",
|
||||
cmp_title: "7,90€ aujourd'hui, ou 80€ le 1er octobre",
|
||||
cmp_during: "Pendant la Coupe du Monde",
|
||||
cmp_during_d: "Les 2 académies, accès illimité",
|
||||
cmp_after: "À partir du 1er octobre",
|
||||
cmp_after_d: "40€ par académie, soit 80€ les deux",
|
||||
faq_eyebrow: "FAQ",
|
||||
faq_title: "Questions fréquentes",
|
||||
q1: "Quand est-ce que j'ai accès aux vidéos ?",
|
||||
a1: "Tu reçois ton précode dès le paiement. L'intégralité des contenus se débloque le 1er octobre 2026.",
|
||||
q2: "C'est quoi un précode ?",
|
||||
a2: "C'est ton accès réservé, envoyé par e-mail dès l'achat. Tu l'utilises pour entrer dans les académies au lancement.",
|
||||
q3: "L'offre 7,90€ couvre les deux académies ?",
|
||||
a3: "Oui. Un seul paiement de 7,90€ te donne un accès illimité à La Payet Academy et à La PhysioSport Academy.",
|
||||
q4: "Jusqu'à quand l'offre est valable ?",
|
||||
a4: "Jusqu'au 19 juillet 2026, fin de la Coupe du Monde. Après, place au tarif normal de 40€ par académie.",
|
||||
q5: "Le paiement est-il sécurisé ?",
|
||||
a5: "Oui, 100%. Les paiements sont traités par Stripe, leader mondial du paiement en ligne.",
|
||||
q6: "Dans quelles langues ?",
|
||||
a6: "Le site est disponible en français, anglais, espagnol et portugais, et les tutoriels sont sous-titrés.",
|
||||
final_eyebrow: "Dernier appel",
|
||||
final_title: "7,90€ aujourd'hui. 80€ le 1er octobre.",
|
||||
final_sub: "L'offre se termine avec la Coupe du Monde, le 19 juillet 2026.",
|
||||
foot_tagline:
|
||||
"Tout le monde a le droit aux experts. La Payet Academy & La PhysioSport Academy.",
|
||||
foot_legal_h: "Informations",
|
||||
legal1: "Conditions générales de vente",
|
||||
legal2: "Mentions légales",
|
||||
legal3: "Règlement intérieur",
|
||||
foot_follow: "Suivez-nous",
|
||||
foot_soon_lbl: "TikTok & LinkedIn :",
|
||||
foot_soon: "à venir",
|
||||
rights: "© 2026 TutoSport Expert. Tous droits réservés.",
|
||||
mcta_sub: "au lieu de 80€",
|
||||
mcta_btn: "J'en profite",
|
||||
cd_d: "j",
|
||||
},
|
||||
en: {
|
||||
pricing: "stripe-pricing-table",
|
||||
nav_offer: "Offer",
|
||||
nav_acad: "Academies",
|
||||
nav_how: "How it works",
|
||||
nav_faq: "FAQ",
|
||||
nav_cta: "Subscribe — 7,90€",
|
||||
bar: "World Cup Offer: both academies for 7,90€ instead of €80 — ends July 19.",
|
||||
bar_ends: "Ends in",
|
||||
hero_eyebrow: "World Cup Offer — limited edition",
|
||||
hero_h1a: "Everyone deserves",
|
||||
hero_h1b: "the experts.",
|
||||
hero_h1full: "Everyone deserves the experts.",
|
||||
hero_sub:
|
||||
"The video academies of Dimitri Payet and Yannick Dyduch. Football & sports physio, taught by people who do it at the highest level.",
|
||||
cta1: "Get the offer — 7,90€",
|
||||
cta2: "See the program",
|
||||
trust1: "Instant pre-code",
|
||||
trust2: "Secure Stripe payment",
|
||||
trust3: "Access to both academies",
|
||||
pass_label: "World Cup Pass",
|
||||
pass_old: "instead of €80",
|
||||
pass_incl: "Unlimited access · 2 academies",
|
||||
pass_valid_lbl: "VALID",
|
||||
pass_expires: "EXPIRES IN",
|
||||
pass_note: "Pre-code sent right after payment",
|
||||
offer_eyebrow: "The offer",
|
||||
offer_title: "7,90€ for everything. During the World Cup.",
|
||||
offer_sub:
|
||||
"One price, both academies, unlimited access. After October 1, each academy goes back to €40.",
|
||||
oi1: "Both academies, unlimited access",
|
||||
oi2: "Pre-code delivered instantly",
|
||||
oi3: "Everything unlocks October 1, 2026",
|
||||
oi4: "Subtitled in your language",
|
||||
oi5: "100% secure payment (Stripe)",
|
||||
oi6: "You save 72€",
|
||||
save_badge: "−72€ · save 90%",
|
||||
vs_after: "From October 1: €40 / academy (€80 for both)",
|
||||
vs_until: "Offer valid until July 19, 2026",
|
||||
acad_eyebrow: "The academies",
|
||||
acad_title: "Two experts. Two programs. One access.",
|
||||
payet_name: "La Payet Academy",
|
||||
payet_role: "Dimitri Payet — pro footballer, OM legend (740+ games)",
|
||||
physio_name: "La PhysioSport Academy",
|
||||
physio_role:
|
||||
"Yannick Dyduch — physiotherapist & osteopath (Juventus, Belgium NT, ex-OM)",
|
||||
program_label: "In the program",
|
||||
unlock_note: "Videos unlock October 1, 2026",
|
||||
p1: "The Pass",
|
||||
p2: "Ball Control",
|
||||
p3: "Dribbling",
|
||||
p4: "Shooting",
|
||||
p5: "Direct Free Kicks",
|
||||
p6: "Set Pieces",
|
||||
f1: "Taping / Strapping",
|
||||
f2: "Mobilization",
|
||||
f3: "Sports Massage",
|
||||
f4: "Muscle Injuries",
|
||||
f5: "Joint Injuries",
|
||||
f6: "Inflammatory Injuries",
|
||||
ex_eyebrow: "Why them",
|
||||
ex_title: "People who do it. Not people who talk about it.",
|
||||
ex_payet_tag: "Football · La Payet Academy",
|
||||
ex_payet_bio:
|
||||
"Over 740 pro games, Olympique de Marseille legend. Dimitri Payet finally shares his craft: shooting, free kicks, control, game vision.",
|
||||
ex_physio_tag: "Sports physio · La PhysioSport Academy",
|
||||
ex_physio_bio:
|
||||
"Physiotherapist and osteopath for elite clubs (Juventus, Belgium national team, ex-OM). Yannick Dyduch teaches sports physio: taping, massage, prevention, injury care.",
|
||||
how_eyebrow: "How it works",
|
||||
how_title: "From sign-up to unlock",
|
||||
s1t: "You subscribe",
|
||||
s1d: "7,90€, secure payment in seconds.",
|
||||
s2t: "You get your pre-code",
|
||||
s2d: "Instant email confirmation.",
|
||||
s3t: "The World Cup",
|
||||
s3d: "We warm up the community until kickoff.",
|
||||
s4t: "October 1, 2026",
|
||||
s4d: "All videos unlock. Game on.",
|
||||
acc_eyebrow: "Why we exist",
|
||||
acc_sub:
|
||||
"Pro knowledge shouldn't be reserved for those with the money, the right postcode or the right language.",
|
||||
acc1t: "Financially accessible",
|
||||
acc1d:
|
||||
"Low-cost subscriptions. Pro knowledge, without the price of training camps.",
|
||||
acc2t: "Accessible anywhere",
|
||||
acc2d: "A site and an app. Wherever you are, the experts are there.",
|
||||
acc3t: "Accessible in your language",
|
||||
acc3d: "Tutorials subtitled in every language.",
|
||||
cmp_title: "7,90€ today, or €80 on October 1",
|
||||
cmp_during: "During the World Cup",
|
||||
cmp_during_d: "Both academies, unlimited access",
|
||||
cmp_after: "From October 1",
|
||||
cmp_after_d: "€40 per academy, €80 for both",
|
||||
faq_eyebrow: "FAQ",
|
||||
faq_title: "Frequently asked questions",
|
||||
q1: "When do I get access to the videos?",
|
||||
a1: "You get your pre-code right after payment. All content unlocks on October 1, 2026.",
|
||||
q2: "What's a pre-code?",
|
||||
a2: "It's your reserved access, emailed at purchase. Use it to enter the academies at launch.",
|
||||
q3: "Does the 7,90€ offer cover both academies?",
|
||||
a3: "Yes. A single 7,90€ payment gives unlimited access to both La Payet Academy and La PhysioSport Academy.",
|
||||
q4: "Until when is the offer valid?",
|
||||
a4: "Until July 19, 2026, the end of the World Cup. After that, the regular €40-per-academy price applies.",
|
||||
q5: "Is payment secure?",
|
||||
a5: "Yes, 100%. Payments are processed by Stripe, a global leader in online payments.",
|
||||
q6: "In which languages?",
|
||||
a6: "The site is available in French, English, Spanish and Portuguese, and tutorials are subtitled.",
|
||||
final_eyebrow: "Last call",
|
||||
final_title: "7,90€ today. €80 on October 1.",
|
||||
final_sub: "The offer ends with the World Cup, on July 19, 2026.",
|
||||
foot_tagline:
|
||||
"Everyone deserves the experts. La Payet Academy & La PhysioSport Academy.",
|
||||
foot_legal_h: "Information",
|
||||
legal1: "Terms of Sale",
|
||||
legal2: "Legal notice",
|
||||
legal3: "House rules",
|
||||
foot_follow: "Follow us",
|
||||
foot_soon_lbl: "TikTok & LinkedIn:",
|
||||
foot_soon: "soon",
|
||||
rights: "© 2026 TutoSport Expert. All rights reserved.",
|
||||
mcta_sub: "instead of €80",
|
||||
mcta_btn: "Get it",
|
||||
cd_d: "d",
|
||||
},
|
||||
es: {
|
||||
pricing: "stripe-pricing-table",
|
||||
nav_offer: "Oferta",
|
||||
nav_acad: "Academias",
|
||||
nav_how: "Cómo funciona",
|
||||
nav_faq: "FAQ",
|
||||
nav_cta: "Suscribirse — 7,90€",
|
||||
bar: "Oferta Mundial: las 2 academias por 7,90€ en vez de 80€ — termina el 19 de julio.",
|
||||
bar_ends: "Termina en",
|
||||
hero_eyebrow: "Oferta Mundial — edición limitada",
|
||||
hero_h1a: "Todos tienen derecho",
|
||||
hero_h1b: "a los expertos.",
|
||||
hero_h1full: "Todos tienen derecho a los expertos.",
|
||||
hero_sub:
|
||||
"Las academias en vídeo de Dimitri Payet y Yannick Dyduch. Fútbol y fisioterapia deportiva, por quienes lo hacen al más alto nivel.",
|
||||
cta1: "Aprovechar la oferta — 7,90€",
|
||||
cta2: "Ver el programa",
|
||||
trust1: "Pre-código inmediato",
|
||||
trust2: "Pago seguro con Stripe",
|
||||
trust3: "Acceso a las 2 academias",
|
||||
pass_label: "Pase Mundial",
|
||||
pass_old: "en vez de 80€",
|
||||
pass_incl: "Acceso ilimitado · 2 academias",
|
||||
pass_valid_lbl: "VÁLIDO",
|
||||
pass_expires: "EXPIRA EN",
|
||||
pass_note: "Pre-código al pagar",
|
||||
offer_eyebrow: "La oferta",
|
||||
offer_title: "7,90€ por todo. Durante el Mundial.",
|
||||
offer_sub:
|
||||
"Un solo precio, las dos academias, acceso ilimitado. Después del 1 de octubre, cada academia vuelve a 40€.",
|
||||
oi1: "Las 2 academias, acceso ilimitado",
|
||||
oi2: "Pre-código al instante",
|
||||
oi3: "Todo se desbloquea el 1 de octubre de 2026",
|
||||
oi4: "Subtitulado en tu idioma",
|
||||
oi5: "Pago 100% seguro (Stripe)",
|
||||
oi6: "Ahorras 72€",
|
||||
save_badge: "−72€ · ahorro del 90%",
|
||||
vs_after: "Desde el 1 de octubre: 40€ / academia (80€ las dos)",
|
||||
vs_until: "Oferta válida hasta el 19 de julio de 2026",
|
||||
acad_eyebrow: "Las academias",
|
||||
acad_title: "Dos expertos. Dos programas. Un solo acceso.",
|
||||
payet_name: "La Payet Academy",
|
||||
payet_role:
|
||||
"Dimitri Payet — futbolista profesional, leyenda del OM (740+ partidos)",
|
||||
physio_name: "La PhysioSport Academy",
|
||||
physio_role:
|
||||
"Yannick Dyduch — fisioterapeuta y osteópata (Juventus, Selección de Bélgica, ex-OM)",
|
||||
program_label: "En el programa",
|
||||
unlock_note: "Vídeos disponibles el 1 de octubre de 2026",
|
||||
p1: "El Pase",
|
||||
p2: "El Control",
|
||||
p3: "La Conducción",
|
||||
p4: "El Disparo",
|
||||
p5: "El Tiro libre directo",
|
||||
p6: "El Balón parado",
|
||||
f1: "El Vendaje (strapping)",
|
||||
f2: "La Movilización",
|
||||
f3: "El Masaje deportivo",
|
||||
f4: "Lesiones musculares",
|
||||
f5: "Lesiones articulares",
|
||||
f6: "Lesiones inflamatorias",
|
||||
ex_eyebrow: "Por qué ellos",
|
||||
ex_title: "Los que lo hacen. No los que hablan de ello.",
|
||||
ex_payet_tag: "Fútbol · La Payet Academy",
|
||||
ex_payet_bio:
|
||||
"Más de 740 partidos profesionales, leyenda del Olympique de Marsella. Dimitri Payet por fin comparte sus gestos: disparo, tiros libres, control, visión de juego.",
|
||||
ex_physio_tag: "Fisioterapia deportiva · La PhysioSport Academy",
|
||||
ex_physio_bio:
|
||||
"Fisioterapeuta y osteópata de los grandes clubes (Juventus, Selección de Bélgica, ex-OM). Yannick Dyduch transmite la fisioterapia deportiva: vendajes, masaje, prevención y tratamiento de lesiones.",
|
||||
how_eyebrow: "Cómo funciona",
|
||||
how_title: "Del registro al desbloqueo",
|
||||
s1t: "Te suscribes",
|
||||
s1d: "7,90€, pago seguro en segundos.",
|
||||
s2t: "Recibes tu pre-código",
|
||||
s2d: "Confirmación inmediata por correo.",
|
||||
s3t: "El Mundial",
|
||||
s3d: "Calentamos la comunidad hasta el inicio.",
|
||||
s4t: "1 de octubre de 2026",
|
||||
s4d: "Se desbloquean todos los vídeos. Te toca.",
|
||||
acc_eyebrow: "Nuestra razón de ser",
|
||||
acc_sub:
|
||||
"El saber de los pros no debería ser solo para quien tiene el dinero, el código postal o el idioma correctos.",
|
||||
acc1t: "Accesible económicamente",
|
||||
acc1d:
|
||||
"Suscripciones low-cost. El saber de los pros, sin el precio de los cursos.",
|
||||
acc2t: "Accesible en todas partes",
|
||||
acc2d: "Una web y una app. Estés donde estés, los expertos están.",
|
||||
acc3t: "Accesible en tu idioma",
|
||||
acc3d: "Tutoriales subtitulados en todos los idiomas.",
|
||||
cmp_title: "7,90€ hoy, u 80€ el 1 de octubre",
|
||||
cmp_during: "Durante el Mundial",
|
||||
cmp_during_d: "Las 2 academias, acceso ilimitado",
|
||||
cmp_after: "Desde el 1 de octubre",
|
||||
cmp_after_d: "40€ por academia, 80€ las dos",
|
||||
faq_eyebrow: "FAQ",
|
||||
faq_title: "Preguntas frecuentes",
|
||||
q1: "¿Cuándo accedo a los vídeos?",
|
||||
a1: "Recibes tu pre-código al pagar. Todo el contenido se desbloquea el 1 de octubre de 2026.",
|
||||
q2: "¿Qué es un pre-código?",
|
||||
a2: "Es tu acceso reservado, enviado por correo al comprar. Lo usas para entrar en las academias en el lanzamiento.",
|
||||
q3: "¿La oferta de 7,90€ cubre las dos academias?",
|
||||
a3: "Sí. Un único pago de 7,90€ da acceso ilimitado a La Payet Academy y a La PhysioSport Academy.",
|
||||
q4: "¿Hasta cuándo es válida la oferta?",
|
||||
a4: "Hasta el 19 de julio de 2026, fin del Mundial. Después se aplica el precio normal de 40€ por academia.",
|
||||
q5: "¿El pago es seguro?",
|
||||
a5: "Sí, 100%. Los pagos los procesa Stripe, líder mundial del pago en línea.",
|
||||
q6: "¿En qué idiomas?",
|
||||
a6: "El sitio está disponible en francés, inglés, español y portugués, y los tutoriales están subtitulados.",
|
||||
final_eyebrow: "Última llamada",
|
||||
final_title: "7,90€ hoy. 80€ el 1 de octubre.",
|
||||
final_sub: "La oferta termina con el Mundial, el 19 de julio de 2026.",
|
||||
foot_tagline:
|
||||
"Todos tienen derecho a los expertos. La Payet Academy & La PhysioSport Academy.",
|
||||
foot_legal_h: "Información",
|
||||
legal1: "Condiciones de venta",
|
||||
legal2: "Aviso legal",
|
||||
legal3: "Reglamento interno",
|
||||
foot_follow: "Síguenos",
|
||||
foot_soon_lbl: "TikTok y LinkedIn:",
|
||||
foot_soon: "próximamente",
|
||||
rights: "© 2026 TutoSport Expert. Todos los derechos reservados.",
|
||||
mcta_sub: "en vez de 80€",
|
||||
mcta_btn: "Lo quiero",
|
||||
cd_d: "d",
|
||||
},
|
||||
pt: {
|
||||
pricing: "stripe-pricing-table",
|
||||
nav_offer: "Oferta",
|
||||
nav_acad: "Academias",
|
||||
nav_how: "Como funciona",
|
||||
nav_faq: "FAQ",
|
||||
nav_cta: "Assinar — 7,90€",
|
||||
bar: "Oferta Copa do Mundo: as 2 academias por 7,90€ em vez de 80€ — acaba em 19 de julho.",
|
||||
bar_ends: "Acaba em",
|
||||
hero_eyebrow: "Oferta Copa do Mundo — edição limitada",
|
||||
hero_h1a: "Todos têm direito",
|
||||
hero_h1b: "aos especialistas.",
|
||||
hero_h1full: "Todos têm direito aos especialistas.",
|
||||
hero_sub:
|
||||
"As academias em vídeo de Dimitri Payet e Yannick Dyduch. Futebol e fisioterapia esportiva, por quem faz no mais alto nível.",
|
||||
cta1: "Aproveitar a oferta — 7,90€",
|
||||
cta2: "Ver o programa",
|
||||
trust1: "Pré-código imediato",
|
||||
trust2: "Pagamento seguro com Stripe",
|
||||
trust3: "Acesso às 2 academias",
|
||||
pass_label: "Passe Copa do Mundo",
|
||||
pass_old: "em vez de 80€",
|
||||
pass_incl: "Acesso ilimitado · 2 academias",
|
||||
pass_valid_lbl: "VÁLIDO",
|
||||
pass_expires: "EXPIRA EM",
|
||||
pass_note: "Pré-código ao pagar",
|
||||
offer_eyebrow: "A oferta",
|
||||
offer_title: "7,90€ por tudo. Durante a Copa do Mundo.",
|
||||
offer_sub:
|
||||
"Um só preço, as duas academias, acesso ilimitado. Depois de 1 de outubro, cada academia volta a 40€.",
|
||||
oi1: "As 2 academias, acesso ilimitado",
|
||||
oi2: "Pré-código na hora",
|
||||
oi3: "Tudo libera em 1 de outubro de 2026",
|
||||
oi4: "Legendado no seu idioma",
|
||||
oi5: "Pagamento 100% seguro (Stripe)",
|
||||
oi6: "Você economiza 72€",
|
||||
save_badge: "−72€ · economia de 90%",
|
||||
vs_after: "A partir de 1 de outubro: 40€ / academia (80€ as duas)",
|
||||
vs_until: "Oferta válida até 19 de julho de 2026",
|
||||
acad_eyebrow: "As academias",
|
||||
acad_title: "Dois especialistas. Dois programas. Um só acesso.",
|
||||
payet_name: "La Payet Academy",
|
||||
payet_role:
|
||||
"Dimitri Payet — jogador profissional, lenda do OM (740+ jogos)",
|
||||
physio_name: "La PhysioSport Academy",
|
||||
physio_role:
|
||||
"Yannick Dyduch — fisioterapeuta e osteopata (Juventus, Seleção da Bélgica, ex-OM)",
|
||||
program_label: "No programa",
|
||||
unlock_note: "Vídeos liberados em 1 de outubro de 2026",
|
||||
p1: "O Passe",
|
||||
p2: "O Domínio",
|
||||
p3: "A Condução",
|
||||
p4: "O Chute",
|
||||
p5: "A Falta direta",
|
||||
p6: "As Bolas paradas",
|
||||
f1: "A Bandagem (strapping)",
|
||||
f2: "A Mobilização",
|
||||
f3: "A Massagem esportiva",
|
||||
f4: "Lesões musculares",
|
||||
f5: "Lesões articulares",
|
||||
f6: "Lesões inflamatórias",
|
||||
ex_eyebrow: "Por que eles",
|
||||
ex_title: "Quem faz. Não quem fala sobre isso.",
|
||||
ex_payet_tag: "Futebol · La Payet Academy",
|
||||
ex_payet_bio:
|
||||
"Mais de 740 jogos profissionais, lenda do Olympique de Marseille. Dimitri Payet enfim compartilha seus gestos: chute, faltas, domínio, visão de jogo.",
|
||||
ex_physio_tag: "Fisioterapia esportiva · La PhysioSport Academy",
|
||||
ex_physio_bio:
|
||||
"Fisioterapeuta e osteopata de grandes clubes (Juventus, Seleção da Bélgica, ex-OM). Yannick Dyduch ensina a fisioterapia esportiva: bandagens, massagem, prevenção e tratamento de lesões.",
|
||||
how_eyebrow: "Como funciona",
|
||||
how_title: "Da inscrição à liberação",
|
||||
s1t: "Você assina",
|
||||
s1d: "7,90€, pagamento seguro em segundos.",
|
||||
s2t: "Você recebe o pré-código",
|
||||
s2d: "Confirmação imediata por e-mail.",
|
||||
s3t: "A Copa do Mundo",
|
||||
s3d: "Aquecemos a comunidade até o apito inicial.",
|
||||
s4t: "1 de outubro de 2026",
|
||||
s4d: "Todos os vídeos liberam. É com você.",
|
||||
acc_eyebrow: "Nossa razão de ser",
|
||||
acc_sub:
|
||||
"O conhecimento dos pros não deveria ser só para quem tem dinheiro, o CEP certo ou o idioma certo.",
|
||||
acc1t: "Acessível no preço",
|
||||
acc1d:
|
||||
"Assinaturas low-cost. O conhecimento dos pros, sem o preço dos cursos.",
|
||||
acc2t: "Acessível em qualquer lugar",
|
||||
acc2d: "Um site e um app. Onde você estiver, os experts estão.",
|
||||
acc3t: "Acessível no seu idioma",
|
||||
acc3d: "Tutoriais legendados em todos os idiomas.",
|
||||
cmp_title: "7,90€ hoje, ou 80€ em 1 de outubro",
|
||||
cmp_during: "Durante a Copa do Mundo",
|
||||
cmp_during_d: "As 2 academias, acesso ilimitado",
|
||||
cmp_after: "A partir de 1 de outubro",
|
||||
cmp_after_d: "40€ por academia, 80€ as duas",
|
||||
faq_eyebrow: "FAQ",
|
||||
faq_title: "Perguntas frequentes",
|
||||
q1: "Quando eu acesso os vídeos?",
|
||||
a1: "Você recebe o pré-código ao pagar. Todo o conteúdo libera em 1 de outubro de 2026.",
|
||||
q2: "O que é um pré-código?",
|
||||
a2: "É o seu acesso reservado, enviado por e-mail na compra. Use-o para entrar nas academias no lançamento.",
|
||||
q3: "A oferta de 7,90€ cobre as duas academias?",
|
||||
a3: "Sim. Um único pagamento de 7,90€ dá acesso ilimitado à La Payet Academy e à La PhysioSport Academy.",
|
||||
q4: "Até quando a oferta é válida?",
|
||||
a4: "Até 19 de julho de 2026, fim da Copa do Mundo. Depois, vale o preço normal de 40€ por academia.",
|
||||
q5: "O pagamento é seguro?",
|
||||
a5: "Sim, 100%. Os pagamentos são processados pela Stripe, líder mundial em pagamentos online.",
|
||||
q6: "Em quais idiomas?",
|
||||
a6: "O site está disponível em francês, inglês, espanhol e português, e os tutoriais são legendados.",
|
||||
final_eyebrow: "Última chamada",
|
||||
final_title: "7,90€ hoje. 80€ em 1 de outubro.",
|
||||
final_sub: "A oferta acaba com a Copa do Mundo, em 19 de julho de 2026.",
|
||||
foot_tagline:
|
||||
"Todos têm direito aos especialistas. La Payet Academy & La PhysioSport Academy.",
|
||||
foot_legal_h: "Informações",
|
||||
legal1: "Termos de venda",
|
||||
legal2: "Aviso legal",
|
||||
legal3: "Regulamento interno",
|
||||
foot_follow: "Siga-nos",
|
||||
foot_soon_lbl: "TikTok e LinkedIn:",
|
||||
foot_soon: "em breve",
|
||||
rights: "© 2026 TutoSport Expert. Todos os direitos reservados.",
|
||||
mcta_sub: "em vez de 80€",
|
||||
mcta_btn: "Quero já",
|
||||
cd_d: "d",
|
||||
},
|
||||
};
|
||||
|
||||
const DEFAULT_LANG = "en";
|
||||
const LANG_STORAGE_KEY = "tutosport_lang";
|
||||
@@ -0,0 +1,90 @@
|
||||
/* ---------------- launch countdown i18n ---------------- */
|
||||
const DICT = {
|
||||
fr: {
|
||||
meta_title: "TutoSport Expert — Ouverture le 22 juin 2026",
|
||||
meta_description:
|
||||
"Les académies de Dimitri Payet & Yannick Dyduch arrivent. Offre Coupe du Monde : les 2 académies à 7,90€. Ouverture le 22 juin 2026.",
|
||||
tag: "Ouverture · 22 juin 2026",
|
||||
h1a: "Le compte à rebours",
|
||||
h1b: "est lancé.",
|
||||
sub: "Les académies de Dimitri Payet & Yannick Dyduch arrivent. Préparez-vous à l'offre Coupe du Monde.",
|
||||
l_d: "Jours",
|
||||
l_h: "Heures",
|
||||
l_m: "Minutes",
|
||||
l_s: "Secondes",
|
||||
offer_a: "Les 2 académies à",
|
||||
offer_b: "au lieu de 80€ · offre limitée Coupe du Monde",
|
||||
ph: "Ton adresse e-mail",
|
||||
btn: "Préviens-moi",
|
||||
thanks: "Merci ! On te prévient dès l'ouverture.",
|
||||
note: "Sois prévenu·e en premier et garde l'offre 7,90€.",
|
||||
rights: "© 2026 TutoSport Expert. Tous droits réservés.",
|
||||
cd_d: "j",
|
||||
},
|
||||
en: {
|
||||
meta_title: "TutoSport Expert — Opening June 22, 2026",
|
||||
meta_description:
|
||||
"The academies of Dimitri Payet & Yannick Dyduch are coming. World Cup offer: both academies for €7.90. Opening June 22, 2026.",
|
||||
tag: "Opening · June 22, 2026",
|
||||
h1a: "The countdown",
|
||||
h1b: "has started.",
|
||||
sub: "The academies of Dimitri Payet & Yannick Dyduch are coming. Get ready for the World Cup offer.",
|
||||
l_d: "Days",
|
||||
l_h: "Hours",
|
||||
l_m: "Minutes",
|
||||
l_s: "Seconds",
|
||||
offer_a: "Both academies for",
|
||||
offer_b: "instead of €80 · limited World Cup offer",
|
||||
ph: "Your email address",
|
||||
btn: "Notify me",
|
||||
thanks: "Thanks! We'll let you know at launch.",
|
||||
note: "Be the first in and keep the €7.90 offer.",
|
||||
rights: "© 2026 TutoSport Expert. All rights reserved.",
|
||||
cd_d: "d",
|
||||
},
|
||||
es: {
|
||||
meta_title: "TutoSport Expert — Apertura el 22 de junio de 2026",
|
||||
meta_description:
|
||||
"Las academias de Dimitri Payet y Yannick Dyduch llegan. Oferta Mundial: las 2 academias por 7,90€. Apertura el 22 de junio de 2026.",
|
||||
tag: "Apertura · 22 de junio de 2026",
|
||||
h1a: "La cuenta atrás",
|
||||
h1b: "ha comenzado.",
|
||||
sub: "Las academias de Dimitri Payet y Yannick Dyduch llegan. Prepárate para la oferta del Mundial.",
|
||||
l_d: "Días",
|
||||
l_h: "Horas",
|
||||
l_m: "Minutos",
|
||||
l_s: "Segundos",
|
||||
offer_a: "Las 2 academias por",
|
||||
offer_b: "en vez de 80€ · oferta limitada del Mundial",
|
||||
ph: "Tu correo electrónico",
|
||||
btn: "Avísame",
|
||||
thanks: "¡Gracias! Te avisamos en la apertura.",
|
||||
note: "Entra el primero y conserva la oferta de 7,90€.",
|
||||
rights: "© 2026 TutoSport Expert. Todos los derechos reservados.",
|
||||
cd_d: "d",
|
||||
},
|
||||
pt: {
|
||||
meta_title: "TutoSport Expert — Abertura em 22 de junho de 2026",
|
||||
meta_description:
|
||||
"As academias de Dimitri Payet e Yannick Dyduch chegam. Oferta Copa do Mundo: as 2 academias por 7,90€. Abertura em 22 de junho de 2026.",
|
||||
tag: "Abertura · 22 de junho de 2026",
|
||||
h1a: "A contagem regressiva",
|
||||
h1b: "começou.",
|
||||
sub: "As academias de Dimitri Payet e Yannick Dyduch chegam. Prepare-se para a oferta da Copa do Mundo.",
|
||||
l_d: "Dias",
|
||||
l_h: "Horas",
|
||||
l_m: "Minutos",
|
||||
l_s: "Segundos",
|
||||
offer_a: "As 2 academias por",
|
||||
offer_b: "em vez de 80€ · oferta limitada da Copa",
|
||||
ph: "Seu e-mail",
|
||||
btn: "Avise-me",
|
||||
thanks: "Obrigado! Avisamos na abertura.",
|
||||
note: "Seja o primeiro e garanta a oferta de 7,90€.",
|
||||
rights: "© 2026 TutoSport Expert. Todos os direitos reservados.",
|
||||
cd_d: "d",
|
||||
},
|
||||
};
|
||||
|
||||
const DEFAULT_LANG = "en";
|
||||
const LANG_STORAGE_KEY = "tutosport_lang";
|
||||
@@ -0,0 +1,372 @@
|
||||
const SUPPORTED_LANGS = Object.keys(DICT);
|
||||
let LANG = DEFAULT_LANG;
|
||||
|
||||
function getStripePricingTableHtml(lang) {
|
||||
const pricingTableId =
|
||||
SITE_CONFIG.stripe.pricingTableIds[lang] ||
|
||||
SITE_CONFIG.stripe.pricingTableIds.en;
|
||||
|
||||
return (
|
||||
`<stripe-pricing-table pricing-table-id="${pricingTableId}" ` +
|
||||
`publishable-key="${SITE_CONFIG.stripe.publishableKey}"></stripe-pricing-table>`
|
||||
);
|
||||
}
|
||||
|
||||
function normalizeLang(value) {
|
||||
if (!value) return null;
|
||||
const lang = String(value).toLowerCase().split(/[-_]/)[0];
|
||||
return DICT[lang] ? lang : null;
|
||||
}
|
||||
|
||||
function getStoredLang() {
|
||||
const cookieMatch = document.cookie.match(
|
||||
new RegExp(`(?:^|; )${LANG_STORAGE_KEY}=([^;]*)`),
|
||||
);
|
||||
try {
|
||||
return (
|
||||
normalizeLang(localStorage.getItem(LANG_STORAGE_KEY)) ||
|
||||
normalizeLang(cookieMatch && decodeURIComponent(cookieMatch[1]))
|
||||
);
|
||||
} catch (e) {
|
||||
return normalizeLang(cookieMatch && decodeURIComponent(cookieMatch[1]));
|
||||
}
|
||||
}
|
||||
|
||||
function getUrlLang() {
|
||||
return normalizeLang(new URLSearchParams(location.search).get("lang"));
|
||||
}
|
||||
|
||||
function getBrowserLang() {
|
||||
const browserLangs = navigator.languages && navigator.languages.length
|
||||
? navigator.languages
|
||||
: [navigator.language];
|
||||
for (const lang of browserLangs) {
|
||||
const normalized = normalizeLang(lang);
|
||||
if (normalized) return normalized;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getInitialLang() {
|
||||
return getUrlLang() || getStoredLang() || getBrowserLang() || DEFAULT_LANG;
|
||||
}
|
||||
|
||||
function getRootPrefix() {
|
||||
if (document.body && document.body.dataset.rootPrefix) {
|
||||
return document.body.dataset.rootPrefix;
|
||||
}
|
||||
const pathParts = location.pathname.split("/").filter(Boolean);
|
||||
const parentDir = pathParts.length > 1 ? pathParts[pathParts.length - 2] : "";
|
||||
return SUPPORTED_LANGS.includes(parentDir) ? "../" : "./";
|
||||
}
|
||||
|
||||
function withLangParam(href, lang) {
|
||||
const [pathWithSearch, hash = ""] = href.split("#");
|
||||
const [path, search = ""] = pathWithSearch.split("?");
|
||||
const params = new URLSearchParams(search);
|
||||
params.set("lang", lang);
|
||||
return `${path}?${params.toString()}${hash ? `#${hash}` : ""}`;
|
||||
}
|
||||
|
||||
function getLocalizedPageUrl(lang) {
|
||||
const pathParts = location.pathname.split("/").filter(Boolean);
|
||||
const parentDir = pathParts.length > 1 ? pathParts[pathParts.length - 2] : "";
|
||||
const fileName = pathParts[pathParts.length - 1] || "";
|
||||
if (!SUPPORTED_LANGS.includes(parentDir)) return null;
|
||||
if (fileName !== "cgv.html" && fileName !== "legals.html") return null;
|
||||
return withLangParam(`../${lang}/${fileName}`, lang);
|
||||
}
|
||||
|
||||
function updateInternalLinks(lang) {
|
||||
const rootPrefix = getRootPrefix();
|
||||
const homeHref = withLangParam(rootPrefix, lang);
|
||||
const offerHref = withLangParam(`${rootPrefix}offre.html`, lang);
|
||||
const legalPrefix = `${rootPrefix}${lang}/`;
|
||||
const anchors = {
|
||||
nav_offer: `${homeHref}#offre`,
|
||||
nav_acad: `${homeHref}#academies`,
|
||||
nav_how: `${homeHref}#how`,
|
||||
nav_faq: `${homeHref}#faq`,
|
||||
legal1: withLangParam(`${legalPrefix}cgv.html`, lang),
|
||||
legal2: withLangParam(`${legalPrefix}legals.html`, lang),
|
||||
};
|
||||
|
||||
Object.entries(anchors).forEach(([key, href]) => {
|
||||
document
|
||||
.querySelectorAll(`a[data-i18n="${key}"]`)
|
||||
.forEach((link) => link.setAttribute("href", href));
|
||||
});
|
||||
|
||||
document.querySelectorAll("a.brand, a.foot-logo-wrap").forEach((link) => {
|
||||
link.setAttribute("href", homeHref);
|
||||
});
|
||||
|
||||
document.querySelectorAll("a[href]").forEach((link) => {
|
||||
const href = link.getAttribute("href");
|
||||
if (!href || href.startsWith("http") || href.startsWith("mailto:")) return;
|
||||
if (href.includes("offre.html")) {
|
||||
link.setAttribute("href", offerHref);
|
||||
} else if (href === "#offre" || href === "./#offre") {
|
||||
link.setAttribute("href", `${homeHref}#offre`);
|
||||
} else if (href === "#academies" || href === "./#academies") {
|
||||
link.setAttribute("href", `${homeHref}#academies`);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function updateGoogleTagManagerNoScript() {
|
||||
const gtmId = SITE_CONFIG.googleTagManagerId;
|
||||
if (!gtmId) return;
|
||||
|
||||
document
|
||||
.querySelectorAll('iframe[src*="googletagmanager.com/ns.html"]')
|
||||
.forEach((iframe) => {
|
||||
iframe.setAttribute(
|
||||
"src",
|
||||
`https://www.googletagmanager.com/ns.html?id=${gtmId}`,
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function loadGoogleTagManagerScript() {
|
||||
const gtmId = SITE_CONFIG.googleTagManagerId;
|
||||
if (!gtmId) return;
|
||||
if (
|
||||
document.querySelector(
|
||||
`script[src*="googletagmanager.com/gtm.js?id=${gtmId}"]`,
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
(function (w, d, s, l, i) {
|
||||
w[l] = w[l] || [];
|
||||
w[l].push({ "gtm.start": new Date().getTime(), event: "gtm.js" });
|
||||
const f = d.getElementsByTagName(s)[0];
|
||||
const j = d.createElement(s);
|
||||
const dl = l !== "dataLayer" ? `&l=${l}` : "";
|
||||
j.async = true;
|
||||
j.src = `https://www.googletagmanager.com/gtm.js?id=${i}${dl}`;
|
||||
f.parentNode.insertBefore(j, f);
|
||||
})(window, document, "script", "dataLayer", gtmId);
|
||||
}
|
||||
|
||||
function updateConfiguredSiteUrl() {
|
||||
const siteUrl = SITE_CONFIG.siteUrl;
|
||||
const siteUrlAliases = SITE_CONFIG.siteUrlAliases || [];
|
||||
if (!siteUrl) return;
|
||||
|
||||
document.querySelectorAll("[href], [src]").forEach((el) => {
|
||||
["href", "src"].forEach((attr) => {
|
||||
const value = el.getAttribute(attr);
|
||||
const alias = siteUrlAliases.find(
|
||||
(item) => value && value.includes(item),
|
||||
);
|
||||
if (alias) {
|
||||
el.setAttribute(attr, value.replaceAll(alias, siteUrl));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
if (!document.createTreeWalker || !document.body) return;
|
||||
const walker = document.createTreeWalker(document.body, 4);
|
||||
let node = walker.nextNode();
|
||||
while (node) {
|
||||
const alias = siteUrlAliases.find((item) =>
|
||||
node.nodeValue.includes(item),
|
||||
);
|
||||
if (alias) {
|
||||
node.nodeValue = node.nodeValue.replaceAll(alias, siteUrl);
|
||||
}
|
||||
node = walker.nextNode();
|
||||
}
|
||||
}
|
||||
|
||||
function updateSocialLinks() {
|
||||
const socialLinks = SITE_CONFIG.socialLinks || {};
|
||||
const selectors = {
|
||||
instagram: 'a[aria-label="Instagram"]',
|
||||
facebook: 'a[aria-label="Facebook"]:not([data-disabled="true"])',
|
||||
tiktok: 'a[aria-label="TikTok"]:not([data-disabled="true"])',
|
||||
linkedin: 'a[aria-label="LinkedIn"]:not([data-disabled="true"])',
|
||||
};
|
||||
|
||||
Object.entries(selectors).forEach(([key, selector]) => {
|
||||
const href = socialLinks[key];
|
||||
if (!href) return;
|
||||
document
|
||||
.querySelectorAll(selector)
|
||||
.forEach((link) => {
|
||||
link.setAttribute("href", href);
|
||||
link.setAttribute("target", "_blank");
|
||||
link.setAttribute("rel", "noopener noreferrer");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function getFooterPath() {
|
||||
return `${getRootPrefix()}footer.html`;
|
||||
}
|
||||
|
||||
async function loadFooter() {
|
||||
const placeholders = document.querySelectorAll('[data-include="footer"]');
|
||||
if (!placeholders.length || !window.fetch) return;
|
||||
|
||||
try {
|
||||
const response = await fetch(getFooterPath());
|
||||
if (!response.ok) return;
|
||||
|
||||
const rootPrefix = getRootPrefix();
|
||||
const footerHtml = (await response.text()).replaceAll(
|
||||
'src="assets/',
|
||||
`src="${rootPrefix}assets/`,
|
||||
);
|
||||
|
||||
placeholders.forEach((placeholder) => {
|
||||
placeholder.innerHTML = footerHtml;
|
||||
});
|
||||
|
||||
setLang(LANG);
|
||||
updateConfiguredSiteUrl();
|
||||
updateSocialLinks();
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
function setLang(l, options = {}) {
|
||||
const normalizedLang = normalizeLang(l);
|
||||
if (!normalizedLang) return;
|
||||
LANG = normalizedLang;
|
||||
if (options.persist) {
|
||||
try {
|
||||
localStorage.setItem(LANG_STORAGE_KEY, normalizedLang);
|
||||
} catch (e) {}
|
||||
document.cookie = `${LANG_STORAGE_KEY}=${encodeURIComponent(
|
||||
normalizedLang,
|
||||
)};path=/;max-age=31536000;SameSite=Lax`;
|
||||
}
|
||||
const localizedPageUrl = options.navigate
|
||||
? getLocalizedPageUrl(normalizedLang)
|
||||
: null;
|
||||
if (localizedPageUrl && localizedPageUrl !== location.pathname + location.search) {
|
||||
location.href = localizedPageUrl;
|
||||
return;
|
||||
}
|
||||
document.documentElement.lang = normalizedLang;
|
||||
document.querySelectorAll("[data-i18n]").forEach((el) => {
|
||||
const v = DICT[normalizedLang][el.getAttribute("data-i18n")];
|
||||
if (v != null) el.textContent = v;
|
||||
});
|
||||
document.querySelectorAll("[data-i18n-html]").forEach((el) => {
|
||||
const key = el.getAttribute("data-i18n-html");
|
||||
const v =
|
||||
key === "pricing"
|
||||
? getStripePricingTableHtml(normalizedLang)
|
||||
: DICT[normalizedLang][key];
|
||||
if (v != null) el.innerHTML = v;
|
||||
});
|
||||
document.querySelectorAll("[data-i18n-content]").forEach((el) => {
|
||||
const v = DICT[normalizedLang][el.getAttribute("data-i18n-content")];
|
||||
if (v != null) el.setAttribute("content", v);
|
||||
});
|
||||
document.querySelectorAll("[data-i18n-ph]").forEach((el) => {
|
||||
const v = DICT[normalizedLang][el.getAttribute("data-i18n-ph")];
|
||||
if (v != null) el.setAttribute("placeholder", v);
|
||||
});
|
||||
document
|
||||
.querySelectorAll(".langsw button")
|
||||
.forEach((b) => {
|
||||
const isActive = b.dataset.lang === normalizedLang;
|
||||
b.classList.toggle("on", isActive);
|
||||
b.setAttribute("aria-pressed", String(isActive));
|
||||
});
|
||||
updateInternalLinks(normalizedLang);
|
||||
renderCountdown();
|
||||
}
|
||||
document
|
||||
.querySelectorAll(".langsw button")
|
||||
.forEach((b) =>
|
||||
b.addEventListener("click", () =>
|
||||
setLang(b.dataset.lang, { persist: true, navigate: true }),
|
||||
)
|
||||
);
|
||||
|
||||
loadGoogleTagManagerScript();
|
||||
updateGoogleTagManagerNoScript();
|
||||
updateConfiguredSiteUrl();
|
||||
updateSocialLinks();
|
||||
loadFooter();
|
||||
|
||||
/* ---------------- countdown ---------------- */
|
||||
const TARGET = new Date("2026-07-19T23:59:59+02:00").getTime();
|
||||
function renderCountdown() {
|
||||
const now = Date.now();
|
||||
let diff = Math.max(0, TARGET - now);
|
||||
const d = Math.floor(diff / 86400000);
|
||||
diff -= d * 86400000;
|
||||
const h = Math.floor(diff / 3600000);
|
||||
diff -= h * 3600000;
|
||||
const m = Math.floor(diff / 60000);
|
||||
diff -= m * 60000;
|
||||
const s = Math.floor(diff / 1000);
|
||||
const p = (n) => String(n).padStart(2, "0");
|
||||
const du = (DICT[LANG] && DICT[LANG].cd_d) || "d";
|
||||
const str = `${d}${du} ${p(h)}h ${p(m)}m ${p(s)}s`;
|
||||
document.querySelectorAll(".js-cd").forEach((e) => (e.textContent = str));
|
||||
}
|
||||
setLang(getInitialLang());
|
||||
setInterval(renderCountdown, 1000);
|
||||
|
||||
/* ---------------- header scroll ---------------- */
|
||||
const hd = document.getElementById("hd");
|
||||
if (hd) {
|
||||
addEventListener(
|
||||
"scroll",
|
||||
() => hd.classList.toggle("scrolled", scrollY > 10),
|
||||
{ passive: true },
|
||||
);
|
||||
}
|
||||
|
||||
/* ---------------- mobile menu ---------------- */
|
||||
const burger = document.getElementById("burger");
|
||||
if (burger && hd) {
|
||||
burger.addEventListener("click", () => {
|
||||
const open = hd.classList.toggle("menu-open");
|
||||
burger.setAttribute("aria-expanded", open);
|
||||
});
|
||||
}
|
||||
document.querySelectorAll("#navlinks a").forEach((a) =>
|
||||
a.addEventListener("click", () => {
|
||||
if (hd) hd.classList.remove("menu-open");
|
||||
if (burger) burger.setAttribute("aria-expanded", "false");
|
||||
}),
|
||||
);
|
||||
|
||||
/* ---------------- faq accordion ---------------- */
|
||||
document.querySelectorAll(".qa button").forEach((btn) => {
|
||||
btn.addEventListener("click", () => {
|
||||
const qa = btn.parentElement,
|
||||
ans = qa.querySelector(".ans"),
|
||||
open = qa.classList.toggle("open");
|
||||
btn.setAttribute("aria-expanded", open);
|
||||
ans.hidden = !open;
|
||||
});
|
||||
});
|
||||
|
||||
/* ---------------- reveal on scroll ---------------- */
|
||||
const reduce = matchMedia("(prefers-reduced-motion:reduce)").matches;
|
||||
if (!reduce && "IntersectionObserver" in window) {
|
||||
const io = new IntersectionObserver(
|
||||
(es) => {
|
||||
es.forEach((e) => {
|
||||
if (e.isIntersecting) {
|
||||
e.target.classList.add("in");
|
||||
io.unobserve(e.target);
|
||||
}
|
||||
});
|
||||
},
|
||||
{ threshold: 0.14 },
|
||||
);
|
||||
document.querySelectorAll(".rv").forEach((el) => io.observe(el));
|
||||
} else {
|
||||
document.querySelectorAll(".rv").forEach((el) => el.classList.add("in"));
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
const SITE_CONFIG = {
|
||||
googleTagManagerId: "GTM-MFN88L24",
|
||||
siteUrl: "https://www.tutosportexpert.com",
|
||||
siteUrlAliases: [
|
||||
"https://tutosportexpert.com",
|
||||
"https://www.tutosportexpert.com",
|
||||
],
|
||||
stripe: {
|
||||
publishableKey:
|
||||
"pk_live_51QblVdAVnr0yCjVxfn0VB0H62Kjdpfly5Cg8mVenw34xBvSavUoWCmDZJISEYme3y3nf9SXrA2GUFngt5dHHPa0N00mCehFE2N",
|
||||
pricingTableIds: {
|
||||
fr: "prctbl_1TjY4mAVnr0yCjVxprPlzN6a",
|
||||
en: "prctbl_1TjYLDAVnr0yCjVxbfn2vzkN",
|
||||
es: "prctbl_1TjYM8AVnr0yCjVx3hmFKXx3",
|
||||
pt: "prctbl_1TjYMtAVnr0yCjVxKNiktdBr",
|
||||
},
|
||||
},
|
||||
socialLinks: {
|
||||
instagram: "https://instagram.com/tutosportexpert",
|
||||
facebook: "#",
|
||||
tiktok: "#",
|
||||
linkedin: "#",
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,24 @@
|
||||
const SITE_CONFIG = {
|
||||
googleTagManagerId: "GTM-WTMNS3J8",
|
||||
siteUrl: "https://preprod.tutosportexpert.com",
|
||||
siteUrlAliases: [
|
||||
"https://tutosportexpert.com",
|
||||
"https://preprod.tutosportexpert.com",
|
||||
],
|
||||
stripe: {
|
||||
publishableKey:
|
||||
"pk_test_51QblVdAVnr0yCjVxvGKVEnsFExwJ5MJHrfpZha3hUdu6M1boWMVfo69sBvsaMAKPsnusWqI4JoDzsxgxjYOnzEot00ESickqIW",
|
||||
pricingTableIds: {
|
||||
fr: "prctbl_1TihgyAVnr0yCjVxitGGF6te",
|
||||
en: "prctbl_1Tif1XAVnr0yCjVxU6YR803D",
|
||||
es: "prctbl_1Tif20AVnr0yCjVxkV0GyCMy",
|
||||
pt: "prctbl_1TifbgAVnr0yCjVxxjJTNQfC",
|
||||
},
|
||||
},
|
||||
socialLinks: {
|
||||
instagram: "https://instagram.com/tutosportexpert",
|
||||
facebook: "#",
|
||||
tiktok: "#",
|
||||
linkedin: "#",
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,24 @@
|
||||
const SITE_CONFIG = {
|
||||
googleTagManagerId: "GTM-MFN88L24",
|
||||
siteUrl: "https://www.tutosportexpert.com",
|
||||
siteUrlAliases: [
|
||||
"https://tutosportexpert.com",
|
||||
"https://www.tutosportexpert.com",
|
||||
],
|
||||
stripe: {
|
||||
publishableKey:
|
||||
"pk_live_51QblVdAVnr0yCjVxfn0VB0H62Kjdpfly5Cg8mVenw34xBvSavUoWCmDZJISEYme3y3nf9SXrA2GUFngt5dHHPa0N00mCehFE2N",
|
||||
pricingTableIds: {
|
||||
fr: "prctbl_1TjY4mAVnr0yCjVxprPlzN6a",
|
||||
en: "prctbl_1TjYLDAVnr0yCjVxbfn2vzkN",
|
||||
es: "prctbl_1TjYM8AVnr0yCjVx3hmFKXx3",
|
||||
pt: "prctbl_1TjYMtAVnr0yCjVxKNiktdBr",
|
||||
},
|
||||
},
|
||||
socialLinks: {
|
||||
instagram: "https://instagram.com/tutosportexpert",
|
||||
facebook: "#",
|
||||
tiktok: "#",
|
||||
linkedin: "#",
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user