From 30fb4360bcd28115d363b2b023f76f1b3e19905e Mon Sep 17 00:00:00 2001 From: DerEchteAlec Date: Sun, 16 Aug 2026 20:23:10 +0200 Subject: [PATCH] FIX - refine Radio Sky UI controls --- frontend/src/ui/controls.css | 2 + frontend/src/ui/controls/SkyRange.test.ts | 9 +++ frontend/src/ui/settings.css | 14 ++++ .../src/ui/settings/SkySettingsGroup.test.ts | 9 +++ .../src/views/apps/RadioApp.contract.test.ts | 63 +++++++++++++++ frontend/src/views/apps/RadioApp.vue | 78 +++++++++++++++---- 6 files changed, 160 insertions(+), 15 deletions(-) diff --git a/frontend/src/ui/controls.css b/frontend/src/ui/controls.css index d36cc55..2ce7d56 100644 --- a/frontend/src/ui/controls.css +++ b/frontend/src/ui/controls.css @@ -1887,6 +1887,8 @@ label.sky-list-item__row { width: 100%; min-width: 0; height: 28px; + position: relative; + z-index: 1; margin: 0; padding: 0; flex: 1; diff --git a/frontend/src/ui/controls/SkyRange.test.ts b/frontend/src/ui/controls/SkyRange.test.ts index 6c4a0dc..1259caa 100644 --- a/frontend/src/ui/controls/SkyRange.test.ts +++ b/frontend/src/ui/controls/SkyRange.test.ts @@ -61,4 +61,13 @@ describe('SkyRange', () => { ) expect(tokens).toContain('--sky-shadow-glass-thumb-glow') }) + + it('keeps the native range above its enlarged pointer target', () => { + const uiDirectory = fileURLToPath(new URL('..', import.meta.url)) + const controls = readFileSync(`${uiDirectory}/controls.css`, 'utf8') + + expect(controls).toMatch( + /\.sky-range__input\s*\{[^}]*position:\s*relative;[^}]*z-index:\s*1;/s, + ) + }) }) diff --git a/frontend/src/ui/settings.css b/frontend/src/ui/settings.css index 8872d05..9cf773f 100644 --- a/frontend/src/ui/settings.css +++ b/frontend/src/ui/settings.css @@ -236,6 +236,20 @@ label.sky-settings-row__title { padding: 0; } +.sky-settings-group__list + > .sky-field:not(.sky-field--has-label) + .sky-field__inner { + display: flex; + flex-direction: column; + justify-content: center; +} + +.sky-settings-group__list + > .sky-field:not(.sky-field--has-label) + .sky-field__control { + margin: 0; +} + .sky-settings-group__list > .sky-field .sky-field__label { font-size: 13px; line-height: 18px; diff --git a/frontend/src/ui/settings/SkySettingsGroup.test.ts b/frontend/src/ui/settings/SkySettingsGroup.test.ts index 86b537b..056524d 100644 --- a/frontend/src/ui/settings/SkySettingsGroup.test.ts +++ b/frontend/src/ui/settings/SkySettingsGroup.test.ts @@ -65,4 +65,13 @@ describe('SkySettingsGroup', () => { /\.sky-settings-group__title\s*\{[^}]*margin:\s*32px 16px 8px/s, ) }) + + it('centers standalone fields without the base field negative margins', () => { + expect(settingsStyles).toMatch( + /\.sky-settings-group__list\s*>\s*\.sky-field:not\(\.sky-field--has-label\)\s*\.sky-field__inner\s*\{[^}]*display:\s*flex[^}]*justify-content:\s*center/s, + ) + expect(settingsStyles).toMatch( + /\.sky-settings-group__list\s*>\s*\.sky-field:not\(\.sky-field--has-label\)\s*\.sky-field__control\s*\{[^}]*margin:\s*0/s, + ) + }) }) diff --git a/frontend/src/views/apps/RadioApp.contract.test.ts b/frontend/src/views/apps/RadioApp.contract.test.ts index e7beb03..f6202f6 100644 --- a/frontend/src/views/apps/RadioApp.contract.test.ts +++ b/frontend/src/views/apps/RadioApp.contract.test.ts @@ -78,6 +78,69 @@ describe('RadioApp Sky UI contract', () => { expect(source).toContain('connectHistory(entry)') }) + it('keeps the volume slider inside its Sky list row and exposes speaker progress', () => { + const volumeTitle = ':title="phone.t(\'Apps.radio.volume\')"' + const volumeRowStart = source.lastIndexOf( + '', + volumeRowStart, + ) + ''.length, + ) + + expect(volumeRow).toContain('