← back to Model Arena

data/artifacts/258516d076e6/qwen3-14b.html

392 lines

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Shop by Color</title>
  <style>
    :root {
      --bg: #faf8f4;
      --surface: #ffffff;
      --text: #1c1a17;
      --muted: #9b948a;
      --accent: #b0472e;
      --line: #e6e6e6;
      --shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
      --ease: cubic-bezier(0.22, 1, 0.36, 1);
    }

    * {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
    }

    body {
      background: var(--bg);
      color: var(--text);
      font-family: -apple-system, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
      font-size: 16px;
      line-height: 1.6;
      display: flex;
      flex-direction: column;
      min-height: 100vh;
    }

    header {
      font-family: 'Playfair Display', Georgia, serif;
      font-size: 48px;
      letter-spacing: 0.18em;
      text-transform: uppercase;
      color: var(--text);
      padding: 16px 32px;
      background: var(--surface);
      box-shadow: var(--shadow);
      display: flex;
      align-items: center;
      justify-content: flex-start;
      flex-shrink: 0;
    }

    main {
      flex: 1;
      display: flex;
      flex-direction: column;
      align-items: center;
      padding: 64px 32px;
    }

    .wheel-container {
      position: relative;
      width: 400px;
      height: 400px;
      margin: 0 auto;
      border: 1px solid var(--line);
      border-radius: 50%;
      overflow: hidden;
      cursor: pointer;
      user-select: none;
      transition: transform 0.3s var(--ease);
    }

    .color-wheel {
      width: 100%;
      height: 100%;
      border-radius: 50%;
      background: conic-gradient(
        var(--accent) 0deg,
        var(--accent) 10deg,
        var(--muted) 10deg,
        var(--muted) 20deg,
        var(--text) 20deg,
        var(--text) 30deg,
        var(--muted) 30deg,
        var(--muted) 40deg,
        var(--accent) 40deg,
        var(--accent) 50deg,
        var(--muted) 50deg,
        var(--muted) 60deg,
        var(--text) 60deg,
        var(--text) 70deg,
        var(--muted) 70deg,
        var(--muted) 80deg,
        var(--accent) 80deg,
        var(--accent) 90deg,
        var(--muted) 90deg,
        var(--muted) 100deg,
        var(--text) 100deg,
        var(--text) 110deg,
        var(--muted) 110deg,
        var(--muted) 120deg,
        var(--accent) 120deg,
        var(--accent) 130deg,
        var(--muted) 130deg,
        var(--muted) 140deg,
        var(--text) 140deg,
        var(--text) 150deg,
        var(--muted) 150deg,
        var(--muted) 160deg,
        var(--accent) 160deg,
        var(--accent) 170deg,
        var(--muted) 170deg,
        var(--muted) 180deg,
        var(--text) 180deg,
        var(--text) 190deg,
        var(--muted) 190deg,
        var(--muted) 200deg,
        var(--accent) 200deg,
        var(--accent) 210deg,
        var(--muted) 210deg,
        var(--muted) 220deg,
        var(--text) 220deg,
        var(--text) 230deg,
        var(--muted) 230deg,
        var(--muted) 240deg,
        var(--accent) 240deg,
        var(--accent) 250deg,
        var(--muted) 250deg,
        var(--muted) 260deg,
        var(--text) 260deg,
        var(--text) 270deg,
        var(--muted) 270deg,
        var(--muted) 280deg,
        var(--accent) 280deg,
        var(--accent) 290deg,
        var(--muted) 290deg,
        var(--muted) 300deg,
        var(--text) 300deg,
        var(--text) 310deg,
        var(--muted) 310deg,
        var(--muted) 320deg,
        var(--accent) 320deg,
        var(--accent) 330deg,
        var(--muted) 330deg,
        var(--muted) 340deg,
        var(--text) 340deg,
        var(--text) 350deg,
        var(--muted) 350deg,
        var(--muted) 360deg
      );
    }

    .wheel-pointer {
      position: absolute;
      top: 50%;
      left: 50%;
      width: 2px;
      height: 150px;
      background: var(--text);
      transform: translate(-50%, -50%) rotate(0deg);
      transition: transform 0.3s var(--ease);
    }

    .pattern-gallery {
      margin-top: 48px;
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
      gap: 24px;
      width: 100%;
      max-width: 1200px;
    }

    .pattern-card {
      background: var(--surface);
      border: 1px solid var(--line);
      border-radius: 14px;
      overflow: hidden;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      padding: 24px;
      transition: transform 0.2s var(--ease);
      box-shadow: var(--shadow);
    }

    .pattern-card:hover {
      transform: scale(1.02);
    }

    .pattern {
      width: 100%;
      height: 180px;
      border-radius: 8px;
      margin-bottom: 16px;
    }

    .pattern-name {
      font-family: 'Playfair Display', Georgia, serif;
      font-size: 24px;
      letter-spacing: 0.1em;
      text-transform: uppercase;
      color: var(--text);
    }

    .share-bar {
      margin-top: 64px;
      display: flex;
      gap: 24px;
      justify-content: center;
      flex-wrap: wrap;
    }

    .share-button {
      background: var(--accent);
      color: var(--text);
      border: none;
      padding: 12px 24px;
      border-radius: 14px;
      font-size: 14px;
      letter-spacing: 0.15em;
      text-transform: uppercase;
      cursor: pointer;
      transition: background 0.2s var(--ease);
    }

    .share-button:hover {
      background: #d03e1c;
    }
  </style>
</head>
<body>
  <header>DESIGNER WALLCOVERINGS</header>
  <main>
    <div class="wheel-container" id="wheel">
      <div class="color-wheel"></div>
      <div class="wheel-pointer" id="pointer"></div>
    </div>
    <div class="pattern-gallery" id="gallery"></div>
    <div class="share-bar">
      <button class="share-button">SHARE ON INSTAGRAM</button>
      <button class="share-button">SHARE ON PINTEREST</button>
      <button class="share-button">SAVE TO FAVES</button>
    </div>
  </main>
  <script>
    const wheel = document.getElementById('wheel');
    const pointer = document.getElementById('pointer');
    const gallery = document.getElementById('gallery');
    const colors = ['#b0472e', '#c9a961', '#e0a458', '#7d6a45', '#8a8578', '#2f4c39'];

    let hue = 0;

    function updateWheel() {
      const gradient = `conic-gradient(
        var(--accent) 0deg,
        var(--accent) 10deg,
        var(--muted) 10deg,
        var(--muted) 20deg,
        var(--text) 20deg,
        var(--text) 30deg,
        var(--muted) 30deg,
        var(--muted) 40deg,
        var(--accent) 40deg,
        var(--accent) 50deg,
        var(--muted) 50deg,
        var(--muted) 60deg,
        var(--text) 60deg,
        var(--text) 70deg,
        var(--muted) 70deg,
        var(--muted) 80deg,
        var(--accent) 80deg,
        var(--accent) 90deg,
        var(--muted) 90deg,
        var(--muted) 100deg,
        var(--text) 100deg,
        var(--text) 110deg,
        var(--muted) 110deg,
        var(--muted) 120deg,
        var(--accent) 120deg,
        var(--accent) 130deg,
        var(--muted) 130deg,
        var(--muted) 140deg,
        var(--text) 140deg,
        var(--text) 150deg,
        var(--muted) 150deg,
        var(--muted) 160deg,
        var(--accent) 160deg,
        var(--accent) 170deg,
        var(--muted) 170deg,
        var(--muted) 180deg,
        var(--text) 180deg,
        var(--text) 190deg,
        var(--muted) 190deg,
        var(--muted) 200deg,
        var(--accent) 200deg,
        var(--accent) 210deg,
        var(--muted) 210deg,
        var(--muted) 220deg,
        var(--text) 220deg,
        var(--text) 230deg,
        var(--muted) 230deg,
        var(--muted) 240deg,
        var(--accent) 240deg,
        var(--accent) 250deg,
        var(--muted) 250deg,
        var(--muted) 260deg,
        var(--text) 260deg,
        var(--text) 270deg,
        var(--muted) 270deg,
        var(--muted) 280deg,
        var(--accent) 280deg,
        var(--accent) 290deg,
        var(--muted) 290deg,
        var(--muted) 300deg,
        var(--text) 300deg,
        var(--text) 310deg,
        var(--muted) 310deg,
        var(--muted) 320deg,
        var(--accent) 320deg,
        var(--accent) 330deg,
        var(--muted) 330deg,
        var(--muted) 340deg,
        var(--text) 340deg,
        var(--text) 350deg,
        var(--muted) 350deg,
        var(--muted) 360deg
      )`;
      wheel.querySelector('.color-wheel').style.background = gradient;
    }

    function updatePointer(angle) {
      pointer.style.transform = `translate(-50%, -50%) rotate(${angle}deg)`;
    }

    function generatePatterns(hue) {
      const patterns = [];
      const colors = [hue, (hue + 30) % 360, (hue + 60) % 360, (hue + 90) % 360];

      for (let i = 0; i < 4; i++) {
        const color = `hsl(${colors[i]}, 80%, 60%)`;
        const pattern = document.createElement('div');
        pattern.className = 'pattern-card';

        const patternElement = document.createElement('div');
        patternElement.className = 'pattern';
        patternElement.style.background = `linear-gradient(45deg, ${color} 25%, transparent 25%, transparent 75%, ${color} 75%, ${color} 75%, transparent 75%, transparent 100%)`;
        patternElement.style.backgroundSize = '20px 20px';

        const patternName = document.createElement('div');
        patternName.className = 'pattern-name';
        patternName.textContent = `Pattern ${i + 1}`;

        pattern.appendChild(patternElement);
        pattern.appendChild(patternName);

        patterns.push(pattern);
      }

      gallery.innerHTML = '';
      patterns.forEach(pattern => gallery.appendChild(pattern));
    }

    wheel.addEventListener('click', (e) => {
      const rect = wheel.getBoundingClientRect();
      const centerX = rect.left + rect.width / 2;
      const centerY = rect.top + rect.height / 2;
      const dx = e.clientX - centerX;
      const dy = e.clientY - centerY;
      const angle = Math.atan2(dy, dx) * (180 / Math.PI);
      hue = (360 - (angle + 360) % 360 + 360) % 360;
      updatePointer(hue);
      generatePatterns(hue);
    });

    wheel.addEventListener('touchstart', (e) => {
      e.preventDefault();
      const rect = wheel.getBoundingClientRect();
      const centerX = rect.left + rect.width / 2;
      const centerY = rect.top + rect.height / 2;
      const dx = e.touches[0].clientX - centerX;
      const dy = e.touches[0].clientY - centerY;
      const angle = Math.atan2(dy, dx) * (180 / Math.PI);
      hue = (360 - (angle + 360) % 360 + 360) % 360;
      updatePointer(hue);
      generatePatterns(hue);
    });

    updateWheel();
    generatePatterns(hue);
  </script>
</body>
</html>