From 864eb45580a216e8ca596c5224469ad1e4ebbd9b Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sun, 11 Oct 2026 10:28:06 -0400 Subject: [PATCH] feat: Settings uses the width of a wide screen: groups sit in two columns, each narrow enough that a row's control stays near its name (M503 #5595) The content was capped at max-w-3xl, so a wide window showed one narrow strip and a lot of empty space. SettingsColumns lays a page's groups out as one column on a phone or narrow window and two side by side from xl up; the page cap moves to 100rem so the columns don't stretch on a very wide screen. - Account: Android app, Profile and Password, with Signed-in devices beside. - Playback: "Between tracks" (crossfade) beside "Volume leveling". - Connections: ListenBrainz beside Subsonic apps. - Appearance, Notifications, About: one column's width. Co-Authored-By: Claude Opus 5.5 --- .../settings/SettingsColumns.svelte | 24 +++ .../settings/SettingsColumns.test.ts | 21 +++ web/src/routes/settings/+layout.svelte | 6 +- web/src/routes/settings/about/+page.svelte | 25 ++- web/src/routes/settings/account/+page.svelte | 174 +++++++++--------- .../routes/settings/appearance/+page.svelte | 15 +- .../routes/settings/connections/+page.svelte | 174 +++++++++--------- .../settings/notifications/+page.svelte | 7 +- web/src/routes/settings/playback/+page.svelte | 53 +++--- 9 files changed, 291 insertions(+), 208 deletions(-) create mode 100644 web/src/lib/components/settings/SettingsColumns.svelte create mode 100644 web/src/lib/components/settings/SettingsColumns.test.ts diff --git a/web/src/lib/components/settings/SettingsColumns.svelte b/web/src/lib/components/settings/SettingsColumns.svelte new file mode 100644 index 00000000..e2e1b9cf --- /dev/null +++ b/web/src/lib/components/settings/SettingsColumns.svelte @@ -0,0 +1,24 @@ + + +
+
+ {@render main()} +
+ {#if side} +
+ {@render side()} +
+ {/if} +
diff --git a/web/src/lib/components/settings/SettingsColumns.test.ts b/web/src/lib/components/settings/SettingsColumns.test.ts new file mode 100644 index 00000000..1c0187ca --- /dev/null +++ b/web/src/lib/components/settings/SettingsColumns.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, test } from 'vitest'; +import { render, screen } from '@testing-library/svelte'; +import { createRawSnippet } from 'svelte'; +import SettingsColumns from './SettingsColumns.svelte'; + +const snip = (id: string) => createRawSnippet(() => ({ render: () => `
` })); + +describe('SettingsColumns', () => { + test('main and side are two columns that sit side by side on a wide screen', () => { + render(SettingsColumns, { main: snip('main'), side: snip('side') }); + const grid = screen.getByTestId('main').parentElement!.parentElement!; + expect(grid.className).toMatch(/xl:grid-cols-2/); + expect(grid.children).toHaveLength(2); + expect(screen.getByTestId('side').parentElement!.parentElement).toBe(grid); + }); + + test('with only main, the groups keep to one column', () => { + render(SettingsColumns, { main: snip('only') }); + expect(screen.getByTestId('only').parentElement!.parentElement!.children).toHaveLength(1); + }); +}); diff --git a/web/src/routes/settings/+layout.svelte b/web/src/routes/settings/+layout.svelte index f1afb0c7..e872f42b 100644 --- a/web/src/routes/settings/+layout.svelte +++ b/web/src/routes/settings/+layout.svelte @@ -24,8 +24,10 @@ - -
+ +
{@render children?.()}
diff --git a/web/src/routes/settings/about/+page.svelte b/web/src/routes/settings/about/+page.svelte index ccd49a3c..9bcd2d83 100644 --- a/web/src/routes/settings/about/+page.svelte +++ b/web/src/routes/settings/about/+page.svelte @@ -1,4 +1,5 @@ {pageTitle('Settings · Notifications')} - + + {#snippet main()} + + {/snippet} + diff --git a/web/src/routes/settings/playback/+page.svelte b/web/src/routes/settings/playback/+page.svelte index 31dc1b2e..fadc038a 100644 --- a/web/src/routes/settings/playback/+page.svelte +++ b/web/src/routes/settings/playback/+page.svelte @@ -1,4 +1,5 @@