HTML
Copy
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#665a4c] uppercase">Checkout with :has(), :user-invalid and a sticky summary</span>
<div class="group/mo @container text-[.93rem] leading-[1.45] text-mo-ink">
<div class="grid items-start gap-6 @min-[760px]:grid-cols-[minmax(0,1fr)_330px]">
<form class="group/form rounded-[20px] border border-mo-line bg-mo-card p-[26px] max-[420px]:px-4 max-[420px]:py-5" method="dialog" aria-labelledby="mo-title">
<h2 class="mb-1 font-[Georgia,'Times_New_Roman',serif] text-[1.5rem] leading-[1.2] font-normal" id="mo-title">Where to?</h2>
<p class="mb-5 text-mo-muted">Every piece is packed by hand in recycled paper. All fields are required.</p>
<div class="grid grid-cols-2 gap-4">
<div class="group/f col-span-2"><label class="mb-1.5 flex justify-between text-[.84rem] font-semibold" for="mo-email">Email<span class="hidden text-mo-ok group-has-[:user-valid]/f:block" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg></span></label><input class="peer block w-full rounded-xl border border-mo-field bg-white px-[13px] py-[11px] transition-[border-color,box-shadow] duration-150 focus:border-mo-accent focus:shadow-[0_0_0_3px_rgba(156,66,33,.25)] focus:outline-none user-valid:border-mo-ok user-invalid:border-mo-error user-invalid:bg-[#fff8f7] user-invalid:focus:shadow-[0_0_0_3px_rgba(180,35,24,.2)] motion-reduce:transition-none" id="mo-email" name="email" type="email" autocomplete="email" required aria-describedby="mo-email-hint"><p class="mt-[5px] text-[.78rem] text-mo-muted peer-user-invalid:text-mo-error [&>b]:hidden [&>b]:font-semibold peer-user-invalid:[&>b]:inline peer-user-invalid:[&>span]:hidden" id="mo-email-hint"><span>For your receipt.</span><b>Enter an email address like [email protected] .</b></p></div>
<div class="group/f col-span-2"><label class="mb-1.5 flex justify-between text-[.84rem] font-semibold" for="mo-name">Full name<span class="hidden text-mo-ok group-has-[:user-valid]/f:block" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg></span></label><input class="peer block w-full rounded-xl border border-mo-field bg-white px-[13px] py-[11px] transition-[border-color,box-shadow] duration-150 focus:border-mo-accent focus:shadow-[0_0_0_3px_rgba(156,66,33,.25)] focus:outline-none user-valid:border-mo-ok user-invalid:border-mo-error user-invalid:bg-[#fff8f7] user-invalid:focus:shadow-[0_0_0_3px_rgba(180,35,24,.2)] motion-reduce:transition-none" id="mo-name" name="name" type="text" autocomplete="shipping name" required aria-describedby="mo-name-hint"><p class="mt-[5px] text-[.78rem] text-mo-muted peer-user-invalid:text-mo-error [&>b]:hidden [&>b]:font-semibold peer-user-invalid:[&>b]:inline peer-user-invalid:[&>span]:hidden" id="mo-name-hint"><span>As it should appear on the parcel.</span><b>Enter your full name.</b></p></div>
<div class="group/f col-span-2"><label class="mb-1.5 flex justify-between text-[.84rem] font-semibold" for="mo-address">Street address<span class="hidden text-mo-ok group-has-[:user-valid]/f:block" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg></span></label><input class="peer block w-full rounded-xl border border-mo-field bg-white px-[13px] py-[11px] transition-[border-color,box-shadow] duration-150 focus:border-mo-accent focus:shadow-[0_0_0_3px_rgba(156,66,33,.25)] focus:outline-none user-valid:border-mo-ok user-invalid:border-mo-error user-invalid:bg-[#fff8f7] user-invalid:focus:shadow-[0_0_0_3px_rgba(180,35,24,.2)] motion-reduce:transition-none" id="mo-address" name="address" type="text" autocomplete="shipping address-line1" required aria-describedby="mo-address-hint"><p class="mt-[5px] text-[.78rem] text-mo-muted peer-user-invalid:text-mo-error [&>b]:hidden [&>b]:font-semibold peer-user-invalid:[&>b]:inline peer-user-invalid:[&>span]:hidden" id="mo-address-hint"><span>House number and street.</span><b>Enter your street address.</b></p></div>
<div class="group/f col-span-1 max-[420px]:col-span-2"><label class="mb-1.5 flex justify-between text-[.84rem] font-semibold" for="mo-city">City<span class="hidden text-mo-ok group-has-[:user-valid]/f:block" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg></span></label><input class="peer block w-full rounded-xl border border-mo-field bg-white px-[13px] py-[11px] transition-[border-color,box-shadow] duration-150 focus:border-mo-accent focus:shadow-[0_0_0_3px_rgba(156,66,33,.25)] focus:outline-none user-valid:border-mo-ok user-invalid:border-mo-error user-invalid:bg-[#fff8f7] user-invalid:focus:shadow-[0_0_0_3px_rgba(180,35,24,.2)] motion-reduce:transition-none" id="mo-city" name="city" type="text" autocomplete="shipping address-level2" required aria-describedby="mo-city-hint"><p class="mt-[5px] text-[.78rem] text-mo-muted peer-user-invalid:text-mo-error [&>b]:hidden [&>b]:font-semibold peer-user-invalid:[&>b]:inline peer-user-invalid:[&>span]:hidden" id="mo-city-hint"><span>Town or city.</span><b>Enter your city.</b></p></div>
<div class="group/f col-span-1 max-[420px]:col-span-2"><label class="mb-1.5 flex justify-between text-[.84rem] font-semibold" for="mo-zip">ZIP code<span class="hidden text-mo-ok group-has-[:user-valid]/f:block" aria-hidden="true"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg></span></label><input class="peer block w-full rounded-xl border border-mo-field bg-white px-[13px] py-[11px] transition-[border-color,box-shadow] duration-150 focus:border-mo-accent focus:shadow-[0_0_0_3px_rgba(156,66,33,.25)] focus:outline-none user-valid:border-mo-ok user-invalid:border-mo-error user-invalid:bg-[#fff8f7] user-invalid:focus:shadow-[0_0_0_3px_rgba(180,35,24,.2)] motion-reduce:transition-none" id="mo-zip" name="zip" type="text" autocomplete="shipping postal-code" inputmode="numeric" pattern="[0-9]{5}" required aria-describedby="mo-zip-hint"><p class="mt-[5px] text-[.78rem] text-mo-muted peer-user-invalid:text-mo-error [&>b]:hidden [&>b]:font-semibold peer-user-invalid:[&>b]:inline peer-user-invalid:[&>span]:hidden" id="mo-zip-hint"><span>5 digits, like 87501.</span><b>Enter a 5-digit ZIP code, like 87501.</b></p></div>
</div>
<fieldset class="mt-[22px] min-w-0"><legend class="float-left mb-2.5 w-full font-bold">Delivery</legend>
<div class="clear-left grid gap-2.5 @min-[560px]:grid-cols-3">
<label class="relative grid cursor-pointer gap-0.5 rounded-[14px] border border-mo-field bg-white py-3.5 pr-3.5 pl-11 transition-colors duration-150 hover:border-mo-ink has-checked:border-mo-accent has-checked:bg-mo-soft has-checked:shadow-[inset_0_0_0_1px_var(--color-mo-accent)] motion-reduce:transition-none"><input class="absolute top-[15px] left-3.5 size-[18px] cursor-pointer accent-mo-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mo-accent" type="radio" id="mo-std" name="delivery" value="std" checked><strong class="font-semibold">Standard</strong><span class="text-[.8rem] text-mo-muted">4 to 6 business days</span><b class="mt-1 tabular-nums">$6.00</b></label>
<label class="relative grid cursor-pointer gap-0.5 rounded-[14px] border border-mo-field bg-white py-3.5 pr-3.5 pl-11 transition-colors duration-150 hover:border-mo-ink has-checked:border-mo-accent has-checked:bg-mo-soft has-checked:shadow-[inset_0_0_0_1px_var(--color-mo-accent)] motion-reduce:transition-none"><input class="absolute top-[15px] left-3.5 size-[18px] cursor-pointer accent-mo-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mo-accent" type="radio" id="mo-exp" name="delivery" value="exp"><strong class="font-semibold">Express</strong><span class="text-[.8rem] text-mo-muted">2 business days</span><b class="mt-1 tabular-nums">$15.00</b></label>
<label class="relative grid cursor-pointer gap-0.5 rounded-[14px] border border-mo-field bg-white py-3.5 pr-3.5 pl-11 transition-colors duration-150 hover:border-mo-ink has-checked:border-mo-accent has-checked:bg-mo-soft has-checked:shadow-[inset_0_0_0_1px_var(--color-mo-accent)] motion-reduce:transition-none"><input class="absolute top-[15px] left-3.5 size-[18px] cursor-pointer accent-mo-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mo-accent" type="radio" id="mo-pick" name="delivery" value="pick"><strong class="font-semibold">Collect from the studio</strong><span class="text-[.8rem] text-mo-muted">Ready Thursday · 9 Kiln Yard</span><b class="mt-1 tabular-nums">Free</b></label>
</div>
</fieldset>
<label class="mt-5 flex cursor-pointer items-center gap-2.5 rounded-xl bg-mo-soft px-3.5 py-3 [&>svg]:text-mo-accent"><input class="size-[18px] cursor-pointer accent-mo-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mo-accent" type="checkbox" id="mo-gift" name="gift"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 11h16v10H4zM3 7h18v4H3zM12 7v14M12 7c-2-4-6-3-5 0M12 7c2-4 6-3 5 0"/></svg><span>This is a gift: wrap it and add a note (free)</span></label>
<div class="mt-3 hidden group-has-[#mo-gift:checked]/mo:block group-has-[#mo-gift:checked]/mo:animate-[mo-in_.25s_ease-out] motion-reduce:animate-none"><label class="mb-1.5 flex justify-between text-[.84rem] font-semibold" for="mo-message">Gift note (optional)</label><textarea class="peer block w-full rounded-xl border border-mo-field bg-white px-[13px] py-[11px] transition-[border-color,box-shadow] duration-150 focus:border-mo-accent focus:shadow-[0_0_0_3px_rgba(156,66,33,.25)] focus:outline-none user-valid:border-mo-ok user-invalid:border-mo-error user-invalid:bg-[#fff8f7] user-invalid:focus:shadow-[0_0_0_3px_rgba(180,35,24,.2)] motion-reduce:transition-none min-h-[84px] resize-y" id="mo-message" name="message" maxlength="200" aria-describedby="mo-message-hint"></textarea><p class="mt-[5px] text-[.78rem] text-mo-muted" id="mo-message-hint">Up to 200 characters, handwritten on a card.</p></div>
<div class="mt-6 flex flex-wrap items-center gap-x-4 gap-y-3"><button class="cursor-pointer rounded-full border-[1.5px] border-mo-accent bg-mo-accent px-[22px] py-[13px] font-bold text-white transition-colors duration-200 hover:bg-mo-accent-dark group-invalid/form:border-dashed group-invalid/form:bg-white group-invalid/form:text-mo-accent group-invalid/form:hover:bg-mo-soft motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-mo-accent" type="submit">Continue to payment</button><p class="text-[.84rem] text-mo-muted"><span class="group-valid/form:hidden">Fill in every field to continue.</span><span class="hidden font-semibold text-mo-ok group-valid/form:inline">All set.</span></p></div>
</form>
<aside class="sticky top-4 @container/sum rounded-[20px] border border-mo-line bg-mo-card p-[22px] max-[420px]:px-4 max-[420px]:py-5" aria-labelledby="mo-sum-title">
<div class="grid gap-1 @min-[520px]/sum:grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)] @min-[520px]/sum:gap-x-7 @min-[520px]/sum:gap-y-0">
<h2 class="mb-1.5 text-[1.05rem] font-bold @min-[520px]/sum:col-span-full" id="mo-sum-title">Order summary</h2>
<ul class="grid gap-3 border-b border-mo-line pb-3.5 @min-[520px]/sum:grid-cols-3 @min-[520px]/sum:content-start @min-[520px]/sum:border-0 @min-[520px]/sum:pb-0">
<li class="grid grid-cols-[52px_minmax(0,1fr)_auto] items-center gap-3 @min-[520px]/sum:grid-cols-1 @min-[520px]/sum:gap-1.5"><img class="size-[52px] rounded-xl bg-mo-soft object-cover @min-[520px]/sum:aspect-square @min-[520px]/sum:h-auto @min-[520px]/sum:w-full" src="https://images.unsplash.com/photo-1612196808214-b8e1d6145a8c?w=240&h=240&fit=crop&auto=format&q=70" alt="" width="52" height="52"><div><p class="text-[.88rem] leading-[1.3] font-semibold">Moon vase</p><p class="text-[.78rem] text-mo-muted">Chalk glaze · 24 cm</p></div><p class="font-semibold tabular-nums">$58.00</p></li>
<li class="grid grid-cols-[52px_minmax(0,1fr)_auto] items-center gap-3 @min-[520px]/sum:grid-cols-1 @min-[520px]/sum:gap-1.5"><img class="size-[52px] rounded-xl bg-mo-soft object-cover @min-[520px]/sum:aspect-square @min-[520px]/sum:h-auto @min-[520px]/sum:w-full" src="https://images.unsplash.com/photo-1578749556568-bc2c40e68b61?w=240&h=240&fit=crop&auto=format&q=70" alt="" width="52" height="52"><div><p class="text-[.88rem] leading-[1.3] font-semibold">Tide side plates, set of 4</p><p class="text-[.78rem] text-mo-muted">Blue slip</p></div><p class="font-semibold tabular-nums">$64.00</p></li>
<li class="grid grid-cols-[52px_minmax(0,1fr)_auto] items-center gap-3 @min-[520px]/sum:grid-cols-1 @min-[520px]/sum:gap-1.5"><img class="size-[52px] rounded-xl bg-mo-soft object-cover @min-[520px]/sum:aspect-square @min-[520px]/sum:h-auto @min-[520px]/sum:w-full" src="https://images.unsplash.com/photo-1600166898405-da9535204843?w=240&h=240&fit=crop&auto=format&q=70" alt="" width="52" height="52"><div><p class="text-[.88rem] leading-[1.3] font-semibold">Handwoven flat rug</p><p class="text-[.78rem] text-mo-muted">Sand · 160 × 230 cm</p></div><p class="font-semibold tabular-nums">$240.00</p></li>
</ul>
<div>
<dl class="grid gap-2 border-b border-mo-line py-3.5 @min-[520px]/sum:pt-0">
<div class="flex justify-between gap-3"><dt class="text-mo-muted">Subtotal</dt><dd class="font-semibold tabular-nums">$362.00</dd></div>
<div class="flex justify-between gap-3"><dt class="text-mo-muted">Shipping</dt><dd class="font-semibold tabular-nums"><span class="inline group-has-[#mo-exp:checked]/mo:hidden group-has-[#mo-pick:checked]/mo:hidden">$6.00</span><span class="hidden group-has-[#mo-exp:checked]/mo:inline">$15.00</span><span class="hidden group-has-[#mo-pick:checked]/mo:inline">Free</span></dd></div>
</dl>
<dl class="flex items-baseline justify-between pt-3.5 font-bold"><dt>Total</dt><dd class="text-[1.35rem] font-extrabold tabular-nums"><span class="inline group-has-[#mo-exp:checked]/mo:hidden group-has-[#mo-pick:checked]/mo:hidden">$368.00</span><span class="hidden group-has-[#mo-exp:checked]/mo:inline">$377.00</span><span class="hidden group-has-[#mo-pick:checked]/mo:inline">$362.00</span></dd></dl>
</div>
</div>
</aside>
</div>
</div>
</div>
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#665a4c] uppercase">The same summary in a wide slot (container query)</span>
<div class="group/mo @container text-[.93rem] leading-[1.45] text-mo-ink">
<aside class="sticky top-4 @container/sum rounded-[20px] border border-mo-line bg-mo-card p-[22px] max-[420px]:px-4 max-[420px]:py-5" aria-labelledby="mo-sum2-title">
<div class="grid gap-1 @min-[520px]/sum:grid-cols-[minmax(0,1.5fr)_minmax(0,1fr)] @min-[520px]/sum:gap-x-7 @min-[520px]/sum:gap-y-0">
<h2 class="mb-1.5 text-[1.05rem] font-bold @min-[520px]/sum:col-span-full" id="mo-sum2-title">Order summary</h2>
<ul class="grid gap-3 border-b border-mo-line pb-3.5 @min-[520px]/sum:grid-cols-3 @min-[520px]/sum:content-start @min-[520px]/sum:border-0 @min-[520px]/sum:pb-0">
<li class="grid grid-cols-[52px_minmax(0,1fr)_auto] items-center gap-3 @min-[520px]/sum:grid-cols-1 @min-[520px]/sum:gap-1.5"><img class="size-[52px] rounded-xl bg-mo-soft object-cover @min-[520px]/sum:aspect-square @min-[520px]/sum:h-auto @min-[520px]/sum:w-full" src="https://images.unsplash.com/photo-1612196808214-b8e1d6145a8c?w=240&h=240&fit=crop&auto=format&q=70" alt="" width="52" height="52"><div><p class="text-[.88rem] leading-[1.3] font-semibold">Moon vase</p><p class="text-[.78rem] text-mo-muted">Chalk glaze · 24 cm</p></div><p class="font-semibold tabular-nums">$58.00</p></li>
<li class="grid grid-cols-[52px_minmax(0,1fr)_auto] items-center gap-3 @min-[520px]/sum:grid-cols-1 @min-[520px]/sum:gap-1.5"><img class="size-[52px] rounded-xl bg-mo-soft object-cover @min-[520px]/sum:aspect-square @min-[520px]/sum:h-auto @min-[520px]/sum:w-full" src="https://images.unsplash.com/photo-1578749556568-bc2c40e68b61?w=240&h=240&fit=crop&auto=format&q=70" alt="" width="52" height="52"><div><p class="text-[.88rem] leading-[1.3] font-semibold">Tide side plates, set of 4</p><p class="text-[.78rem] text-mo-muted">Blue slip</p></div><p class="font-semibold tabular-nums">$64.00</p></li>
<li class="grid grid-cols-[52px_minmax(0,1fr)_auto] items-center gap-3 @min-[520px]/sum:grid-cols-1 @min-[520px]/sum:gap-1.5"><img class="size-[52px] rounded-xl bg-mo-soft object-cover @min-[520px]/sum:aspect-square @min-[520px]/sum:h-auto @min-[520px]/sum:w-full" src="https://images.unsplash.com/photo-1600166898405-da9535204843?w=240&h=240&fit=crop&auto=format&q=70" alt="" width="52" height="52"><div><p class="text-[.88rem] leading-[1.3] font-semibold">Handwoven flat rug</p><p class="text-[.78rem] text-mo-muted">Sand · 160 × 230 cm</p></div><p class="font-semibold tabular-nums">$240.00</p></li>
</ul>
<div>
<dl class="grid gap-2 border-b border-mo-line py-3.5 @min-[520px]/sum:pt-0">
<div class="flex justify-between gap-3"><dt class="text-mo-muted">Subtotal</dt><dd class="font-semibold tabular-nums">$362.00</dd></div>
<div class="flex justify-between gap-3"><dt class="text-mo-muted">Shipping</dt><dd class="font-semibold tabular-nums"><span class="inline group-has-[#mo-exp:checked]/mo:hidden group-has-[#mo-pick:checked]/mo:hidden">$6.00</span><span class="hidden group-has-[#mo-exp:checked]/mo:inline">$15.00</span><span class="hidden group-has-[#mo-pick:checked]/mo:inline">Free</span></dd></div>
</dl>
<dl class="flex items-baseline justify-between pt-3.5 font-bold"><dt>Total</dt><dd class="text-[1.35rem] font-extrabold tabular-nums"><span class="inline group-has-[#mo-exp:checked]/mo:hidden group-has-[#mo-pick:checked]/mo:hidden">$368.00</span><span class="hidden group-has-[#mo-exp:checked]/mo:inline">$377.00</span><span class="hidden group-has-[#mo-pick:checked]/mo:inline">$362.00</span></dd></dl>
</div>
</div>
</aside>
</div>
</div>