mirror of
https://github.com/4gray/iptvnator.git
synced 2026-10-15 05:36:17 -08:00
refactor(settings): kill triple header, compact theme picker, real footer
Four UX-audit fixes for the Settings page:
1. Header dedupe
- The page used to stack THREE headers vertically: the workspace rail's
"Settings" entry, a page-level <h1>Settings</h1> + subtitle, and the
General section's <h3>General</h3> + subtitle. The page-level and
section-level subtitles both used SETTINGS.GENERAL_SUBTITLE
("Change the configuration of the application"), word-for-word.
- Drop the visible page-level header entirely. Keep an a11y-only
<span class="visually-hidden"> for the data-test-id hook so the
existing settings.component.spec selector still resolves. Left rail
announces "Settings"; section header is now the page anchor.
- Add a global .visually-hidden helper to styles.scss for re-use.
2. Theme + Cover-size pickers shrink to a real segmented control
- .theme-switcher was a 3-column grid of ~78px-tall buttons making
"Choose theme" look like the most important action in Settings.
Replaced with a 30px-tall segmented control (track + thumb with
box-shadow on the selected option), matching the standard Material
"compact row" cadence everywhere else.
- Shortened all 18 locales' THEMES.* labels from "Light theme / Dark
theme / System theme" to "Light / Dark / System". The "theme" word
duplicated the section's own h3 ("Visual theme") and forced labels
to wrap into two lines in narrow columns.
3. Save bar becomes a real sticky footer
- The action bar was a `border-radius:18px; margin-left:auto;
position:sticky` chip floating bottom-right that clipped the last
form rows underneath. Now spans the full content column with a
top border separator — sits flush with the bottom edge while
still sticky on scroll. The save-button gradient also drops the
hand-rolled #3b82f6 in favour of var(--app-selection-color) so it
matches the unified blue primary used everywhere else.
4. Playlist switcher hidden on /settings
- Workspace shell header gains an isSettingsRoute input that hides
the playlist switcher block AND the leading actions group
(+ Add source / header shortcut / bulk action). Settings is a
global page — those controls were implying that switching
playlists scopes settings, which it doesn't. Wired through from
the shell facade's existing isSettingsRoute computed.
- Mock header in workspace-shell.component.spec gains the matching
input() declaration so the binding resolves under tests.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
7399fbfa9e
commit
115911d2a6
24 files changed
+207
-156
No files matched your search
@@ -14,18 +14,20 @@
|
||||
class="settings-layout"
|
||||
novalidate
|
||||
>
|
||||
<!-- Page-level "Settings" h1 intentionally removed: the left rail
|
||||
already labels the page "Settings" (sg-nav-title), and each
|
||||
section below provides its own h3 + subtitle. Stacking another
|
||||
h1 in the right pane reproduced the audit's "vertical ladder
|
||||
of identical labels" complaint. -->
|
||||
@if (!isDialog) {
|
||||
<header
|
||||
class="settings-page-header"
|
||||
<!-- Reserved hook so the page test selector still resolves,
|
||||
even though there's no visible chrome here. -->
|
||||
<span
|
||||
class="visually-hidden"
|
||||
data-test-id="settings-page-header"
|
||||
>
|
||||
<div class="settings-page-header__text">
|
||||
<h1 data-test-id="settings-page-title">
|
||||
{{ 'SETTINGS.TITLE' | translate }}
|
||||
</h1>
|
||||
<p>{{ 'SETTINGS.GENERAL_SUBTITLE' | translate }}</p>
|
||||
</div>
|
||||
</header>
|
||||
{{ 'SETTINGS.TITLE' | translate }}
|
||||
</span>
|
||||
}
|
||||
|
||||
<div class="settings-content">
|
||||
|
||||
Reference in new issue
Block a user