Files
pinkudex/mockups/detail-meta-mockups.html
2026-05-26 22:46:00 +02:00

310 lines
17 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Detail Page Metadata Strip — Mockups</title>
<script src="https://cdn.tailwindcss.com"></script>
<style>
:root {
--color-bg-0: oklch(0.16 0.02 280);
--color-bg-1: oklch(0.20 0.03 280);
--color-fg: oklch(0.96 0.01 280);
--color-fg-dim: oklch(0.78 0.02 280);
--color-fg-muted: oklch(0.55 0.02 280);
--color-glass: oklch(0.27 0.04 280 / 0.45);
--color-glass-strong: oklch(0.30 0.05 280 / 0.65);
--color-glass-border: oklch(0.40 0.05 280 / 0.30);
--color-glass-border-strong: oklch(0.50 0.06 280 / 0.45);
--color-cyan: oklch(0.82 0.16 200);
--color-violet: oklch(0.72 0.18 305);
--color-coral: oklch(0.74 0.18 25);
--color-mint: oklch(0.82 0.14 165);
--color-amber: oklch(0.84 0.14 80);
}
body {
background: var(--color-bg-0);
color: var(--color-fg);
font-family: ui-sans-serif, system-ui, -apple-system, sans-serif;
}
.frame {
background: oklch(0.18 0.025 280);
border: 1px solid var(--color-glass-border);
border-radius: 1rem;
padding: 1rem 1.25rem;
}
.header {
font-family: ui-monospace, "JetBrains Mono", monospace;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--color-cyan);
margin-bottom: 0.4rem;
}
.why {
font-size: 11px;
color: var(--color-fg-muted);
margin-top: 0.25rem;
font-style: italic;
}
.label-mono {
font-family: ui-monospace, "JetBrains Mono", monospace;
font-size: 10px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--color-fg-muted);
}
.val-mono {
font-family: ui-monospace, "JetBrains Mono", monospace;
color: var(--color-fg);
font-weight: 600;
}
.glass {
background: var(--color-glass);
border: 1px solid var(--color-glass-border);
}
.glass-strong {
background: var(--color-glass-strong);
border: 1px solid var(--color-glass-border-strong);
}
.pill {
display: inline-flex;
align-items: center;
gap: 0.25rem;
padding: 0.15rem 0.55rem;
border-radius: 999px;
font-size: 10px;
font-family: ui-monospace, monospace;
text-transform: uppercase;
letter-spacing: 0.08em;
}
.divider-v {
width: 1px;
align-self: stretch;
background: var(--color-glass-border);
}
.row-current {
/* The current production look the user dislikes — for reference at top. */
font-family: ui-monospace, monospace;
font-size: 13px;
color: var(--color-fg-muted);
}
</style>
</head>
<body class="p-6 space-y-6">
<header class="space-y-1 mb-2">
<h1 class="text-2xl font-semibold tracking-tight">Detail Metadata Strip — 8 Variants</h1>
<p class="text-sm text-[var(--color-fg-muted)]">Replaces the two-row "RESOLUTION / SIZE / IMPORTED" + "VIDEO (N PARTS) ..." block at <code class="text-[var(--color-cyan)]">localhost:3001/id/YUJ-001</code>. All variants render the same data: cover (800×538, 170 KB, imported 4/29/2026) and video (1920×1080, H.264, 5.7 Mbps, 4.90 GB, 1:56:55, 2 parts).</p>
</header>
<!-- =========================================================
Reference: current production
========================================================= -->
<section class="frame max-w-[820px]">
<div class="header text-[var(--color-fg-muted)]">Current — for comparison</div>
<div class="space-y-1">
<div class="row-current flex flex-wrap items-baseline gap-x-4">
<span class="inline-flex items-baseline gap-1.5"><span class="text-[10px] uppercase tracking-wider opacity-70">RESOLUTION</span><span class="text-[var(--color-fg)] font-bold">800×538</span></span>
<span class="opacity-40">·</span>
<span class="inline-flex items-baseline gap-1.5"><span class="text-[10px] uppercase tracking-wider opacity-70">SIZE</span><span class="text-[var(--color-fg)] font-bold">170 KB</span></span>
<span class="opacity-40">·</span>
<span class="inline-flex items-baseline gap-1.5"><span class="text-[10px] uppercase tracking-wider opacity-70">IMPORTED</span><span class="text-[var(--color-fg)] font-bold">4/29/2026</span></span>
</div>
<div class="row-current">
<span class="inline-flex items-baseline gap-1.5"><span class="text-[10px] uppercase tracking-wider opacity-70">VIDEO (2 PARTS)</span><span class="text-[var(--color-fg)] font-bold">1920×1080 · H.264 · 5.7 Mbps · 4.90 GB · 1:56:55</span></span>
</div>
</div>
</section>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-4">
<!-- 1. Icon-prefixed two rows ----------------------------- -->
<section class="frame">
<div class="header">1 · Iconified rows</div>
<p class="why">Replace the all-caps "RESOLUTION / SIZE / IMPORTED" labels with a single leading icon. Same two-row shape, but the row tells you what it is at a glance.</p>
<div class="space-y-1.5 mt-3 font-mono text-[13px]">
<div class="flex items-center gap-3 text-[var(--color-fg-dim)]">
<svg class="w-3.5 h-3.5 shrink-0 text-[var(--color-fg-muted)]" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>
<span class="text-[var(--color-fg)] font-semibold">800×538</span>
<span class="opacity-40">·</span>
<span>170 KB</span>
<span class="opacity-40">·</span>
<span>imported 4/29/2026</span>
</div>
<div class="flex items-center gap-3 text-[var(--color-fg-dim)]">
<svg class="w-3.5 h-3.5 shrink-0 text-[var(--color-cyan)]" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="2" width="20" height="20" rx="2.18" ry="2.18"/><line x1="7" y1="2" x2="7" y2="22"/><line x1="17" y1="2" x2="17" y2="22"/><line x1="2" y1="12" x2="22" y2="12"/><line x1="2" y1="7" x2="7" y2="7"/><line x1="2" y1="17" x2="7" y2="17"/><line x1="17" y1="17" x2="22" y2="17"/><line x1="17" y1="7" x2="22" y2="7"/></svg>
<span class="text-[var(--color-fg)] font-semibold">1920×1080</span>
<span class="opacity-40">·</span>
<span>H.264</span>
<span class="opacity-40">·</span>
<span>5.7 Mbps</span>
<span class="opacity-40">·</span>
<span>4.90 GB</span>
<span class="opacity-40">·</span>
<span>1:56:55</span>
<span class="ml-2 pill" style="background: oklch(0.30 0.04 280); color: var(--color-cyan); border: 1px solid oklch(0.50 0.10 200 / 0.3);">2 parts</span>
</div>
</div>
</section>
<!-- 2. Single line, vertical divider ---------------------- -->
<section class="frame">
<div class="header">2 · Single line, divided</div>
<p class="why">Both rows fold into one. Cover stats sit muted on the left; video gets the cyan accent color it earns by being the actual content. Vertical rule between them makes it scan as two columns of one line.</p>
<div class="mt-3 flex items-center gap-3 font-mono text-[13px]">
<span class="text-[var(--color-fg-muted)]">800×538 · 170 KB</span>
<span class="divider-v" style="height: 1.2rem;"></span>
<span class="text-[var(--color-fg)] font-semibold">1920×1080</span>
<span class="opacity-40">·</span>
<span>H.264</span>
<span class="opacity-40">·</span>
<span>5.7 Mbps</span>
<span class="opacity-40">·</span>
<span>4.90 GB</span>
<span class="opacity-40">·</span>
<span>1:56:55</span>
<span class="pill" style="background: oklch(0.30 0.04 280); color: var(--color-cyan); border: 1px solid oklch(0.50 0.10 200 / 0.3);">2 parts</span>
</div>
</section>
<!-- 3. Stat tiles (4-up) --------------------------------- -->
<section class="frame col-span-1 lg:col-span-2">
<div class="header">3 · Stat tiles, video-led</div>
<p class="why">Four numeric tiles for the things that matter most — resolution, bitrate, size, length. Cover info reduced to one quiet line under the title. Each tile shows the value big and the label tiny, like a dashboard.</p>
<div class="mt-3 grid grid-cols-2 sm:grid-cols-4 gap-2">
<div class="rounded-lg p-3 glass">
<div class="label-mono mb-1">Resolution</div>
<div class="val-mono text-lg">1920×1080</div>
</div>
<div class="rounded-lg p-3 glass">
<div class="label-mono mb-1">Bitrate</div>
<div class="val-mono text-lg">5.7 <span class="text-[var(--color-fg-muted)] text-xs">Mbps</span></div>
</div>
<div class="rounded-lg p-3 glass">
<div class="label-mono mb-1">File Size</div>
<div class="val-mono text-lg">4.90 <span class="text-[var(--color-fg-muted)] text-xs">GB</span></div>
</div>
<div class="rounded-lg p-3 glass">
<div class="label-mono mb-1">Length</div>
<div class="val-mono text-lg">1:56:55</div>
</div>
</div>
<div class="mt-2 flex items-center gap-2 text-[11px] font-mono text-[var(--color-fg-muted)]">
<span>cover 800×538 · 170 KB</span>
<span class="opacity-40">·</span>
<span>2 parts · H.264</span>
<span class="opacity-40">·</span>
<span>imported 4/29/2026</span>
</div>
</section>
<!-- 4. Inline chips ------------------------------------- -->
<section class="frame">
<div class="header">4 · Inline chips</div>
<p class="why">Each fact is a borderless chip — label and value packed inside one rounded badge. Easier to skip past than the current bare strip; harder to cram many facts in.</p>
<div class="mt-3 flex flex-wrap gap-1.5">
<span class="pill glass" style="color: var(--color-fg-dim);">cover <span class="text-[var(--color-fg)] ml-1">800×538</span></span>
<span class="pill glass" style="color: var(--color-fg-dim);">cover size <span class="text-[var(--color-fg)] ml-1">170 KB</span></span>
<span class="pill glass" style="color: var(--color-fg-dim);">imported <span class="text-[var(--color-fg)] ml-1">4/29/2026</span></span>
</div>
<div class="mt-2 flex flex-wrap gap-1.5">
<span class="pill" style="background: oklch(0.50 0.10 200 / 0.10); color: var(--color-cyan); border: 1px solid oklch(0.50 0.10 200 / 0.30);">1920×1080</span>
<span class="pill" style="background: oklch(0.50 0.10 200 / 0.10); color: var(--color-cyan); border: 1px solid oklch(0.50 0.10 200 / 0.30);">H.264</span>
<span class="pill" style="background: oklch(0.50 0.10 200 / 0.10); color: var(--color-cyan); border: 1px solid oklch(0.50 0.10 200 / 0.30);">5.7 Mbps</span>
<span class="pill" style="background: oklch(0.50 0.10 200 / 0.10); color: var(--color-cyan); border: 1px solid oklch(0.50 0.10 200 / 0.30);">4.90 GB</span>
<span class="pill" style="background: oklch(0.50 0.10 200 / 0.10); color: var(--color-cyan); border: 1px solid oklch(0.50 0.10 200 / 0.30);">1:56:55</span>
<span class="pill" style="background: oklch(0.55 0.18 305 / 0.12); color: var(--color-violet); border: 1px solid oklch(0.55 0.18 305 / 0.30);">2 parts</span>
</div>
</section>
<!-- 5. Definition list, two-column ---------------------- -->
<section class="frame">
<div class="header">5 · Definition list, two-column</div>
<p class="why">Cover left, video right, side by side. Each row is "label : value" in a tight two-column grid. Most "official" looking — leans heavy on the form-y aesthetic.</p>
<div class="mt-3 grid grid-cols-2 gap-x-6 gap-y-1.5 text-[12px] font-mono">
<div class="flex justify-between gap-3"><span class="label-mono">Resolution</span><span class="val-mono">800×538</span></div>
<div class="flex justify-between gap-3"><span class="label-mono">Codec</span><span class="val-mono">H.264</span></div>
<div class="flex justify-between gap-3"><span class="label-mono">Cover Size</span><span class="val-mono">170 KB</span></div>
<div class="flex justify-between gap-3"><span class="label-mono">Video Resolution</span><span class="val-mono">1920×1080</span></div>
<div class="flex justify-between gap-3"><span class="label-mono">Imported</span><span class="val-mono">4/29/2026</span></div>
<div class="flex justify-between gap-3"><span class="label-mono">Bitrate</span><span class="val-mono">5.7 Mbps</span></div>
<div class="flex justify-between gap-3"><span class="label-mono">Parts</span><span class="val-mono">2</span></div>
<div class="flex justify-between gap-3"><span class="label-mono">File Size</span><span class="val-mono">4.90 GB</span></div>
<div></div>
<div class="flex justify-between gap-3"><span class="label-mono">Length</span><span class="val-mono">1:56:55</span></div>
</div>
</section>
<!-- 6. Hero stat: four-up ------------------------------- -->
<section class="frame col-span-1 lg:col-span-2">
<div class="header">6 · Hero stat — four-up</div>
<p class="why">Just the four numbers you actually scan for: Resolution, Bitrate, File Size, Length. Big mono values, tiny caps labels. No caption, no chrome.</p>
<div class="mt-3 flex items-end gap-10 flex-wrap">
<div>
<div class="label-mono mb-1">Resolution</div>
<div class="font-mono text-2xl font-semibold tracking-tight text-[var(--color-fg-dim)]">1920×1080</div>
</div>
<div>
<div class="label-mono mb-1">Bitrate</div>
<div class="font-mono text-2xl font-semibold tracking-tight text-[var(--color-fg-dim)]">5.7 Mbps</div>
</div>
<div>
<div class="label-mono mb-1">File Size</div>
<div class="font-mono text-3xl font-semibold tracking-tight">4.90 GB</div>
</div>
<div>
<div class="label-mono mb-1">Length</div>
<div class="font-mono text-3xl font-semibold tracking-tight" style="color: var(--color-cyan);">1:56:55</div>
</div>
</div>
</section>
<!-- 7. Asymmetric — video center stage ------------------ -->
<section class="frame">
<div class="header">7 · Asymmetric — video front, cover whisper</div>
<p class="why">Cover info is rarely the reason you opened the detail page; bury it in a tiny gray caption. Give video the full strip with separators. Recognizes that this is fundamentally a video library.</p>
<div class="mt-3 space-y-1">
<div class="flex flex-wrap items-baseline gap-x-3 gap-y-1 font-mono">
<span class="text-[var(--color-fg)] font-semibold text-[15px]">1920×1080</span>
<span class="opacity-30">·</span>
<span class="text-[var(--color-fg-dim)] text-[14px]">H.264</span>
<span class="opacity-30">·</span>
<span class="text-[var(--color-fg-dim)] text-[14px]">5.7 Mbps</span>
<span class="opacity-30">·</span>
<span class="text-[var(--color-fg-dim)] text-[14px]">4.90 GB</span>
<span class="opacity-30">·</span>
<span class="text-[var(--color-fg-dim)] text-[14px]">1:56:55</span>
<span class="ml-1 pill" style="background: oklch(0.50 0.10 200 / 0.10); color: var(--color-cyan); border: 1px solid oklch(0.50 0.10 200 / 0.30);">2 parts</span>
</div>
<div class="text-[10px] font-mono text-[var(--color-fg-muted)]">
cover · 800×538 · 170 KB · imported 4/29/2026
</div>
</div>
</section>
<!-- 8. Two-column: cover summary, video summary --------- -->
<section class="frame">
<div class="header">8 · Side-by-side summaries</div>
<p class="why">Each side gets its own headed mini-block. Visual parity between cover and video, but they're clearly separated. Same density as current, but the dotted strip becomes structured.</p>
<div class="mt-3 grid grid-cols-2 gap-3">
<div class="rounded-lg p-3 glass">
<div class="label-mono mb-1.5">Cover</div>
<div class="font-mono text-[13px]"><span class="font-semibold">800×538</span> <span class="opacity-50 mx-1">·</span> 170 KB</div>
<div class="font-mono text-[11px] text-[var(--color-fg-muted)] mt-1">imported 4/29/2026</div>
</div>
<div class="rounded-lg p-3 glass" style="border-color: oklch(0.50 0.10 200 / 0.30);">
<div class="label-mono mb-1.5" style="color: var(--color-cyan);">Video <span class="opacity-60">· 2 parts</span></div>
<div class="font-mono text-[13px]"><span class="font-semibold">1920×1080</span> <span class="opacity-50 mx-1">·</span> H.264 <span class="opacity-50 mx-1">·</span> 5.7 Mbps</div>
<div class="font-mono text-[11px] text-[var(--color-fg-muted)] mt-1">4.90 GB · 1:56:55</div>
</div>
</div>
</section>
</div>
<footer class="text-[11px] text-[var(--color-fg-muted)] mt-6">
Pick one (or a frankenstein) and I'll wire it into <code class="text-[var(--color-cyan)]">components/image/ImageDetailView.tsx</code>.
</footer>
</body>
</html>