fix(web): баннер сервера из снапшота, приглашение, встроенные звуки

- READY-снапшот больше не теряет banner/splash/accent: шапка сервера
  показывает баннер сразу после подключения (AGENT.md 7.4)
- GUILD_UPDATE несёт всё оформление, клиент применяет его без перезагрузки
- кнопка приглашения в шапке сервера со ссылкой и копированием
- встроенные звуки интерфейса на Web Audio с разблокировкой по жесту
- object URL превью через безопасные обёртки (jsdom и урезанные webview)
This commit is contained in:
2026-09-21 00:04:49 +03:00
parent 6882516340
commit 4ea2965892
22 changed files with 989 additions and 56 deletions
@@ -40,10 +40,12 @@ export function VoiceSettingsSection() {
const eventSoundsEnabled = useVoiceStore((state) => state.eventSoundsEnabled);
const soundboardEnabled = useVoiceStore((state) => state.soundboardEnabled);
const latencySharingEnabled = useVoiceStore((state) => state.latencySharingEnabled);
const interfaceSoundsEnabled = useVoiceStore((state) => state.interfaceSoundsEnabled);
const setMicActivation = useVoiceStore((state) => state.setMicActivation);
const setPttKey = useVoiceStore((state) => state.setPttKey);
const setEventSoundsEnabled = useVoiceStore((state) => state.setEventSoundsEnabled);
const setLatencySharingEnabled = useVoiceStore((state) => state.setLatencySharingEnabled);
const setInterfaceSoundsEnabled = useVoiceStore((state) => state.setInterfaceSoundsEnabled);
const setSoundboardEnabled = useVoiceStore((state) => state.setSoundboardEnabled);
return (
@@ -139,6 +141,16 @@ export function VoiceSettingsSection() {
<span>{t('settings.voice.eventSounds')}</span>
</label>
<p className="ml-6 text-xs text-fg-muted">{t('settings.voice.eventSoundsHint')}</p>
<label className="mt-3 flex items-center gap-2 text-sm">
<input
type="checkbox"
checked={interfaceSoundsEnabled}
aria-label={t('settings.voice.interfaceSounds')}
onChange={(event) => setInterfaceSoundsEnabled(event.target.checked)}
/>
<span>{t('settings.voice.interfaceSounds')}</span>
</label>
<p className="ml-6 text-xs text-fg-muted">{t('settings.voice.interfaceSoundsHint')}</p>
<label className="mt-3 flex items-center gap-2 text-sm">
<input
type="checkbox"