jw-search / docs /layout-5-compact-horizontal.html
jw-tools's picture
deploy: latest main (lazy-ML cold start, durable launcher, web-image search, scene search) + full-app data refresh
7ea1851 verified
Raw
History Blame Contribute Delete
14.1 kB
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Layout 5: Compact Horizontal</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
:root {
--bg-primary: #121212;
--bg-secondary: #1e1e1e;
--bg-tertiary: #2a2a2a;
--border-color: #333;
--text-primary: #fff;
--text-secondary: #aaa;
--text-muted: #666;
--accent: #4a9eff;
--accent-hover: #6ab0ff;
--danger: #ff4a4a;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
background-color: var(--bg-primary);
color: var(--text-primary);
height: 100vh;
overflow: hidden;
}
.avatar {
width: 40px; height: 40px; border-radius: 50%;
background: linear-gradient(135deg, var(--accent), #6366f1);
display: flex; align-items: center; justify-content: center;
font-weight: 600; font-size: 16px; flex-shrink: 0;
}
.face-thumb { width: 48px; height: 48px; border-radius: 8px; background: var(--bg-tertiary); flex-shrink: 0; }
.btn {
padding: 8px 16px; border-radius: 6px; border: none;
cursor: pointer; font-size: 13px; font-weight: 500; transition: all 0.2s;
}
.btn-primary { background: var(--accent); color: white; }
.btn-primary:hover { background: var(--accent-hover); }
.btn-secondary { background: var(--bg-tertiary); color: var(--text-primary); border: 1px solid var(--border-color); }
.btn-danger { background: transparent; color: var(--danger); border: 1px solid var(--danger); }
.btn-danger:hover { background: var(--danger); color: white; }
.btn-small { padding: 6px 12px; font-size: 12px; }
input, select {
padding: 8px 12px; border-radius: 6px; border: 1px solid var(--border-color);
background: var(--bg-tertiary); color: var(--text-primary); font-size: 13px;
}
::-webkit-scrollbar { width: 8px; height: 6px; }
::-webkit-scrollbar-track { background: var(--bg-secondary); }
::-webkit-scrollbar-thumb { background: #444; border-radius: 4px; }
/* Layout 5: Compact Horizontal */
.main-container { height: 100vh; display: flex; flex-direction: column; }
.top-bar {
display: flex; align-items: center; gap: 20px;
padding: 12px 20px; background: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
}
.top-bar .tabs { display: flex; gap: 4px; }
.top-bar .tab {
padding: 6px 16px; background: transparent; border: none;
border-radius: 6px; color: var(--text-secondary); cursor: pointer; font-size: 13px;
}
.top-bar .tab.active { background: var(--bg-tertiary); color: var(--text-primary); }
.top-bar .search-input { width: 240px; }
.top-bar .actions { margin-left: auto; display: flex; gap: 8px; }
.people-strip {
width: 100%; height: 100px; background: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
padding: 12px; display: flex; gap: 16px; overflow-x: auto; flex-shrink: 0;
}
.person-pill {
display: flex; flex-direction: column; align-items: center; gap: 6px;
padding: 8px 12px; background: var(--bg-tertiary); border-radius: 8px;
cursor: pointer; min-width: 80px; border: 2px solid transparent;
}
.person-pill:hover { border-color: var(--border-color); }
.person-pill.selected { border-color: var(--accent); background: rgba(74, 158, 255, 0.1); }
.person-pill .avatar { width: 36px; height: 36px; font-size: 14px; }
.person-pill-name { font-size: 11px; white-space: nowrap; max-width: 70px; overflow: hidden; text-overflow: ellipsis; }
.main-area { flex: 1; display: flex; overflow: hidden; }
.unknown-sidebar {
width: 260px; background: var(--bg-secondary);
border-right: 1px solid var(--border-color);
display: flex; flex-direction: column;
}
.unknown-header { padding: 12px 16px; border-bottom: 1px solid var(--border-color); font-size: 13px; font-weight: 600; }
.unknown-list { flex: 1; overflow-y: auto; padding: 8px; }
.unknown-item {
display: flex; align-items: center; gap: 10px;
padding: 10px; border-radius: 6px; cursor: pointer; margin-bottom: 4px;
}
.unknown-item:hover { background: var(--bg-tertiary); }
.unknown-item.selected { background: rgba(74, 158, 255, 0.15); }
.unknown-item .face-thumb { width: 44px; height: 44px; }
.unknown-item-info { flex: 1; min-width: 0; }
.unknown-item-count { font-size: 13px; font-weight: 500; }
.unknown-item-video { font-size: 11px; color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.content-area { flex: 1; display: flex; flex-direction: column; overflow: hidden; }
.content-header {
padding: 16px 20px; border-bottom: 1px solid var(--border-color);
display: flex; align-items: center; gap: 16px;
}
.content-header h2 { font-size: 16px; }
.content-header .assign-controls { display: flex; gap: 8px; margin-left: auto; }
.content-header select { width: 180px; }
.content-body { flex: 1; overflow-y: auto; padding: 20px; }
.appearances-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 12px; }
.appearance-item {
background: var(--bg-secondary); border-radius: 8px; overflow: hidden;
cursor: pointer; border: 2px solid transparent;
}
.appearance-item:hover { border-color: var(--border-color); }
.appearance-item.selected { border-color: var(--accent); }
.appearance-item img { width: 100%; aspect-ratio: 16/9; object-fit: cover; background: var(--bg-tertiary); }
.appearance-item-info { padding: 8px; font-size: 11px; color: var(--text-secondary); }
</style>
</head>
<body>
<div class="main-container">
<div class="top-bar">
<div class="tabs">
<button class="tab active">Manage Faces</button>
<button class="tab">Search by Face</button>
</div>
<input class="search-input" placeholder="Filter by name or video...">
<div class="actions">
<button class="btn btn-secondary">+ Add Person</button>
</div>
</div>
<div style="display: flex; flex-direction: column; flex: 1; overflow: hidden;">
<div class="people-strip">
<div class="person-pill">
<div class="avatar">JW</div>
<span class="person-pill-name">John Wilson</span>
</div>
<div class="person-pill selected">
<div class="avatar">SM</div>
<span class="person-pill-name">Sarah Mitchell</span>
</div>
<div class="person-pill">
<div class="avatar">RJ</div>
<span class="person-pill-name">Robert Jackson</span>
</div>
<div class="person-pill">
<div class="avatar">EL</div>
<span class="person-pill-name">Emily Lawrence</span>
</div>
<div class="person-pill">
<div class="avatar">MT</div>
<span class="person-pill-name">Michael T.</span>
</div>
<div class="person-pill">
<div class="avatar">DK</div>
<span class="person-pill-name">David King</span>
</div>
<div class="person-pill">
<div class="avatar">LM</div>
<span class="person-pill-name">Lisa Martinez</span>
</div>
<div class="person-pill">
<div class="avatar">+</div>
<span class="person-pill-name">Add New</span>
</div>
</div>
<div class="main-area">
<div class="unknown-sidebar">
<div class="unknown-header">Unknown Faces (47)</div>
<div class="unknown-list">
<div class="unknown-item selected">
<div class="face-thumb"></div>
<div class="unknown-item-info">
<div class="unknown-item-count">8 appearances</div>
<div class="unknown-item-video">Morning Worship +3 more</div>
</div>
</div>
<div class="unknown-item">
<div class="face-thumb"></div>
<div class="unknown-item-info">
<div class="unknown-item-count">6 appearances</div>
<div class="unknown-item-video">Convention Part 1</div>
</div>
</div>
<div class="unknown-item">
<div class="face-thumb"></div>
<div class="unknown-item-info">
<div class="unknown-item-count">5 appearances</div>
<div class="unknown-item-video">Studio Tour</div>
</div>
</div>
<div class="unknown-item">
<div class="face-thumb"></div>
<div class="unknown-item-info">
<div class="unknown-item-count">4 appearances</div>
<div class="unknown-item-video">Documentary</div>
</div>
</div>
<div class="unknown-item">
<div class="face-thumb"></div>
<div class="unknown-item-info">
<div class="unknown-item-count">4 appearances</div>
<div class="unknown-item-video">Special Talk</div>
</div>
</div>
</div>
</div>
<div class="content-area">
<div class="content-header">
<div class="face-thumb" style="width: 48px; height: 48px;"></div>
<div>
<h2>Unknown Person</h2>
<span style="font-size: 13px; color: var(--text-secondary);">8 appearances in 4 videos</span>
</div>
<div class="assign-controls">
<select><option>Assign to person...</option></select>
<button class="btn btn-primary">Assign All</button>
<button class="btn btn-danger btn-small">Delete Selected</button>
</div>
</div>
<div class="content-body">
<div class="appearances-grid">
<div class="appearance-item selected"><img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect fill='%232a2a2a' width='160' height='90'/%3E%3C/svg%3E"><div class="appearance-item-info">Morning Worship - Frame 245</div></div>
<div class="appearance-item selected"><img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect fill='%232a2a2a' width='160' height='90'/%3E%3C/svg%3E"><div class="appearance-item-info">Morning Worship - Frame 890</div></div>
<div class="appearance-item"><img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect fill='%232a2a2a' width='160' height='90'/%3E%3C/svg%3E"><div class="appearance-item-info">Annual Meeting - Frame 1024</div></div>
<div class="appearance-item"><img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect fill='%232a2a2a' width='160' height='90'/%3E%3C/svg%3E"><div class="appearance-item-info">Annual Meeting - Frame 2100</div></div>
<div class="appearance-item"><img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect fill='%232a2a2a' width='160' height='90'/%3E%3C/svg%3E"><div class="appearance-item-info">Studio Tour - Frame 567</div></div>
<div class="appearance-item"><img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect fill='%232a2a2a' width='160' height='90'/%3E%3C/svg%3E"><div class="appearance-item-info">Studio Tour - Frame 890</div></div>
<div class="appearance-item"><img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect fill='%232a2a2a' width='160' height='90'/%3E%3C/svg%3E"><div class="appearance-item-info">Interview - Frame 234</div></div>
<div class="appearance-item"><img src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 160 90'%3E%3Crect fill='%232a2a2a' width='160' height='90'/%3E%3C/svg%3E"><div class="appearance-item-info">Interview - Frame 567</div></div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>