← back to Lifestyle Asset Intel
views/families.ejs
57 lines
<%- include('partials/head') %>
<main class="container">
<p class="crumbs"><a href="/">← Console</a></p>
<h1>Model families</h1>
<p class="muted">Cohort index across every brand + model family in the catalog. Click into a family for its asset roster, related indices, and 24-month comp totals.</p>
<form class="controls" method="GET" action="/family" role="region" aria-label="Family sort">
<label>Sort
<% var s = (typeof sort === 'string' ? sort : '') || ''; %>
<select name="sort" onchange="this.form.submit()">
<option value="" <%= s === '' ? 'selected' : '' %>>Brand & name (default)</option>
<option value="name" <%= s === 'name' ? 'selected' : '' %>>Family name A→Z</option>
<option value="slug" <%= s === 'slug' ? 'selected' : '' %>>Slug A→Z</option>
<option value="assets-desc"<%= s === 'assets-desc' ? 'selected' : '' %>>Asset count ↓</option>
<option value="comps-desc" <%= s === 'comps-desc' ? 'selected' : '' %>>24-month comps ↓</option>
<option value="value-desc" <%= s === 'value-desc' ? 'selected' : '' %>>Avg Q50 ↓</option>
<option value="value-asc" <%= s === 'value-asc' ? 'selected' : '' %>>Avg Q50 ↑</option>
</select>
</label>
<label>Density
<input type="range" id="density" min="3" max="8" step="1" value="3" aria-label="Grid density">
<output id="densityOut">3</output>
</label>
<noscript><button type="submit">Apply</button></noscript>
</form>
<% if (!families.length) { %>
<p class="muted">No families seeded yet — run <code>npm run seed</code>.</p>
<% } else { %>
<section class="grid" id="grid">
<% families.forEach(function (f) { %>
<a class="card" href="/family/<%= f.slug %>">
<div class="card-head">
<span class="brand-tag"><%= f.brand.name %></span>
<span class="family-tag"><%= f.name %></span>
</div>
<div class="card-body">
<div class="material muted mono"><%= f.brand.slug %> / <%= f.slug %></div>
<div class="value-band">
<span class="q50">$<%= money(f.avg_q50) %></span>
</div>
<div class="meta">
<span title="Canonical assets in this family">A <%= f.asset_count %></span>
<span title="Total comparable transactions in trailing 24 months">n <%= f.total_comps_24m %></span>
</div>
</div>
</a>
<% }); %>
</section>
<% } %>
</main>
<%
function money(v){ if(v==null||v==='') return '—'; var n=parseFloat(v); return isFinite(n)?n.toLocaleString('en-US',{maximumFractionDigits:0}):'—'; }
%>
<%- include('partials/foot') %>