HTML
Copy
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#6a6158] uppercase">Cart page with order summary</span>
<section class="text-[.93rem] leading-[1.45] text-cp-ink" data-cart data-free-over="150" data-ship="6.95" aria-labelledby="cp1-title">
<div class="mb-[18px] flex items-baseline justify-between gap-3"><h2 class="font-[Georgia,'Times_New_Roman',serif] text-[1.9rem] leading-[1.1] font-normal tracking-[-.01em]" id="cp1-title">Your cart</h2><span class="text-[.88rem] text-cp-muted" data-count>4 items</span></div>
<div class="grid grid-cols-[minmax(0,1fr)_300px] items-start gap-6 max-[820px]:grid-cols-1" data-filled>
<div class="rounded-[18px] bg-white shadow-[0_1px_2px_rgba(31,27,23,.05),0_16px_40px_-20px_rgba(31,27,23,.28)] px-[26px] py-2 max-[600px]:px-[18px] max-[600px]:py-1">
<div class="grid grid-cols-[minmax(0,1fr)_128px_84px_36px] gap-4 border-b border-cp-line pt-3.5 pb-3 text-[.72rem] tracking-[.1em] text-cp-muted uppercase max-[600px]:hidden" aria-hidden="true"><span>Product</span><span>Quantity</span><span class="text-right">Total</span></div>
<ul>
<li class="grid grid-cols-[88px_minmax(0,1fr)_128px_84px_36px] [grid-template-areas:'img_info_qty_total_rm'] items-center gap-4 border-b border-cp-line py-[18px] last:border-b-0 max-[600px]:grid-cols-[72px_minmax(0,1fr)_auto] max-[600px]:gap-x-3.5 max-[600px]:gap-y-2 max-[600px]:[grid-template-areas:'img_info_rm'_'img_qty_total']" data-line data-name="Hearth mug" data-price="24.00">
<img class="[grid-area:img] size-[88px] rounded-xl bg-cp-soft object-cover max-[600px]:size-[72px]" src="https://images.unsplash.com/photo-1514228742587-6b1558fcca3d?w=176&h=176&fit=crop&auto=format&q=70" alt="" width="88" height="88">
<div class="[grid-area:info] min-w-0"><h3 class="text-base leading-[1.3] font-semibold"><a class="hover:underline hover:underline-offset-[3px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Hearth mug</a></h3><p class="mt-0.5 text-[.84rem] text-cp-muted">Oat glaze · 350 ml</p><p class="mt-0.5 text-[.84rem] text-cp-muted">$24.00 each</p></div>
<div class="[grid-area:qty]"><label class="mb-1 block text-[.72rem] font-semibold text-cp-muted" for="cp1-q1">Qty<span class="sr-only"> of Hearth mug</span></label>
<div class="inline-flex items-center rounded-full border border-cp-field bg-white focus-within:border-cp-accent focus-within:shadow-[0_0_0_3px_rgba(47,93,70,.3)]"><button class="size-[34px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-dec aria-label="Decrease quantity of Hearth mug"><svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button><input class="h-[34px] w-[38px] appearance-none bg-transparent text-center font-semibold [-moz-appearance:textfield] focus:outline-none [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" id="cp1-q1" type="number" inputmode="numeric" min="1" max="10" value="2" data-qty><button class="size-[34px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-inc aria-label="Increase quantity of Hearth mug"><svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10M7 2v10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div></div>
<p class="[grid-area:total] text-right font-bold tabular-nums max-[600px]:self-end max-[600px]:pb-1.5" data-line-total>$48.00</p>
<button class="[grid-area:rm] grid size-9 cursor-pointer place-items-center rounded-full text-cp-muted hover:bg-[#fbeee9] hover:text-cp-danger focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-remove aria-label="Remove Hearth mug"><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 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3"/></svg></button>
</li>
<li class="grid grid-cols-[88px_minmax(0,1fr)_128px_84px_36px] [grid-template-areas:'img_info_qty_total_rm'] items-center gap-4 border-b border-cp-line py-[18px] last:border-b-0 max-[600px]:grid-cols-[72px_minmax(0,1fr)_auto] max-[600px]:gap-x-3.5 max-[600px]:gap-y-2 max-[600px]:[grid-template-areas:'img_info_rm'_'img_qty_total']" data-line data-name="Nesting cups, set of 4" data-price="38.00">
<img class="[grid-area:img] size-[88px] rounded-xl bg-cp-soft object-cover max-[600px]:size-[72px]" src="https://images.unsplash.com/photo-1610701596007-11502861dcfa?w=176&h=176&fit=crop&auto=format&q=70" alt="" width="88" height="88">
<div class="[grid-area:info] min-w-0"><h3 class="text-base leading-[1.3] font-semibold"><a class="hover:underline hover:underline-offset-[3px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Nesting cups, set of 4</a></h3><p class="mt-0.5 text-[.84rem] text-cp-muted">Speckled clay</p><p class="mt-0.5 text-[.84rem] text-cp-muted">$38.00 each</p></div>
<div class="[grid-area:qty]"><label class="mb-1 block text-[.72rem] font-semibold text-cp-muted" for="cp1-q2">Qty<span class="sr-only"> of Nesting cups, set of 4</span></label>
<div class="inline-flex items-center rounded-full border border-cp-field bg-white focus-within:border-cp-accent focus-within:shadow-[0_0_0_3px_rgba(47,93,70,.3)]"><button class="size-[34px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-dec aria-label="Decrease quantity of Nesting cups, set of 4"><svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button><input class="h-[34px] w-[38px] appearance-none bg-transparent text-center font-semibold [-moz-appearance:textfield] focus:outline-none [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" id="cp1-q2" type="number" inputmode="numeric" min="1" max="10" value="1" data-qty><button class="size-[34px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-inc aria-label="Increase quantity of Nesting cups, set of 4"><svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10M7 2v10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div></div>
<p class="[grid-area:total] text-right font-bold tabular-nums max-[600px]:self-end max-[600px]:pb-1.5" data-line-total>$38.00</p>
<button class="[grid-area:rm] grid size-9 cursor-pointer place-items-center rounded-full text-cp-muted hover:bg-[#fbeee9] hover:text-cp-danger focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-remove aria-label="Remove Nesting cups, set of 4"><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 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3"/></svg></button>
</li>
<li class="grid grid-cols-[88px_minmax(0,1fr)_128px_84px_36px] [grid-template-areas:'img_info_qty_total_rm'] items-center gap-4 border-b border-cp-line py-[18px] last:border-b-0 max-[600px]:grid-cols-[72px_minmax(0,1fr)_auto] max-[600px]:gap-x-3.5 max-[600px]:gap-y-2 max-[600px]:[grid-template-areas:'img_info_rm'_'img_qty_total']" data-line data-name="Bud vase trio" data-price="46.00">
<img class="[grid-area:img] size-[88px] rounded-xl bg-cp-soft object-cover max-[600px]:size-[72px]" src="https://images.unsplash.com/photo-1565193566173-7a0ee3dbe261?w=176&h=176&fit=crop&auto=format&q=70" alt="" width="88" height="88">
<div class="[grid-area:info] min-w-0"><h3 class="text-base leading-[1.3] font-semibold"><a class="hover:underline hover:underline-offset-[3px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Bud vase trio</a></h3><p class="mt-0.5 text-[.84rem] text-cp-muted">Matte stone</p><p class="mt-0.5 text-[.84rem] text-cp-muted">$46.00 each</p></div>
<div class="[grid-area:qty]"><label class="mb-1 block text-[.72rem] font-semibold text-cp-muted" for="cp1-q3">Qty<span class="sr-only"> of Bud vase trio</span></label>
<div class="inline-flex items-center rounded-full border border-cp-field bg-white focus-within:border-cp-accent focus-within:shadow-[0_0_0_3px_rgba(47,93,70,.3)]"><button class="size-[34px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-dec aria-label="Decrease quantity of Bud vase trio"><svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button><input class="h-[34px] w-[38px] appearance-none bg-transparent text-center font-semibold [-moz-appearance:textfield] focus:outline-none [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" id="cp1-q3" type="number" inputmode="numeric" min="1" max="10" value="1" data-qty><button class="size-[34px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-inc aria-label="Increase quantity of Bud vase trio"><svg width="14" height="14" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10M7 2v10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div></div>
<p class="[grid-area:total] text-right font-bold tabular-nums max-[600px]:self-end max-[600px]:pb-1.5" data-line-total>$46.00</p>
<button class="[grid-area:rm] grid size-9 cursor-pointer place-items-center rounded-full text-cp-muted hover:bg-[#fbeee9] hover:text-cp-danger focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-remove aria-label="Remove Bud vase trio"><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 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3"/></svg></button>
</li>
</ul>
</div>
<aside class="rounded-[18px] bg-white shadow-[0_1px_2px_rgba(31,27,23,.05),0_16px_40px_-20px_rgba(31,27,23,.28)] p-6" aria-labelledby="cp1-sum">
<h3 class="mb-3.5 text-[1.05rem] font-bold" id="cp1-sum">Order summary</h3>
<dl class="grid gap-2.5 border-b border-cp-line pb-4">
<div class="flex justify-between gap-3"><dt class="text-cp-muted">Subtotal</dt><dd class="text-right font-semibold tabular-nums" data-subtotal>$132.00</dd></div>
<div class="flex justify-between gap-3"><dt class="text-cp-muted">Shipping</dt><dd class="text-right font-semibold tabular-nums" data-shipping>$6.95</dd></div>
<div class="flex justify-between gap-3"><dt class="text-cp-muted">Tax</dt><dd class="text-right font-semibold">At checkout</dd></div>
</dl>
<dl><div class="flex justify-between gap-3 pt-4 text-[1.12rem]"><dt class="font-bold">Total</dt><dd class="text-right font-extrabold tabular-nums" data-total>$138.95</dd></div></dl>
<p class="mt-2 mb-[18px] text-[.8rem] text-cp-muted">Free shipping on orders of $150.00 or more.</p>
<a class="flex w-full items-center justify-center gap-2 rounded-full bg-cp-accent px-[18px] py-[13px] font-bold text-white no-underline transition-colors duration-150 hover:bg-cp-accent-dark motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Go to checkout<svg width="16" height="16" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 8h10M9 4l4 4-4 4"/></svg></a>
<a class="mt-3 block text-center text-[.88rem] font-semibold text-cp-accent underline underline-offset-[3px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Continue shopping</a>
<p class="mt-4 flex items-center justify-center gap-2 text-[.78rem] text-cp-muted"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l8 3v6c0 4.5-3.4 8-8 9-4.6-1-8-4.5-8-9V6z"/></svg>30-day returns on unused items</p>
</aside>
</div>
<div class="rounded-[18px] bg-white shadow-[0_1px_2px_rgba(31,27,23,.05),0_16px_40px_-20px_rgba(31,27,23,.28)] px-[26px] pt-10 pb-[34px] text-center" data-empty hidden>
<div class="mx-auto mb-[18px] grid size-[76px] place-items-center rounded-full bg-cp-soft text-cp-accent"><svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 8h14l-1.2 11.1a2 2 0 0 1-2 1.9H8.2a2 2 0 0 1-2-1.9z"/><path d="M9 8V6a3 3 0 0 1 6 0v2"/></svg></div>
<h3 class="font-[Georgia,'Times_New_Roman',serif] text-[1.45rem] font-normal mb-1.5 focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" tabindex="-1">Your cart is empty</h3>
<p class="mx-auto mb-5 max-w-[30ch] text-cp-muted">Everything you add will wait here until you are ready to check out.</p>
<div class="mx-auto grid max-w-[260px] gap-2.5"><a class="flex w-full items-center justify-center gap-2 rounded-full bg-cp-accent px-[18px] py-[13px] font-bold text-white no-underline transition-colors duration-150 hover:bg-cp-accent-dark motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Shop new arrivals</a></div>
</div>
<p class="sr-only" role="status" data-announce></p>
</section>
</div>
<div class="grid grid-cols-[repeat(auto-fit,minmax(300px,1fr))] items-start gap-[34px]">
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#6a6158] uppercase">Compact cart</span>
<section class="rounded-[18px] bg-white shadow-[0_1px_2px_rgba(31,27,23,.05),0_16px_40px_-20px_rgba(31,27,23,.28)] p-[22px] text-[.93rem] leading-[1.45] text-cp-ink" data-cart data-free-over="50" data-ship="5.00" aria-labelledby="cp2-title">
<div class="mb-1.5 flex items-baseline justify-between gap-3"><h2 class="font-[Georgia,'Times_New_Roman',serif] text-[1.4rem] leading-[1.1] font-normal tracking-[-.01em]" id="cp2-title">Your cart</h2><span class="text-[.88rem] text-cp-muted" data-count>3 items</span></div>
<div data-filled>
<ul>
<li class="grid grid-cols-[64px_minmax(0,1fr)_auto] [grid-template-areas:'img_info_total'_'img_qty_rm'] gap-x-3.5 gap-y-1.5 border-b border-cp-line py-4 last:border-b-0" data-line data-name="Haworthia, mint pot" data-price="22.00">
<img class="[grid-area:img] size-16 rounded-[10px] bg-cp-soft object-cover" src="https://images.unsplash.com/photo-1485955900006-10f4d324d411?w=128&h=128&fit=crop&auto=format&q=70" alt="" width="64" height="64">
<div class="[grid-area:info] min-w-0"><h3 class="text-base leading-[1.3] font-semibold"><a class="hover:underline hover:underline-offset-[3px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Haworthia, mint pot</a></h3><p class="mt-0.5 text-[.84rem] text-cp-muted">12 cm pot · $22.00 each</p></div>
<p class="[grid-area:total] self-start text-right font-bold tabular-nums" data-line-total>$22.00</p>
<div class="[grid-area:qty] flex items-center gap-2"><label class="block text-[.72rem] font-semibold text-cp-muted" for="cp2-q1">Qty<span class="sr-only"> of Haworthia, mint pot</span></label>
<div class="inline-flex items-center rounded-full border border-cp-field bg-white focus-within:border-cp-accent focus-within:shadow-[0_0_0_3px_rgba(47,93,70,.3)]"><button class="size-[30px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-dec aria-label="Decrease quantity of Haworthia, mint pot"><svg width="12" height="12" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button><input class="h-[30px] w-8 appearance-none bg-transparent text-center font-semibold [-moz-appearance:textfield] focus:outline-none [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" id="cp2-q1" type="number" inputmode="numeric" min="1" max="10" value="1" data-qty><button class="size-[30px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-inc aria-label="Increase quantity of Haworthia, mint pot"><svg width="12" height="12" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10M7 2v10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div></div>
<button class="[grid-area:rm] justify-self-end grid size-9 cursor-pointer place-items-center rounded-full text-cp-muted hover:bg-[#fbeee9] hover:text-cp-danger focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-remove aria-label="Remove Haworthia, mint pot"><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 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3"/></svg></button>
</li>
<li class="grid grid-cols-[64px_minmax(0,1fr)_auto] [grid-template-areas:'img_info_total'_'img_qty_rm'] gap-x-3.5 gap-y-1.5 border-b border-cp-line py-4 last:border-b-0" data-line data-name="Barrel cactus, terracotta" data-price="16.00">
<img class="[grid-area:img] size-16 rounded-[10px] bg-cp-soft object-cover" src="https://images.unsplash.com/photo-1459411552884-841db9b3cc2a?w=128&h=128&fit=crop&auto=format&q=70" alt="" width="64" height="64">
<div class="[grid-area:info] min-w-0"><h3 class="text-base leading-[1.3] font-semibold"><a class="hover:underline hover:underline-offset-[3px] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Barrel cactus, terracotta</a></h3><p class="mt-0.5 text-[.84rem] text-cp-muted">9 cm pot · $16.00 each</p></div>
<p class="[grid-area:total] self-start text-right font-bold tabular-nums" data-line-total>$32.00</p>
<div class="[grid-area:qty] flex items-center gap-2"><label class="block text-[.72rem] font-semibold text-cp-muted" for="cp2-q2">Qty<span class="sr-only"> of Barrel cactus, terracotta</span></label>
<div class="inline-flex items-center rounded-full border border-cp-field bg-white focus-within:border-cp-accent focus-within:shadow-[0_0_0_3px_rgba(47,93,70,.3)]"><button class="size-[30px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-dec aria-label="Decrease quantity of Barrel cactus, terracotta"><svg width="12" height="12" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button><input class="h-[30px] w-8 appearance-none bg-transparent text-center font-semibold [-moz-appearance:textfield] focus:outline-none [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" id="cp2-q2" type="number" inputmode="numeric" min="1" max="10" value="2" data-qty><button class="size-[30px] grid cursor-pointer place-items-center rounded-full text-cp-ink hover:bg-cp-soft aria-disabled:cursor-not-allowed aria-disabled:text-[#a69d93] aria-disabled:hover:bg-transparent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-inc aria-label="Increase quantity of Barrel cactus, terracotta"><svg width="12" height="12" viewBox="0 0 14 14" aria-hidden="true"><path d="M2 7h10M7 2v10" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></button></div></div>
<button class="[grid-area:rm] justify-self-end grid size-9 cursor-pointer place-items-center rounded-full text-cp-muted hover:bg-[#fbeee9] hover:text-cp-danger focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" type="button" data-remove aria-label="Remove Barrel cactus, terracotta"><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 7h16M10 11v6M14 11v6M6 7l1 12a2 2 0 0 0 2 2h6a2 2 0 0 0 2-2l1-12M9 7V4h6v3"/></svg></button>
</li>
</ul>
<dl class="mt-0.5 grid gap-2.5 border-y border-cp-line pt-3.5 pb-4">
<div class="flex justify-between gap-3"><dt class="text-cp-muted">Subtotal</dt><dd class="text-right font-semibold tabular-nums" data-subtotal>$54.00</dd></div>
<div class="flex justify-between gap-3"><dt class="text-cp-muted">Shipping <small>(free over $50.00)</small></dt><dd class="text-right font-semibold tabular-nums" data-shipping>Free</dd></div>
</dl>
<dl><div class="flex justify-between gap-3 pt-4 text-[1.12rem]"><dt class="font-bold">Total</dt><dd class="text-right font-extrabold tabular-nums" data-total>$54.00</dd></div></dl>
<a class="mt-4 flex w-full items-center justify-center gap-2 rounded-full bg-cp-accent px-[18px] py-[13px] font-bold text-white no-underline transition-colors duration-150 hover:bg-cp-accent-dark motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Checkout</a>
</div>
<div class="px-[26px] pt-10 pb-[34px] text-center" data-empty hidden>
<div class="mx-auto mb-[18px] grid size-[76px] place-items-center rounded-full bg-cp-soft text-cp-accent"><svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 8h14l-1.2 11.1a2 2 0 0 1-2 1.9H8.2a2 2 0 0 1-2-1.9z"/><path d="M9 8V6a3 3 0 0 1 6 0v2"/></svg></div>
<h3 class="font-[Georgia,'Times_New_Roman',serif] text-[1.45rem] font-normal mb-1.5 focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" tabindex="-1">Your cart is empty</h3>
<p class="mx-auto mb-5 max-w-[30ch] text-cp-muted">Your plants are still on the shelf, ready when you are.</p>
<div class="mx-auto grid max-w-[260px] gap-2.5"><a class="flex w-full items-center justify-center gap-2 rounded-full bg-cp-accent px-[18px] py-[13px] font-bold text-white no-underline transition-colors duration-150 hover:bg-cp-accent-dark motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Browse plants</a></div>
</div>
<p class="sr-only" role="status" data-announce></p>
</section>
</div>
<div><span class="mb-4 block text-[.72rem] tracking-[.12em] text-[#6a6158] uppercase">Empty cart</span>
<section class="rounded-[18px] bg-white shadow-[0_1px_2px_rgba(31,27,23,.05),0_16px_40px_-20px_rgba(31,27,23,.28)] px-[26px] pt-10 pb-[34px] text-center text-[.93rem] leading-[1.45] text-cp-ink" aria-labelledby="cp3-title">
<div class="mx-auto mb-[18px] grid size-[76px] place-items-center rounded-full bg-cp-soft text-cp-accent"><svg width="34" height="34" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 8h14l-1.2 11.1a2 2 0 0 1-2 1.9H8.2a2 2 0 0 1-2-1.9z"/><path d="M9 8V6a3 3 0 0 1 6 0v2"/></svg></div>
<h2 class="font-[Georgia,'Times_New_Roman',serif] text-[1.45rem] font-normal mb-1.5 focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" id="cp3-title">Your cart is empty</h2>
<p class="mx-auto mb-5 max-w-[30ch] text-cp-muted">Looks like you have not added anything yet. Our spring glazes are back in stock.</p>
<div class="mx-auto grid max-w-[260px] gap-2.5"><a class="flex w-full items-center justify-center gap-2 rounded-full bg-cp-accent px-[18px] py-[13px] font-bold text-white no-underline transition-colors duration-150 hover:bg-cp-accent-dark motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">Shop new arrivals</a><a class="flex w-full items-center justify-center rounded-full border border-cp-accent px-[18px] py-3 font-bold text-cp-accent hover:bg-cp-soft focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-cp-accent" href="#">View saved items (2)</a></div>
</section>
</div>
</div>
JavaScript
Copy
// Cart: quantity steppers, remove buttons and totals for every [data-cart] on the page. Prices come from
// data-price on each [data-line] and are summed in cents. Shipping is data-ship unless the subtotal reaches
// data-free-over. Changes are announced through the cart's polite [data-announce] region.
document.querySelectorAll('[data-cart]').forEach(function (cart) {
var money = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' });
var cents = function (v) { return Math.round(parseFloat(v) * 100); };
var freeOver = cart.dataset.freeOver ? cents(cart.dataset.freeOver) : Infinity;
var fee = cents(cart.dataset.ship || 0);
var status = cart.querySelector('[data-announce]');
function put(sel, text) { cart.querySelectorAll(sel).forEach(function (el) { el.textContent = text; }); }
function render() {
var sub = 0, count = 0;
cart.querySelectorAll('[data-line]').forEach(function (line) {
var input = line.querySelector('[data-qty]'), min = +input.min || 1, max = +input.max || 99;
var qty = Math.min(max, Math.max(min, parseInt(input.value, 10) || min));
var total = cents(line.dataset.price) * qty;
input.value = qty; sub += total; count += qty;
line.querySelector('[data-line-total]').textContent = money.format(total / 100);
line.querySelector('[data-dec]').setAttribute('aria-disabled', qty <= min);
line.querySelector('[data-inc]').setAttribute('aria-disabled', qty >= max);
});
var ship = sub === 0 || sub >= freeOver ? 0 : fee;
put('[data-subtotal]', money.format(sub / 100));
put('[data-shipping]', ship ? money.format(ship / 100) : 'Free');
put('[data-total]', money.format((sub + ship) / 100));
put('[data-count]', count + (count === 1 ? ' item' : ' items'));
cart.querySelectorAll('[data-filled]').forEach(function (el) { el.hidden = !count; });
cart.querySelectorAll('[data-empty]').forEach(function (el) { el.hidden = !!count; });
return { sub: sub, count: count };
}
function announce(text) { if (status) status.textContent = text; }
cart.addEventListener('click', function (e) {
var btn = e.target.closest('[data-inc],[data-dec],[data-remove]');
if (!btn) return;
var line = btn.closest('[data-line]'), name = line.dataset.name, input = line.querySelector('[data-qty]');
if (btn.hasAttribute('data-remove')) {
var next = line.nextElementSibling || line.previousElementSibling;
line.remove();
var r = render();
announce('Removed ' + name + '. ' + (r.count ? 'Subtotal ' + money.format(r.sub / 100) + '.' : 'Your cart is empty.'));
var target = r.count ? next.querySelector('[data-remove]') : cart.querySelector('[data-empty] [tabindex="-1"]');
if (target) target.focus();
return;
}
if (btn.getAttribute('aria-disabled') === 'true') return;
input.value = (parseInt(input.value, 10) || 1) + (btn.hasAttribute('data-inc') ? 1 : -1);
var s = render();
announce(name + ', quantity ' + input.value + '. Subtotal ' + money.format(s.sub / 100) + '.');
});
cart.addEventListener('change', function (e) {
if (!e.target.matches('[data-qty]')) return;
var s = render();
announce(e.target.closest('[data-line]').dataset.name + ', quantity ' + e.target.value + '. Subtotal ' + money.format(s.sub / 100) + '.');
});
render();
});