• Updated 11 Nov, 12:43 UTC
  • Next run 12 Nov, 05:17 UTCNext 12 Nov 05:17
  • Last 7 days: 10 new models · 61 runs7 d: 10 models · 61 runs
Wristwatch that shows the current time

Hy4Tencent

Network offOpen alone (new tab)

Run details

Model
tencent/hy4
Route
OpenRouter API, one user message
Served by
Tencent
Effort
high, OpenRouter's default for this model
Limits
60 min · 65,536 output tokens (the model's limit)
Date
7 Nov 2026
Time
2 min 35 s
Size
17 kB
Tokens
96 in, 21,979 out (15,766 of them thinking)
List price
$0.028 at today's price ($0.417 in / $1.25 out per M)
Paid
$0.028

Raw files: output · meta.json

Exact prompt

Draw a mechanical wristwatch that shows the current local time, with a sweeping seconds hand and a date window. Make it look expensive.

It must be one complete, self-contained HTML file: inline all CSS and JavaScript, and make no network requests of any kind (no CDNs, web fonts or remote images). Reply with the file in a single ```html code block.

Source

17 kB 548 lines Raw

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Aurélien Genève - Automatic</title>
<style>
  :root {
    --gold-bright: #ffeca0;
    --gold-base: #d4af37;
    --gold-mid: #aa771c;
    --gold-dark: #4a2f05;
    --dial-blue: #112a5c;
    --dial-dark: #01040a;
    --lume: #e8eedd;
  }

  body {
    margin: 0;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    background: radial-gradient(circle at 50% 35%, #2a2d34 0%, #111317 55%, #050506 100%);
    overflow: hidden;
    font-family: "Didot", "Bodoni MT", "Times New Roman", serif;
    user-select: none;
  }

  /* ---------------- ASSEMBLY ---------------- */
  .watch-container {
    position: relative;
    width: 340px;
    height: 340px;
    filter: drop-shadow(0 40px 50px rgba(0, 0, 0, 0.85));
  }

  /* ---------------- STRAP ---------------- */
  .strap {
    position: absolute;
    left: 50%;
    width: 144px;
    height: 220px;
    margin-left: -72px;
    z-index: 1;
    box-shadow: inset 0 0 25px rgba(0, 0, 0, 0.95);
    /* Alligator scale texture */
    background-image: 
      radial-gradient(ellipse at 50% 15%, rgba(255,255,255,0.035) 0%, transparent 45%),
      radial-gradient(ellipse at 25% 40%, rgba(255,255,255,0.025) 0%, transparent 35%),
      radial-gradient(ellipse at 75% 40%, rgba(255,255,255,0.025) 0%, transparent 35%),
      linear-gradient(90deg, #080808, #1a1815 20%, #2a2520 50%, #1a1815 80%, #080808);
    background-size: 46px 46px, 46px 46px, 46px 46px, 100% 100%;
  }
  .strap::before {
    content: '';
    position: absolute;
    inset: 0 14px;
    border-left: 2px dashed #8a6d3b;
    border-right: 2px dashed #8a6d3b;
    opacity: 0.55;
  }
  .strap.top {
    top: -205px;
    border-radius: 24px 24px 0 0;
    transform: perspective(600px) rotateX(12deg);
    transform-origin: bottom center;
  }
  .strap.bottom {
    bottom: -205px;
    border-radius: 0 0 24px 24px;
    transform: perspective(600px) rotateX(-12deg);
    transform-origin: top center;
  }

  /* ---------------- CASE & LUGS ---------------- */
  .watch-case {
    position: relative;
    width: 100%;
    height: 100%;
    border-radius: 50%;
    z-index: 5;
    background: conic-gradient(
      from 210deg,
      var(--gold-dark) 0deg, var(--gold-mid) 30deg, var(--gold-bright) 50deg, var(--gold-base) 70deg, 
      var(--gold-dark) 110deg, var(--gold-mid) 150deg, var(--gold-bright) 180deg, var(--gold-base) 210deg, 
      var(--gold-dark) 250deg, var(--gold-mid) 290deg, var(--gold-bright) 320deg, var(--gold-base) 350deg, 
      var(--gold-dark) 360deg
    );
    border: 1px solid var(--gold-dark);
    box-shadow: 
      0 10px 20px rgba(0,0,0,0.7),
      inset 0 2px 4px rgba(255,255,255,0.5);
  }
  /* Mid-case thickness */
  .watch-case::before {
    content: '';
    position: absolute;
    inset: -4px;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--gold-mid), #2a1a02);
    z-index: -3;
    box-shadow: 0 18px 30px rgba(0,0,0,0.9);
  }

  .lug {
    position: absolute;
    width: 42px;
    height: 65px;
    background: linear-gradient(90deg, var(--gold-mid), var(--gold-bright) 45%, var(--gold-mid));
    z-index: 2;
    border-radius: 12px;
    box-shadow: 0 6px 12px rgba(0,0,0,0.6), inset 0 1px 2px rgba(255,255,255,0.4);
  }
  .lug.tl { top: -18px; left: 28px; transform: rotate(-16deg); }
  .lug.tr { top: -18px; right: 28px; transform: rotate(16deg); }
  .lug.bl { bottom: -18px; left: 28px; transform: rotate(16deg); }
  .lug.br { bottom: -18px; right: 28px; transform: rotate(-16deg); }

  /* ---------------- CROWN ---------------- */
  .crown-stem {
    position: absolute;
    top: 50%; right: -8px;
    transform: translateY(-50%);
    width: 10px; height: 18px;
    background: var(--gold-mid);
    z-index: -1;
  }
  .crown {
    position: absolute;
    top: 50%; right: -24px;
    transform: translateY(-50%);
    width: 20px; height: 38px;
    background: linear-gradient(90deg, var(--gold-mid), var(--gold-base) 25%, var(--gold-bright) 50%, var(--gold-base) 75%, var(--gold-dark));
    border-radius: 4px;
    box-shadow: 3px 4px 8px rgba(0,0,0,0.7), inset 0 1px 2px rgba(255,255,255,0.6);
    z-index: -1;
  }
  .crown::after {
    content: '';
    position: absolute;
    inset: 0;
    background: repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0,0,0,0.35) 2px, rgba(0,0,0,0.35) 3.5px);
    border-radius: 4px;
  }

  /* ---------------- BEZEL & DIAL ---------------- */
  .bezel-outer {
    position: absolute;
    inset: 8px;
    border-radius: 50%;
    background: conic-gradient(
      from 180deg,
      var(--gold-dark) 0deg, var(--gold-base) 60deg, var(--gold-bright) 90deg, 
      var(--gold-mid) 120deg, var(--gold-dark) 180deg, var(--gold-base) 240deg, 
      var(--gold-bright) 270deg, var(--gold-mid) 300deg, var(--gold-dark) 360deg
    );
    box-shadow: inset 0 1px 3px rgba(255,255,255,0.6), 0 2px 5px rgba(0,0,0,0.6);
    padding: 6px;
    box-sizing: border-box;
  }
  .bezel-inner {
    width: 100%; height: 100%;
    border-radius: 50%;
    background: #0c0c0c; /* Dark rehaut */
    box-shadow: inset 0 4px 10px rgba(0,0,0,0.95);
    padding: 4px;
    box-sizing: border-box;
  }
  .dial {
    position: relative;
    width: 100%; height: 100%;
    border-radius: 50%;
    background: radial-gradient(circle at 50% 50%, var(--dial-blue) 0%, #061022 55%, var(--dial-dark) 100%);
    overflow: hidden;
    box-shadow: 0 0 12px rgba(0,0,0,0.9);
  }

  /* Dial Textures */
  .dial::before {
    content: '';
    position: absolute;
    inset: 0;
    background: repeating-conic-gradient(from 0deg, rgba(255,255,255,0.035) 0deg, rgba(255,255,255,0) 1deg, rgba(255,255,255,0.035) 2deg);
    mix-blend-mode: overlay;
    z-index: 1;
  }
  .guilloche {
    position: absolute;
    inset: 32%;
    border-radius: 50%;
    background: repeating-radial-gradient(circle at 50% 50%, rgba(255,255,255,0.018) 0px, rgba(255,255,255,0.018) 1px, transparent 1px, transparent 3px);
    z-index: 1;
    pointer-events: none;
  }

  /* Printed Tracks */
  .minute-ticks {
    position: absolute;
    inset: 8px;
    border-radius: 50%;
    background: repeating-conic-gradient(from 0deg, rgba(212,175,55,0.65) 0deg 0.35deg, transparent 0.35deg 6deg);
    -webkit-mask: radial-gradient(transparent 95%, black 96%);
    mask: radial-gradient(transparent 95%, black 96%);
    z-index: 2;
  }
  .five-min-ticks {
    position: absolute;
    inset: 8px;
    border-radius: 50%;
    background: repeating-conic-gradient(from 0deg, var(--gold-bright) 0deg 0.9deg, transparent 0.9deg 30deg);
    -webkit-mask: radial-gradient(transparent 92%, black 93%);
    mask: radial-gradient(transparent 92%, black 93%);
    z-index: 2;
  }

  /* Applied Markers */
  .markers {
    position: absolute;
    inset: 0;
    z-index: 3;
  }
  .marker {
    position: absolute;
    top: 22px;
    left: 50%;
    width: 6px;
    height: 26px;
    margin-left: -3px;
    background: linear-gradient(90deg, var(--gold-dark), var(--gold-bright) 40%, #ffffff 50%, var(--gold-base) 60%, var(--gold-dark));
    border-radius: 1px;
    box-shadow: 1px 2px 3px rgba(0,0,0,0.7), inset 0 0 1px rgba(255,255,255,0.9);
    transform-origin: 50% 130px; /* Exact center of 304px dial */
  }
  .marker.double {
    width: 14px;
    margin-left: -7px;
    background: none;
    box-shadow: none;
    display: flex;
    justify-content: space-between;
  }
  .marker.double::before, .marker.double::after {
    content: '';
    width: 4px;
    height: 100%;
    background: linear-gradient(90deg, var(--gold-dark), var(--gold-bright) 40%, #ffffff 50%, var(--gold-base) 60%, var(--gold-dark));
    border-radius: 1px;
    box-shadow: 1px 2px 3px rgba(0,0,0,0.7);
  }

  /* Typography */
  .brand {
    position: absolute;
    top: 64px; width: 100%;
    text-align: center;
    font-size: 21px;
    letter-spacing: 4px;
    color: var(--gold-bright);
    text-shadow: 0 1px 2px rgba(0,0,0,0.9), 0 -1px 0 rgba(255,255,255,0.25);
    z-index: 3;
  }
  .brand-sub {
    position: absolute;
    top: 90px; width: 100%;
    text-align: center;
    font-family: Arial, sans-serif;
    font-size: 8px;
    letter-spacing: 5px;
    color: var(--gold-mid);
    z-index: 3;
  }
  .bottom-text {
    position: absolute;
    bottom: 64px; width: 100%;
    text-align: center;
    font-family: Arial, sans-serif;
    font-size: 9px;
    letter-spacing: 3px;
    color: var(--gold-base);
    z-index: 3;
  }
  .bottom-text-small {
    position: absolute;
    bottom: 26px; width: 100%;
    text-align: center;
    font-family: Arial, sans-serif;
    font-size: 7px;
    letter-spacing: 4px;
    color: var(--gold-mid);
    z-index: 3;
  }

  /* Date Window */
  .date-window {
    position: absolute;
    top: 50%; right: 25px;
    transform: translateY(-50%);
    width: 34px; height: 26px;
    background: linear-gradient(135deg, #ffffff 0%, #f2efe9 100%);
    box-shadow: 
      inset 0 3px 5px rgba(0,0,0,0.45),
      inset 0 -1px 2px rgba(255,255,255,0.9),
      0 0 0 1.5px var(--gold-base),
      0 0 0 3px var(--gold-dark),
      3px 4px 7px rgba(0,0,0,0.7);
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 2px;
    z-index: 4;
  }
  #date-value {
    font-size: 19px;
    color: #0a0a0a;
    text-shadow: 0 1px 0 rgba(255,255,255,0.9);
    transform: translateY(-1px);
  }

  /* ---------------- HANDS ---------------- */
  .hands {
    position: absolute;
    inset: 0;
    z-index: 10;
    pointer-events: none;
  }
  .hand {
    position: absolute;
    left: 50%;
    will-change: transform;
  }
  .hour-hand {
    bottom: 50%;
    transform-origin: 50% 100%;
    filter: drop-shadow(2px 4px 3px rgba(0,0,0,0.6));
  }
  .minute-hand {
    bottom: 50%;
    transform-origin: 50% 100%;
    filter: drop-shadow(2px 5px 3px rgba(0,0,0,0.6));
  }
  .second-hand {
    bottom: calc(50% - 30px); /* 30px tail below pivot */
    transform-origin: 50% 130px; /* Pivot exactly at y=130 of 160px SVG */
    filter: drop-shadow(1px 3px 2px rgba(0,0,0,0.7));
  }
  .center-pin {
    position: absolute;
    top: 50%; left: 50%;
    width: 10px; height: 10px;
    margin: -5px 0 0 -5px;
    border-radius: 50%;
    background: radial-gradient(circle at 30% 30%, #ffffff, var(--gold-bright) 40%, var(--gold-mid));
    box-shadow: 0 2px 4px rgba(0,0,0,0.9), inset 0 0 2px rgba(255,255,255,0.9);
    z-index: 15;
  }

  /* ---------------- CRYSTAL & CYCLOPS ---------------- */
  .crystal {
    position: absolute;
    inset: 0;
    border-radius: 50%;
    background: 
      linear-gradient(135deg, rgba(255,255,255,0.13) 0%, rgba(255,255,255,0) 35%, rgba(255,255,255,0) 65%, rgba(255,255,255,0.04) 100%),
      radial-gradient(ellipse at 25% 15%, rgba(255,255,255,0.09) 0%, transparent 45%);
    box-shadow: 
      inset 0 0 35px rgba(0, 90, 220, 0.15), /* AR Coating */
      inset 0 1px 2px rgba(255,255,255,0.25);
    pointer-events: none;
    z-index: 20;
  }
  .crystal::after {
    content: '';
    position: absolute;
    top: -10%; left: -10%; width: 120%; height: 120%;
    border-radius: 50%;
    background: conic-gradient(
      from 200deg,
      transparent 0deg,
      rgba(255,255,255,0.18) 15deg,
      transparent 32deg,
      transparent 180deg,
      rgba(255,255,255,0.06) 195deg,
      transparent 212deg
    );
    -webkit-mask: radial-gradient(transparent 85%, black 95%);
    mask: radial-gradient(transparent 85%, black 95%);
  }
  .cyclops {
    position: absolute;
    top: 50%; right: 22px;
    transform: translateY(-50%);
    width: 44px; height: 32px;
    border-radius: 8px;
    background: radial-gradient(ellipse at 30% 20%, rgba(255,255,255,0.28) 0%, rgba(255,255,255,0.02) 55%, rgba(0,0,0,0.12) 100%);
    box-shadow: 
      inset 1px 1px 3px rgba(255,255,255,0.55),
      inset -1px -1px 3px rgba(0,0,0,0.35),
      2px 4px 7px rgba(0,0,0,0.45);
    z-index: 21;
    pointer-events: none;
  }
</style>
</head>
<body>

<!-- Shared SVG Gradients -->
<svg width="0" height="0" style="position:absolute; pointer-events:none;">
  <defs>
    <!-- Faceted Gold: Bright at center ridge (x=8), dark at outer edges -->
    <linearGradient id="goldLight" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%" stop-color="#ffeca0" />
      <stop offset="30%" stop-color="#d4af37" />
      <stop offset="100%" stop-color="#734a0c" />
    </linearGradient>
    <linearGradient id="goldDark" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%" stop-color="#4a2f05" />
      <stop offset="70%" stop-color="#aa771c" />
      <stop offset="100%" stop-color="#e6c200" />
    </linearGradient>
    <!-- Tempered Blued Steel -->
    <linearGradient id="blueSteel" x1="0%" y1="0%" x2="100%" y2="0%">
      <stop offset="0%" stop-color="#020617" />
      <stop offset="50%" stop-color="#1e3a8a" />
      <stop offset="100%" stop-color="#000000" />
    </linearGradient>
  </defs>
</svg>

<div class="watch-container">
  <div class="strap top"></div>
  <div class="strap bottom"></div>
  
  <div class="watch-case">
    <div class="lug tl"></div><div class="lug tr"></div>
    <div class="lug bl"></div><div class="lug br"></div>
    <div class="crown-stem"></div><div class="crown"></div>
    
    <div class="bezel-outer">
      <div class="bezel-inner">
        <div class="dial">
          <div class="guilloche"></div>
          <div class="minute-ticks"></div>
          <div class="five-min-ticks"></div>
          
          <div class="markers" id="markers"></div>
          
          <div class="brand">AURÉLIEN</div>
          <div class="brand-sub">GENÈVE</div>
          <div class="bottom-text">AUTOMATIC</div>
          <div class="bottom-text-small">SWISS MADE</div>
          
          <div class="date-window">
            <span id="date-value">01</span>
          </div>
          
          <div class="hands">
            <!-- Hour Hand -->
            <div class="hand hour-hand" id="hour">
              <svg width="16" height="90" viewBox="0 0 16 90" style="display:block;">
                <polygon points="8,0 0,25 0,90 8,90" fill="url(#goldDark)" />
                <polygon points="8,0 16,25 16,90 8,90" fill="url(#goldLight)" />
                <polygon points="8,12 12,28 12,70 4,70 4,28" fill="#e8eedd" stroke="#a07d30" stroke-width="0.5" filter="drop-shadow(0 0 2px rgba(232,238,221,0.3))"/>
                <line x1="8" y1="12" x2="8" y2="70" stroke="#ffffff" stroke-width="0.5" opacity="0.6"/>
              </svg>
            </div>
            
            <!-- Minute Hand -->
            <div class="hand minute-hand" id="minute">
              <svg width="12" height="130" viewBox="0 0 12 130" style="display:block;">
                <polygon points="6,0 0,20 0,130 6,130" fill="url(#goldDark)" />
                <polygon points="6,0 12,20 12,130 6,130" fill="url(#goldLight)" />
                <polygon points="6,15 9,25 9,100 3,100 3,25" fill="#e8eedd" stroke="#a07d30" stroke-width="0.5" filter="drop-shadow(0 0 2px rgba(232,238,221,0.3))"/>
                <line x1="6" y1="15" x2="6" y2="100" stroke="#ffffff" stroke-width="0.5" opacity="0.6"/>
              </svg>
            </div>
            
            <!-- Sweeping Seconds Hand -->
            <div class="hand second-hand" id="second">
              <svg width="12" height="160" viewBox="0 0 12 160" style="display:block; overflow:visible;">
                <path d="M6 0 L7 20 L6.5 130 L5.5 130 L5 20 Z" fill="url(#blueSteel)" />
                <circle cx="6" cy="12" r="2.5" fill="none" stroke="#1e3a8a" stroke-width="1.2"/>
                <circle cx="6" cy="142" r="5" fill="url(#blueSteel)" />
                <path d="M5.5 130 L6.5 130 L6.5 160 L5.5 160 Z" fill="url(#blueSteel)" />
              </svg>
            </div>
            
            <div class="center-pin"></div>
          </div>
          
          <div class="crystal"></div>
          <div class="cyclops"></div>
        </div>
      </div>
    </div>
  </div>
</div>

<script>
  // Generate applied hour markers
  const markersContainer = document.getElementById('markers');
  for (let i = 0; i < 12; i++) {
    if (i === 3) continue; // Omitted at 3 o'clock for the date window
    const marker = document.createElement('div');
    marker.className = 'marker' + (i === 0 ? ' double' : '');
    marker.style.transform = `rotate(${i * 30}deg)`;
    markersContainer.appendChild(marker);
  }

  // High-precision sweeping animation
  const hourEl = document.getElementById('hour');
  const minuteEl = document.getElementById('minute');
  const secondEl = document.getElementById('second');
  const dateEl = document.getElementById('date-value');

  function updateWatch() {
    const now = new Date();
    const ms = now.getMilliseconds();
    const s = now.getSeconds();
    const m = now.getMinutes();
    const h = now.getHours() % 12;

    // Perfectly continuous mechanical sweep
    const preciseSeconds = s + ms / 1000;
    const preciseMinutes = m + preciseSeconds / 60;
    const preciseHours = h + preciseMinutes / 60;

    const secDeg = preciseSeconds * 6;
    const minDeg = preciseMinutes * 6;
    const hourDeg = preciseHours * 30;

    // translateX(-50%) centers the SVG on the vertical axis before rotation
    hourEl.style.transform = `translateX(-50%) rotate(${hourDeg}deg)`;
    minuteEl.style.transform = `translateX(-50%) rotate(${minDeg}deg)`;
    secondEl.style.transform = `translateX(-50%) rotate(${secDeg}deg)`;

    const dateStr = now.getDate().toString().padStart(2, '0');
    if (dateEl.textContent !== dateStr) {
      dateEl.textContent = dateStr;
    }

    requestAnimationFrame(updateWatch);
  }

  requestAnimationFrame(updateWatch);
</script>
</body>
</html>

Compare with

Hy4: other attempts