Migrated from Claude Design
This commit is contained in:
@@ -0,0 +1,136 @@
|
||||
<!DOCTYPE html>
|
||||
<!-- @dsCard group="Brand" name="Cards" subtitle="Stat, deploy, alert cards — flat, 6px radius" viewport="700x150" -->
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<link rel="stylesheet" href="../styles.css?v=2">
|
||||
<style>
|
||||
body { margin: 0; padding: 24px; background: var(--bg-page); font-family: var(--font-body); display: flex; gap: 16px; flex-wrap: wrap; align-items: flex-start; }
|
||||
|
||||
/* Base card — a SURFACE. Static by default: no hover, no cursor, no halo. */
|
||||
.card {
|
||||
background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius-md);
|
||||
padding: 14px 16px; width: 200px;
|
||||
background-image: var(--gradient-card);
|
||||
}
|
||||
|
||||
/* Clickable card — opts into the interactive treatment. Use .card.clickable, role="button", or wrap in <a>/<button>. */
|
||||
.card.clickable,
|
||||
a.card,
|
||||
button.card {
|
||||
cursor: pointer;
|
||||
text-decoration: none; text-align: left;
|
||||
transition: background var(--transition-hover), color var(--transition-hover), border-color var(--transition-hover), box-shadow var(--transition-hover);
|
||||
}
|
||||
.card.clickable:active,
|
||||
a.card:active,
|
||||
button.card:active {
|
||||
transition: background var(--transition-press), color var(--transition-press), border-color var(--transition-press), box-shadow var(--transition-press);
|
||||
}
|
||||
|
||||
/* Hover — outward gold halo, only on clickable cards. */
|
||||
.card.clickable:hover,
|
||||
a.card:hover,
|
||||
button.card:hover {
|
||||
border-color: var(--gold-dim);
|
||||
box-shadow: 0 0 0 3px rgba(215, 153, 33, 0.35);
|
||||
}
|
||||
|
||||
/* Active/Press — full gold-bright fill, white text. Mirrors .btn-secondary:active. */
|
||||
.card.clickable:active,
|
||||
a.card:active,
|
||||
button.card:active {
|
||||
background: var(--gold-bright);
|
||||
border-color: var(--gold-bright);
|
||||
color: #fff;
|
||||
box-shadow: none;
|
||||
}
|
||||
.card.clickable:active *,
|
||||
a.card:active *,
|
||||
button.card:active * {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.card-title { font-family: var(--font-display); font-size: 13px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--fg-heading); margin-bottom: 4px; }
|
||||
.card-meta { font-family: var(--font-mono); font-size: 10px; color: var(--fg-caption); letter-spacing: 0.06em; margin-bottom: 8px; }
|
||||
.card-body { font-size: 13px; color: var(--fg-body); line-height: 1.5; }
|
||||
.card-stat { font-family: var(--font-mono); font-size: 22px; font-weight: 700; color: var(--gold-bright); }
|
||||
.card-stat-label { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--fg-caption); }
|
||||
.card-status { display: inline-flex; align-items: center; gap: 5px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase; }
|
||||
.dot { width: 6px; height: 6px; border-radius: 50%; }
|
||||
|
||||
.group-label { flex-basis: 100%; font-family: var(--font-mono); font-size: 9px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--fg-caption); margin: 4px 0 -4px; }
|
||||
|
||||
/* Spec block */
|
||||
.spec {
|
||||
flex-basis: 100%; margin-top: 8px;
|
||||
border-top: 1px solid var(--gold-dim);
|
||||
padding-top: 14px;
|
||||
font-family: var(--font-mono); font-size: 11px; line-height: 1.6; color: var(--fg-secondary);
|
||||
}
|
||||
.spec-title { font-family: var(--font-display); font-size: 10px; font-weight: 700; letter-spacing: 0.18em; text-transform: uppercase; color: var(--gold-bright); margin-bottom: 8px; }
|
||||
.spec-row { display: flex; gap: 12px; margin-bottom: 4px; }
|
||||
.spec-key { color: var(--fg-caption); width: 110px; flex-shrink: 0; letter-spacing: 0.04em; text-transform: uppercase; font-size: 10px; }
|
||||
.spec-val { color: var(--fg-heading); }
|
||||
.spec-note { color: var(--fg-muted); margin-top: 8px; font-style: italic; max-width: 640px; }
|
||||
.spec-section { margin-top: 14px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="group-label">Static cards (display only)</div>
|
||||
<div class="card">
|
||||
<div class="card-title">Node Alpha</div>
|
||||
<div class="card-meta">cluster-01 · us-east-1</div>
|
||||
<div class="card-stat">99.97%</div>
|
||||
<div class="card-stat-label">Uptime — 30d</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-title">Alert</div>
|
||||
<div class="card-meta">node-07 · 09:41:02Z</div>
|
||||
<div class="card-body">Connection timeout. Failover initiated.</div>
|
||||
<div style="margin-top:8px" class="card-status"><div class="dot" style="background:var(--red-bright)"></div><span style="color:var(--red-bright)">Critical</span></div>
|
||||
</div>
|
||||
|
||||
<div class="group-label">Clickable cards (hover + press)</div>
|
||||
<a href="#" class="card">
|
||||
<div class="card-title">Deploy #441</div>
|
||||
<div class="card-meta">main · a3f9c12e · 14s ago</div>
|
||||
<div class="card-body">Production build deployed. 0 errors.</div>
|
||||
<div style="margin-top:8px" class="card-status"><div class="dot" style="background:var(--green-bright)"></div><span style="color:var(--green-bright)">Complete</span></div>
|
||||
</a>
|
||||
<div class="card clickable" role="button" tabindex="0">
|
||||
<div class="card-title">Open Console</div>
|
||||
<div class="card-meta">cluster-01 · 12 active sessions</div>
|
||||
<div class="card-body">Launch terminal session in this cluster.</div>
|
||||
</div>
|
||||
|
||||
<div class="spec">
|
||||
<div class="spec-title">Card states</div>
|
||||
|
||||
<div class="spec-section">
|
||||
<div class="spec-row"><div class="spec-key">Default</div><div class="spec-val">Static surface — no hover effect, no cursor change.</div></div>
|
||||
<div class="spec-row"><div class="spec-key">Background</div><div class="spec-val"><code>--bg-surface</code> + <code>--gradient-card</code></div></div>
|
||||
<div class="spec-row"><div class="spec-key">Border</div><div class="spec-val">1px solid <code>--border</code></div></div>
|
||||
</div>
|
||||
|
||||
<div class="spec-section">
|
||||
<div class="spec-row"><div class="spec-key">Clickable</div><div class="spec-val">Apply <code>.clickable</code>, <code>role="button"</code>, or use <code><a></code>/<code><button></code> — opts the card into hover + press.</div></div>
|
||||
</div>
|
||||
|
||||
<div class="spec-section">
|
||||
<div class="spec-row"><div class="spec-key">Hover</div><div class="spec-val">border <code>--gold-dim</code> · halo <code>0 0 0 3px rgba(215, 153, 33, 0.35)</code></div></div>
|
||||
<div class="spec-row"><div class="spec-key">— width</div><div class="spec-val">3px, grows OUTWARD from card edge</div></div>
|
||||
<div class="spec-row"><div class="spec-key">— opacity</div><div class="spec-val">35% — translucent so the halo reads as a soft accent, not a hard second ring</div></div>
|
||||
<div class="spec-row"><div class="spec-key">— transition</div><div class="spec-val"><code>--transition-hover</code> (150ms ease-out)</div></div>
|
||||
</div>
|
||||
|
||||
<div class="spec-section">
|
||||
<div class="spec-row"><div class="spec-key">Press</div><div class="spec-val">background + border <code>--gold-bright</code> · text <code>#fff</code> · halo cleared</div></div>
|
||||
<div class="spec-row"><div class="spec-key">— transition</div><div class="spec-val"><code>--transition-press</code> (55ms ease-out) on enter, <code>--transition-hover</code> on release</div></div>
|
||||
<div class="spec-row"><div class="spec-key">— mirrors</div><div class="spec-val"><code>.btn-secondary:active</code> — same press treatment as ghost-style buttons</div></div>
|
||||
</div>
|
||||
|
||||
<div class="spec-note">The hover halo only appears when a card is actually interactive. Surface cards (data display) get no hover effect at all — clickable cards opt in via class or semantic element. Press fills with gold-bright to match the secondary-button click pattern, so a clicked card reads consistently with the rest of the interactive system.</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user