One Layer, All Storage. A precise, engineering-grade visual language for Apache OpenDAL™ — built to feel as dependable, fast and composable as the library itself.
This document is the source of truth for OpenDAL's web visual language. The landing page (src/pages/index.jsx) is its first full application; docs and blog inherit it through Infima variable mapping.
The visual system is a direct translation of OpenDAL's engineering values.
| Library value | Visual expression |
|---|---|
| One Layer, All Storage | One accent, one type voice, one grid — convergence over decoration. |
| Solid Foundation | Hairline structure, precise alignment, restraint. Nothing is decorative-only. |
| Fast Access (zero-cost) | System fonts, no web-font requests, CSS-only motion. The page costs nothing it doesn't need. |
| Object Storage First | Content-first layout; code and capabilities lead, ornament follows. |
| Extensible Architecture | CSS variables compose; components are presentational and reusable. |
Operating posture: engineering-minimal, light-first (dark mode is a first-class, fully designed peer), near-monochrome ink with a single precise-blue accent, and the signature solid bar lifted from the OpenDAL wordmark.
| Concern | Location |
|---|---|
| CSS variables + Infima mapping | src/css/variables.css |
| Global styles + motif | src/css/global.css |
| Landing sections | src/components/landing/sections.jsx |
| Code window / language tabs | src/components/landing/CodeTabs.jsx |
| Landing styles | src/components/landing/styles.module.css |
| Content model (copy, catalogs) | src/components/landing/data.js |
All shared design values are encoded as CSS custom properties, also called CSS variables, prefixed --odl-* in src/css/variables.css. Components never hardcode raw values when a matching --odl-* variable exists.
Ink — a cool, neutral near-black → white ramp (the monochrome backbone):
--odl-ink-{0,50,100,150,200,300,400,500,600,700,800,850,900,950} from #ffffff to #0a0d11.
Precise blue — the single brand accent:
--odl-blue-{50…900} from #edf3ff to #163172; --odl-blue-600 #1e54e0 is the canonical light-mode accent.
Functional signals (--odl-green/amber/red-*) exist mostly so inherited docs UI (admonitions, etc.) stay on-system. They are intentionally muted.
Components use semantic CSS variables, not primitive color variables:
| CSS variable | Light | Dark | Use |
|---|---|---|---|
--odl-bg | ink-0 | #0a0d11 | Page background |
--odl-bg-subtle | ink-50 | #0e1218 | Alternating section bands |
--odl-surface | ink-0 | #11161c | Cards, code window |
--odl-fg | ink-900 | #e7ebf0 | Body text |
--odl-fg-muted | ink-600 | #9aa6b3 | Secondary text |
--odl-border | ink-200 | #242c35 | Hairlines, dividers |
--odl-bar | ink-950 | #f6f8fa | The bar motif |
--odl-accent | blue-600 | blue-300 | Links, emphasis |
--odl-action-bg | blue-600 | blue-500 | Solid CTA background |
action-bg passes for buttons. Dark mode lifts the accent to a lighter blue rather than inverting it.--odl-font-sans: system-ui, -apple-system, "Segoe UI", Roboto, … --odl-font-mono: ui-monospace, "SF Mono", "Cascadia Code", "JetBrains Mono", …
System stacks are a deliberate choice, not a fallback: zero third-party requests (ASF privacy-friendly), zero layout shift, instant and globally consistent rendering (OpenDAL has a large global user base). The wordmark already carries the brand letterforms.
Monospace is promoted to a brand voice. It marks anything structural or technical — eyebrows/kickers, section indices, statistics, service names, code. This gives the minimal system its engineering character without a custom font.
To adopt IBM Plex instead: self-host via
@fontsource/ibm-plex-sansand@fontsource/ibm-plex-mono,@importthe weights invariables.css, and set--odl-font-sans/--odl-font-monoaccordingly. The rest of the system needs no changes.
--odl-text-2xs (11px) · xs (12) · sm (14) · base (16) · md (18) · lg (22) · xl (28) · 2xl (36) · 3xl (48) · display clamp(44–80px).
Headings: weight 650–700, tracking -0.022em. Body: 400, line-height 1.6. Mono labels: uppercase, tracking 0.12em.
--odl-space-1…10 (0.25rem → 8rem).--odl-container 1200px, --odl-container-narrow 880px, fluid --odl-gutter clamp(1.25–2.5rem). Use the global .odl-container.clamp(3.5rem, 7rem), every section separated by a single hairline (border-top: 1px var(--odl-border)), alternating with --odl-bg-subtle bands.--odl-radius-xs 3 / sm 5 / md 8 / lg 12 / pill. Restrained by design. The bar motif is always sharp (radius 0).--odl-shadow-sm/md/lg. Prefer border-based separation; reserve real shadow for floating surfaces (the code window).--odl-dur-fast 120ms, --odl-dur 200ms, and --odl-dur-slow 320ms with --odl-ease or --odl-ease-out..reveal and animation-timeline: view(). Browsers without support must show content immediately.opacity and transform by default. Animate layout only when it fixes a real layout jump, keep the movement local, and disable it for prefers-reduced-motion.The solid rectangle from the OpenDAL wordmark is the system's signature mark.
.odl-bar — a sharp solid rectangle for dividers/emphasis..odl-eyebrow — the canonical section kicker: monospace, uppercase, led by a small accent bar. Used above every section title.Used consistently, the bar makes the minimal system unmistakably OpenDAL.
| Component | Class(es) | Notes |
|---|---|---|
| Primary button | .btn .btnPrimary | Solid action-bg; one primary action per view. |
| Secondary button | .btn .btnSecondary | Hairline outline, ink text. |
| On-dark buttons | .btnOnDark / .btnOnDarkGhost | For the dark CTA panel. |
| Eyebrow | .odl-eyebrow (global) | Mono + accent bar; section kicker. |
| Code window | CodeTabs | Window chrome + language tabs + Prism highlight. |
| Value card | .valueCard | Mono index, title, body; 1px-gap grid. |
| Service chip | .serviceChip | Mono name + 15px icon, grouped by family. |
| Binding / layer | .bindingCard / .layerItem | Icon + mono label in a hairline grid. |
Layout grids use a 1px gap over a border-colored background to render crisp hairline dividers between cells — a precise, technical signature.
Do
Don't
static/img/*).--odl-* CSS variable exists.prefers-reduced-motion.:focus-visible state on every interactive element. Use the 2px accent ring by default. Use a compact accent outline, underline, or border for dense icon controls, window chrome links, and text inputs when the default ring overpowers the control.alt; meaning carried by adjacent text.tablist/tab/tabpanel with arrow-key support.prefers-reduced-motion respected globally.