← 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>