<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Deployments — Data Table</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background: #e8e8e5;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding: 72px 56px;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
.mono {
font-family: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
font-variant-numeric: tabular-nums;
}
/* ---------- Card ---------- */
.table-card {
width: max-content;
min-width: 892px;
background: #ffffff;
border: 1px solid #dcdad5;
border-radius: 10px;
box-shadow: 0 1px 2px rgba(24,24,20,.04), 0 16px 40px -16px rgba(24,24,20,.14);
overflow: hidden;
}
/* ---------- Toolbar ---------- */
.toolbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 11px 16px;
border-bottom: 1px solid #ebeae6;
}
.toolbar-left { display: flex; align-items: center; }
.title { font-size: 13px; font-weight: 600; color: #1c1c19; letter-spacing: .01em; }
.count {
margin-left: 9px;
font-size: 11px;
font-weight: 500;
color: #6f6e69;
background: #f3f3f0;
border: 1px solid #e5e4e0;
border-radius: 999px;
padding: 1px 8px;
line-height: 16px;
}
.chip {
margin-left: 14px;
display: inline-flex;
align-items: center;
gap: 6px;
height: 24px;
padding: 0 8px 0 9px;
font-size: 11.5px;
color: #565550;
background: #fbfbfa;
border: 1px solid #e2e1dc;
border-radius: 6px;
}
.chip-dot { width: 6px; height: 6px; border-radius: 50%; background: #3d9a57; }
.chip svg { color: #9b9a94; }
.search { position: relative; }
.search svg {
position: absolute;
left: 9px; top: 50%;
transform: translateY(-50%);
color: #a09f99;
pointer-events: none;
}
.search input {
width: 208px;
height: 28px;
font-family: inherit;
font-size: 12px;
color: #1c1c19;
padding: 0 10px 0 29px;
background: #fafaf8;
border: 1px solid #e0dfd9;
border-radius: 6px;
outline: none;
}
.search input::placeholder { color: #a5a49e; }
.search input:focus { border-color: #c7c6c0; background: #ffffff; }
/* ---------- Table ---------- */
table { border-collapse: collapse; }
thead th {
font-size: 10.5px;
font-weight: 600;
letter-spacing: .065em;
text-transform: uppercase;
color: #8f8e88;
text-align: left;
white-space: nowrap;
padding: 8px 14px;
background: #fcfcfa;
border-bottom: 1px solid #e9e8e4;
cursor: pointer;
user-select: none;
}
thead th.check { cursor: default; }
thead th.sorted { color: #1f1f1c; }
thead th.sorted svg { margin-left: 4px; vertical-align: -1.5px; }
tbody td {
font-size: 13px;
color: #2b2b28;
padding: 8px 14px;
border-bottom: 1px solid #f1f0ec;
vertical-align: middle;
white-space: nowrap;
}
tbody tr:last-child td { border-bottom: none; }
th.check, td.check { width: 42px; padding-left: 16px; padding-right: 6px; }
input[type="checkbox"] {
appearance: auto;
accent-color: #2f6bde;
width: 14px; height: 14px;
margin: 0;
display: block;
cursor: pointer;
}
.num { text-align: right; }
/* Row states */
tr.hover td { background: #f6f6f3; }
tr.selected td { background: #f0f6ff; }
tr.selected td:first-child { box-shadow: inset 2px 0 0 #2f6bde; }
/* ---------- Status pills (icon + label, never colour alone) ---------- */
.status {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 12px;
font-weight: 500;
line-height: 1;
padding: 4px 10px 4px 7px;
border-radius: 999px;
border: 1px solid transparent;
}
.status svg { flex: none; }
.st-success { color: #1c7a3d; background: #eff8f1; border-color: #d2e9d8; }
.st-failed { color: #b3261e; background: #fdf1f0; border-color: #f2d3d0; }
.st-progress { color: #2f5fd0; background: #f0f5ff; border-color: #d4e2fa; }
.st-queued { color: #62615c; background: #f4f4f1; border-color: #e4e3df; }
.st-rollback { color: #8f650e; background: #fbf6e9; border-color: #eedfb8; }
/* ---------- Cells ---------- */
.svc { font-weight: 500; color: #1e1e1b; }
.hash {
margin-left: 8px;
font-family: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace;
font-size: 11px;
color: #a3a29c;
}
.region { font-family: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; color: #5c5b56; }
.user { display: flex; align-items: center; font-size: 12.5px; color: #33322e; }
.avatar {
width: 22px; height: 22px;
border-radius: 50%;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 9px;
font-weight: 600;
letter-spacing: .04em;
margin-right: 8px;
border: 1px solid rgba(0,0,0,.05);
flex: none;
}
.u1 { background: #eaeff3; color: #4e6a80; }
.u2 { background: #f1ede6; color: #7c6e55; }
.u3 { background: #ecf2ec; color: #57795c; }
.u4 { background: #f3ecec; color: #8a5f5f; }
.u5 { background: #e9f1ef; color: #51746b; }
.u6 { background: #efedf3; color: #6c6186; }
.u7 { background: #f1efe5; color: #7d734b; }
.u8 { background: #edf0ea; color: #63755a; }
.duration { font-family: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; color: #3c3b36; font-variant-numeric: tabular-nums; }
.duration.na { color: #bab9b3; }
.ts { font-family: ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace; font-size: 12px; color: #6e6d67; font-variant-numeric: tabular-nums; }
/* ---------- Footer ---------- */
.footer {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 16px;
border-top: 1px solid #ebeae6;
font-size: 12px;
color: #8a8983;
}
</style>
</head>
<body>
<div class="table-card" role="region" aria-label="Server deployment records">
<!-- Toolbar -->
<div class="toolbar">
<div class="toolbar-left">
<span class="title">Deployments</span>
<span class="count">8</span>
<span class="chip">
<span class="chip-dot"></span>Production
<svg width="10" height="10" viewBox="0 0 12 12" fill="none"><path d="M3 4.6l3 3 3-3" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
</span>
</div>
<div class="search">
<svg width="13" height="13" viewBox="0 0 12 12" fill="none"><circle cx="5.2" cy="5.2" r="3.6" stroke="currentColor" stroke-width="1.4"/><path d="M8 8l2.4 2.4" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
<input type="text" placeholder="Filter by service…" aria-label="Filter by service">
</div>
</div>
<!-- Table -->
<table>
<thead>
<tr>
<th class="check" scope="col"><input type="checkbox" id="selectAll" aria-label="Select all deployments"></th>
<th scope="col">Status</th>
<th scope="col">Service</th>
<th scope="col">Region</th>
<th scope="col">Deployed by</th>
<th scope="col" class="num">Duration</th>
<th scope="col" class="sorted" aria-sort="descending">Timestamp
<svg width="11" height="11" viewBox="0 0 12 12" fill="none" aria-hidden="true"><path d="M6 1.8v8M3.4 7L6 9.6l2.6-2.6" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="check"><input type="checkbox" aria-label="Select api-gateway deployment"></td>
<td><span class="status st-success"><svg width="12" height="12" viewBox="0 0 12 12" fill="none"><circle cx="6" cy="6" r="5" stroke="currentColor" stroke-width="1.4"/><path d="M3.8 6.3l1.4 1.4 3-3.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>Success</span></td>
<td><span class="svc">api-gateway</span><span class="hash">c41fa9e</span></td>
<td class="region">us-east-1</td>
<td><span class="user"><span class="avatar u1">AS</span>Ana Sousa</span></td>
<td class="num"><span class="duration">1m 42s</span></td>
<td><span class="ts">12 Jun · 14:32:08</span></td>
</tr>
<tr>
<td class="check"><input type="checkbox" aria-label="Select auth-service deployment"></td>
<td><span class="status st-success"><svg width="12" height="12" viewBox="0 0 12 12" fill="none"><circle cx="6" cy="6" r="5" stroke="currentColor" stroke-width="1.4"/><path d="M3.8 6.3l1.4 1.4 3-3.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>Success</span></td>
<td><span class="svc">auth-service</span><span class="hash">9b0d3f1</span></td>
<td class="region">eu-west-1</td>
<td><span class="user"><span class="avatar u2">MC</span>Marcus Chen</span></td>
<td class="num"><span class="duration">58s</span></td>
<td><span class="ts">12 Jun · 14:18:52</span></td>
</tr>
<tr class="hover">
<td class="check"><input type="checkbox" aria-label="Select search-indexer deployment"></td>
<td><span class="status st-progress"><svg width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M6 1.2a4.8 4.8 0 1 1-4.8 4.8" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>In progress</span></td>
<td><span class="svc">search-indexer</span><span class="hash">77ac2b4</span></td>
<td class="region">us-west-2</td>
<td><span class="user"><span class="avatar u3">PN</span>Priya Nair</span></td>
<td class="num"><span class="duration">2m 05s</span></td>
<td><span class="ts">12 Jun · 13:57:20</span></td>
</tr>
<tr class="selected">
<td class="check"><input type="checkbox" checked aria-label="Select billing-worker deployment"></td>
<td><span class="status st-failed"><svg width="12" height="12" viewBox="0 0 12 12" fill="none"><circle cx="6" cy="6" r="5" stroke="currentColor" stroke-width="1.4"/><path d="M4.3 4.3l3.4 3.4M7.7 4.3L4.3 7.7" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>Failed</span></td>
<td><span class="svc">billing-worker</span><span class="hash">e5c8a07</span></td>
<td class="region">eu-central-1</td>
<td><span class="user"><span class="avatar u4">TE</span>Tom Ellery</span></td>
<td class="num"><span class="duration">3m 11s</span></td>
<td><span class="ts">12 Jun · 13:41:03</span></td>
</tr>
<tr>
<td class="check"><input type="checkbox" aria-label="Select edge-cache deployment"></td>
<td><span class="status st-success"><svg width="12" height="12" viewBox="0 0 12 12" fill="none"><circle cx="6" cy="6" r="5" stroke="currentColor" stroke-width="1.4"/><path d="M3.8 6.3l1.4 1.4 3-3.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>Success</span></td>
<td><span class="svc">edge-cache</span><span class="hash">3fd9e55</span></td>
<td class="region">ap-southeast-2</td>
<td><span class="user"><span class="avatar u5">JP</span>Jin Park</span></td>
<td class="num"><span class="duration">44s</span></td>
<td><span class="ts">12 Jun · 12:26:47</span></td>
</tr>
<tr>
<td class="check"><input type="checkbox" aria-label="Select session-store deployment"></td>
<td><span class="status st-rollback"><svg width="12" height="12" viewBox="0 0 12 12" fill="none"><path d="M1.6 6a4.4 4.4 0 1 0 4.4-4.4 4.9 4.9 0 0 0-3.3 1.35L1.6 4.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/><path d="M1.6 1.6v2.6h2.6" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>Rolled back</span></td>
<td><span class="svc">session-store</span><span class="hash">8a1b6cc</span></td>
<td class="region">us-east-1</td>
<td><span class="user"><span class="avatar u6">LV</span>Lena Vogt</span></td>
<td class="num"><span class="duration">1m 18s</span></td>
<td><span class="ts">12 Jun · 11:03:15</span></td>
</tr>
<tr>
<td class="check"><input type="checkbox" aria-label="Select metrics-pipeline deployment"></td>
<td><span class="status st-queued"><svg width="12" height="12" viewBox="0 0 12 12" fill="none"><circle cx="6" cy="6" r="4.8" stroke="currentColor" stroke-width="1.3"/><path d="M6 3.7V6l1.6 1.1" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round"/></svg>Queued</span></td>
<td><span class="svc">metrics-pipeline</span><span class="hash">b64d021</span></td>
<td class="region">eu-west-1</td>
<td><span class="user"><span class="avatar u7">OH</span>Omar Haddad</span></td>
<td class="num"><span class="duration na">—</span></td>
<td><span class="ts">12 Jun · 09:47:58</span></td>
</tr>
<tr>
<td class="check"><input type="checkbox" aria-label="Select notifications deployment"></td>
<td><span class="status st-success"><svg width="12" height="12" viewBox="0 0 12 12" fill="none"><circle cx="6" cy="6" r="5" stroke="currentColor" stroke-width="1.4"/><path d="M3.8 6.3l1.4 1.4 3-3.2" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>Success</span></td>
<td><span class="svc">notifications</span><span class="hash">f0e3d98</span></td>
<td class="region">us-west-2</td>
<td><span class="user"><span class="avatar u8">GL</span>Grace Liu</span></td>
<td class="num"><span class="duration">1m 07s</span></td>
<td><span class="ts">11 Jun · 22:15:40</span></td>
</tr>
</tbody>
</table>
<!-- Footer -->
<div class="footer">
<span>8 deployments · 1 selected</span>
<span>Page 1 of 1</span>
</div>
</div>
<script>
// Header checkbox reflects the partially-selected state of the rows
document.getElementById('selectAll').indeterminate = true;
</script>
</body>
</html>