BirdsEye ROI, Marketing Visual System
Design authority for every marketing graphic in this kit. Every infographic in
infographic-specs.md draws its colors, type, spacing, and radii from this file.
Nothing in the kit hardcodes a hex value outside this system.
Brand metaphor: an eagle eye view over noisy ground. The product sits above the call log the way a bird of prey sits above terrain, altitude, distance, and precision instead of decoration. The visual register is a financial terminal: Bloomberg panel, flight instrument, radar scope, not a SaaS landing page. Dense, exact, dark by default, numbers treated as the hero, not the illustration around them.
1. Color tokens
Two-tier system: a dark terminal surface (primary, marketing default) and a light surface (secondary, for print/embed contexts that require white backgrounds). Every token below ships both values. Base hue is a deep sky/navy blue (the altitude the eagle flies at), accent is a hot signal amber (the one ring that paid), and a spam-red is reserved exclusively for noise/spam data, never for anything else.
| Token | Role | Dark value | Light value |
|---|---|---|---|
--surface-0 |
Page background | #080B14 |
#F5F7FA |
--surface-1 |
Panel / card background | #0F1420 |
#FFFFFF |
--surface-2 |
Raised panel, nested chart bg | #161D2E |
#EEF1F6 |
--surface-border |
Hairline borders, dividers | #232B40 |
#D8DEE9 |
--ink-primary |
Primary text, headline numbers | #F3F6FC |
#0B1120 |
--ink-secondary |
Body copy, axis labels | #A9B4CC |
#4B5568 |
--ink-tertiary |
Captions, footnotes, units | #6C7793 |
#7A849C |
--brand-sky |
Primary brand blue, structural elements | #3B82F6 |
#2563EB |
--brand-sky-dim |
Secondary blue, gridlines, inactive series | #1E3A5F |
#BFD4F5 |
--signal-amber |
The one ring that paid: revenue, conversion, primary data-ink | #F5A623 |
#D6870E |
--signal-amber-dim |
Amber at low emphasis, fills under amber lines | #7A5416 |
#FCE4B8 |
--noise-red |
Spam / noise / excluded data only, never decorative | #E15554 |
#C13A3A |
--noise-red-dim |
Spam fill tint | #3A1E1E |
#F9DCDC |
--positive-green |
Positive delta, close rate, conversion up | #4ADE80 |
#158A47 |
--grid-line |
Chart gridlines, tick marks | #1B2438 |
#E2E6EE |
Color has a job, per Principle 5:
- Amber = money. Revenue, attributed calls, ROI, the paid ring. It is the only warm accent in the system and it always means "this is the number that matters."
- Sky blue = structure. Providers, pipeline stages, categories, containers, the scaffolding the data sits inside.
- Red = noise. Spam only. Never used for errors, warnings, or anything else, so the eye learns one meaning for it across the whole kit.
- Green = a positive delta or a close/conversion outcome, used sparingly, never as a background fill.
Accessible contrast pairs (WCAG AA, dark surface, primary usage)
| Pair | Ratio | Rating |
|---|---|---|
--ink-primary (#F3F6FC) on --surface-0 (#080B14) |
18.1:1 | AA (and AAA) |
--ink-primary (#F3F6FC) on --surface-1 (#0F1420) |
16.4:1 | AA (and AAA) |
--ink-secondary (#A9B4CC) on --surface-0 (#080B14) |
9.8:1 | AA (and AAA) |
--ink-secondary (#A9B4CC) on --surface-1 (#0F1420) |
8.9:1 | AA (and AAA) |
--ink-tertiary (#6C7793) on --surface-1 (#0F1420) |
4.6:1 | AA (large text / 14px+ only) |
--signal-amber (#F5A623) on --surface-0 (#080B14) |
9.7:1 | AA (and AAA) |
--signal-amber (#F5A623) on --surface-1 (#0F1420) |
8.8:1 | AA (and AAA) |
--brand-sky (#3B82F6) on --surface-0 (#080B14) |
5.1:1 | AA |
--noise-red (#E15554) on --surface-0 (#080B14) |
5.4:1 | AA |
--positive-green (#4ADE80) on --surface-1 (#0F1420) |
11.2:1 | AA (and AAA) |
Accessible contrast pairs (WCAG AA, light surface)
| Pair | Ratio | Rating |
|---|---|---|
--ink-primary (#0B1120) on --surface-0 (#F5F7FA) |
17.6:1 | AA (and AAA) |
--ink-secondary (#4B5568) on --surface-0 (#F5F7FA) |
7.4:1 | AA (and AAA) |
--ink-tertiary (#7A849C) on --surface-1 (#FFFFFF) |
4.5:1 | AA (large text / 14px+ only) |
--signal-amber (#D6870E) on --surface-1 (#FFFFFF) |
4.6:1 | AA |
--brand-sky (#2563EB) on --surface-1 (#FFFFFF) |
5.2:1 | AA |
--noise-red (#C13A3A) on --surface-1 (#FFFFFF) |
5.4:1 | AA |
--positive-green (#158A47) on --surface-1 (#FFFFFF) |
4.7:1 | AA |
Rule: --ink-tertiary is reserved for text 14px and above (captions, units,
footnotes). Never drop --ink-tertiary below 14px, and never use it for a data
value, only for a label of a data value.
2. Type scale
Font stack: IBM Plex Sans (headlines, UI labels, named as the Google Font of record) paired with IBM Plex Mono (all numerals, data values, axis ticks, timestamps). This is the terminal-instrument pairing: a humanist grotesque for words, a true monospace for anything that is a number, so figures always align in a column and never wiggle in width as they update. System fallback stack:
--font-display: "IBM Plex Sans", -apple-system, "Segoe UI", Roboto, sans-serif;
--font-mono: "IBM Plex Mono", "SF Mono", "Cascadia Code", Consolas, monospace;| Step | Size / line-height | Weight | Family | Use |
|---|---|---|---|---|
| Display | 56px / 60px | 700 | Plex Sans | Kit cover title only |
| H1 | 40px / 46px | 700 | Plex Sans | Infographic title |
| H2 | 28px / 34px | 600 | Plex Sans | Section headers inside an infographic |
| H3 | 20px / 26px | 600 | Plex Sans | Card/panel headers |
| Body | 16px / 24px | 400 | Plex Sans | Descriptions, legends |
| Caption | 13px / 18px | 500 | Plex Sans | Footnotes, source lines, unit labels |
| Data XL | 64px / 64px | 600 | Plex Mono | The single hero figure on a panel |
| Data L | 36px / 40px | 600 | Plex Mono | Primary KPI figures |
| Data M | 22px / 28px | 500 | Plex Mono | Secondary figures, table values |
| Data S | 14px / 18px | 500 | Plex Mono | Axis ticks, small inline values |
Scale ratio is roughly 1.25 to 1.4 between adjacent display steps, per the hierarchy-first principle. Every data figure, with no exception, is set in Plex Mono. Every word of description is set in Plex Sans. This is the load-bearing rule of the whole kit: mono means "this is measured," sans means "this is explained."
3. Spacing scale
Base unit 4px. Off-by-4px is wrong, per Principle 4.
--space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px;
--space-5: 20px; --space-6: 24px; --space-8: 32px; --space-10: 40px;
--space-12: 48px; --space-16: 64px; --space-20: 80px; --space-24: 96px;- Panel padding at 1200px canvas:
--space-8(32px) outer,--space-6(24px) between internal blocks,--space-4(16px) between a label and its value. - Panel padding at 380px canvas:
--space-4(16px) outer,--space-3(12px) between internal blocks. - Minimum gap between two independent data marks (bars, nodes, cards):
--space-4. - Never place a caption closer than
--space-2(8px) to the value it describes.
4. Radius scale
--radius-sm: 4px; /* chips, tags, badge pills */
--radius-md: 8px; /* cards, panels, chart containers */
--radius-lg: 12px; /* the outer infographic frame at 1200px */
--radius-full: 999px; /* circular marks, avatar-style nodes, pill badges only */Cards never exceed --radius-lg. No card, panel, or chart container is ever
fully rounded; full radius is reserved for true circular marks and small pills.
5. Elevation
Elevation is used sparingly, this is a flat instrument-panel surface, not a stack of floating cards.
| Level | box-shadow | Use |
|---|---|---|
elevation-0 |
none | Default panel state, flush with page |
elevation-1 |
0 1px 0 var(--surface-border) |
Panel separation, hairline only, no blur |
elevation-2 |
0 4px 12px rgba(0,0,0,0.35) |
The single hero panel on a multi-panel graphic, used once per graphic max |
No elevation-2 plus a visible border on the same element. Pick one lift
mechanism per surface, never stack border and heavy shadow (see impeccable ban
on the "ghost-card" pattern).
6. How a data figure is displayed (the core rule of this kit)
Every number that appears on any infographic must follow this exact structure, top to bottom:
- The value, in Plex Mono, at Data XL, Data L, or Data M depending on
hierarchy weight. Value color is
--signal-amberif it is a revenue or conversion figure,--brand-skyif it is a volume/structural figure,--noise-redif it is a spam/excluded figure,--ink-primaryfor a neutral count. - The unit or context label, in Plex Sans Caption,
--ink-tertiary, directly beneath the value at--space-1to--space-2gap. Example: value103,000+with labelTOTAL CALLS LOGGEDin uppercase, letter-spacing 0.08em. - No sparklines, ever. A trend, split, or comparison is always rendered as one of: a labeled delta ("+12% vs. last period" as static text, never a line), a full-size bar or donut with numeric labels on every segment, or a progress/proportion bar with the percentage printed inline. If a value needs a comparison, draw the comparison at full chart size with axis labels, never as a compressed inline trend line.
- Every chart mark is directly labeled with its number. No mark exists without a visible numeral attached, legends alone are not sufficient. A bar has its value printed at its end or inside it. A donut segment has its percentage printed on or beside the segment.
- Real counts stay real counts. 103,000+ is written as
103,000+, never rounded to "100K+" or "over 100 thousand." $46,000+ is written as$46,000+. 42.3% is written as42.3%, not "42%." Precision is part of the financial terminal feel: exact numbers signal exact tracking. - Units in the caption, never appended to the number.
$46,000+not$46,000+ dollars;42.3%not42.3% percent.
7. Iconography and mark language
No stock photography, no dark scrims over photos, no flat color-slab hero blocks (hard bans, see below). All marks are geometric and hand-authored in SVG: circles, rects, paths, straight or gently curved connective lines. Recurring motifs:
- The eye/scope mark: a simple concentric-circle or crosshair glyph used
as a section marker, never as decoration filling empty space.
Constructed from two circles and a plus, all stroke, no fill, in
--brand-skyor--signal-amber. - The altitude line: a single thin horizontal rule (
--grid-line, 1px) used to separate a "noise" layer from a "signal" layer in split diagrams, always labeled at each end. - Nodes and connectors: pipeline and flow diagrams use rounded-rect nodes
(
--radius-md) connected by 1.5px stroke paths in--brand-sky-dim, with arrowheads as simple triangles, never chevron icon fonts.
8. Hard constraints (binding on every graphic in this kit)
- No stock photography, ever.
- No flat color-slab hero backgrounds, no dark scrims dumped over photography.
- No sparklines, anywhere, in any form. Full-size charts, labeled deltas, or progress bars only.
- Every graphic is hand-authored inline SVG or CSS. No image files, no chart library dependency, nothing that cannot be pasted directly into an HTML file and render.
- Every data point traces back to
FACTS.md. No invented numbers.