Models 44

GPT-6.1 Terra

by OpenAIReasoningClean
Open in new window

Running live in a sandboxed frame. Click inside it before using the keyboard.

How it went

Total time
47.5 s
Cost
$0.021
Output tokens
4,175
Spent thinking
0 tokens
Speed
90.5 tok/s
Console errors
0
First token after
1.4 s
First visible text after
1.4 s
Prompt tokens
498
Code size
11.9 KB
Finish reason
stop
Served by
OpenAI
Model id
openai/gpt-6.1-terra
Reasoning sent
{"effort":"none"}
Max output
128,000 tokens
Generated
Nov 12, 2026

What it was asked

The prompt
Create a set of four animated weather cards (sunny, rainy, snowy, stormy), made with HTML and CSS only. Requirements: - Absolutely no JavaScript: the file must not contain any <script> tag or inline event handler. - No images, no SVG, no icon fonts: every weather icon is built from HTML elements and pseudo-elements styled with CSS. - Each card shows an animated icon (rotating sun rays, falling rain drops, drifting snowflakes, flashing lightning), a city name, a temperature and a short description. - Each card has its own background gradient matching the weather. - The cards are displayed in a responsive grid (4 per row on desktop, stacked on mobile) and lift up on hover. - Smooth infinite animations using @keyframes, and respect prefers-reduced-motion.
System prompt, sent with every prompt
You are generating a self-contained web demo. It will be rendered automatically in a sandboxed iframe and compared side by side with the output of other AI models given the exact same task.

Output rules:
- Reply with exactly ONE fenced code block containing the complete file: ```html (or ```svg when the task asks for an SVG). No text before or after the code block.
- Everything must be inline: CSS in <style>, JavaScript in <script>. No external files, images, fonts or network requests, except the CDN URLs explicitly allowed by the task.
- Do not use localStorage, sessionStorage, cookies, IndexedDB, alert(), confirm(), prompt() or window.open(): they are blocked in the sandbox and will throw.
- The page must look right in a 1280×800 viewport and adapt gracefully down to 375px wide. No horizontal scrollbar.
- Something meaningful must be visible on first paint: a screenshot is taken automatically about 3 seconds after load, without any interaction.
- Everything that makes the demo interesting must be visible within the first seconds: nothing hidden behind a high score, a later level or a long play session.
- Games must start in a self-playing demo mode (a simple AI plays) behind a "Click or press a key to start" message, so the game can be judged in action without playing.
- The iframe only receives keyboard events after the user clicks it: if the demo uses the keyboard, display a clear "Click or press a key to start" message.
- The code must run with zero errors in the console of the latest Chrome.

Code run-1.html · 446 lines

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>A Little Weather</title>
<style>
  :root {
    color-scheme: light;
    font-family: "Trebuchet MS", "Segoe UI", sans-serif;
    background: #f6f5f1;
    color: #252c3a;
  }

  * { box-sizing: border-box; }

  body {
    margin: 0;
    min-height: 100vh;
    background:
      radial-gradient(circle at 9% 4%, rgba(247, 222, 192, .36), transparent 25%),
      radial-gradient(circle at 92% 98%, rgba(203, 219, 228, .35), transparent 30%),
      #f6f5f1;
  }

  main {
    width: min(1160px, calc(100% - 64px));
    margin: 0 auto;
    padding: 88px 0 72px;
  }

  .heading {
    display: flex;
    align-items: end;
    justify-content: space-between;
    gap: 24px;
    margin-bottom: 38px;
  }

  .eyebrow {
    margin: 0 0 12px;
    color: #8c948e;
    font-size: 11px;
    font-weight: 800;
    letter-spacing: .21em;
    text-transform: uppercase;
  }

  h1 {
    margin: 0;
    color: #28323b;
    font-family: Georgia, serif;
    font-size: clamp(38px, 4.7vw, 58px);
    font-weight: 400;
    letter-spacing: -.045em;
    line-height: 1;
  }

  .intro {
    max-width: 260px;
    margin: 0 0 3px;
    color: #89918f;
    font-size: 13px;
    line-height: 1.6;
  }

  .grid {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 18px;
  }

  .card {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    min-height: 420px;
    padding: 24px 23px 22px;
    border: 1px solid rgba(255,255,255,.28);
    border-radius: 20px;
    color: white;
    box-shadow: 0 14px 30px rgba(49, 62, 70, .10);
    transition: transform .35s ease, box-shadow .35s ease;
  }

  .card:hover {
    transform: translateY(-9px);
    box-shadow: 0 23px 36px rgba(49, 62, 70, .18);
  }

  .card::after {
    content: "";
    position: absolute;
    z-index: -1;
    width: 240px;
    height: 240px;
    right: -100px;
    bottom: -135px;
    border: 1px solid rgba(255,255,255,.18);
    border-radius: 50%;
    box-shadow: 0 0 0 35px rgba(255,255,255,.035), 0 0 0 70px rgba(255,255,255,.025);
  }

  .sunny { background: linear-gradient(155deg, #f9c989 0%, #ef9a6c 58%, #e78370 100%); }
  .rainy { background: linear-gradient(155deg, #a9c6cf 0%, #739cae 58%, #5e829a 100%); }
  .snowy { background: linear-gradient(155deg, #d1e3e7 0%, #a8c8d5 58%, #8db1c4 100%); }
  .stormy { background: linear-gradient(155deg, #8692ad 0%, #626d8c 55%, #4f5674 100%); }

  .card-top {
    display: flex;
    justify-content: space-between;
    align-items: center;
    color: rgba(255,255,255,.82);
    font-size: 10px;
    font-weight: 800;
    letter-spacing: .16em;
    text-transform: uppercase;
  }

  .number {
    font-family: Georgia, serif;
    font-size: 12px;
    font-weight: 400;
    letter-spacing: 0;
    opacity: .7;
  }

  .scene {
    position: relative;
    height: 198px;
    display: flex;
    justify-content: center;
    align-items: center;
  }

  .scene::before {
    content: "";
    position: absolute;
    width: 156px;
    height: 156px;
    border: 1px solid rgba(255,255,255,.2);
    border-radius: 50%;
    box-shadow: 0 0 0 19px rgba(255,255,255,.035), 0 0 0 40px rgba(255,255,255,.025);
  }

  .sun {
    position: relative;
    width: 72px;
    height: 72px;
    border-radius: 50%;
    background: #fff2ca;
    box-shadow: 0 0 35px rgba(255, 239, 189, .45);
  }

  .rays {
    position: absolute;
    inset: -29px;
    animation: rotate 18s linear infinite;
  }

  .rays i {
    position: absolute;
    left: calc(50% - 2px);
    top: 0;
    width: 4px;
    height: 13px;
    border-radius: 10px;
    background: rgba(255, 246, 218, .9);
    transform-origin: 2px 65px;
    transform: rotate(calc(var(--i) * 45deg));
  }

  .cloud {
    position: relative;
    z-index: 2;
    width: 106px;
    height: 40px;
    border-radius: 35px;
    background: #f0f5f4;
    box-shadow: 0 9px 18px rgba(48, 78, 95, .1);
    animation: float 4s ease-in-out infinite;
  }

  .cloud::before, .cloud::after {
    content: "";
    position: absolute;
    bottom: 12px;
    border-radius: 50%;
    background: inherit;
  }

  .cloud::before { width: 52px; height: 52px; left: 15px; }
  .cloud::after { width: 42px; height: 42px; right: 12px; }

  .rain-scene .cloud { transform: translateY(-16px); animation-name: float-rain; }
  .storm-scene .cloud { transform: translateY(-16px); animation-name: float-rain; background: #d8dce5; }

  .drops, .flakes {
    position: absolute;
    width: 120px;
    height: 98px;
    top: 100px;
  }

  .drop {
    position: absolute;
    top: 0;
    left: var(--x);
    width: 3px;
    height: 15px;
    border-radius: 5px;
    background: rgba(231, 248, 252, .9);
    transform: rotate(14deg);
    animation: rain 1.1s linear infinite;
    animation-delay: var(--delay);
  }

  .snow-scene .cloud {
    width: 100px;
    height: 38px;
    transform: translateY(-19px);
    animation-name: float-rain;
    background: #f7faf9;
  }

  .flake {
    position: absolute;
    top: 0;
    left: var(--x);
    width: 6px;
    height: 6px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 0 6px rgba(255,255,255,.6);
    animation: snow 2.8s linear infinite;
    animation-delay: var(--delay);
  }

  .bolt {
    position: absolute;
    z-index: 1;
    top: 105px;
    left: calc(50% - 14px);
    width: 32px;
    height: 60px;
    background: #ffe69b;
    clip-path: polygon(48% 0, 100% 0, 69% 38%, 100% 38%, 18% 100%, 36% 52%, 0 52%);
    filter: drop-shadow(0 0 9px rgba(255, 233, 160, .75));
    animation: flash 3.2s infinite;
  }

  .card-info { position: relative; z-index: 3; }

  .city {
    margin: 0 0 7px;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: .04em;
  }

  .temperature {
    margin: 0;
    font-family: Georgia, serif;
    font-size: 62px;
    font-weight: 400;
    letter-spacing: -.06em;
    line-height: 1;
  }

  .description {
    margin: 12px 0 0;
    color: rgba(255,255,255,.82);
    font-size: 13px;
  }

  .card-bottom {
    display: flex;
    justify-content: space-between;
    margin-top: 22px;
    padding-top: 16px;
    border-top: 1px solid rgba(255,255,255,.25);
    color: rgba(255,255,255,.75);
    font-size: 10px;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
  }

  .footer {
    display: flex;
    justify-content: space-between;
    gap: 15px;
    margin-top: 25px;
    color: #a2aaa5;
    font-size: 11px;
    line-height: 1.5;
    letter-spacing: .03em;
  }

  @keyframes rotate { to { transform: rotate(360deg); } }
  @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } }
  @keyframes float-rain { 0%, 100% { transform: translateY(-16px); } 50% { transform: translateY(-22px); } }
  @keyframes rain {
    0% { opacity: 0; transform: translate(0, 0) rotate(14deg); }
    20% { opacity: .9; }
    85% { opacity: .8; }
    100% { opacity: 0; transform: translate(-13px, 66px) rotate(14deg); }
  }
  @keyframes snow {
    0% { opacity: 0; transform: translate(0, 0); }
    15% { opacity: .95; }
    50% { transform: translate(10px, 35px); }
    85% { opacity: .9; }
    100% { opacity: 0; transform: translate(-5px, 78px); }
  }
  @keyframes flash {
    0%, 38%, 45%, 53%, 100% { opacity: .55; }
    40%, 43%, 49% { opacity: 1; }
    41%, 47% { opacity: .25; }
  }

  @media (max-width: 900px) {
    main { width: min(680px, calc(100% - 48px)); padding-top: 60px; }
    .grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .card { min-height: 400px; }
  }

  @media (max-width: 520px) {
    main { width: calc(100% - 40px); padding: 45px 0; }
    .heading { display: block; margin-bottom: 28px; }
    .intro { margin-top: 16px; }
    .grid { grid-template-columns: 1fr; gap: 16px; }
    .card { min-height: 390px; }
    .scene { height: 185px; }
    .footer { flex-direction: column; gap: 4px; }
  }

  @media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
      animation-duration: .01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: .01ms !important;
    }
    .drop, .flake { opacity: .8; animation: none !important; }
    .drop:nth-child(2), .flake:nth-child(2) { top: 20px; }
    .drop:nth-child(3), .flake:nth-child(3) { top: 40px; }
    .drop:nth-child(4), .flake:nth-child(4) { top: 12px; }
    .drop:nth-child(5), .flake:nth-child(5) { top: 48px; }
    .drop:nth-child(6), .flake:nth-child(6) { top: 28px; }
    .bolt { opacity: 1; }
  }
</style>
</head>
<body>
<main>
  <header class="heading">
    <div>
      <p class="eyebrow">A little weather report</p>
      <h1>Whatever the weather.</h1>
    </div>
    <p class="intro">A glimpse of the sky in four corners of the world.</p>
  </header>

  <section class="grid" aria-label="Weather in four cities">
    <article class="card sunny">
      <div class="card-top"><span>Sunny</span><span class="number">01 / 04</span></div>
      <div class="scene" aria-hidden="true">
        <div class="sun">
          <div class="rays">
            <i style="--i:0"></i><i style="--i:1"></i><i style="--i:2"></i><i style="--i:3"></i>
            <i style="--i:4"></i><i style="--i:5"></i><i style="--i:6"></i><i style="--i:7"></i>
          </div>
        </div>
      </div>
      <div class="card-info">
        <h2 class="city">Lisbon, Portugal</h2>
        <p class="temperature">28°</p>
        <p class="description">Golden skies all day</p>
        <div class="card-bottom"><span>Feels like 30°</span><span>Clear skies</span></div>
      </div>
    </article>

    <article class="card rainy">
      <div class="card-top"><span>Rainy</span><span class="number">02 / 04</span></div>
      <div class="scene rain-scene" aria-hidden="true">
        <div class="cloud"></div>
        <div class="drops">
          <i class="drop" style="--x:15%;--delay:-.2s"></i>
          <i class="drop" style="--x:32%;--delay:-.8s"></i>
          <i class="drop" style="--x:49%;--delay:-.4s"></i>
          <i class="drop" style="--x:65%;--delay:-1s"></i>
          <i class="drop" style="--x:80%;--delay:-.6s"></i>
          <i class="drop" style="--x:40%;--delay:-.05s"></i>
        </div>
      </div>
      <div class="card-info">
        <h2 class="city">London, England</h2>
        <p class="temperature">14°</p>
        <p class="description">A little afternoon rain</p>
        <div class="card-bottom"><span>Feels like 12°</span><span>Light rain</span></div>
      </div>
    </article>

    <article class="card snowy">
      <div class="card-top"><span>Snowy</span><span class="number">03 / 04</span></div>
      <div class="scene snow-scene" aria-hidden="true">
        <div class="cloud"></div>
        <div class="flakes">
          <i class="flake" style="--x:13%;--delay:-.3s"></i>
          <i class="flake" style="--x:30%;--delay:-1.7s"></i>
          <i class="flake" style="--x:47%;--delay:-.9s"></i>
          <i class="flake" style="--x:65%;--delay:-2.2s"></i>
          <i class="flake" style="--x:82%;--delay:-1.3s"></i>
          <i class="flake" style="--x:55%;--delay:-.1s"></i>
        </div>
      </div>
      <div class="card-info">
        <h2 class="city">Oslo, Norway</h2>
        <p class="temperature">−2°</p>
        <p class="description">Soft flurries falling</p>
        <div class="card-bottom"><span>Feels like −5°</span><span>Snowfall</span></div>
      </div>
    </article>

    <article class="card stormy">
      <div class="card-top"><span>Stormy</span><span class="number">04 / 04</span></div>
      <div class="scene storm-scene" aria-hidden="true">
        <div class="cloud"></div>
        <div class="bolt"></div>
      </div>
      <div class="card-info">
        <h2 class="city">New York, USA</h2>
        <p class="temperature">19°</p>
        <p class="description">Thunder in the distance</p>
        <div class="card-bottom"><span>Feels like 18°</span><span>Thunderstorm</span></div>
      </div>
    </article>
  </section>

  <footer class="footer">
    <span>Four places, four different skies.</span>
    <span>A little reminder to look up ↑</span>
  </footer>
</main>
</body>
</html>