From d6f22f99e85eee09594d08b15eeedd914aa7521a Mon Sep 17 00:00:00 2001 From: Ivan Kalachikov Date: Fri, 6 Mar 2026 13:48:13 +0000 Subject: [PATCH 01/22] docs: add detailed Orbital UI design specification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Complete design spec for Concept 1 "Orbital" — spatial depth / celestial theme with aurora palette, glassmorphic panels, particle visualization, and starfield parallax background. Co-Authored-By: Claude Opus 4.6 --- .../2026-03-06-orbital-concept-refined.md | 1161 +++++++++++++++++ 1 file changed, 1161 insertions(+) create mode 100644 docs/design/2026-03-06-orbital-concept-refined.md diff --git a/docs/design/2026-03-06-orbital-concept-refined.md b/docs/design/2026-03-06-orbital-concept-refined.md new file mode 100644 index 0000000..7e7aac4 --- /dev/null +++ b/docs/design/2026-03-06-orbital-concept-refined.md @@ -0,0 +1,1161 @@ +# Orbital — Refined Design Specification + +> Spatial Depth / Celestial. Aurora palette on deep space black. +> "You're floating above Earth at night, watching airport lights glow below." + +--- + +## 1. Design System + +### 1.1 Color Palette + +| Token | Value | Usage | +|------------------------|---------------------------------|---------------------------------------------| +| `--bg` | `#080812` | Page background, deepest layer | +| `--bg-gradient-from` | `#0D0B1A` | Aurora gradient start (deep purple) | +| `--bg-gradient-to` | `#0A1A1A` | Aurora gradient end (dark teal) | +| `--surface` | `rgba(255, 255, 255, 0.04)` | Panel resting state background | +| `--surface-active` | `rgba(255, 255, 255, 0.10)` | Panel active/interacted state | +| `--glass-border` | `rgba(255, 255, 255, 0.08)` | Panel border resting | +| `--glass-border-active`| `rgba(255, 255, 255, 0.18)` | Panel border active | +| `--text-primary` | `#E8E8EC` | Primary text (light gray) | +| `--text-dim` | `rgba(232, 232, 236, 0.5)` | Secondary text, labels | +| `--text-muted` | `rgba(232, 232, 236, 0.25)` | Disabled, decorative, ghost text | +| `--accent-warm` | `#FFCC66` | Music particles, music-active elements | +| `--accent-warm-glow` | `rgba(255, 204, 102, 0.25)` | Music glow/shadow | +| `--accent-cool` | `#44FFBB` | Airport particles, airport-active elements | +| `--accent-cool-glow` | `rgba(68, 255, 187, 0.25)` | Airport glow/shadow | +| `--accent-neutral` | `#AA88FF` | Shared UI accents (sphere, app name) | +| `--accent-neutral-glow`| `rgba(170, 136, 255, 0.3)` | Sphere outer glow | +| `--error` | `#FF6655` | Error states | +| `--warning` | `#FFB844` | Buffering states | +| `--star-color` | `rgba(255, 255, 255, 0.6)` | Starfield base point color | + +### 1.2 Typography + +**Display font:** `'Space Grotesk', sans-serif` — weights 400, 500, 700. +Used for: app name, status text, ghost IATA codes, ghost station names. + +**Body font:** `'Inter', sans-serif` — weights 300, 400, 500. +Used for: lists, labels, controls, footer. + +Load both via Google Fonts: +```html + +``` + +| Element | Font | Size | Weight | Tracking | Transform | +|----------------------|----------------|--------|--------|----------|-----------| +| App name | Space Grotesk | 18px | 700 | 0.12em | uppercase | +| Ghost IATA code | Space Grotesk | 120px | 700 | 0.05em | uppercase | +| Ghost station name | Space Grotesk | 80px | 700 | 0.02em | none | +| Status text | Space Grotesk | 14px | 500 | 0.08em | uppercase | +| Station / city name | Inter | 14px | 400 | 0.01em | none | +| IATA code in list | Inter | 14px | 500 | 0.06em | uppercase | +| Country code | Inter | 12px | 400 | 0.04em | uppercase | +| Data label | Inter | 11px | 400 | 0.08em | uppercase | +| Footer | Inter | 11px | 300 | 0.04em | none | +| Volume readout | Inter | 11px | 400 | 0 | none | +| Search input | Inter | 13px | 400 | 0 | none | + +### 1.3 Spacing Scale + +Base unit: 4px. Multiples: 4, 8, 12, 16, 24, 32, 48, 64. + +- Panel inner padding: `24px` (desktop), `16px` (tablet), `12px` (mobile) +- Gap between panels and sphere: `32px` (desktop), `24px` (mobile) +- List row height: `44px` (touch-friendly) +- List row padding: `12px 16px` +- Volume slider height (visible): `4px`, hit area `24px` +- Border radius on panels: `16px` +- Border radius on inputs/buttons: `8px` + +### 1.4 Aurora Background + +Applied to the root `.layout` as multiple layered radial gradients: + +```css +.layout { + background-color: var(--bg); + background-image: + radial-gradient(ellipse at 20% 50%, rgba(13, 11, 26, 0.8) 0%, transparent 60%), + radial-gradient(ellipse at 80% 50%, rgba(10, 26, 26, 0.8) 0%, transparent 60%), + radial-gradient(ellipse at 50% 100%, rgba(68, 255, 187, 0.03) 0%, transparent 40%), + radial-gradient(ellipse at 50% 0%, rgba(170, 136, 255, 0.04) 0%, transparent 40%); +} +``` + +The gradient ellipse positions animate slowly via CSS `@keyframes aurora` (20s cycle, alternating) to create a living aurora. On `prefers-reduced-motion: reduce`, gradients are static. + +```css +@keyframes aurora { + 0%, 100% { + background-position: 20% 50%, 80% 50%, 50% 100%, 50% 0%; + } + 50% { + background-position: 30% 40%, 70% 60%, 40% 90%, 60% 10%; + } +} +.layout { + background-size: 100% 100%; + animation: aurora 20s ease-in-out infinite alternate; +} +``` + +--- + +## 2. Layout + +### 2.1 Desktop (>= 1024px) + +Centered, vertically balanced composition. The sphere is the focal point. + +``` ++------------------------------------------------------------------+ +| HEADER BAR | +| ORBITAL [breathing dot] Now Playing: ... | ++------------------------------------------------------------------+ +| | +| * . * . * | +| . * . . * | +| +------------------+ +------------------+ | +| | AIRPORT PANEL | | MUSIC PANEL | | +| | [ghost: JFK] | ( O ) | [ghost: Synpha] | | +| | | / \ | | | +| | > search_ | particles| > search_ | | +| | * SVO Moscow RU | | | * Synphaera | | +| | JFK New York | | | Space Station | | +| | NRT Tokyo | | n5MD Radio | | +| | | | | | +| | VOL =========- | | VOL ========== | | +| +------------------+ +------------------+ | +| . * . * . | +| . * . | +| | ++------------------------------------------------------------------+ +| Footer: Inspired by... | Frontend by... | v0.2.0 | ++------------------------------------------------------------------+ +``` + +```css +.orbital-layout { + display: grid; + grid-template-rows: auto 1fr auto; + grid-template-areas: + "header" + "main" + "footer"; + min-height: 100vh; + overflow: hidden; + position: relative; +} + +.main-area { + grid-area: main; + display: flex; + align-items: center; + justify-content: center; + gap: 32px; + padding: 24px; + position: relative; /* for starfield canvas */ +} +``` + +The two panels flank the central sphere. Each panel has a subtle 3D tilt: + +```css +.panel--left { + transform: perspective(800px) rotateY(2deg); +} +.panel--right { + transform: perspective(800px) rotateY(-2deg); +} +``` + +### 2.2 Tablet (768px - 1023px) + +Same horizontal layout but panels narrow, sphere shrinks. The 3D tilt reduces to `1deg`. Panels max-width `280px`. + +```css +@media (max-width: 1023px) { + .main-area { + gap: 24px; + padding: 16px; + } + .panel--left { + transform: perspective(800px) rotateY(1deg); + } + .panel--right { + transform: perspective(800px) rotateY(-1deg); + } + .panel { + max-width: 280px; + } +} +``` + +### 2.3 Mobile (< 768px) + +The panels collapse to a bottom drawer. The sphere and starfield take the full viewport. + +``` ++----------------------------------+ +| HEADER BAR | +| ORBITAL Now: SVO | ++----------------------------------+ +| | +| * . * . | +| . . * . | +| | +| ( O ) | +| / \ | +| particles | +| | +| . * . * | +| | ++----------------------------------+ +| [Airport tab] [Music tab] | +| | +| > search_ | +| * SVO Moscow RU | +| JFK New York US | +| NRT Tokyo JP | +| | +| VOL ===================- 85% | ++----------------------------------+ +| Footer | ++----------------------------------+ +``` + +Two tabs at the top of the drawer: "ATC" and "MUSIC". Tap to switch. The drawer has a drag handle and can be collapsed to show just the tab bar (~48px) or expanded to ~50vh. + +```css +@media (max-width: 767px) { + .main-area { + flex-direction: column; + padding-bottom: 0; + } + .sphere-container { + flex: 1; + } + .panel--left, + .panel--right { + transform: none; /* no 3D tilt on mobile */ + } + .drawer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + max-height: 50vh; + border-radius: 16px 16px 0 0; + background: var(--surface-active); + backdrop-filter: blur(20px); + transition: transform 0.3s ease; + } + .drawer--collapsed { + transform: translateY(calc(100% - 48px)); + } +} +``` + +### 2.4 Small Mobile (< 480px) + +Same drawer layout. Additional adjustments: + +- Sphere reduces from 160px to 100px diameter +- Ghost text disabled (too large for small screens) +- Panel padding reduces to 12px +- Font sizes scale down 1px across the board + +--- + +## 3. Components — Detailed Specification + +### 3.1 Header Bar + +A slim horizontal bar, height `48px`, glassmorphic background. + +| Left | Right | +|--------------------------------------------|----------------------------------------------| +| App name `ORBITAL` in `--accent-neutral`, Space Grotesk 700, 18px, tracking 0.12em. A small breathing dot (6px circle) to the right of the name that pulses when playing, dims when paused. | Status text: `NOW PLAYING: SVO / SYNPHAERA` in `--text-dim`, Inter 11px. On mobile, truncated to `SVO / SYNPH...` | + +```css +.header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 24px; + height: 48px; + background: var(--surface); + backdrop-filter: blur(10px); + border-bottom: 1px solid var(--glass-border); + z-index: 10; +} +``` + +### 3.2 Central Sphere (Play/Pause) + +The centerpiece of the entire design. A luminous orb that acts as the global play/pause toggle. + +**Dimensions:** +- Desktop: 160px diameter +- Tablet: 140px +- Mobile: 120px +- Small mobile: 100px + +**Structure:** A `