Files
music_library/backlog/ml-143/mockups.html
T
2026-05-04 21:22:27 +01:00

1080 lines
43 KiB
HTML

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Add Record — Cart UI Mockups</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = { darkMode: "class" };
</script>
<style>
body {
font-family:
ui-sans-serif,
system-ui,
-apple-system,
sans-serif;
}
.mockup-frame {
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.18);
}
/* simple ring to mimic modal shell */
.modal-shell {
border: 1px solid rgb(228 228 231 / 1);
}
.dark .modal-shell {
border-color: rgb(63 63 70 / 1);
}
/* hero-plus like icon via unicode placeholders; SVGs inline below */
</style>
</head>
<body class="bg-zinc-100 dark:bg-zinc-950 text-zinc-900 dark:text-zinc-100">
<div class="mx-auto max-w-6xl px-6 py-10">
<div class="flex items-center justify-between mb-10">
<div>
<h1 class="text-2xl font-semibold">Add Record — Cart UI Mockups</h1>
<p class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">
Three directions for a multi-record import flow. Static HTML, not
wired up.
</p>
</div>
<button
onclick="document.documentElement.classList.toggle('dark')"
class="rounded-md border border-zinc-300 dark:border-zinc-700 px-3 py-1.5 text-sm hover:bg-zinc-200 dark:hover:bg-zinc-800"
>
Toggle dark
</button>
</div>
<!-- =========================================================== -->
<!-- MOCKUP A — Side-by-side panel -->
<!-- =========================================================== -->
<section class="mb-16">
<div class="mb-4">
<h2 class="text-lg font-semibold">A — Side-by-side panel</h2>
<p class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">
Cart lives as a right column inside the existing import modal.
Everything on one screen. Strongest when the user is actively
curating a batch.
</p>
</div>
<div
class="mockup-frame modal-shell rounded-2xl overflow-hidden bg-white dark:bg-zinc-900"
>
<!-- modal header -->
<div
class="flex items-center justify-between px-6 py-4 border-b border-zinc-200 dark:border-zinc-800"
>
<div>
<h3 class="text-base font-semibold">
Import records into your collection
</h3>
<p class="text-xs text-zinc-500 dark:text-zinc-400 mt-0.5">
Search MusicBrainz, add records to the cart, then import them
all at once.
</p>
</div>
<button
class="rounded-md p-1.5 hover:bg-zinc-100 dark:hover:bg-zinc-800"
aria-label="Close"
>
<svg
class="size-5 text-zinc-500"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
<!-- modal body -->
<div class="grid grid-cols-5">
<!-- search column -->
<div
class="col-span-3 p-6 border-r border-zinc-200 dark:border-zinc-800"
>
<label
class="block text-xs font-medium text-zinc-500 dark:text-zinc-400 mb-1"
for="mb_query"
>
Search for a record
</label>
<div class="relative">
<input
id="mb_query"
value="steven wilson"
class="block w-full rounded-lg border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-950 py-2 pl-3 pr-10 text-sm focus:border-zinc-900 dark:focus:border-zinc-100 focus:outline-none"
/>
<svg
class="absolute right-3 top-2.5 size-4 text-zinc-400"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M21 21l-4.35-4.35M10.5 18a7.5 7.5 0 100-15 7.5 7.5 0 000 15z"
/>
</svg>
</div>
<ul
role="list"
class="mt-5 divide-y divide-zinc-100 dark:divide-slate-300/30 max-h-[22rem] overflow-y-auto pr-1"
>
<!-- result row (in cart) -->
<li
class="flex items-center gap-4 py-4 bg-emerald-50/40 dark:bg-emerald-500/5 rounded-md px-2"
>
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/38ad9108-8f7b-4d0e-8efe-6015f3c3c921/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p
class="truncate text-xs text-zinc-500 dark:text-zinc-400"
>
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">
The Harmony Codex
</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2023 · Album
</p>
</div>
<span
class="inline-flex items-center gap-1 rounded-full bg-emerald-100 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 text-xs font-medium px-2 py-0.5"
>
<svg
class="size-3"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="3"
d="M5 13l4 4L19 7"
/>
</svg>
In cart · CD
</span>
</li>
<!-- result row with format dropdown -->
<li
class="flex items-center gap-4 py-4 px-2 hover:bg-zinc-50 dark:hover:bg-zinc-800/50 rounded-md"
>
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/b6cf90a6-5ca4-45c5-92f9-3c729e81ee95/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p
class="truncate text-xs text-zinc-500 dark:text-zinc-400"
>
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">
Hand. Cannot. Erase.
</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2015 · Album
</p>
</div>
<div class="flex items-center gap-1">
<select
class="rounded-md border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-950 text-xs px-2 py-1"
>
<option>CD</option>
<option>Vinyl</option>
<option>Cassette</option>
<option>Digital</option>
</select>
<button
class="rounded-md border border-zinc-300 dark:border-zinc-700 hover:bg-zinc-100 dark:hover:bg-zinc-800 p-1.5"
title="Add to cart"
>
<svg
class="size-4"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 4v16m8-8H4"
/>
</svg>
</button>
</div>
</li>
<!-- result row (in cart, vinyl) -->
<li
class="flex items-center gap-4 py-4 bg-emerald-50/40 dark:bg-emerald-500/5 rounded-md px-2"
>
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/3f57e8fe-4b39-4f50-a1eb-5d7b0dc8a4a2/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p
class="truncate text-xs text-zinc-500 dark:text-zinc-400"
>
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">
The Raven That Refused to Sing
</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2013 · Album
</p>
</div>
<span
class="inline-flex items-center gap-1 rounded-full bg-emerald-100 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 text-xs font-medium px-2 py-0.5"
>
<svg
class="size-3"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="3"
d="M5 13l4 4L19 7"
/>
</svg>
In cart · Vinyl
</span>
</li>
<li
class="flex items-center gap-4 py-4 px-2 hover:bg-zinc-50 dark:hover:bg-zinc-800/50 rounded-md"
>
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/5a8ab40e-8ccb-4d46-9d1e-7b9f60b76fa2/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p
class="truncate text-xs text-zinc-500 dark:text-zinc-400"
>
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">To The Bone</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2017 · Album
</p>
</div>
<div class="flex items-center gap-1">
<select
class="rounded-md border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-950 text-xs px-2 py-1"
>
<option>CD</option>
<option selected>Vinyl</option>
<option>Cassette</option>
<option>Digital</option>
</select>
<button
class="rounded-md border border-zinc-300 dark:border-zinc-700 hover:bg-zinc-100 dark:hover:bg-zinc-800 p-1.5"
>
<svg
class="size-4"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 4v16m8-8H4"
/>
</svg>
</button>
</div>
</li>
</ul>
<p class="mt-3 text-xs text-zinc-500 dark:text-zinc-400">
Showing 4 of 38 results · scroll to load more
</p>
</div>
<!-- cart column -->
<aside
class="col-span-2 bg-zinc-50 dark:bg-zinc-900/60 flex flex-col"
>
<div
class="px-5 py-4 border-b border-zinc-200 dark:border-zinc-800 flex items-center justify-between"
>
<div>
<p class="text-sm font-semibold">Import cart</p>
<p class="text-xs text-zinc-500 dark:text-zinc-400">
2 records ready to import
</p>
</div>
<button
class="text-xs text-zinc-500 hover:text-zinc-900 dark:hover:text-zinc-100"
>
Clear all
</button>
</div>
<ul
class="flex-1 overflow-y-auto divide-y divide-zinc-200 dark:divide-zinc-800"
>
<li class="flex gap-3 px-5 py-3">
<img
class="w-12 h-12 rounded-md object-cover"
src="https://coverartarchive.org/release-group/38ad9108-8f7b-4d0e-8efe-6015f3c3c921/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p
class="truncate text-xs text-zinc-500 dark:text-zinc-400"
>
Steven Wilson
</p>
<p class="truncate text-sm font-medium">
The Harmony Codex
</p>
<div class="mt-1 flex items-center gap-2">
<select
class="rounded-md border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-950 text-xs px-1.5 py-0.5"
>
<option selected>CD</option>
<option>Vinyl</option>
<option>Cassette</option>
<option>Digital</option>
</select>
<button
class="text-xs text-zinc-500 hover:text-red-600 dark:hover:text-red-400"
>
Remove
</button>
</div>
</div>
</li>
<li class="flex gap-3 px-5 py-3">
<img
class="w-12 h-12 rounded-md object-cover"
src="https://coverartarchive.org/release-group/3f57e8fe-4b39-4f50-a1eb-5d7b0dc8a4a2/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p
class="truncate text-xs text-zinc-500 dark:text-zinc-400"
>
Steven Wilson
</p>
<p class="truncate text-sm font-medium">
The Raven That Refused to Sing
</p>
<div class="mt-1 flex items-center gap-2">
<select
class="rounded-md border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-950 text-xs px-1.5 py-0.5"
>
<option>CD</option>
<option selected>Vinyl</option>
<option>Cassette</option>
<option>Digital</option>
</select>
<button
class="text-xs text-zinc-500 hover:text-red-600 dark:hover:text-red-400"
>
Remove
</button>
</div>
</div>
</li>
</ul>
<div
class="border-t border-zinc-200 dark:border-zinc-800 px-5 py-4 space-y-2"
>
<button
class="w-full rounded-lg bg-zinc-900 dark:bg-zinc-100 text-white dark:text-zinc-900 text-sm font-semibold py-2 hover:opacity-90"
>
Import 2 records
</button>
<p
class="text-[11px] text-zinc-500 dark:text-zinc-400 text-center"
>
Each import runs as a background job, same pipeline as barcode
scan batches.
</p>
</div>
</aside>
</div>
</div>
</section>
<!-- =========================================================== -->
<!-- MOCKUP B — Bottom tray -->
<!-- =========================================================== -->
<section class="mb-16">
<div class="mb-4">
<h2 class="text-lg font-semibold">B — Bottom tray</h2>
<p class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">
Search keeps the full width (closest to today's layout). Cart is a
collapsible tray pinned to the bottom. Shown here expanded —
collapsed state is a slim bar with a count.
</p>
</div>
<div
class="mockup-frame modal-shell rounded-2xl overflow-hidden bg-white dark:bg-zinc-900"
>
<div
class="flex items-center justify-between px-6 py-4 border-b border-zinc-200 dark:border-zinc-800"
>
<h3 class="text-base font-semibold">
Import records into your collection
</h3>
<button
class="rounded-md p-1.5 hover:bg-zinc-100 dark:hover:bg-zinc-800"
aria-label="Close"
>
<svg
class="size-5 text-zinc-500"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
<div class="p-6">
<label
class="block text-xs font-medium text-zinc-500 dark:text-zinc-400 mb-1"
>Search for a record</label
>
<input
value="steven wilson"
class="block w-full rounded-lg border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-950 py-2 px-3 text-sm"
/>
<ul
role="list"
class="mt-5 divide-y divide-zinc-100 dark:divide-slate-300/30 max-h-[20rem] overflow-y-auto"
>
<li
class="flex items-center gap-4 py-4 px-2 bg-emerald-50/40 dark:bg-emerald-500/5 rounded-md"
>
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/38ad9108-8f7b-4d0e-8efe-6015f3c3c921/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-xs text-zinc-500 dark:text-zinc-400">
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">
The Harmony Codex
</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2023 · Album
</p>
</div>
<span
class="inline-flex items-center gap-1 rounded-full bg-emerald-100 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 text-xs font-medium px-2 py-0.5"
>
In cart · CD
</span>
</li>
<li
class="flex items-center gap-4 py-4 px-2 hover:bg-zinc-50 dark:hover:bg-zinc-800/50 rounded-md"
>
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/b6cf90a6-5ca4-45c5-92f9-3c729e81ee95/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-xs text-zinc-500 dark:text-zinc-400">
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">
Hand. Cannot. Erase.
</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2015 · Album
</p>
</div>
<div class="flex items-center gap-1">
<select
class="rounded-md border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-950 text-xs px-2 py-1"
>
<option>CD</option>
<option>Vinyl</option>
<option>Cassette</option>
<option>Digital</option>
</select>
<button
class="rounded-md border border-zinc-300 dark:border-zinc-700 hover:bg-zinc-100 dark:hover:bg-zinc-800 p-1.5"
>
<svg
class="size-4"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 4v16m8-8H4"
/>
</svg>
</button>
</div>
</li>
<li
class="flex items-center gap-4 py-4 px-2 bg-emerald-50/40 dark:bg-emerald-500/5 rounded-md"
>
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/3f57e8fe-4b39-4f50-a1eb-5d7b0dc8a4a2/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-xs text-zinc-500 dark:text-zinc-400">
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">
The Raven That Refused to Sing
</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2013 · Album
</p>
</div>
<span
class="inline-flex items-center gap-1 rounded-full bg-emerald-100 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 text-xs font-medium px-2 py-0.5"
>
In cart · Vinyl
</span>
</li>
</ul>
</div>
<!-- expanded tray -->
<div
class="border-t border-zinc-200 dark:border-zinc-800 bg-zinc-50 dark:bg-zinc-900/60"
>
<div class="px-6 py-3 flex items-center justify-between">
<div class="flex items-center gap-2">
<svg
class="size-4 text-zinc-500"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z"
/>
</svg>
<p class="text-sm font-semibold">Cart</p>
<span class="text-xs text-zinc-500 dark:text-zinc-400"
>2 records</span
>
</div>
<div class="flex items-center gap-2">
<button
class="text-xs text-zinc-500 hover:text-zinc-900 dark:hover:text-zinc-100"
>
Clear
</button>
<button
class="rounded-lg bg-zinc-900 dark:bg-zinc-100 text-white dark:text-zinc-900 text-sm font-semibold px-4 py-1.5 hover:opacity-90"
>
Import 2 records
</button>
<button
class="rounded-md p-1 hover:bg-zinc-200 dark:hover:bg-zinc-800"
title="Collapse"
>
<svg
class="size-4 text-zinc-500"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M19 9l-7 7-7-7"
/>
</svg>
</button>
</div>
</div>
<div class="px-6 pb-4">
<ul class="flex gap-3 overflow-x-auto pb-1">
<li
class="flex-none w-56 rounded-lg bg-white dark:bg-zinc-950 border border-zinc-200 dark:border-zinc-800 p-2 flex gap-2"
>
<img
class="w-10 h-10 rounded-md object-cover"
src="https://coverartarchive.org/release-group/38ad9108-8f7b-4d0e-8efe-6015f3c3c921/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-[11px] text-zinc-500">
Steven Wilson
</p>
<p class="truncate text-xs font-medium">
The Harmony Codex
</p>
<div class="mt-1 flex items-center gap-1.5">
<span
class="text-[10px] rounded bg-zinc-200 dark:bg-zinc-800 px-1.5 py-0.5"
>CD</span
>
<button
class="text-[11px] text-zinc-500 hover:text-red-600 dark:hover:text-red-400"
>
Remove
</button>
</div>
</div>
</li>
<li
class="flex-none w-56 rounded-lg bg-white dark:bg-zinc-950 border border-zinc-200 dark:border-zinc-800 p-2 flex gap-2"
>
<img
class="w-10 h-10 rounded-md object-cover"
src="https://coverartarchive.org/release-group/3f57e8fe-4b39-4f50-a1eb-5d7b0dc8a4a2/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-[11px] text-zinc-500">
Steven Wilson
</p>
<p class="truncate text-xs font-medium">
The Raven That Refused to Sing
</p>
<div class="mt-1 flex items-center gap-1.5">
<span
class="text-[10px] rounded bg-zinc-200 dark:bg-zinc-800 px-1.5 py-0.5"
>Vinyl</span
>
<button
class="text-[11px] text-zinc-500 hover:text-red-600 dark:hover:text-red-400"
>
Remove
</button>
</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<!-- collapsed state -->
<p
class="mt-4 mb-2 text-xs uppercase tracking-wide text-zinc-500 dark:text-zinc-400"
>
Collapsed tray state
</p>
<div
class="mockup-frame modal-shell rounded-2xl overflow-hidden bg-white dark:bg-zinc-900"
>
<div class="px-6 py-8 text-center text-zinc-400 text-sm">
(search area)
</div>
<div
class="border-t border-zinc-200 dark:border-zinc-800 bg-zinc-50 dark:bg-zinc-900/60 px-6 py-3 flex items-center justify-between"
>
<div class="flex items-center gap-2">
<svg
class="size-4 text-zinc-500"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17"
/>
</svg>
<p class="text-sm font-semibold">Cart</p>
<span class="text-xs text-zinc-500 dark:text-zinc-400"
>2 records</span
>
</div>
<div class="flex items-center gap-2">
<button
class="rounded-lg bg-zinc-900 dark:bg-zinc-100 text-white dark:text-zinc-900 text-sm font-semibold px-4 py-1.5 hover:opacity-90"
>
Import 2
</button>
<button
class="rounded-md p-1 hover:bg-zinc-200 dark:hover:bg-zinc-800"
title="Expand"
>
<svg
class="size-4 text-zinc-500"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M5 15l7-7 7 7"
/>
</svg>
</button>
</div>
</div>
</div>
</section>
<!-- =========================================================== -->
<!-- MOCKUP C — Inline state + floating cart popover -->
<!-- =========================================================== -->
<section class="mb-16">
<div class="mb-4">
<h2 class="text-lg font-semibold">
C — Inline state + floating cart
</h2>
<p class="text-sm text-zinc-500 dark:text-zinc-400 mt-1">
Smallest footprint: results list looks almost like today, added
items flip to an "In cart" chip. A floating badge in the corner
opens a popover with the cart and import button.
</p>
</div>
<div
class="mockup-frame modal-shell rounded-2xl overflow-hidden bg-white dark:bg-zinc-900 relative"
>
<div
class="flex items-center justify-between px-6 py-4 border-b border-zinc-200 dark:border-zinc-800"
>
<h3 class="text-base font-semibold">
Import records into your collection
</h3>
<button
class="rounded-md p-1.5 hover:bg-zinc-100 dark:hover:bg-zinc-800"
aria-label="Close"
>
<svg
class="size-5 text-zinc-500"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M6 18L18 6M6 6l12 12"
/>
</svg>
</button>
</div>
<div class="p-6">
<label
class="block text-xs font-medium text-zinc-500 dark:text-zinc-400 mb-1"
>Search for a record</label
>
<input
value="steven wilson"
class="block w-full rounded-lg border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-950 py-2 px-3 text-sm"
/>
<ul
role="list"
class="mt-5 divide-y divide-zinc-100 dark:divide-slate-300/30 max-h-[22rem] overflow-y-auto"
>
<li class="flex items-center gap-4 py-4 px-2">
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/38ad9108-8f7b-4d0e-8efe-6015f3c3c921/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-xs text-zinc-500 dark:text-zinc-400">
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">
The Harmony Codex
</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2023 · Album
</p>
</div>
<span
class="inline-flex items-center gap-1 rounded-full bg-emerald-100 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 text-xs font-medium px-2 py-0.5"
>
<svg
class="size-3"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="3"
d="M5 13l4 4L19 7"
/>
</svg>
In cart · CD
</span>
</li>
<li class="flex items-center gap-4 py-4 px-2">
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/b6cf90a6-5ca4-45c5-92f9-3c729e81ee95/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-xs text-zinc-500 dark:text-zinc-400">
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">
Hand. Cannot. Erase.
</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2015 · Album
</p>
</div>
<button
class="inline-flex items-center gap-1 rounded-md border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-950 text-xs px-2 py-1 hover:bg-zinc-50 dark:hover:bg-zinc-800"
>
<svg
class="size-3.5"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 4v16m8-8H4"
/>
</svg>
Add…
</button>
</li>
<li class="flex items-center gap-4 py-4 px-2">
<img
class="w-16 h-16 rounded-lg object-cover"
src="https://coverartarchive.org/release-group/3f57e8fe-4b39-4f50-a1eb-5d7b0dc8a4a2/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-xs text-zinc-500 dark:text-zinc-400">
Steven Wilson
</p>
<p class="truncate text-sm font-semibold">
The Raven That Refused to Sing
</p>
<p class="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
2013 · Album
</p>
</div>
<span
class="inline-flex items-center gap-1 rounded-full bg-emerald-100 dark:bg-emerald-500/10 text-emerald-700 dark:text-emerald-300 text-xs font-medium px-2 py-0.5"
>
<svg
class="size-3"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="3"
d="M5 13l4 4L19 7"
/>
</svg>
In cart · Vinyl
</span>
</li>
</ul>
</div>
<!-- floating cart popover, shown open -->
<div
class="absolute right-6 bottom-6 w-80 rounded-xl bg-white dark:bg-zinc-950 border border-zinc-200 dark:border-zinc-800 shadow-xl"
>
<div
class="px-4 py-3 border-b border-zinc-200 dark:border-zinc-800 flex items-center justify-between"
>
<p class="text-sm font-semibold">Cart (2)</p>
<button
class="text-xs text-zinc-500 hover:text-zinc-900 dark:hover:text-zinc-100"
>
Clear
</button>
</div>
<ul
class="divide-y divide-zinc-200 dark:divide-zinc-800 max-h-56 overflow-y-auto"
>
<li class="flex gap-3 px-4 py-3">
<img
class="w-10 h-10 rounded-md object-cover"
src="https://coverartarchive.org/release-group/38ad9108-8f7b-4d0e-8efe-6015f3c3c921/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-[11px] text-zinc-500">
Steven Wilson
</p>
<p class="truncate text-xs font-medium">The Harmony Codex</p>
<div class="flex items-center gap-2 mt-0.5">
<span
class="text-[10px] rounded bg-zinc-200 dark:bg-zinc-800 px-1.5 py-0.5"
>CD</span
>
<button
class="text-[11px] text-zinc-500 hover:text-red-600 dark:hover:text-red-400"
>
Remove
</button>
</div>
</div>
</li>
<li class="flex gap-3 px-4 py-3">
<img
class="w-10 h-10 rounded-md object-cover"
src="https://coverartarchive.org/release-group/3f57e8fe-4b39-4f50-a1eb-5d7b0dc8a4a2/front-250.jpg"
alt=""
/>
<div class="min-w-0 flex-1">
<p class="truncate text-[11px] text-zinc-500">
Steven Wilson
</p>
<p class="truncate text-xs font-medium">
The Raven That Refused to Sing
</p>
<div class="flex items-center gap-2 mt-0.5">
<span
class="text-[10px] rounded bg-zinc-200 dark:bg-zinc-800 px-1.5 py-0.5"
>Vinyl</span
>
<button
class="text-[11px] text-zinc-500 hover:text-red-600 dark:hover:text-red-400"
>
Remove
</button>
</div>
</div>
</li>
</ul>
<div class="p-3 border-t border-zinc-200 dark:border-zinc-800">
<button
class="w-full rounded-lg bg-zinc-900 dark:bg-zinc-100 text-white dark:text-zinc-900 text-sm font-semibold py-2 hover:opacity-90"
>
Import 2 records
</button>
</div>
</div>
</div>
<p
class="mt-4 mb-2 text-xs uppercase tracking-wide text-zinc-500 dark:text-zinc-400"
>
Floating trigger (popover closed)
</p>
<div
class="mockup-frame modal-shell rounded-2xl overflow-hidden bg-white dark:bg-zinc-900 relative"
>
<div class="px-6 py-8 text-center text-zinc-400 text-sm">
(search + results)
</div>
<button
class="absolute right-6 bottom-6 inline-flex items-center gap-2 rounded-full bg-zinc-900 dark:bg-zinc-100 text-white dark:text-zinc-900 text-sm font-semibold pl-3 pr-2 py-2 shadow-xl hover:opacity-90"
>
<svg
class="size-4"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17"
/>
</svg>
Cart
<span
class="inline-flex items-center justify-center rounded-full bg-emerald-500 text-white text-xs font-bold w-5 h-5"
>2</span
>
</button>
</div>
</section>
<section class="text-sm text-zinc-600 dark:text-zinc-400 leading-relaxed">
<h2 class="text-lg font-semibold text-zinc-900 dark:text-zinc-100 mb-2">
Quick tradeoffs
</h2>
<ul class="list-disc pl-5 space-y-1">
<li>
<strong>A (side-by-side)</strong>: best discoverability and clearest
mental model, but modal needs to grow (cart column steals width from
search). Cramped on narrower viewports.
</li>
<li>
<strong>B (bottom tray)</strong>: closest to the current layout.
Cheap to build on top of today's component. Tray is always reachable
but eats vertical room when expanded.
</li>
<li>
<strong>C (inline + floating)</strong>: smallest visual change; cart
hidden behind a badge click. Adds a click between "I want to import"
and the import button, but list view feels unchanged.
</li>
</ul>
</section>
</div>
</body>
</html>