Files
minstrel/web/src/routes/settings/+layout.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.2 KiB
Svelte

<script lang="ts">
import SectionRail from '#lib/components/SectionRail.svelte';
let { children } = $props<{ children: import('svelte').Snippet }>();
// Settings (#5595): one page per section down a left rail, laid out as
// the Collection is. Account is first and is where /settings lands. The
// admin's settings are a separate area (/admin) a listener never sees.
const items = [
{ href: '/settings/account', label: 'Account' },
{ href: '/settings/playback', label: 'Playback' },
{ href: '/settings/appearance', label: 'Appearance' },
{ href: '/settings/notifications', label: 'Notifications' },
{ href: '/settings/connections', label: 'Connections' },
{ href: '/settings/about', label: 'About' }
];
</script>
<div class="space-y-4">
<h1 class="font-display text-2xl font-medium text-text-primary">Settings</h1>
<div class="md:grid md:grid-cols-[11rem_minmax(0,1fr)] md:gap-6">
<div class="mb-4 md:mb-0">
<div class="md:sticky md:top-4">
<SectionRail label="Settings sections" {items} />
</div>
</div>
<!-- Capped so a row's control sits near its name on a wide screen. -->
<div class="min-w-0 max-w-3xl space-y-6">
{@render children?.()}
</div>
</div>
</div>