Four weather cards — CSS only, built by Kimi K3.1 Pro
Hostedvia OpenCodeOpenRouter
103tok/s
First token included
78.3Ktokens
12m 40s
$0.77
Show the code the model wroteHide the code
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#f1f0ec">
<meta name="description" content="Four weather conditions, brought to life with nothing but CSS.">
<title>Atmosphere — Weather in motion</title>
<style>
/* ---------- Foundations ---------- */
:root {
color-scheme: light;
--paper: #f1f0ec;
--ink: #202522;
--muted: #747973;
--line: rgba(32, 37, 34, 0.13);
--card-radius: 26px;
--rain-fall: 128px;
--snow-fall: 158px;
font-family: "Avenir Next", Avenir, "Helvetica Neue", Helvetica, Arial, sans-serif;
font-synthesis: none;
text-rendering: optimizeLegibility;
}
* {
box-sizing: border-box;
}
html {
min-width: 320px;
background: var(--paper);
}
body {
min-width: 320px;
min-height: 100vh;
min-height: 100svh;
margin: 0;
color: var(--ink);
background:
radial-gradient(circle at 12% 0%, rgba(255, 255, 255, 0.85), transparent 34rem),
var(--paper);
-webkit-font-smoothing: antialiased;
}
p,
h1,
h2 {
margin: 0;
}
.weather-app {
width: min(100%, 1600px);
margin: 0 auto;
padding: 38px clamp(22px, 3vw, 48px) 24px;
}
.page-header {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 32px;
margin-bottom: 34px;
}
.eyebrow,
.card-heading,
.card-index,
.page-footer {
font-family: ui-monospace, "SFMono-Regular", Consolas, "Liberation Mono", monospace;
text-transform: uppercase;
}
.eyebrow {
display: flex;
align-items: center;
gap: 9px;
margin-bottom: 14px;
color: #656b65;
font-size: 10px;
font-weight: 600;
letter-spacing: 0.16em;
}
.eyebrow-mark {
width: 7px;
height: 7px;
border: 1px solid #777e75;
border-radius: 50%;
box-shadow: inset 0 0 0 2px var(--paper);
background: #777e75;
}
h1 {
max-width: 780px;
font-size: clamp(38px, 4.6vw, 68px);
font-weight: 500;
line-height: 0.98;
letter-spacing: -0.058em;
}
.header-note {
flex: 0 0 auto;
padding-bottom: 3px;
color: #777c76;
font-size: 12px;
line-height: 1.55;
letter-spacing: -0.01em;
}
.weather-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: clamp(12px, 1.35vw, 22px);
}
.weather-card {
--accent: #7d867d;
position: relative;
isolation: isolate;
display: flex;
flex-direction: column;
min-width: 0;
height: 500px;
overflow: hidden;
border: 1px solid rgba(32, 37, 34, 0.09);
border-radius: var(--card-radius);
background: #f8f7f3;
box-shadow:
0 1px 1px rgba(31, 38, 33, 0.03),
0 14px 35px rgba(31, 38, 33, 0.065);
}
.weather-scene {
position: relative;
flex: 1 1 auto;
min-height: 0;
overflow: hidden;
}
.weather-scene::after {
content: "";
position: absolute;
z-index: 10;
inset: 0;
border-radius: calc(var(--card-radius) - 1px) calc(var(--card-radius) - 1px) 0 0;
box-shadow: inset 0 0 45px rgba(255, 255, 255, 0.09);
pointer-events: none;
}
.sun-card {
--accent: #d6a938;
}
.sun-card .weather-scene {
background: linear-gradient(155deg, #b9dfe3 0%, #dbe9dc 51%, #f1dfba 100%);
}
.rain-card {
--accent: #668b97;
}
.rain-card .weather-scene {
background: linear-gradient(155deg, #92adb6 0%, #beced0 52%, #d5dcd5 100%);
}
.snow-card {
--accent: #879bb5;
}
.snow-card .weather-scene {
background: linear-gradient(155deg, #b9c9df 0%, #d8e2ea 54%, #e6e9e7 100%);
}
.storm-card {
--accent: #596f86;
}
.storm-card .weather-scene {
background: linear-gradient(155deg, #243542 0%, #405462 55%, #68777a 100%);
}
.card-footer {
position: relative;
z-index: 12;
flex: 0 0 140px;
display: flex;
flex-direction: column;
justify-content: space-between;
padding: 20px 22px 21px;
border-top: 1px solid rgba(32, 37, 34, 0.075);
background: rgba(248, 247, 243, 0.97);
}
.card-heading {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.card-heading h2 {
display: flex;
align-items: center;
gap: 8px;
font-size: 10px;
font-weight: 700;
line-height: 1;
letter-spacing: 0.16em;
}
.card-heading h2::before {
content: "";
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--accent);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 13%, transparent);
}
.card-index {
color: #687068;
font-size: 9px;
letter-spacing: 0.1em;
}
.card-reading {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 12px;
}
.temperature {
flex: 0 0 auto;
font-size: clamp(48px, 4.25vw, 64px);
font-weight: 400;
line-height: 0.82;
letter-spacing: -0.075em;
}
.temperature span {
display: inline-block;
margin-left: 2px;
font-size: 0.62em;
font-weight: 300;
vertical-align: top;
transform: translateY(-0.08em);
}
.weather-summary {
padding-bottom: 1px;
color: #4c534d;
font-size: 10px;
font-weight: 600;
line-height: 1.45;
text-align: right;
letter-spacing: -0.015em;
}
.weather-summary span {
display: block;
color: #687068;
font-size: 9px;
font-weight: 400;
}
.page-footer {
display: flex;
justify-content: space-between;
gap: 20px;
padding-top: 19px;
color: #687068;
font-size: 8px;
line-height: 1.4;
letter-spacing: 0.13em;
}
/* ---------- Shared cloud construction ---------- */
.cloud {
position: absolute;
left: 50%;
width: 138px;
height: 40px;
border-radius: 999px;
transform: translateX(-50%);
}
.cloud::before,
.cloud::after {
content: "";
position: absolute;
border-radius: 50%;
}
.cloud::before {
left: 23px;
bottom: 11px;
width: 62px;
height: 62px;
}
.cloud::after {
right: 18px;
bottom: 7px;
width: 76px;
height: 76px;
}
/* ---------- Sun ---------- */
.sun-system {
position: absolute;
z-index: 2;
top: 44%;
left: 50%;
width: 214px;
height: 214px;
transform: translate(-50%, -50%);
}
.sun-halo {
position: absolute;
inset: 20px;
border-radius: 50%;
opacity: 0.72;
background: radial-gradient(circle, rgba(255, 221, 111, 0.58) 0%, rgba(255, 215, 100, 0.22) 45%, transparent 72%);
filter: blur(7px);
animation: halo-pulse 5.7s ease-in-out -1.3s infinite;
}
.sun-rays {
position: absolute;
inset: 0;
animation: ray-rotation 44s linear -8s infinite;
}
.sun-rays i {
position: absolute;
top: 0;
left: 50%;
width: 4px;
height: 23px;
margin-left: -2px;
border-radius: 999px;
opacity: 0.78;
background: linear-gradient(to bottom, #e7ad36, #f5c958);
box-shadow: 0 0 8px rgba(247, 195, 74, 0.2);
transform: rotate(calc(var(--ray) * 30deg));
transform-origin: 2px 107px;
}
.sun-rays i:nth-child(3n + 2) {
height: 17px;
opacity: 0.55;
}
.sun-disc {
position: absolute;
inset: 49px;
border-radius: 50%;
background: radial-gradient(circle at 35% 28%, #fff7bd 0%, #ffe486 31%, #ffd267 67%, #ffc45c 100%);
box-shadow:
inset -8px -10px 18px rgba(225, 150, 43, 0.11),
0 0 30px rgba(255, 205, 88, 0.34);
animation: sun-dimming 22s ease-in-out -3s infinite;
}
.sun-cloud {
z-index: 4;
top: 51%;
width: 88px;
height: 25px;
opacity: 0;
color: #f4f2e8;
background: linear-gradient(180deg, #fbf9ef, #e9e9df);
box-shadow: 0 8px 18px rgba(93, 111, 103, 0.12);
animation: sun-cloud-pass 22s linear -3s infinite;
}
.sun-cloud::before {
left: 16px;
bottom: 8px;
width: 39px;
height: 39px;
background: #faf8ee;
}
.sun-cloud::after {
right: 12px;
bottom: 5px;
width: 46px;
height: 46px;
background: #f7f5eb;
}
@keyframes ray-rotation {
to { transform: rotate(360deg); }
}
@keyframes halo-pulse {
0%, 100% { opacity: 0.64; transform: scale(0.95); }
50% { opacity: 0.94; transform: scale(1.09); }
}
@keyframes sun-cloud-pass {
0% {
opacity: 0;
transform: translate3d(calc(-50% - 240px), 0, 0);
}
10% { opacity: 0.88; }
82% { opacity: 0.88; }
94%, 100% {
opacity: 0;
transform: translate3d(calc(-50% + 240px), 0, 0);
}
}
@keyframes sun-dimming {
0%, 35%, 68%, 100% { filter: brightness(1) saturate(1); }
48%, 56% { filter: brightness(0.78) saturate(0.78); }
}
/* ---------- Rain and splashes ---------- */
.rain-cloud {
z-index: 5;
top: 27%;
color: #71868b;
background: linear-gradient(180deg, #82979b 0%, #6e8389 72%, #657b81 100%);
box-shadow:
inset 0 -7px 10px rgba(54, 75, 81, 0.13),
0 12px 20px rgba(58, 78, 83, 0.15);
animation: rain-cloud-hover 6.3s ease-in-out -2.2s infinite;
}
.rain-cloud::before {
background: linear-gradient(145deg, #91a4a6, #788d91 72%);
}
.rain-cloud::after {
background: linear-gradient(145deg, #899da0, #70868b 75%);
}
.rain-field,
.snow-field {
position: absolute;
inset: 0;
}
.rain-drop {
--drop-color: rgba(222, 244, 246, 0.82);
--splash-color: rgba(108, 151, 161, 0.64);
position: absolute;
z-index: 3;
top: 42%;
left: var(--x);
width: 14px;
height: var(--rain-fall);
margin-left: -7px;
pointer-events: none;
}
.rain-drop::before {
content: "";
position: absolute;
top: 0;
left: 6px;
width: 2px;
height: var(--length);
border-radius: 999px;
opacity: 0;
background: linear-gradient(to bottom, transparent, var(--drop-color) 38%, var(--drop-color));
box-shadow: 0 0 3px rgba(223, 246, 248, 0.12);
animation: rain-fall var(--duration) linear var(--delay) infinite;
}
.rain-drop::after {
content: "";
position: absolute;
top: calc(var(--rain-fall) + 1px);
left: 50%;
width: 13px;
height: 5px;
border: 1px solid var(--splash-color);
border-radius: 50%;
opacity: 0;
transform: translate(-50%, -50%) scale(0.1);
animation: rain-splash var(--duration) ease-out var(--delay) infinite;
}
.puddle {
position: absolute;
z-index: 2;
top: calc(42% + var(--rain-fall) + 5px);
left: 17%;
right: 17%;
height: 17px;
border-bottom: 1px solid rgba(85, 124, 133, 0.3);
border-radius: 50%;
opacity: 0.78;
background: radial-gradient(ellipse at center, rgba(96, 137, 145, 0.16), transparent 69%);
}
.puddle::after {
content: "";
position: absolute;
inset: 4px 13% -3px;
border-bottom: 1px solid rgba(101, 139, 146, 0.2);
border-radius: 50%;
animation: puddle-breathe 4.9s ease-in-out -1.7s infinite;
}
@keyframes rain-cloud-hover {
0%, 100% { transform: translate(-50%, 0); }
50% { transform: translate(-50%, -5px); }
}
@keyframes rain-fall {
0% {
opacity: 0;
transform: translate3d(0, -18px, 0) rotate(9deg) scaleY(0.65);
}
9% { opacity: 0.9; }
76% { opacity: 0.9; }
82%, 100% {
opacity: 0;
transform: translate3d(var(--drift), var(--rain-fall), 0) rotate(9deg) scaleY(1);
}
}
@keyframes rain-splash {
0%, 81% {
opacity: 0;
transform: translate(-50%, -50%) scale(0.1);
}
82% {
opacity: 0.8;
transform: translate(-50%, -50%) scale(0.25);
}
100% {
opacity: 0;
transform: translate(-50%, -50%) scale(1.85);
}
}
@keyframes puddle-breathe {
0%, 100% { opacity: 0.35; transform: scaleX(0.88); }
50% { opacity: 0.85; transform: scaleX(1.08); }
}
/* ---------- Snow ---------- */
.snow-cloud {
z-index: 5;
top: 25%;
color: #e8edf2;
background: linear-gradient(180deg, #f8fafb 0%, #e5ebef 72%, #dce4e9 100%);
box-shadow:
inset 0 -7px 12px rgba(122, 145, 164, 0.08),
0 12px 22px rgba(105, 127, 150, 0.12);
animation: snow-cloud-hover 7.4s ease-in-out -4.6s infinite;
}
.snow-cloud::before {
background: linear-gradient(145deg, #ffffff, #e9eef2 80%);
}
.snow-cloud::after {
background: linear-gradient(145deg, #fbfcfd, #e3eaf0 80%);
}
.snowflake {
position: absolute;
z-index: 3;
top: 40%;
left: var(--x);
width: 2px;
height: var(--size);
margin-top: calc(var(--size) / -2);
margin-left: -1px;
border-radius: 999px;
opacity: 0;
color: rgba(255, 255, 255, 0.94);
background: currentColor;
box-shadow: 0 0 5px rgba(255, 255, 255, 0.4);
animation: snow-drift var(--duration) linear var(--delay) infinite;
}
.snowflake::before,
.snowflake::after {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
background: currentColor;
}
.snowflake::before { transform: rotate(60deg); }
.snowflake::after { transform: rotate(120deg); }
.snowflake:nth-child(3n) {
width: 3px;
margin-left: -1.5px;
color: rgba(255, 255, 255, 0.78);
}
.snowflake:nth-child(4n) {
filter: blur(0.25px);
}
.snowbank {
position: absolute;
z-index: 5;
pointer-events: none;
}
.snowbank-back {
right: -18%;
bottom: -35px;
width: 99%;
height: 81px;
border-radius: 50% 50% 0 0;
opacity: 0.8;
background: #e7edf0;
transform: rotate(5deg);
}
.snowbank-front {
left: -19%;
bottom: -43px;
width: 118%;
height: 96px;
border-radius: 50% 50% 0 0;
background: linear-gradient(175deg, #fbfcfa, #edf1ef);
box-shadow: 0 -7px 18px rgba(255, 255, 255, 0.2);
transform: rotate(-4deg);
}
@keyframes snow-cloud-hover {
0%, 100% { transform: translate(-50%, -2px); }
50% { transform: translate(-50%, 4px); }
}
@keyframes snow-drift {
0% {
opacity: 0;
transform: translate3d(0, -18px, 0) rotate(0deg);
}
10% { opacity: 0.9; }
25% { transform: translate3d(var(--sway), calc(var(--snow-fall) * 0.22), 0) rotate(65deg); }
48% { transform: translate3d(calc(var(--sway) * -0.55), calc(var(--snow-fall) * 0.47), 0) rotate(125deg); }
72% { transform: translate3d(calc(var(--sway) * 0.7), calc(var(--snow-fall) * 0.73), 0) rotate(195deg); }
88% { opacity: 0.82; }
100% {
opacity: 0;
transform: translate3d(calc(var(--sway) * -0.15), var(--snow-fall), 0) rotate(280deg);
}
}
/* ---------- Thunderstorm ---------- */
.storm-cloud {
z-index: 6;
top: 25%;
width: 150px;
height: 45px;
color: #35434d;
background: linear-gradient(180deg, #4d5b65 0%, #35444f 68%, #2c3b46 100%);
box-shadow:
inset 0 -9px 13px rgba(15, 26, 35, 0.25),
0 14px 24px rgba(17, 28, 37, 0.28);
animation: storm-cloud-hover 5.6s ease-in-out -3.4s infinite;
}
.storm-cloud::before {
left: 21px;
bottom: 12px;
width: 68px;
height: 68px;
background: linear-gradient(145deg, #596772, #394852 78%);
}
.storm-cloud::after {
right: 15px;
bottom: 8px;
width: 82px;
height: 82px;
background: linear-gradient(145deg, #53626d, #33434e 78%);
}
.storm-rain .rain-drop {
--drop-color: rgba(199, 228, 244, 0.86);
--splash-color: rgba(196, 225, 239, 0.58);
}
.storm-rain .rain-drop::before {
width: 2px;
box-shadow: 0 0 4px rgba(197, 228, 245, 0.14);
}
.storm-card .puddle {
border-bottom-color: rgba(194, 218, 228, 0.37);
background: radial-gradient(ellipse at center, rgba(192, 217, 227, 0.18), transparent 69%);
}
.storm-card .puddle::after {
border-bottom-color: rgba(194, 218, 228, 0.26);
animation-delay: -3.1s;
animation-duration: 4.3s;
}
.lightning-bolt {
position: absolute;
z-index: 5;
top: 38%;
left: 52%;
width: 57px;
height: 124px;
opacity: 0;
background: linear-gradient(180deg, #ffffff, #fff7bd 72%, #ffffff);
clip-path: polygon(48% 0, 100% 0, 68% 36%, 94% 36%, 15% 100%, 37% 54%, 7% 54%);
filter: drop-shadow(0 0 7px #f5f4cf) drop-shadow(0 0 18px rgba(224, 239, 255, 0.9));
transform: translateX(-50%) rotate(7deg);
animation: lightning-flash 19.3s linear 1.8s infinite;
}
.whole-card-flash {
position: absolute;
z-index: 30;
inset: 0;
border-radius: inherit;
opacity: 0;
background: #e7f2ff;
mix-blend-mode: screen;
pointer-events: none;
animation: lightning-flash 19.3s linear 1.8s infinite;
}
@keyframes storm-cloud-hover {
0%, 100% { transform: translate(-50%, 1px); }
50% { transform: translate(-50%, -5px); }
}
/* Four separated bursts, with short return strokes, inside a long cycle. */
@keyframes lightning-flash {
0%, 10.29% { opacity: 0; }
10.34%, 10.43% { opacity: 0.96; }
10.49% { opacity: 0.08; }
10.55% { opacity: 0.74; }
10.68%, 36.19% { opacity: 0; }
36.24%, 36.35% { opacity: 0.9; }
36.48%, 67.59% { opacity: 0; }
67.64%, 67.72% { opacity: 1; }
67.79% { opacity: 0.12; }
67.86%, 67.96% { opacity: 0.82; }
68.09%, 85.89% { opacity: 0; }
85.94%, 86.08% { opacity: 0.92; }
86.23%, 100% { opacity: 0; }
}
/* ---------- Responsive layout ---------- */
@media (max-width: 1120px) {
.weather-app {
padding-top: 32px;
}
.weather-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
max-width: 880px;
margin-inline: auto;
}
.page-header,
.page-footer {
max-width: 880px;
margin-inline: auto;
}
.page-header {
margin-bottom: 28px;
}
.temperature {
font-size: 62px;
}
}
@media (max-width: 640px) {
:root {
--card-radius: 21px;
--rain-fall: 104px;
--snow-fall: 121px;
}
.weather-app {
padding: 25px 14px 19px;
}
.page-header {
align-items: flex-start;
margin-bottom: 23px;
}
.eyebrow {
margin-bottom: 11px;
font-size: 8px;
}
h1 {
font-size: clamp(36px, 10vw, 52px);
}
.header-note {
display: none;
}
.weather-grid {
gap: 11px;
}
.weather-card {
height: 410px;
}
.card-footer {
flex-basis: 130px;
padding: 17px 16px 18px;
}
.temperature {
font-size: clamp(42px, 11vw, 56px);
}
.weather-summary {
font-size: 9px;
}
.weather-summary span {
font-size: 8px;
}
.sun-system {
width: 174px;
height: 174px;
}
.sun-rays i {
height: 19px;
transform-origin: 2px 87px;
}
.sun-disc {
inset: 41px;
}
.cloud {
width: 124px;
height: 36px;
}
.cloud::before {
left: 20px;
width: 56px;
height: 56px;
}
.cloud::after {
right: 16px;
width: 68px;
height: 68px;
}
.sun-cloud {
width: 78px;
height: 23px;
}
.sun-cloud::before {
left: 14px;
width: 35px;
height: 35px;
}
.sun-cloud::after {
right: 10px;
width: 41px;
height: 41px;
}
.storm-cloud {
width: 132px;
height: 39px;
}
.storm-cloud::before {
width: 60px;
height: 60px;
}
.storm-cloud::after {
width: 73px;
height: 73px;
}
.lightning-bolt {
width: 48px;
height: 104px;
}
.page-footer {
padding-top: 16px;
font-size: 7px;
}
}
@media (max-width: 390px) {
.weather-app {
padding-inline: 10px;
}
.weather-grid {
gap: 9px;
}
.weather-card {
height: 385px;
}
.card-footer {
flex-basis: 122px;
padding: 15px 12px 16px;
}
.card-heading h2 {
gap: 6px;
font-size: 9px;
}
.card-index {
font-size: 8px;
}
.card-reading {
gap: 6px;
}
.temperature {
font-size: 40px;
}
.weather-summary {
max-width: 67px;
font-size: 8px;
}
.weather-summary span {
font-size: 7px;
}
}
/* Keep the composed scene, but remove all motion and flashing on request. */
@media (prefers-reduced-motion: reduce) {
.sun-halo,
.sun-rays,
.sun-disc,
.cloud,
.rain-drop::before,
.rain-drop::after,
.puddle::after,
.snowflake,
.lightning-bolt,
.whole-card-flash {
animation: none !important;
}
.sun-cloud,
.whole-card-flash,
.lightning-bolt,
.rain-drop::after {
display: none;
}
.sun-disc {
filter: none;
}
.rain-drop::before {
opacity: 0.65;
transform: translateY(42px) rotate(9deg);
}
.snowflake {
opacity: 0.72;
transform: translateY(54px) rotate(25deg);
}
.snowflake:nth-child(3n) { transform: translateY(92px) rotate(70deg); }
.snowflake:nth-child(4n) { transform: translateY(25px) rotate(110deg); }
}
</style>
</head>
<body>
<main class="weather-app">
<header class="page-header">
<div>
<p class="eyebrow"><span class="eyebrow-mark" aria-hidden="true"></span> Atmosphere / Study 001</p>
<h1>Weather, in motion.</h1>
</div>
<p class="header-note">Four conditions.<br>One sky, endlessly changing.</p>
</header>
<section class="weather-grid" aria-label="Animated weather conditions">
<article class="weather-card sun-card">
<div class="weather-scene" aria-hidden="true">
<div class="sun-system">
<div class="sun-halo"></div>
<div class="sun-rays">
<i style="--ray: 0"></i>
<i style="--ray: 1"></i>
<i style="--ray: 2"></i>
<i style="--ray: 3"></i>
<i style="--ray: 4"></i>
<i style="--ray: 5"></i>
<i style="--ray: 6"></i>
<i style="--ray: 7"></i>
<i style="--ray: 8"></i>
<i style="--ray: 9"></i>
<i style="--ray: 10"></i>
<i style="--ray: 11"></i>
</div>
<div class="sun-disc"></div>
</div>
<div class="cloud sun-cloud"></div>
</div>
<footer class="card-footer">
<div class="card-heading">
<h2>Sun</h2>
<span class="card-index">01</span>
</div>
<div class="card-reading">
<p class="temperature">24<span>°</span></p>
<p class="weather-summary">Clear skies<span>Warm & calm</span></p>
</div>
</footer>
</article>
<article class="weather-card rain-card">
<div class="weather-scene" aria-hidden="true">
<div class="cloud rain-cloud"></div>
<div class="rain-field">
<i class="rain-drop" style="--x: 27%; --delay: -0.31s; --duration: 1.37s; --length: 17px; --drift: 7px"></i>
<i class="rain-drop" style="--x: 35%; --delay: -1.08s; --duration: 1.61s; --length: 13px; --drift: 4px"></i>
<i class="rain-drop" style="--x: 43%; --delay: -0.72s; --duration: 1.24s; --length: 19px; --drift: 8px"></i>
<i class="rain-drop" style="--x: 51%; --delay: -1.42s; --duration: 1.73s; --length: 15px; --drift: 5px"></i>
<i class="rain-drop" style="--x: 59%; --delay: -0.17s; --duration: 1.43s; --length: 18px; --drift: 9px"></i>
<i class="rain-drop" style="--x: 67%; --delay: -0.94s; --duration: 1.19s; --length: 14px; --drift: 6px"></i>
<i class="rain-drop" style="--x: 74%; --delay: -1.51s; --duration: 1.82s; --length: 18px; --drift: 4px"></i>
<i class="rain-drop" style="--x: 31%; --delay: -0.53s; --duration: 1.92s; --length: 12px; --drift: 8px"></i>
<i class="rain-drop" style="--x: 39%; --delay: -1.26s; --duration: 1.49s; --length: 16px; --drift: 5px"></i>
<i class="rain-drop" style="--x: 47%; --delay: -0.06s; --duration: 1.68s; --length: 14px; --drift: 7px"></i>
<i class="rain-drop" style="--x: 55%; --delay: -1.03s; --duration: 1.29s; --length: 20px; --drift: 6px"></i>
<i class="rain-drop" style="--x: 63%; --delay: -0.44s; --duration: 1.77s; --length: 13px; --drift: 9px"></i>
<i class="rain-drop" style="--x: 70%; --delay: -1.66s; --duration: 1.55s; --length: 17px; --drift: 4px"></i>
<i class="rain-drop" style="--x: 57%; --delay: -0.81s; --duration: 2.03s; --length: 12px; --drift: 7px"></i>
</div>
<div class="puddle"></div>
</div>
<footer class="card-footer">
<div class="card-heading">
<h2>Rain</h2>
<span class="card-index">02</span>
</div>
<div class="card-reading">
<p class="temperature">16<span>°</span></p>
<p class="weather-summary">Steady rain<span>Soft & soothing</span></p>
</div>
</footer>
</article>
<article class="weather-card snow-card">
<div class="weather-scene" aria-hidden="true">
<div class="cloud snow-cloud"></div>
<div class="snow-field">
<i class="snowflake" style="--x: 25%; --delay: -3.2s; --duration: 8.6s; --size: 10px; --sway: 18px"></i>
<i class="snowflake" style="--x: 34%; --delay: -6.7s; --duration: 10.4s; --size: 14px; --sway: -23px"></i>
<i class="snowflake" style="--x: 43%; --delay: -1.4s; --duration: 9.3s; --size: 8px; --sway: 14px"></i>
<i class="snowflake" style="--x: 52%; --delay: -7.9s; --duration: 11.2s; --size: 16px; --sway: -19px"></i>
<i class="snowflake" style="--x: 61%; --delay: -4.6s; --duration: 8.9s; --size: 11px; --sway: 25px"></i>
<i class="snowflake" style="--x: 70%; --delay: -2.1s; --duration: 10.8s; --size: 9px; --sway: -16px"></i>
<i class="snowflake" style="--x: 29%; --delay: -8.8s; --duration: 12.1s; --size: 13px; --sway: 21px"></i>
<i class="snowflake" style="--x: 38%; --delay: -5.3s; --duration: 9.8s; --size: 7px; --sway: -13px"></i>
<i class="snowflake" style="--x: 47%; --delay: -0.6s; --duration: 11.7s; --size: 12px; --sway: 24px"></i>
<i class="snowflake" style="--x: 56%; --delay: -6.1s; --duration: 8.4s; --size: 9px; --sway: -20px"></i>
<i class="snowflake" style="--x: 65%; --delay: -3.9s; --duration: 10.1s; --size: 15px; --sway: 17px"></i>
<i class="snowflake" style="--x: 74%; --delay: -9.2s; --duration: 12.6s; --size: 8px; --sway: -26px"></i>
<i class="snowflake" style="--x: 32%; --delay: -1.9s; --duration: 9.1s; --size: 11px; --sway: 15px"></i>
<i class="snowflake" style="--x: 49%; --delay: -7.2s; --duration: 10.9s; --size: 7px; --sway: -18px"></i>
<i class="snowflake" style="--x: 59%; --delay: -4.1s; --duration: 11.4s; --size: 10px; --sway: 22px"></i>
<i class="snowflake" style="--x: 68%; --delay: -0.8s; --duration: 8.8s; --size: 12px; --sway: -14px"></i>
</div>
<div class="snowbank snowbank-back"></div>
<div class="snowbank snowbank-front"></div>
</div>
<footer class="card-footer">
<div class="card-heading">
<h2>Snow</h2>
<span class="card-index">03</span>
</div>
<div class="card-reading">
<p class="temperature">−2<span>°</span></p>
<p class="weather-summary">Light snowfall<span>Quiet & crisp</span></p>
</div>
</footer>
</article>
<article class="weather-card storm-card">
<div class="weather-scene" aria-hidden="true">
<div class="cloud storm-cloud"></div>
<div class="lightning-bolt"></div>
<div class="rain-field storm-rain">
<i class="rain-drop" style="--x: 22%; --delay: -0.23s; --duration: 0.91s; --length: 22px; --drift: 10px"></i>
<i class="rain-drop" style="--x: 29%; --delay: -0.71s; --duration: 1.08s; --length: 18px; --drift: 8px"></i>
<i class="rain-drop" style="--x: 36%; --delay: -0.09s; --duration: 0.79s; --length: 24px; --drift: 12px"></i>
<i class="rain-drop" style="--x: 43%; --delay: -0.86s; --duration: 1.17s; --length: 20px; --drift: 9px"></i>
<i class="rain-drop" style="--x: 50%; --delay: -0.41s; --duration: 0.86s; --length: 25px; --drift: 11px"></i>
<i class="rain-drop" style="--x: 57%; --delay: -1.04s; --duration: 1.23s; --length: 18px; --drift: 8px"></i>
<i class="rain-drop" style="--x: 64%; --delay: -0.16s; --duration: 0.96s; --length: 23px; --drift: 12px"></i>
<i class="rain-drop" style="--x: 71%; --delay: -0.65s; --duration: 1.11s; --length: 19px; --drift: 9px"></i>
<i class="rain-drop" style="--x: 78%; --delay: -0.34s; --duration: 0.83s; --length: 24px; --drift: 11px"></i>
<i class="rain-drop" style="--x: 26%; --delay: -0.98s; --duration: 1.26s; --length: 17px; --drift: 8px"></i>
<i class="rain-drop" style="--x: 33%; --delay: -0.49s; --duration: 0.94s; --length: 21px; --drift: 13px"></i>
<i class="rain-drop" style="--x: 40%; --delay: -0.13s; --duration: 1.06s; --length: 19px; --drift: 10px"></i>
<i class="rain-drop" style="--x: 47%; --delay: -0.77s; --duration: 0.82s; --length: 26px; --drift: 12px"></i>
<i class="rain-drop" style="--x: 54%; --delay: -1.12s; --duration: 1.19s; --length: 20px; --drift: 9px"></i>
<i class="rain-drop" style="--x: 61%; --delay: -0.28s; --duration: 0.89s; --length: 23px; --drift: 11px"></i>
<i class="rain-drop" style="--x: 68%; --delay: -0.92s; --duration: 1.14s; --length: 18px; --drift: 8px"></i>
<i class="rain-drop" style="--x: 75%; --delay: -0.55s; --duration: 0.98s; --length: 22px; --drift: 13px"></i>
<i class="rain-drop" style="--x: 46%; --delay: -0.04s; --duration: 1.04s; --length: 20px; --drift: 10px"></i>
</div>
<div class="puddle"></div>
</div>
<div class="whole-card-flash" aria-hidden="true"></div>
<footer class="card-footer">
<div class="card-heading">
<h2>Storm</h2>
<span class="card-index">04</span>
</div>
<div class="card-reading">
<p class="temperature">13<span>°</span></p>
<p class="weather-summary">Thunderstorm<span>Wild & electric</span></p>
</div>
</footer>
</article>
</section>
<footer class="page-footer">
<span>Pure CSS weather study</span>
<span>Loops made to get lost in</span>
</footer>
</main>
</body>
</html>Same prompt, other models
One email when a new model lands on the board or in the showcase. Unsubscribe anytime.