Skip to content

docs: Orbital UI design spec and implementation plan#10

Open
ivan-kalachikov wants to merge 22 commits into
devfrom
docs/orbital-design-spec
Open

docs: Orbital UI design spec and implementation plan#10
ivan-kalachikov wants to merge 22 commits into
devfrom
docs/orbital-design-spec

Conversation

@ivan-kalachikov
Copy link
Copy Markdown
Owner

@ivan-kalachikov ivan-kalachikov commented Mar 6, 2026

Orbital UI Redesign

Complete implementation of the Orbital design concept — a space-themed ambient music + ATC radio player.

What changed

New components:

  • Starfield.vue — Canvas starfield background with parallax and audio reactivity
  • ParticleCanvas.vue — Dual orbit particle system (music inner #FFCC66, ATC outer #44FFBB) with trail effects
  • Sphere.vue — Central orb button with play/pause icons, breathing animation, expanding rings
  • GlassPanel.vue — Glassmorphism container with 3D tilt and backdrop blur
  • DataList.vue — Reusable search/select/volume component with accent colors
  • MobileDrawer.vue — Bottom drawer with swipe gestures and tab switching
  • HeaderBar.vue — Minimal header with status indicator
  • useAudioAnalyser.js — Web Audio API composable (shared AudioContext, WeakMap source cache)

Redesigned:

  • Main.vue — Layout orchestrator with responsive breakpoints, amplitude loop, sphere zone with ghost text
  • Footer.vue — Restyled, hidden on mobile
  • App.vue — New CSS design system (custom properties, aurora gradients)

Infrastructure:

  • i18n for all UI strings across 9 languages (en, ru, es, fr, de, pt, zh, ja, ko)
  • Global keyboard shortcuts (Space, [ ], { })
  • prefers-reduced-motion support in all animated components
  • Full ARIA: roles, labels, tab patterns, listbox/option

Removed:

  • Airports.vue, Music.vue, CustomSelect.vue, christmas-hat.png
  • vue-audio-visual dependency

Quality gates passed

  • QG1: Layout & visual foundation (1280x800)
  • QG2: Full desktop experience with DOM property verification
  • QG3: Mobile (375px, 480px, 768px) — drawer, touch, responsive
  • QG4: Final visual verification — paused/playing states

Test plan

  • Desktop 1280x800: panels, sphere, particles, starfield render correctly
  • Tablet 768x1024: two-column layout, reduced tilt, 140px sphere
  • Mobile 375x812: drawer with tabs, no panels, 100px sphere
  • Play/pause toggle via sphere click and spacebar
  • Volume control via sliders and keyboard shortcuts
  • Search filtering in both lists
  • Active item scroll-to-center
  • i18n strings render in all languages
  • Build succeeds: npm run build

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 <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 6, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
focused Ready Ready Preview, Comment Mar 6, 2026 3:12pm

16 implementation tasks across 13 phases with 4 mandatory quality gates.
Each gate uses Chrome DevTools MCP for screenshots, DOM verification,
and computed style audits against the design spec.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ivan-kalachikov and others added 20 commits March 6, 2026 14:18
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…s and aurora background

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… text

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… and state animations

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nd volume slider

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…host text

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…yout

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Moved up from cleanup phase — blocks dev server since vue-audio-visual
is no longer used by any component.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Create Starfield.vue with Canvas 2D starfield background featuring:
- 200 stars (desktop) / 100 stars (mobile) with random size, brightness, depth
- Mouse-driven parallax on desktop, auto-drift on mobile
- musicAmplitude modulates brightness, airportAmplitude modulates twinkle rate
- ResizeObserver + devicePixelRatio for crisp HiDPI rendering
- prefers-reduced-motion support (single static frame, no rAF loop)
- Full cleanup in beforeUnmount (rAF, mousemove listener, ResizeObserver)

Integrate into Main.vue as first child of main-area for z-index 0 layering.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Plain JS factory function that wraps Web Audio API to provide real-time
frequency analysis from <audio> elements. Uses a shared AudioContext
singleton and WeakMap-cached MediaElementSource nodes to avoid browser
limits and double-bind errors.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…useAudioAnalyser

- Cache canvas context in Starfield instead of calling getContext each frame
- Add zero-size canvas guard to prevent NaN from modulo with 0
- Add disconnect() at top of connect() to prevent AnalyserNode leaks on reconnect
- Disconnect source before rewiring to prevent accumulated audio graph connections
- Add try/catch around AudioContext creation for robustness

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…activity

Create ParticleCanvas.vue with two particle systems orbiting the central
sphere — music particles (inner, #FFCC66) and airport particles (outer,
#44FFBB). Features include:

- Audio-reactive modulation via useAudioAnalyser (radius, brightness, speed)
- Trail effect using semi-transparent rgba overlay
- Object pooling with pre-allocated particles and visibility toggling
- Responsive particle counts via matchMedia (mobile/desktop)
- Reduced motion support (static render, no animation loop)
- Performance: rAF loop with document.hidden skip, cached canvas context,
  zero-size canvas guard, ResizeObserver for sizing with devicePixelRatio

Wire audio analysers into Main.vue:
- Create and connect useAudioAnalyser instances for both audio elements
- Pass amplitude data to Starfield via rAF-driven data properties
- Track sphere position via updateSphereRect for orbit center
- Clean up all listeners, observers, and rAF loops in beforeUnmount

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… and Main.vue

- Remove useAudioAnalyser from setup() return, call directly in mounted()
- ParticleCanvas now accepts musicAmplitude/airportAmplitude props instead of
  raw analyser objects, eliminating duplicate getAmplitude() calls per frame
- Connect analysers on mount if already in playing state
- Always allocate desktop max pool size to prevent overflow on viewport change

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use @touchmove.prevent instead of manual preventDefault (passive listener fix)
- Add role="region" and aria-label on drawer root
- Add id, aria-controls, aria-labelledby for complete ARIA tab pattern
- Remove dead onTouchMove method

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… i18n, scroll active item

- Move ghost text from GlassPanel overlay to sphere zone (above/below orb)
  to improve list readability
- Add play triangle and pause bars icons to Sphere for clear button affordance
- Wire i18n ($t) for all hardcoded UI strings: search, volume, labels, tabs
- Add scrollToActive() to DataList to center the active selection on mount
  and selection change
- Clean up GlassPanel: remove unused ghost text props and CSS

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Space toggles play/pause, [ ] adjust music volume, { } adjust ATC volume.
Escape in search fields clears and blurs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…s asset

Deleted: CustomSelect.vue, Airports.vue, Music.vue, christmas-hat.png
Uninstalled: vue-audio-visual

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant