PEPSI — Template Landing (Demo RTEC DESIGN)

Explorați soluția noastră în categoria: HTML & CSS

Detalii Tehnice

⚡ Landing Page animat Pepsi-style, 100% HTML/CSS/JS. Interactiv, responsive & GRATUIT de descărcat!

🔹 Template Landing Pepsi — Demo RTEC DESIGN

Acest proiect gratuit este un landing page modern creat exclusiv cu HTML, CSS și JavaScript, fără framework-uri externe.

👉 Ce include:

  • 🌊 Animații fluide & efect video-like — fundal cu bule animate pe canvas și tranziții cromatice.
  • 🥤 Selector de arome interactiv (Original, Zero, Cherry, Lime) cu schimbare dinamică de temă și accente.
  • 🎨 Design 3D interactiv pe doză (efect de tilt la hover).
  • Scroll reveal animations pentru o experiență cinematică și atractivă.
  • 📱 Responsive & optimizat — se adaptează perfect pentru desktop și mobil.
  • 🛠️ Cod curat și modular, ușor de integrat într-un CMS sau framework.

📌 Ideal pentru cei care vor să învețe cum se construiesc landing pages moderne, cu efecte vizuale captivante și interacțiuni user-friendly.



<!DOCTYPE html>
<html lang="ro">
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>PEPSI — Template Landing (Demo RTEC DESIGN)</title>
  <meta name="description" content="Landing page demo în stil video, cu animații fluide, selector de arome și efect 3D pe doză. Creat de RTEC DESIGN."/>
  <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@400;600;800;900&display=swap" rel="stylesheet">
  <style>
    /* =====================================================
       RTEC DESIGN — Template Pepsi (Single-file)
       Notă: folosește doar culori/forme generice. Înlocuiește
       placeholder-ele cu asset-urile tale oficiale.
       ===================================================== */


    :root{
      /* Paletă generală Pepsi-ish (dar generica) */
      --bg:#05070e; --panel:#0b1020; --ink:#e9f1ff; --muted:#9ab0d1;
      --accent:#005CB4; /* albastru */
      --accent-2:#C8102E; /* roșu */
      --ring:rgba(0,92,180,.3);
      --glass:rgba(255,255,255,.06);
      --border:rgba(255,255,255,.14);
      --radius:20px;


      /* Arome (teme) */
      --t-original:#005CB4;
      --t-zero:#111827;
      --t-cherry:#a1122b;
      --t-lime:#16a34a;
    }


    /* Teme dinamice pe <body data-flavor> */
    body[data-flavor="original"]{ --accent:var(--t-original); --accent-2:#f52f2f; --ring:rgba(0,92,180,.35); }
    body[data-flavor="zero"]{ --accent:var(--t-zero); --accent-2:#e5e7eb; --ring:rgba(229,231,235,.2); }
    body[data-flavor="cherry"]{ --accent:var(--t-cherry); --accent-2:#ff6384; --ring:rgba(161,18,43,.35); }
    body[data-flavor="lime"]{ --accent:var(--t-lime); --accent-2:#9ae6b4; --ring:rgba(22,163,74,.35); }


    *{box-sizing:border-box}
    html,body{height:100%}
    body{
      margin:0; font-family:Montserrat,system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif;
      color:var(--ink); background:
        radial-gradient(1200px 800px at 120% -10%, var(--accent), transparent 60%),
        radial-gradient(1000px 700px at -10% 110%, var(--accent-2), transparent 60%),
        linear-gradient(180deg, #03050b, #05070e);
      overflow-x:hidden; transition: background .6s ease;
    }


    /* Bule pe canvas pe fundal */
    #bubbles{position:fixed; inset:0; z-index:0; display:block}


    /* Nav */
    .nav{position:sticky; top:0; z-index:10; backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
      background:linear-gradient(180deg, rgba(0,0,0,.35), rgba(0,0,0,.08)); border-bottom:1px solid var(--border)}
    .nav-inner{max-width:1200px; margin:0 auto; padding:14px 18px; display:flex; align-items:center; gap:14px}
    .brand{display:flex; align-items:center; gap:10px; font-weight:900; letter-spacing:.06em}
    .logo{width:36px; height:36px; border-radius:50%; background:conic-gradient(from 200deg, var(--accent), var(--accent) 40%, #fff 40% 60%, var(--accent-2) 60%);
      box-shadow:0 8px 24px rgba(0,0,0,.35), inset 0 0 0 2px rgba(255,255,255,.3)}
    .nav a{color:var(--ink); text-decoration:none; opacity:.9}
    .spacer{flex:1}
    .pill{display:inline-flex; align-items:center; gap:8px; padding:8px 12px; border-radius:999px; background:var(--glass);
      border:1px solid var(--border); font-weight:600}


    /* Hero */
    .hero{position:relative; z-index:1; max-width:1200px; margin:0 auto; padding:48px 18px 24px; display:grid; grid-template-columns:1.1fr .9fr; gap:26px; align-items:center}
    .stripe{height:3px; background:linear-gradient(90deg, var(--accent), #fff, var(--accent-2)); border-radius:3px; margin:8px 0 18px}
    .h1{font-size:clamp(32px, 5vw, 64px); line-height:1.05; margin:0 0 10px; font-weight:900; letter-spacing:.02em}
    .lead{color:var(--muted); margin:0 0 22px}


    .cta{display:flex; gap:12px; flex-wrap:wrap}
    .btn{display:inline-grid; place-items:center; padding:14px 18px; border-radius:14px; border:0; font-weight:800; cursor:pointer;
      background:linear-gradient(135deg, var(--accent), var(--accent-2)); color:#071018; box-shadow:0 16px 36px rgba(0,0,0,.4)}
    .btn.outline{background:transparent; color:var(--ink); border:1px solid var(--border)}


    /* Can card */
    .can-wrap{position:relative; display:grid; place-items:center}
    .card{width:min(520px, 86%); background:linear-gradient(180deg, rgba(255,255,255,.08), rgba(255,255,255,.04));
      border:1px solid var(--border); border-radius:var(--radius); padding:22px; backdrop-filter:blur(10px); -webkit-backdrop-filter:blur(10px);
      box-shadow:0 24px 60px rgba(0,0,0,.45); transform-style:preserve-3d; transition:transform .2s ease}
    .card:hover{transform:perspective(900px) rotateX(2deg) rotateY(-4deg)}


    /* SVG doză — generică, fără elemente de brand protejate */
    svg{display:block; height:auto}
    .can{width:100%}


    .flavors{margin-top:16px; display:flex; align-items:center; gap:8px; flex-wrap:wrap}
    .flavor{padding:8px 12px; border-radius:999px; border:1px solid var(--border); background:var(--glass); cursor:pointer; font-weight:700}
    .flavor[aria-pressed="true"]{outline:3px solid var(--ring)}


    /* Secțiune promo */
    .promo{position:relative; z-index:1; max-width:1200px; margin:28px auto; padding:0 18px}
    .grid{display:grid; gap:18px; grid-template-columns:repeat(12,1fr)}
    .tile{grid-column:span 6; background:linear-gradient(180deg, rgba(255,255,255,.06), rgba(255,255,255,.03)); border:1px solid var(--border);
      border-radius:var(--radius); padding:18px; min-height:180px}
    .tile h3{margin:6px 0 10px}
    .tile p{color:var(--muted)}


    /* Carusel produse */
    .carousel{margin:26px 0; overflow:auto; display:flex; gap:16px; scroll-snap-type:x mandatory; padding-bottom:6px}
    .prod{scroll-snap-align:start; min-width:260px; background:linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.02)); border:1px solid var(--border);
      border-radius:16px; padding:16px}


    /* Footer */
    footer{position:relative; z-index:1; margin-top:36px; border-top:1px solid var(--border); background:rgba(0,0,0,.35)}
    .foot{max-width:1200px; margin:0 auto; padding:22px 18px; display:flex; align-items:center; gap:14px; flex-wrap:wrap}
    .copy{color:var(--muted)}


    /* Responsive */
    @media (max-width: 980px){
      .hero{grid-template-columns:1fr; padding-top:28px}
      .card{width:min(560px, 100%)}
    }
    
  /* ==== CHOP transition overlay ==== */
  :root{ --chopA:#0b5db6; --chopB:#ef4444; }
  .chop{ position:fixed; inset:0; z-index:12; pointer-events:none; display:grid; grid-template-rows:repeat(8,1fr); gap:6px; opacity:0; }
  .chop .s{ background:linear-gradient(90deg, var(--chopA), var(--chopB)); transform:translateX(-110%); border-radius:6px; }
  @media (prefers-reduced-motion: reduce){ .chop{ display:none; } }
  .chop.on{ opacity:1; }
  .chop.on .s{ animation: chopIn 320ms calc(var(--i)*40ms) cubic-bezier(.2,.8,.1,1) forwards, chopOut 320ms calc(var(--i)*40ms + 320ms) cubic-bezier(.2,.8,.1,1) forwards; }
  .chop.on .s:nth-child(even){ animation-name: chopInR, chopOutR; }
  @keyframes chopIn{ from{ transform:translateX(-110%);} to{ transform:translateX(0);} }
  @keyframes chopOut{ from{ transform:translateX(0);} to{ transform:translateX(110%);} }
  @keyframes chopInR{ from{ transform:translateX(110%);} to{ transform:translateX(0);} }
  @keyframes chopOutR{ from{ transform:translateX(0);} to{ transform:translateX(-110%);} }
</style>
</head>
<body data-flavor="original">
  <canvas id="bubbles" aria-hidden="true"></canvas>
  <div class="chop" id="chop" aria-hidden="true">
    <div class="s" style="--i:0"></div>
    <div class="s" style="--i:1"></div>
    <div class="s" style="--i:2"></div>
    <div class="s" style="--i:3"></div>
    <div class="s" style="--i:4"></div>
    <div class="s" style="--i:5"></div>
    <div class="s" style="--i:6"></div>
    <div class="s" style="--i:7"></div>
  </div>


  <nav class="nav">
    <div class="nav-inner">
      <div class="brand"><div class="logo"></div><span>PEPSI</span></div>
      <div class="spacer"></div>
      <a class="pill" href="#arome">Arome</a>
      <a class="pill" href="#produse">Produse</a>
      <a class="pill" href="#cumpara">Cumpără</a>
    </div>
  </nav>


  <header class="hero">
    <div>
      <div class="stripe" aria-hidden="true"></div>
      <h1 class="h1">Răcorește-ți lumea.<br>Îndrăzneț. Crocant. Revigorant.</h1>
      <p class="lead">Template inovator cu animații fluide, efect 3D pe doză și selector de aromă. Inspirat din trendurile video moderne — implementare full front‑end.</p>
      <div class="cta">
        <a href="#cumpara" class="btn">Cumpără acum</a>
        <a href="#produse" class="btn outline">Vezi gama</a>
      </div>
      <div class="flavors" id="arome">
        <button class="flavor" data-flavor="original" aria-pressed="true">Original</button>
        <button class="flavor" data-flavor="zero" aria-pressed="false">Zero</button>
        <button class="flavor" data-flavor="cherry" aria-pressed="false">Cherry</button>
        <button class="flavor" data-flavor="lime" aria-pressed="false">Lime</button>
      </div>
    </div>


    <div class="can-wrap">
      <div class="card" id="tilt">
        <!-- Doză SVG generică (schimbă gradientele prin JS per aromă) -->
        <svg class="can" viewBox="0 0 420 820" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Doză băutură carbogazoasă">
          <defs>
            <linearGradient id="gBody" x1="0" y1="0" x2="0" y2="1">
              <stop offset="0" stop-color="#0f172a"/>
              <stop offset="1" stop-color="#0b1224"/>
            </linearGradient>
            <linearGradient id="gCap" x1="0" y1="0" x2="0" y2="1">
              <stop offset="0" stop-color="#d1d5db"/>
              <stop offset="1" stop-color="#9ca3af"/>
            </linearGradient>
            <filter id="shadow" x="-40%" y="-40%" width="180%" height="180%">
              <feGaussianBlur stdDeviation="14"/>
            </filter>
          </defs>


          <!-- Umbra sub doză -->
          <ellipse cx="210" cy="790" rx="150" ry="22" fill="#000" opacity=".45" filter="url(#shadow)"/>


          <!-- Corp doză -->
          <rect x="60" y="90" width="300" height="620" rx="42" fill="url(#gBody)" stroke="rgba(255,255,255,.15)"/>


          <!-- Capac -->
          <rect x="80" y="50" width="260" height="52" rx="18" fill="url(#gCap)"/>


          <!-- Bandă decorativă generică, NU logo – doar val cu culori din temă -->
          <path id="band" d="M60 420 C 140 360, 280 520, 360 460 L 360 600 Q 280 640, 210 600 Q 140 560, 60 600 Z" fill="#1e3a8a" opacity=".9"/>
          <path id="band2" d="M60 380 C 140 420, 280 300, 360 340 L 360 420 Q 280 460, 210 420 Q 140 380, 60 420 Z" fill="#ef4444" opacity=".9"/>


          <!-- Titlu mare generic -->
          <text x="210" y="360" text-anchor="middle" font-size="84" font-weight="900" fill="#fff" opacity=".95" letter-spacing="4">PEPSI</text>
          <text x="210" y="690" text-anchor="middle" font-size="18" font-weight="700" fill="#dbeafe" opacity=".9">Refreshing Taste</text>
        </svg>
      </div>
    </div>
  </header>


  <main class="promo" id="produse">
    <div class="grid">
      <div class="tile" style="grid-column:span 12">
        <h3>Experiență „like-video”</h3>
        <p>Parallax cu bule, panglici cromatice și „shine” subtil. Performanță optimizată (canvas & requestAnimationFrame), accesibil și responsiv.</p>
      </div>
      <div class="tile">
        <h3>Flavor Engine</h3>
        <p>Schimbă instant tema (culori & accente) pentru Original / Zero / Cherry / Lime. Toate elementele UI reacționează la temă.</p>
      </div>
      <div class="tile">
        <h3>3D Tilt</h3>
        <p>Efect ușor de tilt pe cardul dozei, cu reset smart la mouse leave.</p>
      </div>
      <div class="tile">
        <h3>Scroll Reveal</h3>
        <p>Animări fine la apariția în viewport (IntersectionObserver) pentru tile-uri & carduri.</p>
      </div>
      <div class="tile">
        <h3>Carusel</h3>
        <p>Secțiune de carduri cu scroll-snap. Pregătită pentru produse, bundle-uri și promoții sezoniere.</p>
      </div>
      <div class="tile">
        <h3>Curat & Modular</h3>
        <p>CSS cu variabile, JS organizat, ușor de integrat într-un CMS sau framework.</p>
      </div>
    </div>


    <div class="carousel" aria-label="Produse în tendințe">
      <div class="prod"><strong>Pepsi Original 330ml</strong><p class="copy">Gust clasic, efervescent, potrivit oricând.</p><a class="pill" href="#cumpara">Detalii</a></div>
      <div class="prod"><strong>Pepsi Zero 500ml</strong><p class="copy">Zero zahăr. Zero compromis.</p><a class="pill" href="#cumpara">Detalii</a></div>
      <div class="prod"><strong>Pepsi Cherry 330ml</strong><p class="copy">Note fructate pentru un twist dulce.</p><a class="pill" href="#cumpara">Detalii</a></div>
      <div class="prod"><strong>Pepsi Lime 1L</strong><p class="copy">Prospețime citrică ce iese în evidență.</p><a class="pill" href="#cumpara">Detalii</a></div>
    </div>


    <section id="cumpara" class="tile" style="grid-column:1/-1">
      <h3>Găsește-ți favorita</h3>
      <p class="copy">Adaugă un „store locator” sau un buton către magazinele partenere. Acest template e gândit să se integreze ușor.</p>
      <div class="cta" style="margin-top:10px">
        <a class="btn" href="#">Cumpără de la parteneri</a>
        <a class="btn outline" href="#">Vezi promoții</a>
      </div>
    </section>
  </main>


  <footer>
    <div class="foot">
      <div class="brand"><div class="logo"></div><span>PEPSI</span></div>
      <span class="copy">© 2025. Template demo creat de RTEC DESIGN. Mărcile aparțin proprietarilor lor.</span>
    </div>
  </footer>


  <script>
    // ===== BULE CANVAS =====
    const canvas = document.getElementById('bubbles');
    const ctx = canvas.getContext('2d');
    const DPR = Math.min(window.devicePixelRatio || 1, 2);
    let W=0,H=0, P=[];


    function resize(){
      W = canvas.width = Math.floor(innerWidth*DPR);
      H = canvas.height = Math.floor(innerHeight*DPR);
      canvas.style.width = innerWidth + 'px';
      canvas.style.height = innerHeight + 'px';
    }
    addEventListener('resize', resize); resize();


    function rand(a,b){ return a + Math.random()*(b-a); }
    function spawn(n=2){
      for(let i=0;i<n;i++){
        P.push({x:Math.random()*W, y:H+20, r:rand(6,22)*DPR, vy:rand(0.2,0.8)*DPR, drift:rand(-0.2,0.2)*DPR, a:rand(0.25,0.6)});
      }
    }


    function tick(){
      ctx.clearRect(0,0,W,H);
      const grad = ctx.createRadialGradient(W*0.5,H*0.2,0, W*0.5,H*0.2, Math.max(W,H)*0.9);
      grad.addColorStop(0,'rgba(255,255,255,0.04)');
      grad.addColorStop(1,'rgba(0,0,0,0.18)');
      ctx.fillStyle=grad; ctx.fillRect(0,0,W,H);


      if(P.length<120) spawn(1);


      for(let i=P.length-1;i>=0;i--){
        const p=P[i];
        p.y -= p.vy; p.x += p.drift;
        ctx.globalAlpha = p.a;
        const r=p.r, s=r*0.6;
        const g = ctx.createRadialGradient(p.x-s*0.4,p.y-s*0.4, r*0.1, p.x, p.y, r);
        g.addColorStop(0,'rgba(255,255,255,.9)');
        g.addColorStop(1,'rgba(255,255,255,.08)');
        ctx.fillStyle=g; ctx.beginPath(); ctx.arc(p.x,p.y,r,0,Math.PI*2); ctx.fill();
        if(p.y < -40 || p.x<-40 || p.x>W+40){ P.splice(i,1); }
      }
      requestAnimationFrame(tick);
    }
    requestAnimationFrame(tick);


    // ===== FLAVORS THEME ENGINE =====
    const flavors = document.querySelectorAll('.flavor');
    const band = document.getElementById('band');
    const band2 = document.getElementById('band2');


    const THEMES = {
      original: { band:'#0b5db6', band2:'#ef4444', bodyTop:'#0f1c3b', bodyBot:'#0a1530' },
      zero:     { band:'#1f2937', band2:'#9ca3af', bodyTop:'#0b0f16', bodyBot:'#0a0e14' },
      cherry:   { band:'#8b1430', band2:'#ff6b8a', bodyTop:'#2a0d17', bodyBot:'#1b0a12' },
      lime:     { band:'#15803d', band2:'#9ae6b4', bodyTop:'#0d1a12', bodyBot:'#0b1610' }
    };


    function applyFlavor(key){
      document.body.setAttribute('data-flavor', key);
      const t = THEMES[key];
      band.setAttribute('fill', t.band);
      band2.setAttribute('fill', t.band2);
      // update body gradient via CSS variables by replacing stops
      const styleTag = document.getElementById('dynGrad') || (()=>{ const s=document.createElement('style'); s.id='dynGrad'; document.head.appendChild(s); return s; })();
      styleTag.textContent = `#gBody stop[offset="0"]{stop-color:${t.bodyTop}} #gBody stop[offset="1"]{stop-color:${t.bodyBot}}`;


      flavors.forEach(btn=> btn.setAttribute('aria-pressed', String(btn.dataset.flavor===key)));
    }


  // ===== CHOP TRANSITION =====
  const chop = document.getElementById('chop');
  function chopTransition(to){
    const t = THEMES[to];
    document.documentElement.style.setProperty('--chopA', t.band);
    document.documentElement.style.setProperty('--chopB', t.band2);
    chop.classList.remove('on'); void chop.offsetWidth; // restart
    chop.classList.add('on');
    setTimeout(()=> applyFlavor(to), 340);
    setTimeout(()=> chop.classList.remove('on'), 700);
  }


  flavors.forEach(btn=> btn.addEventListener('click', ()=> chopTransition(btn.dataset.flavor)));
    applyFlavor('original');


    // ===== 3D TILT =====
    const tilt = document.getElementById('tilt');
    tilt.addEventListener('mousemove', (e)=>{
      const r = tilt.getBoundingClientRect();
      const x = (e.clientX - r.left)/r.width - .5;
      const y = (e.clientY - r.top)/r.height - .5;
      tilt.style.transform = `perspective(900px) rotateX(${(-y*6).toFixed(2)}deg) rotateY(${(x*8).toFixed(2)}deg)`;
    });
    tilt.addEventListener('mouseleave', ()=> tilt.style.transform='');


    // ===== SCROLL REVEAL =====
    const revealEls = document.querySelectorAll('.tile, .prod');
    const io = new IntersectionObserver((entries)=>{
      entries.forEach(en=>{
        if(en.isIntersecting){ en.target.animate([
          {opacity:0, transform:'translateY(12px)'}, {opacity:1, transform:'translateY(0)'}
        ], {duration:500, easing:'cubic-bezier(.2,.6,.2,1)', fill:'forwards'}); io.unobserve(en.target); }
      })
    }, {threshold:.2});
    revealEls.forEach(el=> io.observe(el));
  </script>
</body>
</html>

Ai Nevoie de Cod Personalizat?

Contactează-ne pentru soluții de cod personalizate pentru proiectul tău. Putem dezvolta componente, module și funcționalități specifice nevoilor tale.

Contactează-ne
RTEC
Suport RTEC DESIGN Nexa este online