# Weather map 404

> A TV weather map: a 404 hectopascal storm spins over the sea while the warning ticker scrolls along the bottom.

- Category: [404](https://library.aimran.es/components/404)
- Built with: HTML + CSS
- Live editor: https://library.aimran.es/blocks/404-weather
- Library: AIMRAN Library (https://library.aimran.es), free, no sign-up, by Aimran Oukham

## Where to use it

News sites, weather apps and local media can turn their error page into a television weather map. Beige coastlines sit on a teal sea, dashed isobars circle a spinning storm symbol labeled 404 hPa, a sun turns slowly, a cloud drifts and the temperatures only read dashes.

Along the bottom, a warning ticker scrolls the chance of finding this page, which is zero. Everything is inline SVG and CSS keyframes, and reduced motion freezes the map. Adjust the orange accent of the warning label and point the button home.

## Code

### HTML

```html
<!doctype html>
<html lang="es">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="robots" content="noindex" />
    <title>404 · Page not found</title>
    <style>
      body { margin: 0; background: #000; }
      .n4-weather {
        --accent: #ff6b35;
        --k: 1;
        position: fixed;
        inset: 0;
        z-index: 0;
        overflow: hidden;
        container-type: size;
        display: grid;
        place-items: center;
        background: #000;
        color: #f5f5f7;
        font-family: -apple-system,BlinkMacSystemFont,"SF Pro Display","Inter","Segoe UI",system-ui,sans-serif;
        -webkit-font-smoothing: antialiased;
        text-align: center;
        line-height: 1.4;
      }
      
      .n4-weather *,.n4-weather *::before,.n4-weather *::after {
        box-sizing: border-box;
      }
      
      .n4-weather .n4-copy {
        position: relative;
        z-index: 5;
        display: flex;
        flex-direction: column;
        align-items: center;
        gap: 1.6cqmin;
        width: 100%;
        max-width: 680px;
        padding: 0 6cqw;
      }
      
      .n4-weather .n4-title {
        margin: 0;
        font-size: clamp(17px,4.2cqmin,36px);
        font-weight: 600;
        letter-spacing: -.02em;
        line-height: 1.15;
        text-wrap: balance;
      }
      
      .n4-weather .n4-sub {
        margin: 0;
        max-width: 34em;
        font-size: clamp(13px,2.4cqmin,18px);
        color: #a1a1a6;
        text-wrap: balance;
      }
      
      .n4-weather .n4-tag {
        font: 600 clamp(10px,1.9cqmin,13px)/1 ui-monospace,"SF Mono",Menlo,Consolas,monospace;
        letter-spacing: .16em;
        text-transform: uppercase;
        color: var(--accent);
      }
      
      .n4-weather .n4-cta {
        margin-top: 1.8cqmin;
        display: inline-flex;
        align-items: center;
        gap: .5em;
        padding: .85em 1.5em;
        border-radius: 999px;
        background: #f5f5f7;
        color: #000;
        font-size: clamp(13px,2.2cqmin,16px);
        font-weight: 600;
        text-decoration: none;
        transition: transform .3s cubic-bezier(.25,.1,.25,1),box-shadow .3s cubic-bezier(.25,.1,.25,1);
      }
      
      .n4-weather .n4-cta:hover {
        transform: translateY(-2px);
        box-shadow: 0 12px 32px -10px var(--accent);
      }
      
      .n4-weather .n4-cta:focus-visible {
        outline: 2px solid var(--accent);
        outline-offset: 3px;
      }
      
      .n4-weather .n4-stars,.n4-weather .n4-stars2 {
        position: absolute;
        inset: -4%;
        pointer-events: none;
      }
      
      .n4-weather .n4-stars {
        background-image: radial-gradient(1px 1px at 8% 12%,#fff 60%,transparent),radial-gradient(1px 1px at 22% 68%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 35% 24%,#fff 60%,transparent),radial-gradient(1px 1px at 48% 82%,#fff 60%,transparent),radial-gradient(1px 1px at 57% 9%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 66% 44%,#fff 60%,transparent),radial-gradient(1px 1px at 74% 72%,#fff 60%,transparent),radial-gradient(1px 1px at 86% 18%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 93% 58%,#fff 60%,transparent),radial-gradient(1px 1px at 14% 42%,#fff 60%,transparent),radial-gradient(1px 1px at 40% 55%,#fff 60%,transparent),radial-gradient(1px 1px at 81% 90%,#fff 60%,transparent),radial-gradient(1px 1px at 4% 88%,#fff 60%,transparent),radial-gradient(1px 1px at 62% 30%,#fff 60%,transparent);
        opacity: .75;
        animation: n4-weather-tw calc(5s / var(--k)) ease-in-out infinite alternate;
      }
      
      .n4-weather .n4-stars2 {
        background-image: radial-gradient(2px 2px at 18% 30%,rgba(255,255,255,.9) 50%,transparent),radial-gradient(1.5px 1.5px at 72% 20%,rgba(255,255,255,.8) 50%,transparent),radial-gradient(2px 2px at 30% 85%,rgba(255,255,255,.7) 50%,transparent),radial-gradient(1.5px 1.5px at 88% 70%,rgba(255,255,255,.8) 50%,transparent),radial-gradient(2px 2px at 52% 60%,rgba(255,255,255,.6) 50%,transparent),radial-gradient(1.5px 1.5px at 6% 55%,rgba(255,255,255,.8) 50%,transparent);
        opacity: .55;
        animation: n4-weather-tw calc(7s / var(--k)) ease-in-out infinite alternate-reverse;
      }
      
      .n4-weather [data-depth] {
        transition: transform .9s cubic-bezier(.2,.7,.2,1);
      }
      
      @keyframes n4-weather-tw {
        from {
          opacity: .3;
        }
      }
      
      @keyframes n4-weather-spin {
        to {
          transform: rotate(1turn);
        }
      }
      
      @keyframes n4-weather-fade {
        from {
          opacity: 0;
          transform: translateY(10px);
        }
      }
      
      @media (prefers-reduced-motion:reduce) {
        .n4-weather *,.n4-weather *::before,.n4-weather *::after {
          animation: none!important;
          transition: none!important;
        }
      }
      
      .n4-weather {
        background: radial-gradient(80% 60% at 50% 25%,#f2f8fa,#cfe2e9 75%);
        color: #0f2f3a;
      }
      
      .n4-weather .n4-tv {
        width: min(70cqmin,480px);
        font-size: min(2cqmin,14px);
        margin-bottom: 1.8cqmin;
        overflow: hidden;
        border-radius: 1em;
        background: #0f2f3a;
        box-shadow: 0 0 0 .45em #0f2f3a,0 1.8em 2.4em -1.2em rgba(15,47,58,.6);
      }
      
      .n4-weather .n4-map {
        display: block;
        width: 100%;
        height: auto;
        background: radial-gradient(70% 70% at 65% 40%,#2389a8,#145e78);
      }
      
      .n4-weather .n4-land {
        fill: #d8cf9e;
        stroke: #b5a86e;
        stroke-width: 1.5;
      }
      
      .n4-weather .n4-iso ellipse {
        fill: none;
        stroke: rgba(255,255,255,.5);
        stroke-width: 1.3;
        stroke-dasharray: 3 4;
        animation: n4-weather-iso calc(6s / var(--k)) linear infinite;
      }
      
      .n4-weather .n4-storm {
        transform-box: fill-box;
        transform-origin: center;
        animation: n4-weather-spin calc(5s / var(--k)) linear infinite reverse;
      }
      
      .n4-weather .n4-storm path {
        fill: none;
        stroke: #fff;
        stroke-width: 7;
        stroke-linecap: round;
      }
      
      .n4-weather .n4-storm circle {
        fill: var(--accent);
        stroke: #fff;
        stroke-width: 4;
      }
      
      .n4-weather .n4-hpa {
        font: 800 15px "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
        fill: #fff;
        text-anchor: middle;
        paint-order: stroke;
        stroke: #0f2f3a;
        stroke-width: 3px;
      }
      
      .n4-weather .n4-sun {
        transform-box: fill-box;
        transform-origin: center;
        animation: n4-weather-spin calc(24s / var(--k)) linear infinite;
      }
      
      .n4-weather .n4-sun circle {
        fill: #ffd23f;
      }
      
      .n4-weather .n4-sun path {
        stroke: #ffd23f;
        stroke-width: 3.5;
        stroke-linecap: round;
      }
      
      .n4-weather .n4-cloud {
        animation: n4-weather-cloud calc(7s / var(--k)) ease-in-out infinite alternate;
      }
      
      .n4-weather .n4-cloud path {
        fill: #f3f6f8;
        stroke: #c9d6dc;
        stroke-width: 1.5;
      }
      
      .n4-weather .n4-temp {
        font: 800 16px "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
        fill: #fff;
        text-anchor: middle;
        paint-order: stroke;
        stroke: #0f2f3a;
        stroke-width: 3px;
      }
      
      .n4-weather .n4-wind {
        fill: none;
        stroke: #fff;
        stroke-width: 2.5;
        stroke-linecap: round;
        stroke-linejoin: round;
        stroke-dasharray: 60;
        stroke-dashoffset: 60;
        animation: n4-weather-wind calc(3s / var(--k)) ease-in-out infinite;
      }
      
      .n4-weather .n4-tick {
        display: flex;
        margin: 0;
        font: 700 1em/1 "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
        color: #fff;
      }
      
      .n4-weather .n4-tick b {
        padding: .65em .9em;
        background: var(--accent);
        color: #1b0b03;
        text-transform: uppercase;
        letter-spacing: .1em;
      }
      
      .n4-weather .n4-tick span {
        flex: 1;
        overflow: hidden;
        display: flex;
        align-items: center;
      }
      
      .n4-weather .n4-tick em {
        flex: none;
        padding-left: 100%;
        font-style: normal;
        white-space: nowrap;
        animation: n4-weather-ticker calc(11s / var(--k)) linear infinite;
      }
      
      .n4-weather .n4-title {
        font-size: clamp(20px,5cqmin,42px);
        font-weight: 800;
        letter-spacing: -.03em;
      }
      
      .n4-weather .n4-sub {
        color: #3d5f6b;
      }
      
      .n4-weather .n4-cta {
        background: #0f2f3a;
        color: #fff;
      }
      
      @keyframes n4-weather-iso {
        to {
          stroke-dashoffset: -28;
        }
      }
      
      @keyframes n4-weather-cloud {
        to {
          transform: translateX(18px);
        }
      }
      
      @keyframes n4-weather-wind {
        40%,60% {
          stroke-dashoffset: 0;
        }
        100% {
          stroke-dashoffset: -60;
        }
      }
      
      @keyframes n4-weather-ticker {
        to {
          transform: translateX(-100%);
        }
      }
      
      @media (prefers-reduced-motion:reduce) {
        .n4-weather .n4-tick em {
          padding-left: .9em;
        }
        .n4-weather .n4-wind {
          stroke-dashoffset: 0;
        }
      }
    </style>
  </head>
  <body>
    <main class="n4-weather">
      <div class="n4-copy">
        <div class="n4-tv" aria-hidden="true">
          <svg class="n4-map" viewBox="0 0 400 230">
            <path class="n4-land" d="M0 0H176C166 28 126 40 134 70S100 118 64 128 22 168 0 178Z"/>
            <path class="n4-land" d="M400 230H246C258 204 298 198 316 174S362 150 400 138Z"/>
            <g class="n4-iso"><ellipse cx="262" cy="96" rx="38" ry="28"/><ellipse cx="262" cy="96" rx="70" ry="52"/><ellipse cx="262" cy="96" rx="104" ry="78"/><ellipse cx="262" cy="96" rx="140" ry="106"/></g>
            <g class="n4-storm"><path d="M262 84C282 80 298 70 304 52"/><path d="M262 108C242 112 226 122 220 140"/><circle cx="262" cy="96" r="12"/></g>
            <text class="n4-hpa" x="262" y="160">404 hPa</text>
            <g class="n4-sun"><circle cx="66" cy="58" r="12"/><path d="M66 36v-7M66 80v7M44 58h-7M88 58h7M50 42l-5-5M82 74l5 5M50 74l-5 5M82 42l5-5"/></g>
            <text class="n4-temp" x="66" y="104">--°</text>
            <g class="n4-cloud"><path d="M150 196a12 12 0 0 1 4-23 16 16 0 0 1 30-4 11 11 0 0 1 14 15 9 9 0 0 1-2 12z"/></g>
            <text class="n4-temp" x="176" y="222">--°</text>
            <path class="n4-wind" d="M128 120c18-6 34-6 50 2M172 116l7 6-9 3"/>
          </svg>
          <p class="n4-tick"><b>Warning</b><span><em>Chance of finding this page: 0%</em></span></p>
        </div>
        <h1 class="n4-title">No forecast for this page today.</h1>
        <p class="n4-sub">A 404 hectopascal storm has carried it away. Check the main map or go back home until it clears up.</p>
        <a class="n4-cta" href="/">Back to home</a>
      </div>
    </main>
  </body>
</html>
```

### CSS

```css
.n4-weather {
  --accent: #ff6b35;
  --k: 1;
  position: fixed;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  container-type: size;
  display: grid;
  place-items: center;
  background: #000;
  color: #f5f5f7;
  font-family: -apple-system,BlinkMacSystemFont,"SF Pro Display","Inter","Segoe UI",system-ui,sans-serif;
  -webkit-font-smoothing: antialiased;
  text-align: center;
  line-height: 1.4;
}

.n4-weather *,.n4-weather *::before,.n4-weather *::after {
  box-sizing: border-box;
}

.n4-weather .n4-copy {
  position: relative;
  z-index: 5;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.6cqmin;
  width: 100%;
  max-width: 680px;
  padding: 0 6cqw;
}

.n4-weather .n4-title {
  margin: 0;
  font-size: clamp(17px,4.2cqmin,36px);
  font-weight: 600;
  letter-spacing: -.02em;
  line-height: 1.15;
  text-wrap: balance;
}

.n4-weather .n4-sub {
  margin: 0;
  max-width: 34em;
  font-size: clamp(13px,2.4cqmin,18px);
  color: #a1a1a6;
  text-wrap: balance;
}

.n4-weather .n4-tag {
  font: 600 clamp(10px,1.9cqmin,13px)/1 ui-monospace,"SF Mono",Menlo,Consolas,monospace;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--accent);
}

.n4-weather .n4-cta {
  margin-top: 1.8cqmin;
  display: inline-flex;
  align-items: center;
  gap: .5em;
  padding: .85em 1.5em;
  border-radius: 999px;
  background: #f5f5f7;
  color: #000;
  font-size: clamp(13px,2.2cqmin,16px);
  font-weight: 600;
  text-decoration: none;
  transition: transform .3s cubic-bezier(.25,.1,.25,1),box-shadow .3s cubic-bezier(.25,.1,.25,1);
}

.n4-weather .n4-cta:hover {
  transform: translateY(-2px);
  box-shadow: 0 12px 32px -10px var(--accent);
}

.n4-weather .n4-cta:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}

.n4-weather .n4-stars,.n4-weather .n4-stars2 {
  position: absolute;
  inset: -4%;
  pointer-events: none;
}

.n4-weather .n4-stars {
  background-image: radial-gradient(1px 1px at 8% 12%,#fff 60%,transparent),radial-gradient(1px 1px at 22% 68%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 35% 24%,#fff 60%,transparent),radial-gradient(1px 1px at 48% 82%,#fff 60%,transparent),radial-gradient(1px 1px at 57% 9%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 66% 44%,#fff 60%,transparent),radial-gradient(1px 1px at 74% 72%,#fff 60%,transparent),radial-gradient(1px 1px at 86% 18%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 93% 58%,#fff 60%,transparent),radial-gradient(1px 1px at 14% 42%,#fff 60%,transparent),radial-gradient(1px 1px at 40% 55%,#fff 60%,transparent),radial-gradient(1px 1px at 81% 90%,#fff 60%,transparent),radial-gradient(1px 1px at 4% 88%,#fff 60%,transparent),radial-gradient(1px 1px at 62% 30%,#fff 60%,transparent);
  opacity: .75;
  animation: n4-weather-tw calc(5s / var(--k)) ease-in-out infinite alternate;
}

.n4-weather .n4-stars2 {
  background-image: radial-gradient(2px 2px at 18% 30%,rgba(255,255,255,.9) 50%,transparent),radial-gradient(1.5px 1.5px at 72% 20%,rgba(255,255,255,.8) 50%,transparent),radial-gradient(2px 2px at 30% 85%,rgba(255,255,255,.7) 50%,transparent),radial-gradient(1.5px 1.5px at 88% 70%,rgba(255,255,255,.8) 50%,transparent),radial-gradient(2px 2px at 52% 60%,rgba(255,255,255,.6) 50%,transparent),radial-gradient(1.5px 1.5px at 6% 55%,rgba(255,255,255,.8) 50%,transparent);
  opacity: .55;
  animation: n4-weather-tw calc(7s / var(--k)) ease-in-out infinite alternate-reverse;
}

.n4-weather [data-depth] {
  transition: transform .9s cubic-bezier(.2,.7,.2,1);
}

@keyframes n4-weather-tw {
  from {
    opacity: .3;
  }
}

@keyframes n4-weather-spin {
  to {
    transform: rotate(1turn);
  }
}

@keyframes n4-weather-fade {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
}

@media (prefers-reduced-motion:reduce) {
  .n4-weather *,.n4-weather *::before,.n4-weather *::after {
    animation: none!important;
    transition: none!important;
  }
}

.n4-weather {
  background: radial-gradient(80% 60% at 50% 25%,#f2f8fa,#cfe2e9 75%);
  color: #0f2f3a;
}

.n4-weather .n4-tv {
  width: min(70cqmin,480px);
  font-size: min(2cqmin,14px);
  margin-bottom: 1.8cqmin;
  overflow: hidden;
  border-radius: 1em;
  background: #0f2f3a;
  box-shadow: 0 0 0 .45em #0f2f3a,0 1.8em 2.4em -1.2em rgba(15,47,58,.6);
}

.n4-weather .n4-map {
  display: block;
  width: 100%;
  height: auto;
  background: radial-gradient(70% 70% at 65% 40%,#2389a8,#145e78);
}

.n4-weather .n4-land {
  fill: #d8cf9e;
  stroke: #b5a86e;
  stroke-width: 1.5;
}

.n4-weather .n4-iso ellipse {
  fill: none;
  stroke: rgba(255,255,255,.5);
  stroke-width: 1.3;
  stroke-dasharray: 3 4;
  animation: n4-weather-iso calc(6s / var(--k)) linear infinite;
}

.n4-weather .n4-storm {
  transform-box: fill-box;
  transform-origin: center;
  animation: n4-weather-spin calc(5s / var(--k)) linear infinite reverse;
}

.n4-weather .n4-storm path {
  fill: none;
  stroke: #fff;
  stroke-width: 7;
  stroke-linecap: round;
}

.n4-weather .n4-storm circle {
  fill: var(--accent);
  stroke: #fff;
  stroke-width: 4;
}

.n4-weather .n4-hpa {
  font: 800 15px "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
  fill: #fff;
  text-anchor: middle;
  paint-order: stroke;
  stroke: #0f2f3a;
  stroke-width: 3px;
}

.n4-weather .n4-sun {
  transform-box: fill-box;
  transform-origin: center;
  animation: n4-weather-spin calc(24s / var(--k)) linear infinite;
}

.n4-weather .n4-sun circle {
  fill: #ffd23f;
}

.n4-weather .n4-sun path {
  stroke: #ffd23f;
  stroke-width: 3.5;
  stroke-linecap: round;
}

.n4-weather .n4-cloud {
  animation: n4-weather-cloud calc(7s / var(--k)) ease-in-out infinite alternate;
}

.n4-weather .n4-cloud path {
  fill: #f3f6f8;
  stroke: #c9d6dc;
  stroke-width: 1.5;
}

.n4-weather .n4-temp {
  font: 800 16px "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
  fill: #fff;
  text-anchor: middle;
  paint-order: stroke;
  stroke: #0f2f3a;
  stroke-width: 3px;
}

.n4-weather .n4-wind {
  fill: none;
  stroke: #fff;
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-dasharray: 60;
  stroke-dashoffset: 60;
  animation: n4-weather-wind calc(3s / var(--k)) ease-in-out infinite;
}

.n4-weather .n4-tick {
  display: flex;
  margin: 0;
  font: 700 1em/1 "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
  color: #fff;
}

.n4-weather .n4-tick b {
  padding: .65em .9em;
  background: var(--accent);
  color: #1b0b03;
  text-transform: uppercase;
  letter-spacing: .1em;
}

.n4-weather .n4-tick span {
  flex: 1;
  overflow: hidden;
  display: flex;
  align-items: center;
}

.n4-weather .n4-tick em {
  flex: none;
  padding-left: 100%;
  font-style: normal;
  white-space: nowrap;
  animation: n4-weather-ticker calc(11s / var(--k)) linear infinite;
}

.n4-weather .n4-title {
  font-size: clamp(20px,5cqmin,42px);
  font-weight: 800;
  letter-spacing: -.03em;
}

.n4-weather .n4-sub {
  color: #3d5f6b;
}

.n4-weather .n4-cta {
  background: #0f2f3a;
  color: #fff;
}

@keyframes n4-weather-iso {
  to {
    stroke-dashoffset: -28;
  }
}

@keyframes n4-weather-cloud {
  to {
    transform: translateX(18px);
  }
}

@keyframes n4-weather-wind {
  40%,60% {
    stroke-dashoffset: 0;
  }
  100% {
    stroke-dashoffset: -60;
  }
}

@keyframes n4-weather-ticker {
  to {
    transform: translateX(-100%);
  }
}

@media (prefers-reduced-motion:reduce) {
  .n4-weather .n4-tick em {
    padding-left: .9em;
  }
  .n4-weather .n4-wind {
    stroke-dashoffset: 0;
  }
}
```

### React

```tsx
const css = `
.n4-weather {
  --accent: #ff6b35;
  --k: 1;
  position: fixed;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  container-type: size;
  display: grid;
  place-items: center;
  background: #000;
  color: #f5f5f7;
  font-family: -apple-system,BlinkMacSystemFont,"SF Pro Display","Inter","Segoe UI",system-ui,sans-serif;
  -webkit-font-smoothing: antialiased;
  text-align: center;
  line-height: 1.4;
}

.n4-weather *,.n4-weather *::before,.n4-weather *::after {
  box-sizing: border-box;
}

.n4-weather .n4-copy {
  position: relative;
  z-index: 5;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.6cqmin;
  width: 100%;
  max-width: 680px;
  padding: 0 6cqw;
}

.n4-weather .n4-title {
  margin: 0;
  font-size: clamp(17px,4.2cqmin,36px);
  font-weight: 600;
  letter-spacing: -.02em;
  line-height: 1.15;
  text-wrap: balance;
}

.n4-weather .n4-sub {
  margin: 0;
  max-width: 34em;
  font-size: clamp(13px,2.4cqmin,18px);
  color: #a1a1a6;
  text-wrap: balance;
}

.n4-weather .n4-tag {
  font: 600 clamp(10px,1.9cqmin,13px)/1 ui-monospace,"SF Mono",Menlo,Consolas,monospace;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--accent);
}

.n4-weather .n4-cta {
  margin-top: 1.8cqmin;
  display: inline-flex;
  align-items: center;
  gap: .5em;
  padding: .85em 1.5em;
  border-radius: 999px;
  background: #f5f5f7;
  color: #000;
  font-size: clamp(13px,2.2cqmin,16px);
  font-weight: 600;
  text-decoration: none;
  transition: transform .3s cubic-bezier(.25,.1,.25,1),box-shadow .3s cubic-bezier(.25,.1,.25,1);
}

.n4-weather .n4-cta:hover {
  transform: translateY(-2px);
  box-shadow: 0 12px 32px -10px var(--accent);
}

.n4-weather .n4-cta:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}

.n4-weather .n4-stars,.n4-weather .n4-stars2 {
  position: absolute;
  inset: -4%;
  pointer-events: none;
}

.n4-weather .n4-stars {
  background-image: radial-gradient(1px 1px at 8% 12%,#fff 60%,transparent),radial-gradient(1px 1px at 22% 68%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 35% 24%,#fff 60%,transparent),radial-gradient(1px 1px at 48% 82%,#fff 60%,transparent),radial-gradient(1px 1px at 57% 9%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 66% 44%,#fff 60%,transparent),radial-gradient(1px 1px at 74% 72%,#fff 60%,transparent),radial-gradient(1px 1px at 86% 18%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 93% 58%,#fff 60%,transparent),radial-gradient(1px 1px at 14% 42%,#fff 60%,transparent),radial-gradient(1px 1px at 40% 55%,#fff 60%,transparent),radial-gradient(1px 1px at 81% 90%,#fff 60%,transparent),radial-gradient(1px 1px at 4% 88%,#fff 60%,transparent),radial-gradient(1px 1px at 62% 30%,#fff 60%,transparent);
  opacity: .75;
  animation: n4-weather-tw calc(5s / var(--k)) ease-in-out infinite alternate;
}

.n4-weather .n4-stars2 {
  background-image: radial-gradient(2px 2px at 18% 30%,rgba(255,255,255,.9) 50%,transparent),radial-gradient(1.5px 1.5px at 72% 20%,rgba(255,255,255,.8) 50%,transparent),radial-gradient(2px 2px at 30% 85%,rgba(255,255,255,.7) 50%,transparent),radial-gradient(1.5px 1.5px at 88% 70%,rgba(255,255,255,.8) 50%,transparent),radial-gradient(2px 2px at 52% 60%,rgba(255,255,255,.6) 50%,transparent),radial-gradient(1.5px 1.5px at 6% 55%,rgba(255,255,255,.8) 50%,transparent);
  opacity: .55;
  animation: n4-weather-tw calc(7s / var(--k)) ease-in-out infinite alternate-reverse;
}

.n4-weather [data-depth] {
  transition: transform .9s cubic-bezier(.2,.7,.2,1);
}

@keyframes n4-weather-tw {
  from {
    opacity: .3;
  }
}

@keyframes n4-weather-spin {
  to {
    transform: rotate(1turn);
  }
}

@keyframes n4-weather-fade {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
}

@media (prefers-reduced-motion:reduce) {
  .n4-weather *,.n4-weather *::before,.n4-weather *::after {
    animation: none!important;
    transition: none!important;
  }
}

.n4-weather {
  background: radial-gradient(80% 60% at 50% 25%,#f2f8fa,#cfe2e9 75%);
  color: #0f2f3a;
}

.n4-weather .n4-tv {
  width: min(70cqmin,480px);
  font-size: min(2cqmin,14px);
  margin-bottom: 1.8cqmin;
  overflow: hidden;
  border-radius: 1em;
  background: #0f2f3a;
  box-shadow: 0 0 0 .45em #0f2f3a,0 1.8em 2.4em -1.2em rgba(15,47,58,.6);
}

.n4-weather .n4-map {
  display: block;
  width: 100%;
  height: auto;
  background: radial-gradient(70% 70% at 65% 40%,#2389a8,#145e78);
}

.n4-weather .n4-land {
  fill: #d8cf9e;
  stroke: #b5a86e;
  stroke-width: 1.5;
}

.n4-weather .n4-iso ellipse {
  fill: none;
  stroke: rgba(255,255,255,.5);
  stroke-width: 1.3;
  stroke-dasharray: 3 4;
  animation: n4-weather-iso calc(6s / var(--k)) linear infinite;
}

.n4-weather .n4-storm {
  transform-box: fill-box;
  transform-origin: center;
  animation: n4-weather-spin calc(5s / var(--k)) linear infinite reverse;
}

.n4-weather .n4-storm path {
  fill: none;
  stroke: #fff;
  stroke-width: 7;
  stroke-linecap: round;
}

.n4-weather .n4-storm circle {
  fill: var(--accent);
  stroke: #fff;
  stroke-width: 4;
}

.n4-weather .n4-hpa {
  font: 800 15px "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
  fill: #fff;
  text-anchor: middle;
  paint-order: stroke;
  stroke: #0f2f3a;
  stroke-width: 3px;
}

.n4-weather .n4-sun {
  transform-box: fill-box;
  transform-origin: center;
  animation: n4-weather-spin calc(24s / var(--k)) linear infinite;
}

.n4-weather .n4-sun circle {
  fill: #ffd23f;
}

.n4-weather .n4-sun path {
  stroke: #ffd23f;
  stroke-width: 3.5;
  stroke-linecap: round;
}

.n4-weather .n4-cloud {
  animation: n4-weather-cloud calc(7s / var(--k)) ease-in-out infinite alternate;
}

.n4-weather .n4-cloud path {
  fill: #f3f6f8;
  stroke: #c9d6dc;
  stroke-width: 1.5;
}

.n4-weather .n4-temp {
  font: 800 16px "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
  fill: #fff;
  text-anchor: middle;
  paint-order: stroke;
  stroke: #0f2f3a;
  stroke-width: 3px;
}

.n4-weather .n4-wind {
  fill: none;
  stroke: #fff;
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-dasharray: 60;
  stroke-dashoffset: 60;
  animation: n4-weather-wind calc(3s / var(--k)) ease-in-out infinite;
}

.n4-weather .n4-tick {
  display: flex;
  margin: 0;
  font: 700 1em/1 "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
  color: #fff;
}

.n4-weather .n4-tick b {
  padding: .65em .9em;
  background: var(--accent);
  color: #1b0b03;
  text-transform: uppercase;
  letter-spacing: .1em;
}

.n4-weather .n4-tick span {
  flex: 1;
  overflow: hidden;
  display: flex;
  align-items: center;
}

.n4-weather .n4-tick em {
  flex: none;
  padding-left: 100%;
  font-style: normal;
  white-space: nowrap;
  animation: n4-weather-ticker calc(11s / var(--k)) linear infinite;
}

.n4-weather .n4-title {
  font-size: clamp(20px,5cqmin,42px);
  font-weight: 800;
  letter-spacing: -.03em;
}

.n4-weather .n4-sub {
  color: #3d5f6b;
}

.n4-weather .n4-cta {
  background: #0f2f3a;
  color: #fff;
}

@keyframes n4-weather-iso {
  to {
    stroke-dashoffset: -28;
  }
}

@keyframes n4-weather-cloud {
  to {
    transform: translateX(18px);
  }
}

@keyframes n4-weather-wind {
  40%,60% {
    stroke-dashoffset: 0;
  }
  100% {
    stroke-dashoffset: -60;
  }
}

@keyframes n4-weather-ticker {
  to {
    transform: translateX(-100%);
  }
}

@media (prefers-reduced-motion:reduce) {
  .n4-weather .n4-tick em {
    padding-left: .9em;
  }
  .n4-weather .n4-wind {
    stroke-dashoffset: 0;
  }
}
`;

export default function NotFoundWeather() {
  return (
    <>
      <style>{css}</style>
      <div>
        <main className="n4-weather">
          <div className="n4-copy">
            <div className="n4-tv" aria-hidden="true">
              <svg className="n4-map" viewBox="0 0 400 230">
                <path className="n4-land" d="M0 0H176C166 28 126 40 134 70S100 118 64 128 22 168 0 178Z" />
                <path className="n4-land" d="M400 230H246C258 204 298 198 316 174S362 150 400 138Z" />
                <g className="n4-iso"><ellipse cx="262" cy="96" rx="38" ry="28" /><ellipse cx="262" cy="96" rx="70" ry="52" /><ellipse cx="262" cy="96" rx="104" ry="78" /><ellipse cx="262" cy="96" rx="140" ry="106" /></g>
                <g className="n4-storm"><path d="M262 84C282 80 298 70 304 52" /><path d="M262 108C242 112 226 122 220 140" /><circle cx="262" cy="96" r="12" /></g>
                <text className="n4-hpa" x="262" y="160">404 hPa</text>
                <g className="n4-sun"><circle cx="66" cy="58" r="12" /><path d="M66 36v-7M66 80v7M44 58h-7M88 58h7M50 42l-5-5M82 74l5 5M50 74l-5 5M82 42l5-5" /></g>
                <text className="n4-temp" x="66" y="104">--°</text>
                <g className="n4-cloud"><path d="M150 196a12 12 0 0 1 4-23 16 16 0 0 1 30-4 11 11 0 0 1 14 15 9 9 0 0 1-2 12z" /></g>
                <text className="n4-temp" x="176" y="222">--°</text>
                <path className="n4-wind" d="M128 120c18-6 34-6 50 2M172 116l7 6-9 3" />
              </svg>
              <p className="n4-tick"><b>Warning</b><span><em>Chance of finding this page: 0%</em></span></p>
            </div>
            <h1 className="n4-title">No forecast for this page today.</h1>
            <p className="n4-sub">A 404 hectopascal storm has carried it away. Check the main map or go back home until it clears up.</p>
            <a className="n4-cta" href="/">Back to home</a>
          </div>
        </main>
      </div>
    </>
  );
}
```

## Prompt for AI assistants

Paste this into ChatGPT, Claude, Cursor, v0 or Lovable to adapt the block to your stack (Tailwind, Vue, Svelte…):

````text
I want to add the “Weather map 404” block (404) from AIMRAN Library to my project.

## What it is
A TV weather map: a 404 hectopascal storm spins over the sea while the warning ticker scrolls along the bottom.

## Chosen settings
- Accent color: #ff6b35
- Speed: 1x (from 0.5 to 2x)
- Title: "Hoy no hay previsión para esta página."
- Message: "Una borrasca de 404 hectopascales se la ha llevado. Consulta el mapa general o vuelve al inicio hasta que despeje."
- Button: "Volver al inicio"

## What I need
1. Add it to my project with the same look and animation as the reference code: same sizes, colours, radii, shadows, timings and easing.
2. It is built with plain HTML and CSS (the reference wraps it in a React component with its CSS). If my project uses something else (Vue, Svelte, Astro, plain HTML…), translate it without losing any behaviour. If I use Tailwind, turn the styles into classes; if not, keep the CSS in its own file.
3. Expose the settings above as props (or CSS variables) with those values as defaults.
4. Make it work well on phones: nothing that depends only on hover, touch targets of at least 44 px and no overflow on 320 px screens.
5. Make it look right in light and dark mode.
6. Keep it accessible: semantic HTML, roles and aria-* where needed, visible focus and keyboard support.
7. Respect prefers-reduced-motion: with reduced motion, no big animations but the same end result.

## Reference code
```tsx
const css = `
.n4-weather {
  --accent: #ff6b35;
  --k: 1;
  position: fixed;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  container-type: size;
  display: grid;
  place-items: center;
  background: #000;
  color: #f5f5f7;
  font-family: -apple-system,BlinkMacSystemFont,"SF Pro Display","Inter","Segoe UI",system-ui,sans-serif;
  -webkit-font-smoothing: antialiased;
  text-align: center;
  line-height: 1.4;
}

.n4-weather *,.n4-weather *::before,.n4-weather *::after {
  box-sizing: border-box;
}

.n4-weather .n4-copy {
  position: relative;
  z-index: 5;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1.6cqmin;
  width: 100%;
  max-width: 680px;
  padding: 0 6cqw;
}

.n4-weather .n4-title {
  margin: 0;
  font-size: clamp(17px,4.2cqmin,36px);
  font-weight: 600;
  letter-spacing: -.02em;
  line-height: 1.15;
  text-wrap: balance;
}

.n4-weather .n4-sub {
  margin: 0;
  max-width: 34em;
  font-size: clamp(13px,2.4cqmin,18px);
  color: #a1a1a6;
  text-wrap: balance;
}

.n4-weather .n4-tag {
  font: 600 clamp(10px,1.9cqmin,13px)/1 ui-monospace,"SF Mono",Menlo,Consolas,monospace;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--accent);
}

.n4-weather .n4-cta {
  margin-top: 1.8cqmin;
  display: inline-flex;
  align-items: center;
  gap: .5em;
  padding: .85em 1.5em;
  border-radius: 999px;
  background: #f5f5f7;
  color: #000;
  font-size: clamp(13px,2.2cqmin,16px);
  font-weight: 600;
  text-decoration: none;
  transition: transform .3s cubic-bezier(.25,.1,.25,1),box-shadow .3s cubic-bezier(.25,.1,.25,1);
}

.n4-weather .n4-cta:hover {
  transform: translateY(-2px);
  box-shadow: 0 12px 32px -10px var(--accent);
}

.n4-weather .n4-cta:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}

.n4-weather .n4-stars,.n4-weather .n4-stars2 {
  position: absolute;
  inset: -4%;
  pointer-events: none;
}

.n4-weather .n4-stars {
  background-image: radial-gradient(1px 1px at 8% 12%,#fff 60%,transparent),radial-gradient(1px 1px at 22% 68%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 35% 24%,#fff 60%,transparent),radial-gradient(1px 1px at 48% 82%,#fff 60%,transparent),radial-gradient(1px 1px at 57% 9%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 66% 44%,#fff 60%,transparent),radial-gradient(1px 1px at 74% 72%,#fff 60%,transparent),radial-gradient(1px 1px at 86% 18%,#fff 60%,transparent),radial-gradient(1.5px 1.5px at 93% 58%,#fff 60%,transparent),radial-gradient(1px 1px at 14% 42%,#fff 60%,transparent),radial-gradient(1px 1px at 40% 55%,#fff 60%,transparent),radial-gradient(1px 1px at 81% 90%,#fff 60%,transparent),radial-gradient(1px 1px at 4% 88%,#fff 60%,transparent),radial-gradient(1px 1px at 62% 30%,#fff 60%,transparent);
  opacity: .75;
  animation: n4-weather-tw calc(5s / var(--k)) ease-in-out infinite alternate;
}

.n4-weather .n4-stars2 {
  background-image: radial-gradient(2px 2px at 18% 30%,rgba(255,255,255,.9) 50%,transparent),radial-gradient(1.5px 1.5px at 72% 20%,rgba(255,255,255,.8) 50%,transparent),radial-gradient(2px 2px at 30% 85%,rgba(255,255,255,.7) 50%,transparent),radial-gradient(1.5px 1.5px at 88% 70%,rgba(255,255,255,.8) 50%,transparent),radial-gradient(2px 2px at 52% 60%,rgba(255,255,255,.6) 50%,transparent),radial-gradient(1.5px 1.5px at 6% 55%,rgba(255,255,255,.8) 50%,transparent);
  opacity: .55;
  animation: n4-weather-tw calc(7s / var(--k)) ease-in-out infinite alternate-reverse;
}

.n4-weather [data-depth] {
  transition: transform .9s cubic-bezier(.2,.7,.2,1);
}

@keyframes n4-weather-tw {
  from {
    opacity: .3;
  }
}

@keyframes n4-weather-spin {
  to {
    transform: rotate(1turn);
  }
}

@keyframes n4-weather-fade {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
}

@media (prefers-reduced-motion:reduce) {
  .n4-weather *,.n4-weather *::before,.n4-weather *::after {
    animation: none!important;
    transition: none!important;
  }
}

.n4-weather {
  background: radial-gradient(80% 60% at 50% 25%,#f2f8fa,#cfe2e9 75%);
  color: #0f2f3a;
}

.n4-weather .n4-tv {
  width: min(70cqmin,480px);
  font-size: min(2cqmin,14px);
  margin-bottom: 1.8cqmin;
  overflow: hidden;
  border-radius: 1em;
  background: #0f2f3a;
  box-shadow: 0 0 0 .45em #0f2f3a,0 1.8em 2.4em -1.2em rgba(15,47,58,.6);
}

.n4-weather .n4-map {
  display: block;
  width: 100%;
  height: auto;
  background: radial-gradient(70% 70% at 65% 40%,#2389a8,#145e78);
}

.n4-weather .n4-land {
  fill: #d8cf9e;
  stroke: #b5a86e;
  stroke-width: 1.5;
}

.n4-weather .n4-iso ellipse {
  fill: none;
  stroke: rgba(255,255,255,.5);
  stroke-width: 1.3;
  stroke-dasharray: 3 4;
  animation: n4-weather-iso calc(6s / var(--k)) linear infinite;
}

.n4-weather .n4-storm {
  transform-box: fill-box;
  transform-origin: center;
  animation: n4-weather-spin calc(5s / var(--k)) linear infinite reverse;
}

.n4-weather .n4-storm path {
  fill: none;
  stroke: #fff;
  stroke-width: 7;
  stroke-linecap: round;
}

.n4-weather .n4-storm circle {
  fill: var(--accent);
  stroke: #fff;
  stroke-width: 4;
}

.n4-weather .n4-hpa {
  font: 800 15px "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
  fill: #fff;
  text-anchor: middle;
  paint-order: stroke;
  stroke: #0f2f3a;
  stroke-width: 3px;
}

.n4-weather .n4-sun {
  transform-box: fill-box;
  transform-origin: center;
  animation: n4-weather-spin calc(24s / var(--k)) linear infinite;
}

.n4-weather .n4-sun circle {
  fill: #ffd23f;
}

.n4-weather .n4-sun path {
  stroke: #ffd23f;
  stroke-width: 3.5;
  stroke-linecap: round;
}

.n4-weather .n4-cloud {
  animation: n4-weather-cloud calc(7s / var(--k)) ease-in-out infinite alternate;
}

.n4-weather .n4-cloud path {
  fill: #f3f6f8;
  stroke: #c9d6dc;
  stroke-width: 1.5;
}

.n4-weather .n4-temp {
  font: 800 16px "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
  fill: #fff;
  text-anchor: middle;
  paint-order: stroke;
  stroke: #0f2f3a;
  stroke-width: 3px;
}

.n4-weather .n4-wind {
  fill: none;
  stroke: #fff;
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  stroke-dasharray: 60;
  stroke-dashoffset: 60;
  animation: n4-weather-wind calc(3s / var(--k)) ease-in-out infinite;
}

.n4-weather .n4-tick {
  display: flex;
  margin: 0;
  font: 700 1em/1 "Helvetica Neue",Helvetica,Arial,system-ui,sans-serif;
  color: #fff;
}

.n4-weather .n4-tick b {
  padding: .65em .9em;
  background: var(--accent);
  color: #1b0b03;
  text-transform: uppercase;
  letter-spacing: .1em;
}

.n4-weather .n4-tick span {
  flex: 1;
  overflow: hidden;
  display: flex;
  align-items: center;
}

.n4-weather .n4-tick em {
  flex: none;
  padding-left: 100%;
  font-style: normal;
  white-space: nowrap;
  animation: n4-weather-ticker calc(11s / var(--k)) linear infinite;
}

.n4-weather .n4-title {
  font-size: clamp(20px,5cqmin,42px);
  font-weight: 800;
  letter-spacing: -.03em;
}

.n4-weather .n4-sub {
  color: #3d5f6b;
}

.n4-weather .n4-cta {
  background: #0f2f3a;
  color: #fff;
}

@keyframes n4-weather-iso {
  to {
    stroke-dashoffset: -28;
  }
}

@keyframes n4-weather-cloud {
  to {
    transform: translateX(18px);
  }
}

@keyframes n4-weather-wind {
  40%,60% {
    stroke-dashoffset: 0;
  }
  100% {
    stroke-dashoffset: -60;
  }
}

@keyframes n4-weather-ticker {
  to {
    transform: translateX(-100%);
  }
}

@media (prefers-reduced-motion:reduce) {
  .n4-weather .n4-tick em {
    padding-left: .9em;
  }
  .n4-weather .n4-wind {
    stroke-dashoffset: 0;
  }
}
`;

export default function NotFoundWeather() {
  return (
    <>
      <style>{css}</style>
      <div>
        <main className="n4-weather">
          <div className="n4-copy">
            <div className="n4-tv" aria-hidden="true">
              <svg className="n4-map" viewBox="0 0 400 230">
                <path className="n4-land" d="M0 0H176C166 28 126 40 134 70S100 118 64 128 22 168 0 178Z" />
                <path className="n4-land" d="M400 230H246C258 204 298 198 316 174S362 150 400 138Z" />
                <g className="n4-iso"><ellipse cx="262" cy="96" rx="38" ry="28" /><ellipse cx="262" cy="96" rx="70" ry="52" /><ellipse cx="262" cy="96" rx="104" ry="78" /><ellipse cx="262" cy="96" rx="140" ry="106" /></g>
                <g className="n4-storm"><path d="M262 84C282 80 298 70 304 52" /><path d="M262 108C242 112 226 122 220 140" /><circle cx="262" cy="96" r="12" /></g>
                <text className="n4-hpa" x="262" y="160">404 hPa</text>
                <g className="n4-sun"><circle cx="66" cy="58" r="12" /><path d="M66 36v-7M66 80v7M44 58h-7M88 58h7M50 42l-5-5M82 74l5 5M50 74l-5 5M82 42l5-5" /></g>
                <text className="n4-temp" x="66" y="104">--°</text>
                <g className="n4-cloud"><path d="M150 196a12 12 0 0 1 4-23 16 16 0 0 1 30-4 11 11 0 0 1 14 15 9 9 0 0 1-2 12z" /></g>
                <text className="n4-temp" x="176" y="222">--°</text>
                <path className="n4-wind" d="M128 120c18-6 34-6 50 2M172 116l7 6-9 3" />
              </svg>
              <p className="n4-tick"><b>Warning</b><span><em>Chance of finding this page: 0%</em></span></p>
            </div>
            <h1 className="n4-title">No forecast for this page today.</h1>
            <p className="n4-sub">A 404 hectopascal storm has carried it away. Check the main map or go back home until it clears up.</p>
            <a className="n4-cta" href="/">Back to home</a>
          </div>
        </main>
      </div>
    </>
  );
}
```

Give me the complete final code, ready to paste, and tell me in one line where to put it in my project.
````
