Maintenance page
A planned-downtime page that says what is paused.
Loading stays
2 guests · 1 bed
$148 night
4 guests · 2 beds
$212 night
2 guests · 1 bed
$119 night
Live preview: try it.
<style>
.odl-skeleton-card { box-sizing: border-box; inline-size: 100%; max-inline-size: 60rem; margin-inline: auto; container-type: inline-size; font: var(--ds-text-body-md); color: var(--ds-color-text-primary); text-wrap: pretty; }
.odl-skeleton-card *, .odl-skeleton-card *::before, .odl-skeleton-card *::after { box-sizing: border-box; }
.odl-skeleton-card svg { flex: none; inline-size: var(--ds-size-icon-sm); block-size: var(--ds-size-icon-sm); fill: none; stroke: currentColor; stroke-width: var(--ds-icon-stroke-md); }
.odl-skeleton-card h2, .odl-skeleton-card h3, .odl-skeleton-card p, .odl-skeleton-card ul, .odl-skeleton-card ol, .odl-skeleton-card dl, .odl-skeleton-card dd { margin: 0; }
.odl-skeleton-card h2, .odl-skeleton-card h3 { text-wrap: balance; }
.odl-skeleton-card .odl-btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--ds-space-inline-sm); min-block-size: max(var(--ds-size-control-md), var(--ds-size-target-min)); padding: 0 var(--ds-space-inset-md);
border: var(--ds-border-width-default) solid transparent; border-radius: var(--ds-radius-control); background: var(--ds-color-bg-action-primary); color: var(--ds-color-text-on-action);
font: var(--ds-text-label-lg); font-weight: var(--ds-font-weight-label); text-decoration: none; white-space: nowrap; cursor: pointer; transition: background-color var(--ds-motion-duration-short) var(--ds-motion-easing-standard); }
.odl-skeleton-card .odl-btn:hover { background: var(--ds-color-bg-action-primary-hover); }
.odl-skeleton-card .odl-btn:active { background: var(--ds-color-bg-action-primary-pressed); }
.odl-skeleton-card .odl-btn.is-quiet { border-color: var(--ds-color-border-default); background: var(--ds-color-surface-raised); color: var(--ds-color-text-primary); }
.odl-skeleton-card .odl-btn.is-quiet:hover { background: var(--ds-color-bg-neutral-subtle); }
.odl-skeleton-card .odl-btn.is-text { padding-inline: var(--ds-space-inset-sm); background: transparent; color: var(--ds-color-text-link); }
.odl-skeleton-card .odl-btn.is-text:hover { background: var(--ds-color-bg-neutral-subtle); }
.odl-skeleton-card .odl-btn[disabled], .odl-skeleton-card .odl-btn[aria-disabled="true"] { opacity: var(--ds-opacity-disabled-container); cursor: not-allowed; }
.odl-skeleton-card button:focus-visible, .odl-skeleton-card a:focus-visible, .odl-skeleton-card input:focus-visible, .odl-skeleton-card textarea:focus-visible, .odl-skeleton-card [tabindex]:focus-visible { outline: var(--ds-focus-ring-width) solid var(--ds-color-border-focus); outline-offset: var(--ds-focus-ring-offset); }
.odl-skeleton-card .odl-sr { position: absolute; inline-size: 1px; block-size: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.odl-skeleton-card .odl-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--ds-space-inline-sm); margin-block-end: var(--ds-space-stack-md); }
.odl-skeleton-card .odl-bar h2 { font: var(--ds-text-title-md); font-weight: var(--ds-font-weight-heading); }
.odl-skeleton-card .odl-demo { min-block-size: max(var(--ds-size-control-sm), var(--ds-size-target-min)); }
.odl-skeleton-card .odl-one { display: block; white-space: nowrap; }
.odl-skeleton-card .odl-one > .odl-t { display: inline-block; max-inline-size: 100%; overflow: hidden; text-overflow: ellipsis; vertical-align: top; }
.odl-skeleton-card [aria-busy="true"] .odl-t { color: transparent; border-radius: var(--ds-state-skeleton-radius, var(--ds-radius-detail)); box-decoration-break: clone; -webkit-box-decoration-break: clone; }
.odl-skeleton-card [aria-busy="true"] .odl-t, .odl-skeleton-card [aria-busy="true"] .odl-pic, .odl-skeleton-card [aria-busy="true"] .odl-ctl.odl-ctl {
background: linear-gradient(90deg, var(--ds-state-skeleton-base, var(--ds-color-bg-neutral-subtle)) 30%, var(--ds-state-skeleton-highlight, var(--ds-color-surface-raised)) 50%, var(--ds-state-skeleton-base, var(--ds-color-bg-neutral-subtle)) 70%) 0 0 / 300% 100%;
animation: odl-sweep var(--ds-state-skeleton-pulse, calc(var(--ds-motion-duration-extra) * 2.5)) var(--ds-motion-easing-linear) infinite; }
.odl-skeleton-card [aria-busy="true"] .odl-pic > *, .odl-skeleton-card [aria-busy="true"] .odl-ctl > * { visibility: hidden; }
.odl-skeleton-card [aria-busy="true"] .odl-ctl.odl-ctl { border-color: transparent; color: transparent; }
@keyframes odl-sweep { from { background-position: 100% 0; } to { background-position: 0 0; } }
.odl-skeleton-card .odl-body { display: grid; grid-template-columns: repeat(auto-fit, minmax(13rem, 1fr)); gap: var(--ds-space-stack-lg) var(--ds-space-inline-md); padding: 0; list-style: none; }
.odl-skeleton-card .odl-c { display: grid; gap: var(--ds-space-stack-xs); min-inline-size: 0; }
.odl-skeleton-card .odl-pic { display: block; aspect-ratio: 4 / 3; margin-block-end: var(--ds-space-stack-xs); overflow: hidden; border-radius: var(--ds-radius-container); background: var(--ds-color-surface-sunken); }
.odl-skeleton-card .odl-pic img { display: block; inline-size: 100%; block-size: 100%; object-fit: cover; }
.odl-skeleton-card .odl-c h3 { font: var(--ds-text-title-sm); font-weight: var(--ds-font-weight-heading); }
.odl-skeleton-card .odl-sub { color: var(--ds-color-text-secondary); font: var(--ds-text-body-sm); }
.odl-skeleton-card .odl-price { font: var(--ds-text-label-lg); font-weight: var(--ds-font-weight-label); font-variant-numeric: tabular-nums; }
@media (prefers-reduced-motion: reduce) { .odl-skeleton-card, .odl-skeleton-card *, .odl-skeleton-card *::before, .odl-skeleton-card *::after { transition: none !important; animation: none !important; } }
</style>
<section class="odl-skeleton-card" aria-label="Stays">
<div class="odl-bar"><h2>Stays this weekend</h2><button type="button" class="odl-btn is-quiet odl-demo" data-odl-demo>Show loaded</button></div><p class="odl-live odl-sr" role="status" data-odl-busy="Loading stays" data-odl-done="3 stays loaded">Loading stays</p>
<ul class="odl-body" aria-busy="true" data-od-list="items"><li class="odl-c" data-od-item><span class="odl-pic"><img src="https://images.unsplash.com/photo-1618773928121-c32242e63f39?w=640&h=480&fit=crop&auto=format&q=70" alt="Hotel bed with white linen and pillows" width="320" height="240" loading="lazy" decoding="async" data-od-media="photo"></span><h3 class="odl-one"><span class="odl-t" data-od-slot="name">Linen room, Old Town</span></h3><p class="odl-one odl-sub"><span class="odl-t" data-od-slot="detail">2 guests · 1 bed</span></p><p class="odl-one odl-price"><span class="odl-t" data-od-slot="price">$148 night</span></p></li><li class="odl-c" data-od-item><span class="odl-pic"><img src="https://images.unsplash.com/photo-1611892440504-42a792e24d32?w=640&h=480&fit=crop&auto=format&q=70" alt="Hotel bedroom with a wooden bed and garden view" width="320" height="240" loading="lazy" decoding="async" data-od-media="photo"></span><h3 class="odl-one"><span class="odl-t" data-od-slot="name">Garden suite, Harbourside</span></h3><p class="odl-one odl-sub"><span class="odl-t" data-od-slot="detail">4 guests · 2 beds</span></p><p class="odl-one odl-price"><span class="odl-t" data-od-slot="price">$212 night</span></p></li><li class="odl-c" data-od-item><span class="odl-pic"><img src="https://images.unsplash.com/photo-1566665797739-1674de7a421a?w=640&h=480&fit=crop&auto=format&q=70" alt="Bedroom with a blue headboard" width="320" height="240" loading="lazy" decoding="async" data-od-media="photo"></span><h3 class="odl-one"><span class="odl-t" data-od-slot="name">Blue room, Riverside</span></h3><p class="odl-one odl-sub"><span class="odl-t" data-od-slot="detail">2 guests · 1 bed</span></p><p class="odl-one odl-price"><span class="odl-t" data-od-slot="price">$119 night</span></p></li></ul>
</section>
<script>
document.querySelectorAll(".odl-skeleton-card").forEach(function (root) {
if (root.hasAttribute("data-odl-wired")) return;
root.setAttribute("data-odl-wired", "");
var body = root.querySelector(".odl-body"), live = root.querySelector(".odl-live"), demo = root.querySelector("[data-odl-demo]");
function set(busy) {
body.setAttribute("aria-busy", busy ? "true" : "false");
body.toggleAttribute("inert", busy);
live.textContent = busy ? live.getAttribute("data-odl-busy") : live.getAttribute("data-odl-done");
if (demo) demo.textContent = busy ? "Show loaded" : "Show loading";
}
if (demo) demo.addEventListener("click", function () { set(body.getAttribute("aria-busy") !== "true"); });
set(body.getAttribute("aria-busy") === "true");
});
</script>
A planned-downtime page that says what is paused.
A 403 page that says who owns the page and lets the person ask for access with an.
What a person sees with no connection.