A calming, professional design language inspired by coastal waters. Built for Dolphin AI with accessibility and scalability at its core.
The philosophy behind every decision in Ocean Modern.
Like still water, our interfaces communicate trust through restraint. We use teal gradients and soft shadows to create depth without overwhelming the user.
Movement in Ocean Modern mimics water—gentle lifts, soft pulses, and wave-like transitions. Nothing jerky. Everything flows.
We create visual hierarchy through layering and subtle gradients, not harsh contrasts. Every element should feel approachable, never intimidating.
Teal is serious but not cold. Our palette balances ocean depths with foam and sand—professional enough for B2B, warm enough for humans.
A palette derived from the ocean's natural gradient—from deep blues to bright aqua.
Use teal-to-ocean gradients for primary actions
Use aqua alone for primary buttons (too bright)
Plus Jakarta Sans provides modern warmth with excellent legibility at all sizes.
A 4px base unit creates consistent rhythm throughout the interface.
Interactive elements built with the Ocean Modern token system.
.btn-primary { background: linear-gradient(135deg, var(--color-teal-600), var(--color-ocean-800)); box-shadow: 0 4px 14px rgba(74, 157, 158, 0.4); } .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(74, 157, 158, 0.5); }
.input { border: 2px solid var(--color-border-default); border-radius: var(--radius-md); /* 12px */ padding: 14px 18px; } .input:focus { border-color: var(--color-teal-600); box-shadow: 0 0 0 4px rgba(74, 157, 158, 0.1); }
Animations that feel like gentle water movement—never jarring, always purposeful.
Hover over each card to see the animation.
The signature background element creates ambient movement.
/* Three layered waves with staggered timing */ .wave1 { animation: wave 15s linear infinite; opacity: 0.3; } .wave2 { animation: wave 20s linear infinite -5s; opacity: 0.4; } .wave3 { animation: wave 25s linear infinite -10s; opacity: 0.2; } @keyframes wave { 0% { transform: translateX(0); } 100% { transform: translateX(-50%); } }
A three-tier system that enables theming and maintainability.
/* ═══════════════════════════════════════════════════ TIER 1: PRIMITIVES (Raw values, never used directly) ═══════════════════════════════════════════════════ */ --color-teal-600: #4a9d9e; --space-4: 1rem; /* ═══════════════════════════════════════════════════ TIER 2: SEMANTIC (Purpose-driven, themeable) ═══════════════════════════════════════════════════ */ --color-brand-primary: var(--color-teal-600); --color-text-primary: var(--color-slate-900); /* ═══════════════════════════════════════════════════ TIER 3: COMPONENT (Specific usage) ═══════════════════════════════════════════════════ */ --btn-padding-y: var(--space-4); --input-border-width: 2px;
Why three tiers? Primitives give you raw values to reference. Semantic tokens give meaning (what is "primary"?). Component tokens make specific decisions. To theme the system, you only change Tier 2.