Leaderboard
A game or challenge leaderboard: a calm podium of the top three with photos and a crown for first, ranked rows with photos and how far each moved up or down, your own row pinned and highlighted, and a this week or all time switch.
Bergen
Thu 23 Oct · 14:05
Now 14°
Partly cloudy
H 16° · L 9° · Feels 12°
Rain from about 18:00, easing by 20:00.
It is live: hover, focus and its own controls respond. Actions that would change data (approve, send, delete) are for your app to wire. The width is a real 390 px, 768 px or 1280 px box, shrunk to fit your screen.
<!-- Icons: Lucide (lucide.dev), ISC licence -->
<style>
.odl-weather-now { box-sizing: border-box; inline-size: 100%; max-inline-size: 24rem; margin-inline: auto; container-type: inline-size; color: var(--ds-color-text-primary); font: var(--ds-text-body-md); }
.odl-weather-now *, .odl-weather-now *::before, .odl-weather-now *::after { box-sizing: border-box; }
.odl-weather-now .odl-card { overflow: hidden; background: var(--ds-color-surface-raised); border: var(--ds-border-width-default) solid var(--ds-color-border-subtle); border-radius: var(--ds-radius-container); box-shadow: var(--ds-elevation-raised); }
.odl-weather-now .odl-sky { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: var(--ds-space-inline-md); padding: var(--ds-space-inset-xl);
color: var(--ds-color-white); background: radial-gradient(90% 80% at 85% 20%, var(--ds-color-info-light-8), transparent 70%), linear-gradient(170deg, var(--ds-color-info-light-10), var(--ds-color-info-light-12)); }
.odl-weather-now .odl-place { display: flex; align-items: center; gap: var(--ds-space-inline-xs); margin: 0; font: var(--ds-text-label-lg); }
.odl-weather-now .odl-place svg { inline-size: var(--ds-size-icon-sm); block-size: var(--ds-size-icon-sm); fill: currentColor; stroke-width: var(--ds-icon-stroke-md); }
.odl-weather-now .odl-when { margin: var(--ds-space-stack-xs) 0 0; font: var(--ds-text-label-md); opacity: 0.85; }
.odl-weather-now .odl-temp { margin: var(--ds-space-stack-sm) 0 0; font: var(--ds-text-headline-sm); font-size: calc(var(--ds-text-headline-sm-size) * 2.6); font-weight: var(--ds-font-weight-body); line-height: 1; letter-spacing: var(--ds-text-headline-sm-tracking); font-variant-numeric: tabular-nums; }
.odl-weather-now .odl-cond { margin: var(--ds-space-stack-xs) 0 0; font: var(--ds-text-title-sm); }
.odl-weather-now .odl-range { margin: var(--ds-space-stack-xs) 0 0; font: var(--ds-text-label-md); opacity: 0.9; font-variant-numeric: tabular-nums; }
.odl-weather-now .odl-big { inline-size: calc(var(--ds-size-control-lg) * 2.2); block-size: auto; aspect-ratio: 1; stroke-width: var(--ds-icon-stroke-sm); }
.odl-weather-now .odl-sec { padding: var(--ds-space-inset-lg); }
.odl-weather-now .odl-sec + .odl-sec { border-block-start: var(--ds-border-width-default) solid var(--ds-color-border-separator); }
.odl-weather-now h4 { display: flex; align-items: center; gap: var(--ds-space-inline-xs); margin: 0 0 var(--ds-space-stack-sm); color: var(--ds-color-text-secondary); font: var(--ds-text-label-md); }
.odl-weather-now h4 svg { inline-size: var(--ds-size-icon-sm); block-size: var(--ds-size-icon-sm); stroke-width: var(--ds-icon-stroke-md); }
.odl-weather-now .odl-note { margin: 0 0 var(--ds-space-stack-md); font: var(--ds-text-body-md); }
.odl-weather-now .odl-hours { display: flex; gap: var(--ds-space-inline-xs); margin: 0 calc(-1 * var(--ds-space-inset-lg)); padding: 0 var(--ds-space-inset-lg) var(--ds-space-inset-xs); list-style: none; overflow-x: auto; scroll-snap-type: x proximity; scroll-padding-inline: var(--ds-space-inset-lg); -webkit-mask-image: linear-gradient(to right, var(--ds-color-black) calc(100% - var(--ds-space-48)), transparent); mask-image: linear-gradient(to right, var(--ds-color-black) calc(100% - var(--ds-space-48)), transparent); scrollbar-width: thin; }
.odl-weather-now .odl-hours li { position: relative; flex: none; display: grid; justify-items: center; gap: var(--ds-space-stack-xs); min-inline-size: var(--ds-size-control-lg); padding: var(--ds-space-inset-sm) var(--ds-space-inset-xs); scroll-snap-align: start; border-radius: var(--ds-radius-nested); }
.odl-weather-now .odl-hours li:first-child { background: var(--ds-color-bg-neutral-subtle); }
.odl-weather-now .odl-hours li:first-child .odl-hr { color: var(--ds-color-text-primary); font-weight: var(--ds-font-weight-heading); }
.odl-weather-now .odl-hr { color: var(--ds-color-text-secondary); font: var(--ds-text-label-md); font-variant-numeric: tabular-nums; }
.odl-weather-now .odl-ic { inline-size: var(--ds-size-icon-md); block-size: var(--ds-size-icon-md); color: var(--ds-color-icon-default); stroke-width: var(--ds-icon-stroke-md); }
.odl-weather-now .odl-pop { min-block-size: 1lh; color: var(--ds-color-text-info); font: var(--ds-text-label-sm); font-variant-numeric: tabular-nums; }
.odl-weather-now .odl-hours b { font: var(--ds-text-label-lg); font-variant-numeric: tabular-nums; }
.odl-weather-now .odl-days { display: grid; margin: 0; padding: 0; list-style: none; }
.odl-weather-now .odl-days li { position: relative; display: grid; grid-template-columns: 3.5rem 3.75rem 2.25rem minmax(0, 1fr) 2.25rem; align-items: center; column-gap: var(--ds-space-inline-md); min-block-size: max(var(--ds-size-control-lg), var(--ds-size-target-min)); }
.odl-weather-now .odl-days li + li { border-block-start: var(--ds-border-width-default) solid var(--ds-color-border-separator); }
.odl-weather-now .odl-day { font: var(--ds-text-label-lg); }
.odl-weather-now .odl-days .odl-cond { display: flex; align-items: center; gap: var(--ds-space-inline-xs); margin: 0; }
.odl-weather-now .odl-days .odl-ic { inline-size: var(--ds-size-icon-sm); block-size: var(--ds-size-icon-sm); }
.odl-weather-now .odl-days .odl-pop { min-block-size: 0; }
.odl-weather-now .odl-lo, .odl-weather-now .odl-hi { font: var(--ds-text-label-lg); font-variant-numeric: tabular-nums; text-align: end; }
.odl-weather-now .odl-lo { color: var(--ds-color-text-secondary); }
.odl-weather-now .odl-bar { position: relative; block-size: var(--ds-space-6); border-radius: var(--ds-radius-full); background: var(--ds-color-bg-neutral-subtle); }
.odl-weather-now .odl-bar i { position: absolute; inset: 0; border-radius: var(--ds-radius-full); clip-path: inset(0 calc(100% - var(--e)) 0 var(--s) round var(--ds-radius-full));
background: linear-gradient(to right, var(--ds-color-info-light-8), var(--ds-color-success-light-8), var(--ds-color-warning-light-8)); }
.odl-weather-now .odl-bar .odl-now { clip-path: none; inset-inline: auto; inset-inline-start: var(--n); inset-block: 50% auto; inline-size: var(--ds-space-8); block-size: var(--ds-space-8); transform: translate(-50%, -50%);
background: var(--ds-color-surface-raised); border: var(--ds-border-width-emphasis) solid var(--ds-color-text-primary); }
.odl-weather-now .odl-sr { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.odl-weather-now .odl-hours:focus-visible { outline: var(--ds-focus-ring-width) solid var(--ds-color-border-focus); outline-offset: calc(-1 * var(--ds-focus-ring-width)); }
@container (max-width: 21rem) {
.odl-weather-now .odl-days li { grid-template-columns: 2.75rem 3.25rem 2rem minmax(0, 1fr) 2rem; column-gap: var(--ds-space-inline-xs); }
}
</style>
<section class="odl-weather-now" aria-label="Weather in Bergen">
<div class="odl-card">
<div class="odl-sky">
<div>
<p class="odl-place"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polygon points="3 11 22 2 13 21 11 13 3 11"/></svg>Bergen</p>
<p class="odl-when">Thu 23 Oct · 14:05</p>
<p class="odl-temp"><span class="odl-sr">Now </span>14°</p>
<p class="odl-cond">Partly cloudy</p>
<p class="odl-range">H 16° · L 9° · Feels 12°</p>
</div>
<svg class="odl-big" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="M20 12h2"/><path d="m19.07 4.93-1.41 1.41"/><path d="M15.947 12.65a4 4 0 0 0-5.925-4.128"/><path d="M13 22H7a5 5 0 1 1 4.9-6H13a3 3 0 0 1 0 6Z"/></svg>
</div>
<div class="odl-sec">
<h4><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>Next hours</h4>
<p class="odl-note">Rain from about 18:00, easing by 20:00.</p>
<ol class="odl-hours" tabindex="0" aria-label="Hourly forecast"><li><span class="odl-hr">Now</span><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="M20 12h2"/><path d="m19.07 4.93-1.41 1.41"/><path d="M15.947 12.65a4 4 0 0 0-5.925-4.128"/><path d="M13 22H7a5 5 0 1 1 4.9-6H13a3 3 0 0 1 0 6Z"/></svg><span class="odl-pop"></span><b>14°</b><span class="odl-sr">partly cloudy</span></li><li><span class="odl-hr">15</span><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="M20 12h2"/><path d="m19.07 4.93-1.41 1.41"/><path d="M15.947 12.65a4 4 0 0 0-5.925-4.128"/><path d="M13 22H7a5 5 0 1 1 4.9-6H13a3 3 0 0 1 0 6Z"/></svg><span class="odl-pop"></span><b>15°</b><span class="odl-sr">partly cloudy</span></li><li><span class="odl-hr">16</span><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></svg><span class="odl-pop"></span><b>16°</b><span class="odl-sr">sunny</span></li><li><span class="odl-hr">17</span><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"/></svg><span class="odl-pop">10%</span><b>15°</b><span class="odl-sr">cloudy, 10% chance of rain</span></li><li><span class="odl-hr">18</span><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242"/><path d="M16 14v6"/><path d="M8 14v6"/><path d="M12 16v6"/></svg><span class="odl-pop">60%</span><b>13°</b><span class="odl-sr">rain, 60% chance of rain</span></li><li><span class="odl-hr">19</span><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242"/><path d="M16 14v6"/><path d="M8 14v6"/><path d="M12 16v6"/></svg><span class="odl-pop">70%</span><b>12°</b><span class="odl-sr">rain, 70% chance of rain</span></li><li><span class="odl-hr">20</span><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"/></svg><span class="odl-pop">30%</span><b>11°</b><span class="odl-sr">cloudy, 30% chance of rain</span></li><li><span class="odl-hr">21</span><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg><span class="odl-pop"></span><b>10°</b><span class="odl-sr">clear</span></li><li><span class="odl-hr">22</span><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg><span class="odl-pop"></span><b>10°</b><span class="odl-sr">clear</span></li></ol>
</div>
<div class="odl-sec">
<h4><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 2v4"/><path d="M16 2v4"/><rect width="18" height="18" x="3" y="4" rx="2"/><path d="M3 10h18"/></svg>7 days</h4>
<ol class="odl-days" aria-label="Seven-day forecast"><li><span class="odl-day">Today</span><span class="odl-cond"><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="M20 12h2"/><path d="m19.07 4.93-1.41 1.41"/><path d="M15.947 12.65a4 4 0 0 0-5.925-4.128"/><path d="M13 22H7a5 5 0 1 1 4.9-6H13a3 3 0 0 1 0 6Z"/></svg><span class="odl-pop"></span></span><span class="odl-lo">9°</span><span class="odl-bar" style="--s: 36.4%; --e: 100.0%" aria-hidden="true"><i></i><i class="odl-now" style="--n: 81.8%"></i></span><span class="odl-hi">16°</span><span class="odl-sr">partly cloudy, low 9°, high 16°</span></li><li><span class="odl-day">Fri</span><span class="odl-cond"><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242"/><path d="M16 14v6"/><path d="M8 14v6"/><path d="M12 16v6"/></svg><span class="odl-pop">80%</span></span><span class="odl-lo">8°</span><span class="odl-bar" style="--s: 27.3%; --e: 63.6%" aria-hidden="true"><i></i></span><span class="odl-hi">12°</span><span class="odl-sr">rain, 80% chance of rain, low 8°, high 12°</span></li><li><span class="odl-day">Sat</span><span class="odl-cond"><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242"/><path d="M16 14v6"/><path d="M8 14v6"/><path d="M12 16v6"/></svg><span class="odl-pop">60%</span></span><span class="odl-lo">7°</span><span class="odl-bar" style="--s: 18.2%; --e: 54.5%" aria-hidden="true"><i></i></span><span class="odl-hi">11°</span><span class="odl-sr">rain, 60% chance of rain, low 7°, high 11°</span></li><li><span class="odl-day">Sun</span><span class="odl-cond"><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"/></svg><span class="odl-pop">20%</span></span><span class="odl-lo">6°</span><span class="odl-bar" style="--s: 9.1%; --e: 63.6%" aria-hidden="true"><i></i></span><span class="odl-hi">12°</span><span class="odl-sr">cloudy, 20% chance of rain, low 6°, high 12°</span></li><li><span class="odl-day">Mon</span><span class="odl-cond"><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></svg><span class="odl-pop"></span></span><span class="odl-lo">5°</span><span class="odl-bar" style="--s: 0.0%; --e: 72.7%" aria-hidden="true"><i></i></span><span class="odl-hi">13°</span><span class="odl-sr">sunny, low 5°, high 13°</span></li><li><span class="odl-day">Tue</span><span class="odl-cond"><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 2v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="M20 12h2"/><path d="m19.07 4.93-1.41 1.41"/><path d="M15.947 12.65a4 4 0 0 0-5.925-4.128"/><path d="M13 22H7a5 5 0 1 1 4.9-6H13a3 3 0 0 1 0 6Z"/></svg><span class="odl-pop"></span></span><span class="odl-lo">7°</span><span class="odl-bar" style="--s: 18.2%; --e: 81.8%" aria-hidden="true"><i></i></span><span class="odl-hi">14°</span><span class="odl-sr">partly cloudy, low 7°, high 14°</span></li><li><span class="odl-day">Wed</span><span class="odl-cond"><svg class="odl-ic" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z"/></svg><span class="odl-pop">10%</span></span><span class="odl-lo">8°</span><span class="odl-bar" style="--s: 27.3%; --e: 90.9%" aria-hidden="true"><i></i></span><span class="odl-hi">15°</span><span class="odl-sr">cloudy, 10% chance of rain, low 8°, high 15°</span></li></ol>
</div>
</div>
</section>
A game or challenge leaderboard: a calm podium of the top three with photos and a crown for first, ranked rows with photos and how far each moved up or down, your own row pinned and highlighted, and a this week or all time switch.
A dense table with row checkboxes, status pills and a bar of bulk actions that appears, with a live count, as soon as a row is picked.
One bill waiting for approval: the amount, the policy that applies, who has approved so far, and what the balance will be after paying.