← back to Model Arena

data/artifacts/1cbd0c1990e7/qwen3-14b.html

442 lines

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Stalwartia Economic Briefing</title>
  <style>
    :root {
      --bg-color: #001122;
      --fg-color: #0f9;
      --highlight-color: #f00;
      --text-color: #fff;
      --scanline-opacity: 0.1;
      --mood-dial-red: #f44;
      --mood-dial-green: #0f0;
      --mood-dial-yellow: #ff0;
      --mood-dial-amber: #ff8;
      --mood-dial-black: #000;
    }

    * {
      box-sizing: border-box;
      margin: 0;
      padding: 0;
      font-family: 'Courier New', Courier, monospace;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
    }

    html, body {
      width: 100%;
      height: 100%;
      background: var(--bg-color);
      color: var(--text-color);
      overflow: hidden;
      user-select: none;
    }

    .container {
      position: relative;
      width: 100%;
      height: 100%;
      display: flex;
      flex-direction: column;
      overflow: hidden;
      background: repeating-linear-gradient(
        to bottom,
        rgba(0, 0, 0, 0),
        rgba(0, 0, 0, 0) 1px,
        var(--bg-color) 1px,
        var(--bg-color) 2px
      );
    }

    .teletext-screen {
      flex: 1;
      display: flex;
      flex-direction: column;
      overflow: hidden;
      position: relative;
      background: var(--bg-color);
      color: var(--text-color);
      padding: 0 1em;
    }

    .teletext-header {
      font-size: 1.2em;
      margin-bottom: 0.5em;
      display: flex;
      align-items: center;
      justify-content: space-between;
    }

    .teletext-header .time {
      background: var(--highlight-color);
      padding: 0.2em 0.5em;
      border-radius: 2px;
    }

    .teletext-header .channel {
      font-weight: bold;
      color: var(--highlight-color);
    }

    .teletext-content {
      flex: 1;
      overflow-y: auto;
      padding: 0.5em 0;
      display: flex;
      flex-direction: column;
      gap: 0.5em;
      position: relative;
    }

    .teletext-content::-webkit-scrollbar {
      width: 6px;
      background: transparent;
    }

    .teletext-content::-webkit-scrollbar-thumb {
      background: var(--fg-color);
      border-radius: 3px;
    }

    .line {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 0.3em 0;
      font-size: 1em;
      position: relative;
      border-bottom: 1px solid rgba(255, 255, 255, 0.1);
    }

    .line > .label {
      font-weight: bold;
      color: var(--fg-color);
    }

    .line > .value {
      font-weight: normal;
      color: var(--text-color);
    }

    .line .error {
      color: #f44;
    }

    .line .success {
      color: #0f0;
    }

    .line .empty {
      color: #666;
    }

    .mood-dial {
      position: absolute;
      bottom: 20px;
      left: 50%;
      transform: translateX(-50%);
      width: 200px;
      height: 200px;
      border-radius: 50%;
      border: 4px solid var(--fg-color);
      background: conic-gradient(
        var(--mood-dial-green) 0%,
        var(--mood-dial-amber) 30%,
        var(--mood-dial-red) 60%,
        var(--mood-dial-black) 90%
      );
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 2em;
      text-align: center;
      color: var(--text-color);
      pointer-events: none;
      transition: transform 0.3s ease;
    }

    .mood-dial::before {
      content: '📈';
      font-size: 1.5em;
      opacity: 0.4;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%) rotate(180deg);
    }

    .mood-dial .current {
      font-size: 1.5em;
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      user-select: none;
    }

    .channel-control {
      position: absolute;
      top: 10px;
      right: 20px;
      background: var(--bg-color);
      border: 1px solid var(--fg-color);
      border-radius: 4px;
      padding: 0.5em 0.8em;
      font-size: 1em;
      color: var(--fg-color);
      cursor: pointer;
      outline: none;
      transition: background 0.2s, color 0.2s;
    }

    .channel-control:focus {
      background: var(--fg-color);
      color: #000;
    }

    .channel-control::after {
      content: '▲';
      font-size: 0.8em;
      margin-left: 0.3em;
      transition: transform 0.2s ease;
    }

    .channel-control.active::after {
      transform: rotate(180deg);
    }

    @media (prefers-reduced-motion: no-preference) {
      .mood-dial {
        animation: spin 6s linear infinite;
      }

      @keyframes spin {
        from { transform: rotate(0deg); }
        to { transform: rotate(360deg); }
      }
    }

    @media (min-width: 390px) and (max-width: 768px) {
      .mood-dial {
        width: 140px;
        height: 140px;
      }
    }

    @media (min-width: 769px) and (max-width: 1024px) {
      .mood-dial {
        width: 180px;
        height: 180px;
      }
    }

    @media (min-width: 1025px) {
      .mood-dial {
        width: 220px;
        height: 220px;
      }
    }
  </style>
</head>
<body>
  <div class="container">
    <div class="teletext-screen">
      <div class="teletext-header">
        <div class="time" id="time">13:45</div>
        <div class="channel" id="channel">Channel 6</div>
      </div>
      <div class="teletext-content" id="content">
        <div class="line">
          <span class="label">GDP Growth (2025 Q1):</span>
          <span class="value" id="gdp">Loading...</span>
        </div>
        <div class="line">
          <span class="label">Inflation Rate:</span>
          <span class="value" id="inflation">Loading...</span>
        </div>
        <div class="line">
          <span class="label">Industrial Output:</span>
          <span class="value" id="output">Loading...</span>
        </div>
        <div class="line">
          <span class="label">Trade Balance:</span>
          <span class="value" id="trade">Loading...</span>
        </div>
        <div class="line">
          <span class="label">Currency Index (Stal)</span>
          <span class="value" id="currency">Loading...</span>
        </div>
        <div class="line">
          <span class="label">Consumer Confidence:</span>
          <span class="value" id="confidence">Loading...</span>
        </div>
        <div class="line">
          <span class="label">Employment Rate:</span>
          <span class="value" id="employment">Loading...</span>
        </div>
        <div class="line">
          <span class="label">Government Debt:</span>
          <span class="value" id="debt">Loading...</span>
        </div>
      </div>
      <div class="mood-dial" id="mood-dial">
        <div class="current" id="mood-text">Neutral</div>
      </div>
    </div>
    <button class="channel-control" id="flip-channel">Flip Channel</button>
  </div>

  <script>
    const timeElement = document.getElementById('time');
    const channelElement = document.getElementById('channel');
    const contentElement = document.getElementById('content');
    const moodDial = document.getElementById('mood-dial');
    const moodText = document.getElementById('mood-text');
    const flipButton = document.getElementById('flip-channel');
    const gdp = document.getElementById('gdp');
    const inflation = document.getElementById('inflation');
    const output = document.getElementById('output');
    const trade = document.getElementById('trade');
    const currency = document.getElementById('currency');
    const confidence = document.getElementById('confidence');
    const employment = document.getElementById('employment');
    const debt = document.getElementById('debt');

    const channels = [
      {
        name: '6',
        data: {
          gdp: '2.7%',
          inflation: '3.4%',
          output: '102%',
          trade: '+2.1%',
          currency: 'Stal 1.35',
          confidence: '65%',
          employment: '58%',
          debt: '34%',
          mood: 'green'
        }
      },
      {
        name: '7',
        data: {
          gdp: '-0.5%',
          inflation: '6.1%',
          output: '93%',
          trade: '-3.4%',
          currency: 'Stal 1.17',
          confidence: '42%',
          employment: '53%',
          debt: '39%',
          mood: 'red'
        }
      },
      {
        name: '8',
        data: {
          gdp: '1.1%',
          inflation: '2.2%',
          output: '105%',
          trade: '+1.8%',
          currency: 'Stal 1.41',
          confidence: '73%',
          employment: '61%',
          debt: '29%',
          mood: 'green'
        }
      },
      {
        name: '9',
        data: {
          gdp: '3.0%',
          inflation: '1.8%',
          output: '109%',
          trade: '+4.0%',
          currency: 'Stal 1.39',
          confidence: '69%',
          employment: '57%',
          debt: '33%',
          mood: 'amber'
        }
      }
    ];

    let currentChannelIndex = 0;

    function updateDisplay(channel) {
      gdp.textContent = channel.data.gdp;
      inflation.textContent = channel.data.inflation;
      output.textContent = channel.data.output;
      trade.textContent = channel.data.trade;
      currency.textContent = channel.data.currency;
      confidence.textContent = channel.data.confidence;
      employment.textContent = channel.data.employment;
      debt.textContent = channel.data.debt;

      const mood = channel.data.mood;
      let angle = 0;
      let moodTextValue = 'Neutral';

      if (mood === 'green') {
        angle = 30;
        moodTextValue = 'Bullish';
      } else if (mood === 'amber') {
        angle = 150;
        moodTextValue = 'Stable';
      } else if (mood === 'red') {
        angle = 270;
        moodTextValue = 'Bearish';
      }

      moodDial.style.background = `conic-gradient(
        var(--mood-dial-green) 0%,
        var(--mood-dial-amber) 30%,
        var(--mood-dial-red) 60%,
        var(--mood-dial-black) 90%
      )`;
      moodDial.style.transform = `rotate(${angle}deg)`;
      moodText.textContent = moodTextValue;
    }

    function updateTime() {
      const now = new Date();
      const hours = String(now.getHours()).padStart(2, '0');
      const minutes = String(now.getMinutes()).padStart(2, '0');
      timeElement.textContent = `${hours}:${minutes}`;
    }

    function start() {
      updateTime();
      setInterval(updateTime, 1000);
      updateDisplay(channels[currentChannelIndex]);
    }

    function flipChannel() {
      currentChannelIndex = (currentChannelIndex + 1) % channels.length;
      updateDisplay(channels[currentChannelIndex]);
    }

    function init() {
      document.addEventListener('keydown', (e) => {
        if (e.key === 'ArrowUp' || e.key === ' ') {
          flipChannel();
        }
      });

      flipButton.addEventListener('click', flipChannel);
      flipButton.addEventListener('keydown', (e) => {
        if (e.key === 'Enter' || e.key === ' ') {
          flipChannel();
        }
      });

      start();
    }

    init();
  </script>
</body>
</html>