UI Components Easy
Document Preview Card
PDF/document preview card with page thumbnail placeholder, file metadata, download and open buttons. Pure CSS.
Open in Lab
MCP
css
Targets: JS HTML
Code
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background: #0d1117;
color: #e6edf3;
min-height: 100vh;
padding: 32px 16px;
display: flex;
justify-content: center;
}
.demo {
width: 100%;
max-width: 720px;
}
.doc-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.doc-card {
display: flex;
align-items: center;
gap: 16px;
background: #161b22;
border: 1px solid #21262d;
border-radius: 12px;
padding: 14px 16px;
transition: border-color 0.2s, transform 0.15s;
}
.doc-card:hover {
border-color: #30363d;
transform: translateX(2px);
}
/* Thumbnail */
.doc-thumb {
width: 56px;
height: 70px;
border-radius: 8px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
}
.doc-thumb--pdf {
background: linear-gradient(160deg, #1e1e2e, #2d1b34);
border: 1px solid rgba(248, 81, 73, 0.2);
}
.doc-thumb--doc {
background: linear-gradient(160deg, #1a2035, #1a2e4a);
border: 1px solid rgba(56, 139, 253, 0.2);
}
.doc-thumb--xls {
background: linear-gradient(160deg, #0f2a1a, #1a3a2a);
border: 1px solid rgba(63, 185, 80, 0.2);
}
.doc-thumb--ppt {
background: linear-gradient(160deg, #2a1a10, #3a2010);
border: 1px solid rgba(210, 153, 34, 0.2);
}
.doc-type-badge {
position: absolute;
bottom: 4px;
right: 4px;
font-size: 8px;
font-weight: 800;
padding: 1px 4px;
border-radius: 3px;
letter-spacing: 0.04em;
}
.doc-thumb--pdf .doc-type-badge {
background: rgba(248, 81, 73, 0.2);
color: #f85149;
}
.doc-thumb--doc .doc-type-badge {
background: rgba(56, 139, 253, 0.2);
color: #58a6ff;
}
.doc-thumb--xls .doc-type-badge {
background: rgba(63, 185, 80, 0.2);
color: #3fb950;
}
.doc-thumb--ppt .doc-type-badge {
background: rgba(210, 153, 34, 0.2);
color: #d29922;
}
/* Document lines */
.doc-page-lines {
display: flex;
flex-direction: column;
gap: 4px;
padding: 8px 6px 14px;
width: 100%;
}
.dpl {
height: 4px;
border-radius: 2px;
background: rgba(255, 255, 255, 0.12);
}
.dpl--title {
height: 6px;
width: 70%;
background: rgba(255, 255, 255, 0.2);
}
.dpl--80 {
width: 80%;
}
.dpl--60 {
width: 60%;
}
.dpl--90 {
width: 90%;
}
.dpl--40 {
width: 40%;
}
.dpl--70 {
width: 70%;
}
.dpl--55 {
width: 55%;
}
.dpl--75 {
width: 75%;
}
.dpl--50 {
width: 50%;
}
.dpl--85 {
width: 85%;
}
/* Spreadsheet thumb */
.doc-spreadsheet {
display: flex;
flex-direction: column;
gap: 2px;
padding: 4px;
width: 100%;
}
.ds-row {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 2px;
}
.ds-row span {
height: 6px;
border-radius: 1px;
background: rgba(255, 255, 255, 0.08);
}
.ds-row--head span {
background: rgba(63, 185, 80, 0.2);
}
/* Slide thumb */
.doc-slide {
padding: 6px;
width: 100%;
}
.ds-title {
height: 7px;
width: 80%;
background: rgba(255, 255, 255, 0.2);
border-radius: 3px;
margin-bottom: 5px;
}
.ds-subtitle {
height: 5px;
width: 60%;
background: rgba(255, 255, 255, 0.12);
border-radius: 2px;
margin-bottom: 8px;
}
.ds-body {
height: 20px;
background: rgba(255, 255, 255, 0.06);
border-radius: 3px;
}
/* Info */
.doc-info {
flex: 1;
min-width: 0;
}
.doc-name {
font-size: 14px;
font-weight: 600;
color: #e6edf3;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin-bottom: 4px;
}
.doc-meta {
font-size: 12px;
color: #6c7086;
margin-bottom: 8px;
}
.doc-tags {
display: flex;
gap: 6px;
flex-wrap: wrap;
}
.doc-tag {
font-size: 11px;
font-weight: 600;
background: rgba(255, 255, 255, 0.06);
color: #8b949e;
padding: 2px 8px;
border-radius: 4px;
border: 1px solid #30363d;
}
/* Actions */
.doc-actions {
display: flex;
gap: 4px;
flex-shrink: 0;
}
.doc-btn {
background: none;
border: 1px solid #30363d;
color: #6c7086;
font-size: 14px;
width: 32px;
height: 32px;
border-radius: 8px;
cursor: pointer;
transition: all 0.15s;
display: flex;
align-items: center;
justify-content: center;
}
.doc-btn:hover {
border-color: #8b949e;
color: #e6edf3;
background: rgba(255, 255, 255, 0.04);
}// Ripple feedback on action buttons
document.querySelectorAll(".doc-btn").forEach((btn) => {
btn.addEventListener("click", (e) => {
const title = btn.title;
const card = btn.closest(".doc-card");
const name = card.querySelector(".doc-name").textContent;
// Visual flash
btn.style.background = "rgba(99,102,241,0.2)";
btn.style.borderColor = "#6366f1";
btn.style.color = "#a5b4fc";
setTimeout(() => {
btn.style.background = "";
btn.style.borderColor = "";
btn.style.color = "";
}, 600);
});
});
// Hover lift on cards
document.querySelectorAll(".doc-card").forEach((card) => {
card.addEventListener("click", (e) => {
if (e.target.closest(".doc-btn")) return;
card.style.borderColor = "#6366f1";
setTimeout(() => {
card.style.borderColor = "";
}, 800);
});
});<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document Preview</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div class="demo">
<div class="doc-list">
<div class="doc-card" data-type="pdf">
<div class="doc-thumb doc-thumb--pdf">
<div class="doc-page-lines">
<div class="dpl dpl--80"></div>
<div class="dpl dpl--60"></div>
<div class="dpl dpl--90"></div>
<div class="dpl dpl--40"></div>
<div class="dpl dpl--70"></div>
<div class="dpl dpl--55"></div>
</div>
<span class="doc-type-badge">PDF</span>
</div>
<div class="doc-info">
<p class="doc-name">Q1 Financial Report 2026.pdf</p>
<p class="doc-meta">4.2 MB · 24 pages · Modified Mar 6</p>
<div class="doc-tags">
<span class="doc-tag">Finance</span>
<span class="doc-tag">Reports</span>
</div>
</div>
<div class="doc-actions">
<button class="doc-btn" title="Preview">👁</button>
<button class="doc-btn" title="Download">⬇</button>
<button class="doc-btn" title="Share">⤴</button>
</div>
</div>
<div class="doc-card" data-type="doc">
<div class="doc-thumb doc-thumb--doc">
<div class="doc-page-lines">
<div class="dpl dpl--title"></div>
<div class="dpl dpl--60"></div>
<div class="dpl dpl--85"></div>
<div class="dpl dpl--75"></div>
<div class="dpl dpl--50"></div>
</div>
<span class="doc-type-badge">DOC</span>
</div>
<div class="doc-info">
<p class="doc-name">Product Roadmap 2026.docx</p>
<p class="doc-meta">1.8 MB · 12 pages · Modified Mar 5</p>
<div class="doc-tags">
<span class="doc-tag">Product</span>
<span class="doc-tag">Planning</span>
</div>
</div>
<div class="doc-actions">
<button class="doc-btn" title="Preview">👁</button>
<button class="doc-btn" title="Download">⬇</button>
<button class="doc-btn" title="Share">⤴</button>
</div>
</div>
<div class="doc-card" data-type="xls">
<div class="doc-thumb doc-thumb--xls">
<div class="doc-spreadsheet">
<div class="ds-row ds-row--head">
<span></span><span></span><span></span><span></span>
</div>
<div class="ds-row"><span></span><span></span><span></span><span></span></div>
<div class="ds-row"><span></span><span></span><span></span><span></span></div>
<div class="ds-row"><span></span><span></span><span></span><span></span></div>
<div class="ds-row"><span></span><span></span><span></span><span></span></div>
</div>
<span class="doc-type-badge">XLS</span>
</div>
<div class="doc-info">
<p class="doc-name">User Analytics March.xlsx</p>
<p class="doc-meta">892 KB · 3 sheets · Modified today</p>
<div class="doc-tags">
<span class="doc-tag">Analytics</span>
</div>
</div>
<div class="doc-actions">
<button class="doc-btn" title="Preview">👁</button>
<button class="doc-btn" title="Download">⬇</button>
<button class="doc-btn" title="Share">⤴</button>
</div>
</div>
<div class="doc-card" data-type="ppt">
<div class="doc-thumb doc-thumb--ppt">
<div class="doc-slide">
<div class="ds-title"></div>
<div class="ds-subtitle"></div>
<div class="ds-body"></div>
</div>
<span class="doc-type-badge">PPT</span>
</div>
<div class="doc-info">
<p class="doc-name">Investor Pitch Deck v3.pptx</p>
<p class="doc-meta">6.1 MB · 18 slides · Modified Mar 4</p>
<div class="doc-tags">
<span class="doc-tag">Pitch</span>
<span class="doc-tag">Investors</span>
</div>
</div>
<div class="doc-actions">
<button class="doc-btn" title="Preview">👁</button>
<button class="doc-btn" title="Download">⬇</button>
<button class="doc-btn" title="Share">⤴</button>
</div>
</div>
</div>
</div>
<script src="script.js"></script>
</body>
</html>Document preview card with a styled page thumbnail (PDF-style), file name, type badge, file size, page count, upload date, and action buttons (Download, Open). Supports multiple document type variants.