* feat(themes): add follow-system mode to the theme scheduler
The theme scheduler can now switch the day/night theme pair by the OS
light/dark preference instead of a clock schedule. A segmented control
picks the trigger; in system mode the time inputs are hidden and the two
theme pickers read as Light/Dark.
The OS theme is read via the native Tauri window theme API (theme() +
onThemeChanged) rather than the Web prefers-color-scheme media query,
which is unreliable through WebKitGTK on Linux. Live updates land
instantly where the platform forwards them; on Linux setups that don't,
a hint notes the change applies after an app restart.
* docs(changelog): add follow-system theme mode entry (#1163)
CHANGELOG Added entry, contributor credit and What's New highlight for the
theme scheduler's new system-theme mode.
* fix(orbit): harden the guest outbox — recover lost suggestions, avoid a duplicate outbox
Two outbox robustness issues on the poll-based, non-atomic playlist
transport:
- Lost-update: a track a guest appends to its outbox can be wiped by a
concurrent host sweep-clear before the host recorded it, leaving the
suggestion lost AND stuck on "waiting on host" forever (it only clears
once it reaches the host's play queue). The playlist read-modify-write
can't be made atomic, so recover: re-send a pending suggestion the host
hasn't recorded (absent from state.queue) past a grace window — the host
dedupes by (user, trackId), so it's idempotent — and give up + toast past
a 45s window so the row stops hanging. New pendingResend planner module
with unit tests; suggest + tick share ensureTrackInOutbox.
- Duplicate outbox: a transient getPlaylists failure at join was swallowed
to [], so the existing-outbox check missed and a second outbox was
created. Distinguish "lookup failed" from "genuinely absent" and retry
once before falling back to create.
New i18n key for the give-up toast across all locales.
* fix(orbit): reject non-http(s) schemes in share invites
normalizeShareServerUrl only prepends http:// when the server string doesn't
already start with "http", so an invite carrying a scheme like httpx:// or
https-phish:// slips through unchanged. Reject anything whose parsed protocol
isn't http(s) at parse time, before the known-server match. Add round-trip
tests covering the accepted and rejected schemes.
* fix(orbit): read exit-modal role fresh to avoid a stale keydown closure
The exit modal's Enter/Escape handler binds once per open (deps [isOpen]) and
closed over the role prop, so a role change while the modal was up would act
on a stale value. Read role from the store inside the action instead, and drop
the now-unused reactive subscription.
* docs(changelog): consolidate Orbit fixes into one block, add 1159
* feat(orbit): mirror host track-transition settings into the session
Each client previously used its own local crossfade / gapless / AutoDJ
settings, so guests blended tracks differently from the host and drifted
out of sync — the exact drift the Catch-Up button exists to paper over.
Add an optional OrbitSettings.transitions (crossfade enabled/secs/trim,
AutoDJ smooth-skip, gapless), additive on the wire so older sessions
simply omit it. The host seeds its own prefs at start and refreshes them
every tick, so a mid-session change propagates. Guests snapshot their own
prefs on join, adopt the host's for the session (idempotent — no setState
churn / audio-sync re-fire when unchanged), and restore their own on
leave. Applying via authStore.setState reuses the existing authSyncListener
path to the Rust engine, so no new IPC. Without the Hot cache a guest's
AutoDJ blend degrades gracefully via the existing byte-preload fallback.
Add a bridge module with unit tests for read/apply/save/restore.
* feat(orbit): lock guest transition controls during a session
Since a guest now mirrors the host's track-transition settings (re-applied
every read tick), their own controls would visibly fight the sync. Disable
them while a guest is in a live session and explain why.
Settings -> Audio -> Track transitions greys out the mode picker, seconds
slider and smooth-skip toggle with a "controlled by the Orbit host" note;
the queue toolbar's Gapless / Crossfade / AutoDJ quick-toggles get the same
disabled state and tooltip. Host controls are untouched. New i18n key added
across all locales.
* docs(changelog): add Orbit transition sync (1158)
* feat(i18n): add Hungarian (hu) translation files
* feat(i18n): register Hungarian locale and language option
* docs(changelog): Hungarian translation entry and credit (#1149)
* fix(i18n): list Romanian in the Login language picker
* fix(eq): surface the active AutoEQ profile name in the preset picker
* i18n(settings): add AutoEQ preset group label (10 locales)
* docs(changelog): AutoEQ active-profile picker fix (#1147)