- i18n.svelte.ts: store with $state locale + createIntl(), t() function,
formatDate/Number/RelativeTime, getDir() for RTL, async setLocale()
- i18n.types.ts: TranslationKey union (codegen from en.json)
- locales/en.json: 200+ strings in ICU MessageFormat
- locales/pl.json: full Polish translation
- locales/ar.json: partial Arabic (validates 6-form plural + RTL)
- scripts/i18n-types.ts: codegen script for type-safe keys
- 6 components wired: StatusBar, AgentPane, CommandPalette,
SettingsDrawer, SplashScreen, ChatInput
- Language selector in AppearanceSettings
- App.svelte: document.dir reactive for RTL
- CONTRIBUTING_I18N.md: guide for adding languages
Note: currently Electrobun-only. Will extract to @agor/i18n shared
package for both Tauri and Electrobun.
CSS pulse animations restored — they run at ~0% CPU on WebKitGTK's
native compositor. The --disable-gpu flags in electrobun.config.ts
only apply in CEF mode (AGOR_CEF=1) for E2E testing.
User mode (WebKitGTK): full GPU, full animations, full transitions
Test mode (CEF): GPU disabled, animations still CSS but no human watching
- electrobun.config.ts: add --disable-gpu --disable-gpu-compositing to CEF
flags (GLXBadWindow X11 errors cause continuous recovery loop)
- StatusBar.svelte: replace @keyframes pulse with CSS transition + JS toggle
- app.css: remove @keyframes pulse-dot (continuous compositor repaint)
CSS animations on small elements cause 10-30% CPU in both CEF and WebKitGTK.
JS class toggle with transition: opacity 0.3s uses near-zero CPU.