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
- /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>
33 lines
1.1 KiB
Svelte
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>
|