Component library and brand reference
Major Third scale (1.25) from 14px base. NHG Display throughout. No monospace — all data uses tabular numerals.
Brain in a Vat secured placements across 31 Spotify playlists during the Q1 campaign cycle, with an average follower count of 124,500 per playlist. Editorial coverage included Filtr, thatgaragepage, and Deep House Nation. The campaign exceeded placement targets by 40% while maintaining a 92% approval rate from curators.
Centered wordmark + tagline. Used on landing pages and the design guide itself. Tagline uses text-wrap: balance to avoid orphaned words on the second line.
Animated variant uses the Ross Aitken wordmark GIF instead of the static PNG. Same layout and sizing. Source GIF is black on transparent, generated per-color via ~/Scripts/maintenance/generate-footer-gifs.sh.
Reports use a linear (non-centered) header: wordmark → H1 title → subtitle. Wordmark is 36px height with 32px bottom margin. H1 is 28px/700 (not 34px/900 like page titles). Subtitle adds 48px bottom margin before content.
DSP promo campaign report
Random accent assigned on page load. Cycles through the pool via footer shuffle button.
Report-style placement table: 3 columns, collapsible group headers, subtotal rows, hyperlinked placements in accent color.
| Placement | Curator | Followers |
|---|---|---|
| Editorial — Spotify | ||
| New Music Friday | Spotify Editorial | 4,540,936 |
| Housewerk | Spotify Editorial | 1,950,234 |
| Dance Rising | Spotify Editorial | 1,838,107 |
| 3 placements · 8.3M reach | ||
| Third Party — YouTube | ||
| House Hits 2025 | Mav | 179,000 |
| Tech House Essentials 2024 | PLATTENBAU MUSIC | 1,410 |
| 2 placements · 180.4K reach | ||
Multi-row filter system with label + tag toggles. Three independent dimensions: Status, Type, Platform. Rows filter using AND logic across all three. Tags use data-status, data-type, data-platform attributes.
Filter Behavior
filterMap.status:type:value and status:platform:value. Drives dynamic tag visibility — tags with no matching data for active statuses are hidden via display:none.statusMatch && typeMatch && platformMatch. Group headers, subtotals, and totals follow their child visibility.Collapsible group headers with toggle arrow. Groups contain placement rows and end with a subtotal row. Status totals span the full table width. Each row carries data-status, data-type, data-platform, and data-group attributes for filtering and grouping.
| Placement | Curator | Followers |
|---|---|---|
| Third Party — Spotify | ||
| New Dance Music Friday | Spinnin' Records | 31,650 |
| Pop Hits 2026 | Black Hand Music Network | 24,994 |
| 2 placements · 56.6K reach | ||
| 2 total pitched placements · 56.6K combined reach | ||
Collapse Behavior (JS)
.collapsed class on the .group-header row. All sibling rows with matching data-group (excluding the header itself) are hidden/shown..group-toggle rotates from ▾ (down) to ▸ (right) via CSS transform: rotate(-90deg) when .collapsed is present.status-type-platform (e.g. earned-third-party-spotify). Shared by header, data rows, and subtotal.SVG platform icons from the icon sprite, shown inline next to curator names in placement tables. Each icon is a hyperlink to the curator's profile on that platform. Icons are 14px, secondary color, accent on hover. Wrapped in .curator-platforms container.
Stream totals displayed below charts. Single mode shows total streams. Comparison mode shows per-track totals with color-coded labels matching chart lines.
Cards reordered: reach on top, placement count middle, platform name bottom (14px, prominent). Grouped by Editorial / Third Party with breakdown label.
Bar Chart
SVG Sparkline
Dot Chart
Split by Editorial / Third Party with per-platform stat cards. Cards show placements count, reach (when available), and platform name.
With Reach
Without Reach (single type)
Curator feedback displayed in table cells. Italic secondary text, truncated to one line with ellipsis, expands on hover. Curly quotes auto-applied via CSS ::before/::after on non-empty cells. Empty cells show nothing.
| Placement | Curator | Feedback |
|---|---|---|
| All About House | unique playlists | Your track fits in one of our playlists! Keep creating, keep submitting! |
| HOUSE MUSIC 2026 | Dancefy Records | Hey, this is amazing! |
| New Music Friday | Spotify Editorial |
Tertiary-colored social platform indicators displayed below curator names in placement tables. Middot-separated.
| Curator | Followers |
|---|---|
| Ben Dooks | 20,715 |
| Whistleface | 22,714 |
| Spotify Editorial | 4,540,936 |
Intro text for sections, used to provide context before tables or content blocks. Also used as .organic-note in non-pitched placement sections.
Placements secured through BiV's direct curator relationships and SubmitHub pitching. Excludes algorithmic and editorial placements.
These placements were discovered organically and were not part of the pitched campaign.
Used within <details> sections to create sub-groupings. In reports, these label algorithmic vs organic placement categories within a parent section.
No algorithmic playlist placements detected.
3 organic placements discovered outside the pitched campaign.
Table rows inside <details> sections get a subtle accent tint on hover. 6% accent via color-mix, 0.15s transition.
| Placement | Followers |
|---|---|
| New Music Friday | 4,540,936 |
| Housewerk | 1,950,234 |
| Dance Rising | 1,838,107 |
Table headers inside <details> sections stick to the top of the viewport when scrolling. .table-wrap set to overflow: visible on desktop to enable sticky behavior. Mobile overrides with overflow-x: auto for horizontal scroll.
| Placement | Curator | Followers |
|---|---|---|
| New Music Friday | Spotify Editorial | 4,540,936 |
| Housewerk | Spotify Editorial | 1,950,234 |
| Dance Rising | Spotify Editorial | 1,838,107 |
| Club Hits 2026 | Spotify Editorial | 680,639 |
| All New Dance | Spotify Editorial | 565,900 |
| Dance 2026 | Spotify Editorial | 188,370 |
| New Dance Beats | Spotify Editorial | 148,819 |
| The Dance List | Spotify Editorial | 107,693 |
Three D3.js chart functions in assets/charts.js. All render into a target <div> container (selector or element), are responsive via SVG viewBox, and read CSS custom properties for theming. Dark mode triggers a full re-render to pick up updated variables. Requires D3.js v7.
bivStreamTrajectory(container, data, options)
'#chart-trajectory')[{ date: 'YYYY-MM-DD', streams: Number }, ...]{ width: 720, height: 320 } (defaults)bivReleaseComparison(container, data, options)
[{ name: 'Track Name', isBivCampaign: Boolean, data: [{ day: Number, streams: Number }, ...] }, ...]{ width: 720, height: 360 } (defaults)bivBarChart(container, data, options)
[{ label: 'Platform', value: Number, highlight: Boolean }, ...]{ width: 720, height: auto, showValues: true }highlight: true uses accent color. Labels left-aligned, values right of bar in abbreviated notation. 28px bar height, 8px gap.Uses .tag.clickable to toggle between chart modes (single trajectory vs. multi-release comparison) in the same container. Text toggles between "Compare Releases" and "Hide Comparison". Active state via .active class. On toggle, re-renders chart and updates stats block below.
Placement table rows carry four data attributes for filtering and grouping. Generated at report build time from Airtable data.
earned (pitched placements) or non-pitched (organic/editorial discovered outside campaign)editorial | third-party | organicspotify, youtube, apple-music, deezer, amazon, beatport, soundcloud, tidal, traxsourcestatus-type-platform (e.g. earned-third-party-spotify). Links header, data rows, and subtotal.Hidden SVG block at top of report HTML defines platform icons as <symbol> elements. Referenced inline via <svg><use href="#icon-xxx"/></svg>. Icons are 14px, inherit currentColor, shown in .curator-platforms containers.
Footer buttons for exporting report data. Both use .footer-btn styling.
tr[data-status] rows. Builds CSV with columns: Status, Type, Platform, Placement, Curator, Followers, Feedback. Downloads as Artist - Track - Campaign Report.csv.window.print() for native Save as PDF. Print styles hide filters, footer controls, and accent dots. details sections forced open via .section-body { display: block !important }.Callout — Success Variant
Used in reports for campaign highlights. Green left border + green-tinted background. Includes .accent-dot indicator before bold label.
Horizontal Columns
Vertical Stacked (Color-coded)
Compact Table-like
SIDEPIECE — "On My Mind" has been placed on Filtr's Friday Cratediggers playlist (842K followers). Mark as confirmed?