Files
minstrel/web/src/routes/settings/playback/+page.svelte
T
bvandeusenandClaude Opus 5.5 c94c09aeae
release / govulncheck (push) Successful in 18s
release / web (push) Successful in 1m45s
release / go (push) Successful in 1m58s
release / integration (push) Successful in 5m39s
release / android (push) Successful in 5m43s
release / Build signed APK (releases and dev) (push) Successful in 5m58s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 26s
release / Verify release artifacts (tag releases only) (push) Skipped
feat: Settings is one page per section down a left rail, Account first, every setting a row; the profile form no longer saves blanks over your name and email (M503 #5595 #5596 #5597)
- /settings lands on Account: the Android app, profile, password, signed-in
  devices. Then Playback, Appearance, Notifications, Connections, About.
- Each setting is a row (name, one short line, control at the end) in a
  capped-width column; one-of-N choices are a shared Segmented control.
- Collection and Settings share one SectionRail.
- Connections leads ListenBrainz with a status line: not connected,
  connected and not sending, or sending with the last scrobble's age.
- Notifications prints its column labels once; the digest email's
  settings link points at /settings/notifications.
- #5596: the profile form now loads what is stored and sends only the
  fields that changed. It used to start blank, and the server reads a
  blank as "clear", so one Save wiped the display name and email.
- Recommendation metrics moves to Library › Your listening, and Hidden
  tracks gets a Library tab.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 23:34:51 -04:00

33 lines
1.1 KiB
Svelte

<script lang="ts">
import { pageTitle } from '#lib/branding.js';
import { player, setCrossfade } from '#lib/player/store.svelte.js';
import NormalizationSetting from '#lib/components/NormalizationSetting.svelte';
import SettingsGroup from '#lib/components/settings/SettingsGroup.svelte';
import SettingRow from '#lib/components/settings/SettingRow.svelte';
</script>
<svelte:head><title>{pageTitle('Settings · Playback')}</title></svelte:head>
<SettingsGroup title="Playback">
<SettingRow
label="Crossfade"
hint="Fades one track into the next. Most albums sound best with it off."
for="crossfade-slider"
>
<input
id="crossfade-slider"
type="range"
min="0"
max="12"
step="1"
value={player.crossfadeSec}
oninput={(e) => setCrossfade(Number((e.currentTarget as HTMLInputElement).value))}
class="w-40 accent-accent"
/>
<span class="w-8 text-right text-sm tabular-nums text-text-primary">
{player.crossfadeSec === 0 ? 'Off' : `${player.crossfadeSec}s`}
</span>
</SettingRow>
<NormalizationSetting />
</SettingsGroup>