Data & Cards
Where real data lives. Numbers stay Red Hat Mono and tabular; cards are flat hairline panels — the interactive variant adds the wing-wipe, never a shadow.
Cards
.across-card · .across-card--interactiveThe container archetype. Resting cards are still; .across-card--interactive adds the wing-wipe and a 2.5% lift. Tint the accent with .across-card--track / --orbit / --relay.
Weather
Clear in San Francisco — 62°F, feels like 60°. Static card, no hover affordance.
<div class="across-card across-card--interactive across-card--orbit">
<div class="across-card__eyebrow"><span class="dot"></span> Currency · live</div>
<div class="across-card__value">0.9234</div>
<div class="across-card__delta across-card__delta--up">+0.23%</div>
</div>
Stat Grid
.across-statgrid · .across-statA hairline-separated row of key figures. Deltas use the semantic up/down colors — never the rebindable accent.
<div class="across-statgrid">
<div class="across-stat">
<div class="across-stat__label">USD → EUR</div>
<div class="across-stat__value">0.9234</div>
<div class="across-stat__foot"><span class="across-stat__delta across-stat__delta--up">+0.23%</span> 24h</div>
</div>
</div>
The ledger. Number columns are .num (right-aligned, tabular); --boxed frames it, --zebra stripes it. For sort/filter/select/paginate, wrap it in the full .across-data-table below.
| Pair | Name | Rate | 24h | Status |
|---|---|---|---|---|
| USD → EUR | Euro | 0.9234 | +0.23% | Live |
| GBP → USD | US Dollar | 1.2710 | −0.11% | Live |
| BTC → USD | Bitcoin | 67,412.00 | −1.82% | Volatile |
<table class="across-table across-table--boxed across-table--zebra">
<thead><tr><th>Pair</th><th class="num">Rate</th></tr></thead>
<tbody>
<tr><td>USD → EUR</td><td class="num">0.9234</td></tr>
</tbody>
</table>
Data Table
.across-data-table · data-dtableThe working ledger: a .across-table wrapped in .across-data-table[data-dtable] for sort, scoped search, status filter, row selection, and density — all auto-wired by primitives.js straight from the markup (the rows live in HTML). Click a header to sort, type to filter, tick rows to select. The same surface drives the currency dashboard.
| Pair | Status | Rate | 24h | |
|---|---|---|---|---|
| EUR / USD | Live | 1.0847 | +0.21% | |
| GBP / USD | Live | 1.2693 | −0.08% | |
| USD / JPY | Live | 157.42 | +0.44% | |
| AUD / USD | Paused | 0.6612 | +0.12% | |
| USD / CHF | Live | 0.8971 | −0.17% | |
| USD / CAD | Stale | 1.3702 | +0.03% |
<div class="across-data-table" data-dtable>
<div class="across-data-table__bar">
<span class="across-data-table__title">Tracked pairs</span>
<span class="across-data-table__count" data-dt-count></span>
<span class="across-data-table__bar-spacer"></span>
<div class="across-data-table__search" data-dt-search>…<input>…</div>
<div class="across-data-table__filter" data-dt-filter>…</div>
<div class="across-data-table__density" data-dt-density>…</div>
</div>
<div class="across-data-table__scroll">
<table class="across-table" data-dt-table>
<thead><tr>
<th class="across-data-table__checkcol"><input type="checkbox" data-dt-all></th>
<th class="is-sortable" data-key="pair">Pair</th>
<th class="num is-sortable" data-key="rate">Rate</th>
</tr></thead>
<tbody>
<tr data-status="live">
<td><input type="checkbox" class="across-data-table-check dt-row"></td>
<td>EUR / USD</td>
<td class="num" data-sort="1.0847">1.0847</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- sort / search / filter / select / density auto-wire from the markup -->
Sortable
.across-sortable · data-sortableDrag rows to reorder — auto-wired by primitives.js, fires a reorder event. The handle is the drag affordance.
<div class="across-sortable" data-sortable>
<div class="across-sortable__row">
<span class="across-sortable__handle"><i class="ph-light ph-dots-six-vertical"></i></span>
<span class="across-sortable__main"><span class="across-sortable__name">USD → EUR</span></span>
</div>
</div>
Avatars
.across-avatar · .across-avatar-groupTonal initials drawn from the brand wings, with presence rings and an overflow group. Sizes xs → xl. When a headshot is available, drop an <img class="across-avatar__img"> inside — it fills the shape, keeps the presence ring, and stacks in groups just like the initials.
<!-- initials -->
<span class="across-avatar across-avatar--md across-avatar--orbit">KA</span>
<!-- headshot — drop in an img, it fills the shape -->
<span class="across-avatar across-avatar--md">
<img class="across-avatar__img" src="/avatars/rosa.jpg" alt="Rosa Okafor">
</span>
<!-- headshot + presence ring -->
<span class="across-avatar across-avatar--md">
<img class="across-avatar__img" src="/avatars/eli.jpg" alt="Eli Jensen">
<span class="across-avatar__status across-avatar__status--online"></span>
</span>
<!-- photos and initials stack together in a group -->
<div class="across-avatar-group">
<span class="across-avatar across-avatar--sm"><img class="across-avatar__img" src="/avatars/kai.jpg" alt="Kai"></span>
<span class="across-avatar across-avatar--sm across-avatar--track">DA</span>
<span class="across-avatar-group__more">+3</span>
</div>

