- fg
#EDEDF8- bg
#000000- APCA Lc
- -97
- Use
- background on foreground
Blackalgo
Dark-first SaaS marketing site that treats its design system as the product. Blackalgo builds on a Radix-style alpha-scale token foundation (12-step accents + 5-tier text + 4-tier border) and pairs TWK Lausanne with GeistMono on a near-black canvas, reserving a dual coral-and-mint accent for pivot signals only — closer to a public design system tour than a product page.

Editorial disclaimer
This entry documents observable design-language patterns for educational transfer and AI-agent briefing. Screenshots and trademarks are property of their respective owners. AI2 Design is not affiliated with or endorsed by the featured brand. Inspiration here is about language and rhythm - do not reproduce brand identity, logo, product copy, or proprietary features.
Fair Use & Gallery PolicyCopy the full design language into your agent
A typed, paste-ready design system brief - philosophy, tokens, rules, techniques, and fitness checks. Drop it into Claude, Cursor, v0 or any coding agent and it builds in Blackalgo’s language, not just a screenshot.
Dark-first tokenized SaaS canvas at a Radix-style alpha-scale resolution. The ground is `#01010d` near-black (with `#000000` and `#040410` siblings); near-white `#ededf8` carries the dominant text load. Twenty-seven CSS variables encode the system: 5-tier text descender (--text-loud → -default → -muted → -faint → -disabled), 4-tier border (--border-loud → -default → -muted → -disabled), 12-step accent alpha scale (--accent-1 through --accent-12). TWK Lausanne handles prose across a 300 / 350 / 400 / 500 weight ladder; GeistMono handles numerics and inline labels. Dual brand-tier accent — `#ff587a` coral and `#5fffd7` mint — appears only as pivot signals at <1% surface area. Atmospheric gradients live in modern colorspace (`color(xyz-d65 ...)`, `rgba()` light leaks at 0.02-0.12 alpha). Motion is anchored by three curves with non-overlapping responsibilities.
Use this capture as a design language transfer brief for my project. Adopt the palette (dark-first `#01010d` ground + `#040410` deep + `#ededf8` near-white ink + dual `#ff587a` coral and `#5fffd7` mint reserved for pivot signals only), Radix-style CSS variable foundation (5-tier text descender + 4-tier border + 12-step accent alpha scale, alphas 05/0a/0d/0f/14/1f/29/52/66/a3/e0/ff), typographic rhythm (TWK Lausanne with 300 / 350 / 400 / 500 weight ladder, GeistMono for numerics, size scale 10/13/15/16/32/36/64 px), 2/4/6/8/12/16 px-base spacing scale with mid-narrow container rails (700/800/1140/1240/1312 px), atmospheric multi-stop gradients in modern colorspace (`color(xyz-d65 ...)` + `rgba()`) drifting at 0.02-0.12 alpha rather than hero illustration, and a multi-curve motion vocabulary — Geist `cubic-bezier(0.6, 0.6, 0, 1)` for hover, Quart `cubic-bezier(0.76, 0, 0.24, 1)` for scroll reveals, `linear()` with stops for sub-100ms feedback. Treat this as my project's constitution — any new component I author should pass as if crafted in the same studio. Apply the language, not the source brand's specific copy or identity.
- Layout
- Stack
- Content width
- Bounded
- Framing
- Flat
- Grid strength
- Medium
Dark-first tokenized canvas — `#01010d` primary background paired with `#040410` deep variant and `#ededf8` near-white foreground (the dominant text token at 2876 measured occurrences). Cool periwinkle support tones `#e9e9fb`, `#c9cafd` for tinted panels and frosted overlays. Dual brand-tier accent: `#ff587a` (coral pink) and `#5fffd7` (mint cyan), each appearing only as pivot signals — surface area combined < 1%. The CSS variable vocabulary is Radix-style: `--text-{loud,default,muted,faint,disabled}` 5-tier descender (alpha ff → b8 → a3 → 7a → 52), `--border-{loud,default,muted,disabled}` 4-tier (alpha 29 → 1f → 14 → 0d), `--accent-1` through `--accent-12` 12-step alpha scale (05/0a/0d/0f/14/1f/29/52/66/a3/e0/ff).
- Near-white `#ededf8` text handling ~2876 measured surface occurrences via `--text-loud` — dominant reading layer
- Background pair `#01010d` (page) + `#040410` (deep panel), maintaining 19:1+ contrast with `#ededf8`
- Cool periwinkle support `#e9e9fb` / `#c9cafd` for tinted overlays and frosted glass surfaces
- Coral `#ff587a` reserved for pivot signals, hover accents — never as CTA fill
- Mint `#5fffd7` reserved for active state highlights, secondary pivot — never as background
Gradients (paste-ready)
linear-gradient(rgba(235, 234, 251, 0) 25%, rgba(235, 234, 251, 0.05) 65%, rgba(235, 234, 251, 0) 95%) — single-pass light beam linear-gradient(92deg, rgb(208, 206, 253) 0%, rgb(158, 183, 248) 50%, rgb(210, 236, 249) 100%) — pastel lavender→periwinkle→sky display gradient linear-gradient(270deg, rgba(5, 26, 34, 0.12) 35%, rgba(0, 255, 213, 0.12) 100%) — mint accent edge fade radial-gradient(50% 50%, color(xyz-d65 0.367 0.28 1.054 / 0.059), rgba(1, 1, 14, 0) 85%) — modern colorspace atmospheric pass linear-gradient(rgba(237, 236, 249, 0.96), rgba(237, 237, 249, 0.77)) — frosted glass card overlay
- Primary family: TWK Lausanne (prose, headings, UI). Counterpart family: GeistMono (numerics, inline code labels, version pills).
- Weight ladder: 300 (light display) / 350 (custom in-between, deliberate display register) / 400 (reading body) / 500 (emphasis + GeistMono caps). The 350 stop is the signature — do not substitute.
- Size scale: 10 / 13 / 15 / 16 / 32 / 36 / 64 px. Display headings extend up the same scale; body and UI cluster at 13-16 px.
- Line-height pattern: tight on display (lh 36 on 32 px = 1.125, lh 52 on 36 px = 1.44, lh 68 on 64 px = 1.06); standard on body (lh 22-26 on 13-16 px); GeistMono lh 16 on 10 px (1.6).
- GeistMono signals developer affinity — version pills, status badges, inline tokens. Don't use for prose paragraphs; that flips the register.
- TWK Lausanne 350 is the display register weight — use for heading clusters and feature labels, never for body copy.
- Mixed-density rhythm — 8px (102 measured occurrences) and 16px (98) dominate; 6px (51), 12px (41), 4px (19), 2px (20) form the support scale.
- Standard scale: 2 / 4 / 6 / 8 / 10 / 12 / 14 / 16 / 18 / 20 / 22 / 24 px. Pick from scale; never freehand values.
- Container max-width set: 700 / 800 / 1140 / 1240 / 1312 px — narrow modules + wide hero rails.
- Section vertical rhythm follows the same 8/16/24 px scale × multipliers, never freehand.
- Card padding: 16-24 px on desktop, 12-16 px on mobile. Border via `--border-default` (alpha 1f) before reaching for shadow.
- Primary elevation is the alpha-tinted border — `border: 1px solid var(--border-default)` (alpha 1f) before any shadow.
- Multi-layer shadows for dimensional surfaces: 3-4 stacked rules combining inset highlight + tinted drop + outer halo.
- Inset highlight pattern (light-on-dark): `rgba(235, 234, 251, 0.04) 0px 12px 24px 0px inset, rgba(235, 234, 251, 0.04) 0px 6px 12px 0px inset`.
- Drop pattern with periwinkle tint: `rgba(218, 214, 255, 0.12) 3px 3px 6px 0px, rgba(218, 214, 255, 0.08) 1px 1px 3px 0px` — the rgb(218, 214, 255) tint is the signature.
- Hero panels add a deep blue drop: `rgba(2, 0, 28, 0.24) 0px 16px 24px -6px` plus periwinkle inset glow `rgba(208, 203, 255, 0.08) 0px 0px 32px 0px inset`.
Techniques
Stacked shadow with periwinkle tint
Cards default to a 2-3 layer shadow stack tinted in periwinkle (`rgba(218, 214, 255 / 0.12)` and `0.08`). The tint reads as ambient blue light rather than a black drop. Pattern: `rgba(218, 214, 255, 0.12) 3px 3px 6px 0px, rgba(218, 214, 255, 0.08) 1px 1px 3px 0px`.
Modern colorspace atmospheric pass
Hero atmospheres use `radial-gradient(color(xyz-d65 0.367 0.28 1.054 / 0.059), rgba(1, 1, 14, 0) 85%)` instead of legacy `rgba()` blends. The `xyz-d65` colorspace stays perceptually uniform across luminance, which is why the light leak feels like ambient glow rather than alpha mask.
- Radius scale 4-12 px for cards, buttons, inputs. Pill radii avoided — corners stay editorial.
- Hairline borders dominate (1px); use `--border-default` alpha tier for default surfaces, `--border-loud` for emphasis.
- Icons are monoline Lucide-style, never filled glyphs. Stroke 1.5-2 px.
- GeistMono numerics align to character grid for tabular columns.
Primary CTA button- background
- var(--accent-12)
- text
- #01010d
- border
- 1px solid transparent
- radius
- 8px
- padding
- 10px 20px
- font
- TWKLausanne 500 14px / 20px
- transition
- 0.2s cubic-bezier(0.6, 0.6, 0, 1) on color, background-color, border-color
Tailwind
inline-flex items-center justify-center rounded-lg bg-[#ededf8] px-5 py-2.5 text-sm font-medium leading-tight text-[#01010d] transition-colors duration-200 ease-[cubic-bezier(0.6,0.6,0,1)] hover:bg-[#ededf8]/90
Secondary ghost button- background
- transparent
- text
- #ededf8
- border
- 1px solid var(--border-default)
- radius
- 8px
- padding
- 10px 20px
- font
- TWKLausanne 500 14px / 20px
- hoverBackground
- var(--accent-3)
Tailwind
inline-flex items-center justify-center rounded-lg border border-[#ededf81f] bg-transparent px-5 py-2.5 text-sm font-medium leading-tight text-[#ededf8] transition-colors duration-200 ease-[cubic-bezier(0.6,0.6,0,1)] hover:bg-[#ebeafa0d]
Surface card with periwinkle shadow- background
- var(--accent-2)
- text
- #ededf8
- border
- 1px solid var(--border-muted)
- radius
- 12px
- padding
- 20px 24px
- shadow
- rgba(218, 214, 255, 0.12) 3px 3px 6px 0px, rgba(218, 214, 255, 0.08) 1px 1px 3px 0px
Tailwind
rounded-xl border border-[#ededf814] bg-[#ebeafa0a] p-6 text-[#ededf8] shadow-[rgba(218,214,255,0.12)_3px_3px_6px_0px,rgba(218,214,255,0.08)_1px_1px_3px_0px]
GeistMono pill- background
- var(--accent-2)
- text
- var(--text-muted)
- border
- 1px solid var(--border-muted)
- radius
- 4px
- padding
- 2px 6px
- font
- GeistMono 500 10px / 16px
Tailwind
inline-flex items-center rounded-sm border border-[#ededf814] bg-[#ebeafa0a] px-1.5 py-0.5 font-mono text-[10px] font-medium leading-4 text-[#ededf8a3]
Pivot signal (coral)- text
- #ff587a
- font
- TWKLausanne 500 13px / 20px
- usage
- Hover state highlights, badges, inline pivot signals — never as CTA fill
Tailwind
text-[13px] font-medium leading-5 text-[#ff587a]
Pivot signal (mint)- text
- #5fffd7
- font
- TWKLausanne 500 13px / 20px
- usage
- Active state highlights, secondary pivot — never as background fill
Tailwind
text-[13px] font-medium leading-5 text-[#5fffd7]
Easings
cubic-bezier(0.6, 0.6, 0, 1)cubic-bezier(0.76, 0, 0.24, 1)linear(1 0%, 0.5 14.2857%, 0.1 28.5714%, 1 42.8571%, 0.8 57.1429%, 0.2 71.4286%, 0.5 85.7143%, 0 100%)linearease-in-outScroll patterns
- Opacity-only at 750ms with Quart `cubic-bezier(0.76, 0, 0.24, 1)` for slow scroll-revealed sections
- Transform-only at 250ms with linear for inline marquee or carousel motion
- Honor `prefers-reduced-motion` everywhere — collapse scroll choreography to static when set
- Three primary curves with non-overlapping jobs: Geist `cubic-bezier(0.6, 0.6, 0, 1)` for hover/focus, Quart `cubic-bezier(0.76, 0, 0.24, 1)` for scroll reveals, custom `linear()` with stops for sub-100ms overshoot/settle feedback.
- Duration ladder: 50 / 100 / 200 / 250 / 400 / 750 ms — never freehand timings.
- The `linear()` function with stops is reserved for fast micro-feedback (color/background-color/border-color/text-decoration-color); don't use it on transform or opacity.
- Transform-only animations stick to linear or ease-in-out; never apply Geist or Quart to transform.
- Hover states: color + background-color shift at 200ms with Geist easing — primary feedback channel.
- Focus rings inherit `--border-loud` (alpha 29) at 1-2 px; visible against dark canvas without an outer glow.
- Coral pivot signals appear inline (badges, highlight text); mint signals appear on active state. Don't combine in the same component.
- GeistMono pills act as silent metadata — never receive hover or focus treatment.
- Pivot signals never carry semantic meaning — never use coral/mint for state (success/error/warning). Reserve semantic states for separate tokens.
5-step custom set: sm 576 / md 768 / lg 996 / xl 1240 / 2xl 1536 px. The lg break at 996 (not Tailwind default 1024) is custom-tuned, suggesting a 1000-pixel-class threshold. Container max-width set (700-1312 px) provides narrow editorial rails plus a wide hero rail.
- Mobile-first authoring; lg/xl introduce columned layouts.
- Container max-width set: 700 / 800 / 1140 / 1240 / 1312 px — narrow rails for content modules, wide rail for hero.
- Section vertical rhythm shrinks ~40% on mobile.
- Atmospheric gradients render identically across breakpoints; never gate them behind md+.
- Foreground/background contrast: `#ededf8` on `#01010d` = 18:1 (AAA Large + Normal). `#ededf8b8` (--text-default alpha b8) on `#01010d` = ~13:1 (AAA). `#ededf8a3` (--text-muted) = ~10:1 (AAA). `#ededf87a` (--text-faint) = ~7:1 (AA Normal). `#ededf852` (--text-disabled) = ~4.7:1 (AA Normal pass with caveat).
- Audit accent contrasts: `#ff587a` coral on `#01010d` = 5.4:1 (AA Normal). `#5fffd7` mint on `#01010d` = 14:1 (AAA Large + Normal).
- Honor `prefers-reduced-motion` — collapse scroll choreography (750ms opacity tweens) to static when set.
- Focus rings use `--border-loud` (alpha 29) at 1-2 px; visible against #01010d without outer glow.
- Pivot accents (coral, mint) never carry semantic state — reserve semantic UI for separate tokens.
- All interactive controls keyboard-reachable; Tab + Enter parity with click on every button + link.
Blackalgo encodes its design system as CSS variables in `:root` and references them across components. Hero atmospheric background lives as a 1280×1000 webp light leak (lazy-loaded). 30 captured images, 0 preloaded fonts at runtime — TWK Lausanne and GeistMono ship through self-hosted woff2 (CORS may block @font-face inspection).
- CSS variables in `:root`: `--text-{loud,default,muted,faint,disabled}` + `--border-{loud,default,muted,disabled}` + `--accent-1` through `--accent-12` + `--icon-{loud,default,disabled}` + `--background-{black,menu,menu-item}`.
- Tailwind custom breakpoint config: `screens: { sm: '576px', md: '768px', lg: '996px', xl: '1240px', '2xl': '1536px' }`.
- Easing as a Tailwind theme extension: `transitionTimingFunction: { geist: 'cubic-bezier(0.6, 0.6, 0, 1)', quart: 'cubic-bezier(0.76, 0, 0.24, 1)', spring: 'linear(1 0%, 0.5 14.2857%, ...)' }`.
- Atmospheric gradients live as page-level background layers; modern colorspace passes use `color(xyz-d65 ...)` directly in `background-image`.
- Default to the dark-first canvas (`#01010d` ground + `#040410` deep + `#ededf8` near-white ink) for every surface unless light mode is required.
- Use TWK Lausanne for prose + GeistMono for numerics and inline code labels.
- Reserve coral (`#ff587a`) and mint (`#5fffd7`) for pivot signals and inline highlights only.
- Reference Radix-style CSS variables (`--text-loud`, `--border-default`, `--accent-3`) in components instead of hardcoded hex.
- Anchor hover transitions with Geist `cubic-bezier(0.6, 0.6, 0, 1)`, scroll reveals with Quart, sub-100ms feedback with `linear()` stops.
- Don't paint surfaces with the coral or mint accent — accents stay micro-surface (pivot + inline highlight).
- Don't use GeistMono for prose — it's a developer-trust signal, not a body typeface.
- Don't introduce a third typeface — TWK Lausanne plus GeistMono is the entire system.
- Don't substitute the 350 weight with 300 or 400 in display contexts — the custom step is the signature.
- Don't bypass Radix-style CSS variables with hardcoded hex literals in component code.
- Two typefaces only (TWK Lausanne + GeistMono) — no third family.
- Two-accent palette (`#ff587a` coral + `#5fffd7` mint) — no expansion to a chromatic accent system.
- Container max-width capped at 1312 px on the inner content rail.
- Motion duration ladder fixed: 50 / 100 / 200 / 250 / 400 / 750 ms — no freehand timings.
- Radix-style CSS variable foundation must remain the token source — do not bypass with hex literals in component code.
- Hex grep — `#01010d` ground + `#ededf8` ink dominate; `#ff587a` and `#5fffd7` appear only inline (< 1% surface combined).
- Font stack inspection — TWK Lausanne for prose, GeistMono for numerics + inline code; no third family present.
- CSS variable check — `--text-{loud,default,muted,faint,disabled}` + `--border-{loud,default,muted,disabled}` + `--accent-1` through `--accent-12` defined in `:root`.
- Easing audit — `cubic-bezier(0.6, 0.6, 0, 1)` for hover, `cubic-bezier(0.76, 0, 0.24, 1)` for scroll, `linear()` with stops for sub-100ms feedback. No fourth primary curve.
- TWK Lausanne weight check — 300, 350, 400, 500 only. Custom 350 stop must be present.
- Container max-width audit — every inner rail measures within 700-1312 px on desktop screenshots.
Design tokens
Observed token system
Color, type, spacing, gradients, and stacking order captured from the live page and rendered here as living, paste-ready previews.
Inspector
Observable layers
Structure, breakpoints, motion, fonts, and images captured from the live page and kept paste-ready alongside the tokens.
Depth-first walk of the meaningful sections. 6 nodes across 5 levels, shallow to deep by color.
- body2
- Main1
- Header1
- div1
- Nav
- div
Accessibility
Contrast matrix
46 combinations - 36 pass AA - 30 pass AAA. Each pair is previewed with its real foreground on background; APCA Lc sits alongside the WCAG 2.1 ratio for draft WCAG 3 awareness.
- fg
#000000- bg
#EDEDF8- APCA Lc
- +96
- Use
- foreground on background
- fg
#EDEDF8- bg
#01010D- APCA Lc
- -97
- Use
- background on accent
- fg
#01010D- bg
#EDEDF8- APCA Lc
- +96
- Use
- accent on background
- fg
#EDEDF8- bg
#040410- APCA Lc
- -97
- Use
- background on accent
- fg
#040410- bg
#EDEDF8- APCA Lc
- +96
- Use
- accent on background
- fg
#000000- bg
#E9E9FB- APCA Lc
- +94
- Use
- foreground on background
- fg
#E9E9FB- bg
#000000- APCA Lc
- -94
- Use
- background on foreground
- fg
#01010D- bg
#E9E9FB- APCA Lc
- +94
- Use
- accent on background
Images
Image strategy
Observable image posture - total count, lazy-loading ratio, and format mix. The hero image is measured above the fold.
- webp68 · 85%
- png10 · 13%
- unknown2 · 3%
Hero image
https://blackalgo.com/images/hero/section-lights.webp- Format
- WEBP
- Dimensions
- 1280x1000
- Loading
- lazy
- srcset
- no
- Industry
- saas
- Industry
- developer-tools
- Theme
- Dark
- Added
- 2026-04-30
FAQ
Questions people ask about Blackalgo
3questionsAnswers are pulled from the curator verdict and design brief - the same text your AI agent sees when it paste-reads this page.
Compare this with



