Загрузка данных


<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Discord</title>
<style>
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

  html, body {
    width: 100%; height: 100%;
    overflow: hidden;
    background: #07000f;
  }

  /* ── Gradient BG ── */
  .bg {
    position: fixed; inset: 0; z-index: 0;
    background:
      radial-gradient(ellipse 70% 55% at 15% 15%, rgba(88,101,242,0.4) 0%, transparent 55%),
      radial-gradient(ellipse 55% 65% at 85% 85%, rgba(124,58,237,0.35) 0%, transparent 55%),
      radial-gradient(ellipse 50% 40% at 75% 10%, rgba(6,182,212,0.22) 0%, transparent 50%),
      radial-gradient(ellipse 60% 45% at 20% 90%, rgba(236,72,153,0.18) 0%, transparent 50%),
      linear-gradient(135deg, #07000f 0%, #0d0025 40%, #010a18 100%);
  }

  /* animated mesh orbs */
  .orb {
    position: fixed; border-radius: 50%; pointer-events: none; z-index: 0;
    filter: blur(90px); animation: drift ease-in-out infinite alternate;
  }
  .o1 { width: 600px; height: 600px; top: -150px; left: -150px; background: rgba(88,101,242,0.22); animation-duration: 14s; }
  .o2 { width: 500px; height: 500px; bottom: -120px; right: -120px; background: rgba(124,58,237,0.2); animation-duration: 18s; animation-delay: -5s; }
  .o3 { width: 350px; height: 350px; top: 35%; right: 5%; background: rgba(6,182,212,0.15); animation-duration: 22s; animation-delay: -9s; }
  .o4 { width: 280px; height: 280px; bottom: 15%; left: 8%; background: rgba(236,72,153,0.13); animation-duration: 20s; animation-delay: -13s; }

  @keyframes drift {
    0%   { transform: translate(0, 0) scale(1); }
    50%  { transform: translate(25px, -18px) scale(1.04); }
    100% { transform: translate(-15px, 20px) scale(0.97); }
  }

  /* subtle grid */
  .grid {
    position: fixed; inset: 0; z-index: 0; pointer-events: none; opacity: 0.04;
    background-image:
      linear-gradient(rgba(255,255,255,0.5) 1px, transparent 1px),
      linear-gradient(90deg, rgba(255,255,255,0.5) 1px, transparent 1px);
    background-size: 60px 60px;
  }

  /* ── Scene ── */
  .scene {
    position: fixed; inset: 0; z-index: 10;
    display: flex; align-items: center; justify-content: center;
    perspective: 900px;
  }

  /* wrapper that gets the 3d transform */
  #tilt {
    transform-style: preserve-3d;
    will-change: transform;
    transition: transform 0.08s linear;
    position: relative;
  }

  /* glow ring behind iframe */
  #tilt::before {
    content: '';
    position: absolute;
    inset: -18px;
    border-radius: 22px;
    background: linear-gradient(135deg,
      rgba(88,101,242,0.55) 0%,
      rgba(124,58,237,0.45) 35%,
      rgba(6,182,212,0.35) 70%,
      rgba(236,72,153,0.4) 100%);
    filter: blur(22px);
    z-index: -1;
    opacity: 0.85;
    animation: glowPulse 4s ease-in-out infinite alternate;
  }

  @keyframes glowPulse {
    0%   { opacity: 0.7; filter: blur(22px); }
    100% { opacity: 1;   filter: blur(30px); }
  }

  /* border frame around iframe */
  #tilt::after {
    content: '';
    position: absolute;
    inset: -1.5px;
    border-radius: 18px;
    background: linear-gradient(135deg,
      rgba(88,101,242,0.7),
      rgba(168,85,247,0.5),
      rgba(6,182,212,0.4),
      rgba(236,72,153,0.5));
    z-index: 2;
    pointer-events: none;
  }

  iframe {
    display: block;
    border-radius: 16px;
    position: relative;
    z-index: 3;
    /* shadow depth under card */
    filter: drop-shadow(0 40px 60px rgba(0,0,0,0.7));
  }

  /* corner sparkles */
  .sparkle {
    position: absolute; pointer-events: none; z-index: 4;
    width: 6px; height: 6px; border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 10px 3px rgba(168,85,247,0.9);
    animation: sparklePulse 2s ease-in-out infinite;
  }
  .sp1 { top: -3px; left: -3px; animation-delay: 0s; }
  .sp2 { top: -3px; right: -3px; animation-delay: 0.5s; }
  .sp3 { bottom: -3px; left: -3px; animation-delay: 1s; }
  .sp4 { bottom: -3px; right: -3px; animation-delay: 1.5s; }

  @keyframes sparklePulse {
    0%,100% { opacity: 0.4; transform: scale(1); }
    50%      { opacity: 1;   transform: scale(1.6); }
  }

  /* label above */
  .label {
    position: absolute;
    top: -38px; left: 50%; transform: translateX(-50%);
    font-family: 'Segoe UI', system-ui, sans-serif;
    font-size: 11px; font-weight: 700; letter-spacing: 0.14em;
    text-transform: uppercase;
    color: rgba(168,85,247,0.7);
    white-space: nowrap;
    z-index: 4;
  }

</style>
</head>
<body>

<div class="bg"></div>
<div class="orb o1"></div>
<div class="orb o2"></div>
<div class="orb o3"></div>
<div class="orb o4"></div>
<div class="grid"></div>

<div class="scene">
  <div id="tilt">
    <div class="label">s1mclick · Discord</div>
    <span class="sparkle sp1"></span>
    <span class="sparkle sp2"></span>
    <span class="sparkle sp3"></span>
    <span class="sparkle sp4"></span>
    <iframe
      src="https://discord.com/widget?id=1506958285562187846&theme=dark"
      width="350" height="500"
      allowtransparency="true"
      frameborder="0"
      sandbox="allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts">
    </iframe>
  </div>
</div>

<script>
  const tilt = document.getElementById('tilt');
  const MAX = 22; // max degrees
  let cx = window.innerWidth / 2;
  let cy = window.innerHeight / 2;
  let curRX = 0, curRY = 0;
  let targetRX = 0, targetRY = 0;

  // smooth lerp
  let raf;
  function lerp(a, b, t) { return a + (b - a) * t; }

  function animate() {
    curRX = lerp(curRX, targetRX, 0.1);
    curRY = lerp(curRY, targetRY, 0.1);

    // rotateX tilts top/bottom, rotateY tilts left/right
    // "вогнуто к мышке" = сторона ближе к мышке — вперёд, дальняя — назад
    tilt.style.transform = `rotateX(${curRX}deg) rotateY(${curRY}deg)`;
    raf = requestAnimationFrame(animate);
  }
  animate();

  document.addEventListener('mousemove', e => {
    const dx = (e.clientX - cx) / cx; // -1 .. 1
    const dy = (e.clientY - cy) / cy; // -1 .. 1

    // когда мышь справа (dx>0) — правая сторона ближе к нам → rotateY положительный
    // когда мышь снизу (dy>0) — нижняя сторона ближе → rotateX отрицательный
    targetRY =  dx * MAX;
    targetRX = -dy * MAX;
  });

  // reset on mouse leave
  document.addEventListener('mouseleave', () => {
    targetRX = 0;
    targetRY = 0;
  });

  window.addEventListener('resize', () => {
    cx = window.innerWidth / 2;
    cy = window.innerHeight / 2;
  });
</script>
</body>
</html>