← back to Lifestyle Asset Intel
views/family.ejs
98 lines
<%- include('partials/head') %>
<main class="container">
<p class="crumbs"><a href="/">← Console</a></p>
<h1><%= out.brand.name %> <%= out.family.name %></h1>
<p class="muted mono"><%= out.brand.slug %> / <%= out.family.slug %></p>
<section class="family-summary">
<h2>Cohort summary</h2>
<ul class="kpis">
<li><span class="lbl">Assets</span><span class="val"><%= out.summary.asset_count %></span></li>
<li><span class="lbl">Avg Q50</span><span class="val">$<%= money(out.summary.avg_q50) %></span></li>
<li><span class="lbl">Total comps (24mo)</span><span class="val"><%= out.summary.total_comps %></span></li>
<li><span class="lbl">Avg liquidity</span><span class="val"><%= pct(out.summary.avg_liquidity) %></span></li>
</ul>
</section>
<% if (out.indices && out.indices.length) { %>
<section class="family-indices">
<h2>Related indices</h2>
<ul class="related-indices">
<% out.indices.forEach(function (i) { %>
<li>
<a href="/indices/<%= i.slug %>"><%= i.name %></a>
<span class="muted mono"> · <%= i.slug %> · <%= i.methodology_version %></span>
</li>
<% }); %>
</ul>
</section>
<% } %>
<section class="family-grid">
<h2>Assets in family (<%= out.assets.length %>)</h2>
<% if (!out.assets.length) { %>
<p class="muted">No assets in this family yet.</p>
<% } else { %>
<div class="controls" role="region" aria-label="Grid controls">
<label>Sort
<select id="sort">
<option value="newest">Newest snapshot</option>
<option value="brand">Brand A→Z</option>
<option value="family">Family A→Z</option>
<option value="q50_asc">Q50 ascending</option>
<option value="q50_desc">Q50 descending</option>
<option value="liquidity_desc">Liquidity ↓</option>
<option value="confidence_desc">Confidence ↓</option>
<option value="recency_desc">Recently revalued</option>
</select>
</label>
<label>Density
<input type="range" id="density" min="3" max="8" step="1" value="4" aria-label="Grid density">
<output id="densityOut">4</output>
</label>
<label class="grow">Search
<input type="search" id="search" placeholder="material, color, hardware…" aria-label="Filter assets in family">
</label>
</div>
<section class="grid" id="grid">
<% out.assets.forEach(function (a) { %>
<a class="card"
href="/asset/<%= a.slug %>"
data-brand="<%= a.brand_name %>"
data-family="<%= a.family_name %>"
data-material="<%= a.material || '' %>"
data-color="<%= a.color || '' %>"
data-q50="<%= a.q50 || 0 %>"
data-liquidity="<%= a.liquidity_score || 0 %>"
data-confidence="<%= a.confidence || 0 %>"
data-asof="<%= a.as_of || '' %>">
<div class="card-head">
<span class="brand-tag"><%= a.brand_name %></span>
<span class="family-tag"><%= a.family_name %> <%= a.size || '' %><% if (a.attrs && a.attrs.exotic) { %> <span class="exotic-badge" title="Exotic skin or special edition">EXOTIC</span><% } %></span>
</div>
<div class="card-body">
<div class="material"><%= a.material || '—' %><% if (a.color) { %> · <%= a.color %><% } %><% if (a.hardware) { %> · <%= a.hardware %><% } %></div>
<div class="value-band">
<span class="q10">$<%= money(a.q10) %></span>
<span class="q50">$<%= money(a.q50) %></span>
<span class="q90">$<%= money(a.q90) %></span>
</div>
<div class="meta">
<span title="Liquidity score">L <%= pct(a.liquidity_score) %></span>
<span title="Confidence">C <%= pct(a.confidence) %></span>
<span title="Comp count">n <%= a.comp_count || 0 %></span>
</div>
</div>
</a>
<% }); %>
</section>
<% } %>
</section>
</main>
<%
function money(v){ if(v==null||v==='') return '—'; var n=parseFloat(v); return isFinite(n)?n.toLocaleString('en-US',{maximumFractionDigits:0}):'—'; }
function pct(v){ if(v==null||v==='') return '—'; var n=parseFloat(v); return isFinite(n)?Math.round(n*100)+'%':'—'; }
%>
<%- include('partials/foot') %>