import { useStore } from '@nanostores/react'; import { $appSettings, updateAppSettings } from '../stores/appSettings'; import { VALUE_MODES, ValueMode } from '../utils/constants'; import { uiState, toggleMobileMenu, showHelp, toggleUI, toggleShaderLibrary, } from '../stores/ui'; import { $shader, setShaderCode } from '../stores/shader'; import { $input } from '../stores/input'; import { FakeShader } from '../FakeShader'; import { useAudio } from '../hooks/useAudio'; import { LucideIcon } from '../hooks/useLucideIcon'; function getValueModeLabel(mode: string): string { const labels: Record = { integer: 'Integer (0-255)', float: 'Float (0.0-1.0)', polar: 'Polar (angle-based)', distance: 'Distance (radial)', wave: 'Wave (ripple)', fractal: 'Fractal (recursive)', cellular: 'Cellular (automata)', noise: 'Noise (perlin-like)', warp: 'Warp (space deformation)', flow: 'Flow (fluid dynamics)', }; return labels[mode] || mode; } export function TopBar() { const settings = useStore($appSettings); const ui = useStore(uiState); const shader = useStore($shader); const input = useStore($input); const { setupAudio, disableAudio } = useAudio(); const handleFullscreen = () => { if (!document.fullscreenElement) { document.documentElement.requestFullscreen(); } else { document.exitFullscreen(); } }; const handleRandom = () => { const randomCode = FakeShader.generateRandomCode(); setShaderCode(randomCode); }; const handleShare = () => { const shareData = { code: shader.code, resolution: settings.resolution, fps: settings.fps, renderMode: settings.renderMode, valueMode: settings.valueMode, uiOpacity: settings.uiOpacity, }; const encoded = btoa(JSON.stringify(shareData)); window.location.hash = encoded; navigator.clipboard .writeText(window.location.href) .then(() => { console.log('URL copied to clipboard'); }) .catch(() => { console.log('Copy failed'); }); }; const handleExportPNG = () => { const canvas = document.getElementById('canvas') as HTMLCanvasElement; if (canvas) { const link = document.createElement('a'); link.download = `bitfielder-${Date.now()}.png`; link.href = canvas.toDataURL('image/png'); link.click(); } }; const handleAudioToggle = async () => { if (input.audioEnabled) { disableAudio(); } else { await setupAudio(); } }; return (
Bitfielder
); }