From 6ced26a78f2fb686cf9a3fb575fb0cbe551260f4 Mon Sep 17 00:00:00 2001 From: intergrav Date: Thu, 6 Aug 2026 15:55:17 -0400 Subject: [PATCH] refactor: clean up and modernize styling --- package.json | 3 +- src/app.css | 60 +++++++++-------- src/lib/Controls.svelte | 39 ++++++----- src/lib/Library.svelte | 6 +- src/lib/LibraryTreeItem.svelte | 43 ++++++------ src/lib/NowPlaying.svelte | 74 +++++++++++---------- src/lib/Queue.svelte | 19 ++---- src/lib/Sidebar.svelte | 5 +- src/lib/Visualizer.svelte | 3 +- src/lib/components/ContextMenu.svelte | 6 +- src/lib/components/ProgressBar.svelte | 10 +-- src/lib/dialogs/AuthModal.svelte | 2 - src/lib/dialogs/InfoModal.svelte | 1 - src/lib/dialogs/Modal.svelte | 22 +++++- src/lib/dialogs/PlaylistModals.svelte | 15 ----- src/lib/dialogs/RadioModals.svelte | 15 ----- src/lib/dialogs/SettingsModal.svelte | 20 +++--- src/lib/dialogs/ShortcutsModal.svelte | 10 +-- src/lib/dialogs/UnsyncedChangesModal.svelte | 13 ++-- src/lib/dialogs/UpdateModal.svelte | 4 -- src/lib/icons/Icon.svelte | 10 +-- 21 files changed, 175 insertions(+), 205 deletions(-) diff --git a/package.json b/package.json index 2e77aec..43edcb8 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,7 @@ "dev": "vite", "build": "vite build", "preview": "vite preview", - "check:svelte": "svelte-check --tsconfig ./tsconfig.app.json", - "check:tsc": "tsc --noEmit", + "check:svelte": "svelte-check", "check:biome": "biome check", "check:knip": "knip", "check": "svelte-check && biome check && knip", diff --git a/src/app.css b/src/app.css index 4076360..85209d1 100644 --- a/src/app.css +++ b/src/app.css @@ -2,7 +2,6 @@ color-scheme: light dark; --bg-layer: light-dark(hsl(0 0% 0% / 0.05), hsl(0 0% 100% / 0.05)); - --bg-playing: hsl(200 90% 50% / 0.3); --bg-highlight: Highlight; --bg: Canvas; @@ -14,6 +13,10 @@ --text-highlight: HighlightText; --text: CanvasText; + --accent-red: red; + --accent-orange: orange; + --accent-green: lime; + --font-family: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; @@ -23,7 +26,8 @@ --radius-sm: 2px; --radius-md: 4px; - --button-hover-scale: 1.125; + --ease-out-cubic: cubic-bezier(0.33, 1, 0.68, 1); + --button-press-scale-x: 1.25; --button-press-scale-y: 0.75; --button-hover-duration: 350ms; @@ -36,6 +40,20 @@ --viewport-inset-left: env(safe-area-inset-left, 0px); } +/* squircles! only chromium supports this right now */ +/* snippet from https://til.jakelazaroff.com/css/make-all-rounded-corners-squircles */ + +@supports (corner-shape: squircle) { + :root { + --radius-sm: 4px; + --radius-md: 8px; + } + :where(html.rounded-corners) + :where(:not(button, input, select, textarea, option, optgroup)) { + corner-shape: squircle; + } +} + html.window-controls-overlay { --viewport-inset-top: max( env(safe-area-inset-top, 0px), @@ -51,11 +69,11 @@ html.window-controls-overlay { display: block; inline-size: 100%; block-size: 100%; + object-fit: cover; } .rounded-corners :is(.artwork, .artwork-image) { border-radius: var(--radius-sm); - corner-shape: squircle; } button.pressable--gentle { @@ -67,7 +85,7 @@ button.pressable--gentle { html.animations { &.dynamic-colors { - transition: background-color 300ms cubic-bezier(0.33, 1, 0.68, 1); + transition: background-color 300ms var(--ease-out-cubic); } img.image-loading { @@ -85,7 +103,7 @@ html.animations { :where(.pressable--gentle) ):hover, button.pressable.focused:not(:disabled, :active, .pressable--gentle) { - transform: scale(var(--button-hover-scale)); + transform: scale(1.125); } button:where(.pressable, :has(> .icon)):not(:disabled):active { @@ -157,7 +175,6 @@ html { font-size: calc(var(--font-size) * env(preferred-text-scale, 1)); font-family: var(--font-family); user-select: none; - -webkit-user-select: none; -webkit-tap-highlight-color: transparent; overscroll-behavior: none; } @@ -174,25 +191,18 @@ html.transparent-borders { body { background: transparent; color: var(--text); - block-size: 100vh; - inline-size: 100vw; + block-size: 100dvh; + inline-size: 100dvw; padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left); } -@supports (block-size: 100dvh) { - body { - block-size: 100dvh; - inline-size: 100dvw; - } -} - #app { display: grid; grid-template-areas: "sidebar queue" "sidebar controls"; - grid-template-columns: auto 1fr; + grid-template-columns: auto minmax(0, 1fr); grid-template-rows: 1fr auto; block-size: 100%; inline-size: 100%; @@ -214,13 +224,13 @@ body { border-inline-end: var(--border); } -@media (max-width: 32rem) { +@media (width <= 32rem) { html:not(.miniplayer) body { background: var(--bg); } html.animations.dynamic-colors body { - transition: background-color 300ms cubic-bezier(0.33, 1, 0.68, 1); + transition: background-color 300ms var(--ease-out-cubic); } #sidebar { display: contents; @@ -263,6 +273,10 @@ html.miniplayer #app { grid-template-rows: 1fr auto; } +html.miniplayer #now-playing { + grid-area: nowplaying; +} + html.miniplayer #library, html.miniplayer #queue { display: none; @@ -289,13 +303,3 @@ html.miniplayer.window-controls-overlay #now-playing { app-region: drag; z-index: 20; } - -/* squircles! only chromium supports this right now */ -/* snippet from https://til.jakelazaroff.com/css/make-all-rounded-corners-squircles */ - -@supports (corner-shape: squircle) { - :root { - --radius-sm: 4px; - --radius-md: 8px; - } -} diff --git a/src/lib/Controls.svelte b/src/lib/Controls.svelte index c10096d..f2d4270 100644 --- a/src/lib/Controls.svelte +++ b/src/lib/Controls.svelte @@ -30,7 +30,6 @@ let menu = $state<{
- .controls { + #controls { container-type: inline-size; } #playback { @@ -286,7 +285,7 @@ let menu = $state<{ order: 2; } - @container (max-width: 36rem) { + @container (width <= 36rem) { display: grid; grid-template-columns: minmax(0, 1fr); @@ -300,13 +299,13 @@ let menu = $state<{ } } - @container (max-width: 26rem) { + @container (width <= 26rem) { .time { display: none; } } - @container (max-width: 20rem) { + @container (width <= 20rem) { .volume { display: none; } @@ -325,6 +324,12 @@ let menu = $state<{ #playback-next { --button-transform-origin: 25%; } + :global(:dir(rtl)) #playback-prev { + --button-transform-origin: 25%; + } + :global(:dir(rtl)) #playback-next { + --button-transform-origin: 75%; + } button { background: none; @@ -352,8 +357,8 @@ let menu = $state<{ gap: 1rem; } .stats { - @container (max-width: 20rem) { - @media (max-width: 32rem) { + @container (width <= 20rem) { + @media (width <= 32rem) { display: none; } } @@ -365,7 +370,7 @@ let menu = $state<{ opacity: 0.5; } - @container (max-width: 32rem) { + @container (width <= 32rem) { --button-press-scale-x: 1.25; --button-press-scale-y: 0.75; --button-hover-duration: 400ms; @@ -380,7 +385,7 @@ let menu = $state<{ .library-toggle { display: none; - @media (max-width: 32rem) { + @media (width <= 32rem) { display: flex; } } @@ -401,8 +406,8 @@ let menu = $state<{ border-block-start: var(--border-subtle); } - @container (max-width: 36rem) { - :global(html.miniplayer) .controls.time-disabled.volume-disabled { + @container (width <= 36rem) { + :global(html.miniplayer) #controls.time-disabled.volume-disabled { #ratings, #playback .playback-main { justify-content: center; @@ -412,8 +417,8 @@ let menu = $state<{ } } } - @container (max-width: 26rem) { - :global(html.miniplayer) .controls.volume-disabled { + @container (width <= 26rem) { + :global(html.miniplayer) #controls.volume-disabled { #ratings, #playback .playback-main { justify-content: center; @@ -423,8 +428,8 @@ let menu = $state<{ } } } - @container (max-width: 20rem) { - :global(html.miniplayer) .controls { + @container (width <= 20rem) { + :global(html.miniplayer) #controls { #ratings, #playback .playback-main { justify-content: center; @@ -443,12 +448,12 @@ let menu = $state<{ } .btn-rating.active { :global(html:not(.dynamic-colors)) & { - color: hsl(45, 100%, 60%); + color: var(--accent-orange); } } .btn-favorite.active { :global(html:not(.dynamic-colors)) & { - color: hsl(0, 100%, 60%); + color: var(--accent-red); } } .rating-stars { diff --git a/src/lib/Library.svelte b/src/lib/Library.svelte index ef50cdd..15d7f54 100644 --- a/src/lib/Library.svelte +++ b/src/lib/Library.svelte @@ -904,7 +904,7 @@ function onKey(event: KeyboardEvent) { .library-header { padding-block-start: 0.5rem; } - #search { + input { inline-size: 100%; } :global(#library > ul) { @@ -939,14 +939,14 @@ function onKey(event: KeyboardEvent) { button { color: inherit; } - :global(.dynamic-colors) #search { + :global(.dynamic-colors) input { background: var(--bg-layer); color: var(--text); border: var(--border); border-radius: var(--radius-md); corner-shape: squircle; } - :global(.dynamic-colors) #search::placeholder { + :global(.dynamic-colors) input::placeholder { color: var(--text); opacity: 0.5; } diff --git a/src/lib/LibraryTreeItem.svelte b/src/lib/LibraryTreeItem.svelte index a4204cb..633fc01 100644 --- a/src/lib/LibraryTreeItem.svelte +++ b/src/lib/LibraryTreeItem.svelte @@ -331,7 +331,7 @@ function onDragStart(event: DragEvent) { type="button" tabindex="-1" class:focused={lib.focusedId === rowKey} - class="btn main pressable pressable--gentle" + class="main pressable pressable--gentle" data-id={rowKey} draggable={canDrag} disabled={busy} @@ -396,10 +396,7 @@ function onDragStart(event: DragEvent) { {/if}
- {label} {#if owner && !isOwner} @@ -411,7 +408,7 @@ function onDragStart(event: DragEvent) {