Files
Psychotoxical-psysonic/src/components/OfflineOverlay.tsx
T
Psychotoxical 59115a09d2 feat: 10-band EQ, connection indicator, new icon (v1.5.0)
### 10-Band Graphic Equalizer
- Full EQ in Rust audio engine via EqSource<S> biquad peak filters
- 10 built-in presets + custom preset save/delete
- EqSource::try_seek() implemented — also fixes waveform seek which broke
  silently when EQ was introduced (rodio returned SeekError::NotSupported)
- EQ state persisted in localStorage, synced to Rust on startup

### Connection Indicator
- LED in header (green/red/pulsing) with server name and LAN/WAN label
- Offline overlay with retry button when server is unreachable
- useConnectionStatus hook

### New App Icon
- New logo (logo-psysonic.png) applied across Login, Sidebar, Settings,
  README and all Tauri platform icons (Windows, macOS, Linux, Android, iOS)

### Now Playing Page
- New /now-playing route added

### Fixes
- WaveformSeek: mousemove/mouseup on window to fix drag outside canvas

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 22:25:32 +01:00

33 lines
986 B
TypeScript

import { useTranslation } from 'react-i18next';
import { WifiOff, RefreshCw } from 'lucide-react';
interface Props {
serverName: string;
onRetry: () => void;
isChecking: boolean;
}
export default function OfflineOverlay({ serverName, onRetry, isChecking }: Props) {
const { t } = useTranslation();
return (
<div className="offline-overlay">
<div className="offline-overlay-card">
<WifiOff size={48} className="offline-icon" />
<h2 className="offline-title">{t('connection.offlineTitle')}</h2>
<p className="offline-subtitle">
{t('connection.offlineSubtitle', { server: serverName })}
</p>
<button
className="btn btn-primary offline-retry"
onClick={onRetry}
disabled={isChecking}
>
<RefreshCw size={16} className={isChecking ? 'spin' : ''} />
{isChecking ? t('connection.checking') : t('connection.retry')}
</button>
</div>
</div>
);
}