← back to Osborne Redesign
compare.html
196 lines
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Compare · Osborne Partners — 10 Themes Side by Side</title>
<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700;800&family=Playfair+Display:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: #0a0a0a; color: #e8e8e8;
font-family: 'Inter', system-ui, sans-serif;
min-height: 100vh;
}
.topbar {
position: sticky; top: 0; z-index: 50;
background: rgba(10,10,10,0.92); backdrop-filter: blur(20px);
border-bottom: 1px solid rgba(255,255,255,0.08);
padding: 16px 24px;
display: flex; gap: 24px; align-items: center; flex-wrap: wrap;
}
.brand {
display: flex; flex-direction: column;
font-family: 'Playfair Display', serif; font-weight: 700; font-size: 20px;
}
.brand small { font-family: 'JetBrains Mono', monospace; font-size: 9px; letter-spacing: 3px; color: #bfa15a; }
.topbar nav { display: flex; gap: 4px; flex-wrap: wrap; flex: 1; justify-content: center; }
.topbar nav button {
padding: 8px 14px; background: transparent; color: #aaa;
border: 1px solid rgba(255,255,255,0.12); border-radius: 999px;
font-family: inherit; font-size: 12px; cursor: pointer;
transition: all 0.2s;
}
.topbar nav button:hover { color: #fff; border-color: rgba(255,255,255,0.4); }
.topbar nav button.is-active { background: #fff; color: #000; border-color: #fff; }
.topbar .scale {
display: flex; gap: 8px; align-items: center;
font-family: 'JetBrains Mono', monospace; font-size: 11px;
color: #888;
}
.topbar .scale input { width: 120px; }
.grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 12px;
padding: 16px;
}
.tile {
position: relative;
border-radius: 8px; overflow: hidden;
background: #1a1a1a;
border: 1px solid rgba(255,255,255,0.08);
aspect-ratio: 9 / 16;
transition: transform 0.2s, box-shadow 0.2s;
}
.tile:hover { transform: translateY(-2px); box-shadow: 0 12px 32px rgba(0,0,0,0.6); }
.tile__head {
position: absolute; top: 0; left: 0; right: 0;
padding: 10px 14px;
display: flex; justify-content: space-between; align-items: center;
background: linear-gradient(180deg, rgba(0,0,0,0.65) 0%, transparent 100%);
z-index: 5;
pointer-events: none;
font-size: 11px;
color: #fff;
}
.tile__head .num { font-family: 'JetBrains Mono', monospace; opacity: 0.7; letter-spacing: 1px; }
.tile__head .name { font-family: 'Playfair Display', serif; font-weight: 600; font-size: 14px; }
.tile__open {
position: absolute; top: 8px; right: 8px; z-index: 10;
padding: 4px 8px; background: rgba(255,255,255,0.18); backdrop-filter: blur(10px);
border-radius: 4px; font-size: 10px; color: #fff; text-decoration: none;
font-family: 'JetBrains Mono', monospace; letter-spacing: 1px;
text-transform: uppercase;
border: 1px solid rgba(255,255,255,0.2);
}
.tile__open:hover { background: #fff; color: #000; }
.tile iframe {
width: 250%; /* zoom-out: render at 1440 wide, scale to fit ~36% */
height: 250%;
border: 0;
transform: scale(0.4);
transform-origin: 0 0;
background: #fff;
pointer-events: auto;
}
.info {
padding: 24px; max-width: 920px; margin: 0 auto;
text-align: center;
color: #aaa;
}
.info h1 {
font-family: 'Playfair Display', serif; font-size: 36px; font-weight: 600;
color: #fff; margin-bottom: 12px;
}
.info p { font-size: 15px; line-height: 1.6; margin-bottom: 8px; }
@media (max-width: 1300px) { .grid { grid-template-columns: repeat(4,1fr); } }
@media (max-width: 1000px) { .grid { grid-template-columns: repeat(3,1fr); } }
@media (max-width: 720px) { .grid { grid-template-columns: repeat(2,1fr); } }
@media (max-width: 480px) { .grid { grid-template-columns: 1fr; } }
</style>
</head>
<body>
<header class="topbar">
<a href="themes.html" class="brand" style="text-decoration:none;color:inherit">
<span>Osborne Partners</span>
<small>SIDE-BY-SIDE COMPARE · 10 THEMES</small>
</a>
<nav id="pageNav"></nav>
<a href="themes.html" style="color:#aaa;font-size:12px;text-decoration:none">Theme Gallery →</a>
</header>
<section class="info">
<h1>Ten themes. One page. Pick a direction.</h1>
<p>Each tile below is a live render of the chosen page in one of the ten theme directions. Click any tile to open the full site in that theme; click a tab above to switch which page is being compared.</p>
</section>
<div class="grid" id="grid"></div>
<script>
const THEMES = [
{ id:'heritage', name:'Heritage Navy' },
{ id:'whisper', name:'Whisper' },
{ id:'broadsheet',name:'Broadsheet' },
{ id:'onyx', name:'Onyx' },
{ id:'pacific', name:'Pacific' },
{ id:'atelier', name:'Atelier' },
{ id:'loro', name:'Loro' },
{ id:'monolith', name:'Monolith' },
{ id:'archive', name:'Archive' },
{ id:'aurora', name:'Aurora' }
];
const PAGES = [
{ slug:'index.html', label:'Home' },
{ slug:'history.html', label:'History' },
{ slug:'team.html', label:'Team' },
{ slug:'philosophy.html', label:'Philosophy' },
{ slug:'performance.html', label:'Performance' },
{ slug:'service-area.html', label:'Service Area' },
{ slug:'clients.html', label:'Clients' },
{ slug:'insights.html', label:'Insights' },
{ slug:'videos.html', label:'Videos' },
{ slug:'reports.html', label:'Reports' },
{ slug:'contact.html', label:'Contact' }
];
let activePage = new URLSearchParams(location.search).get('page') || 'index.html';
function renderNav() {
const nav = document.getElementById('pageNav');
nav.innerHTML = PAGES.map(p =>
`<button data-page="${p.slug}" class="${p.slug===activePage?'is-active':''}">${p.label}</button>`
).join('');
nav.querySelectorAll('button').forEach(b => {
b.addEventListener('click', () => {
activePage = b.dataset.page;
history.replaceState(null, '', '?page=' + activePage);
renderNav(); renderGrid();
});
});
}
function renderGrid() {
const grid = document.getElementById('grid');
const bust = Date.now(); // cache-buster so iframes always pull fresh JS
grid.innerHTML = THEMES.map((t, i) => {
const num = String(i+1).padStart(2,'0');
const src = `${activePage}?theme=${t.id}&_=${bust}`;
return `
<div class="tile">
<div class="tile__head">
<span class="num">${num}</span>
<span class="name">${t.name}</span>
</div>
<a class="tile__open" href="${activePage}?theme=${t.id}" target="_blank" rel="noopener noreferrer">Open ↗</a>
<iframe src="${src}" loading="lazy" sandbox="allow-scripts allow-same-origin"></iframe>
</div>`;
}).join('');
}
renderNav();
renderGrid();
</script>
</body>
</html>