-
now playing
-
-
-
![]()
-
-
-
+
+
+
+ —
+ —
+
+
+
+
+
+
+ —
+ this week
+
+
+ —
+ all‑time
+
+
+ —
+ minutes
-
-
top tracks last 4 weeks
-
-
+
+
+
+
on repeat · this week
+
+
+
+
top artists · this week
+
+
+
+
+
+
@@ -304,31 +325,51 @@ import { Icon } from "astro-icon/components";
overflow-y: auto;
max-height: calc(min(82vh, 40rem) - 2.6rem);
}
- .music-block + .music-block {
- margin-top: 1.4rem;
+ .music-wall__body .stat-bigs {
+ margin-top: 1rem;
}
- .music-block .label {
- margin-bottom: 0.7rem;
+ .music-wall__body .np[hidden] + .stat-bigs {
+ margin-top: 0;
+ }
+ .lfm-lib {
+ margin: 0.7rem 0 0;
+ font-family: var(--mono);
+ font-size: 0.66rem;
+ letter-spacing: 0.02em;
+ color: var(--faint);
+ }
+ .stat-list--plain li::before {
+ display: none;
+ }
+ .stat-list--plain .stat-list__v {
+ color: var(--faint);
}
.np {
- width: 100%;
- border: 1px solid var(--faint);
- background: #151412;
- }
- .np__body {
display: flex;
- gap: 0.7rem;
- padding: 0.65rem;
+ gap: 0.8rem;
+ align-items: center;
+ padding: 0.7rem;
+ border: 1px solid var(--line);
+ border-radius: 8px;
+ background: #151412;
+ text-decoration: none;
+ transition:
+ border-color 0.18s ease,
+ background 0.18s ease;
+ }
+ .np:hover,
+ .np:focus-visible {
+ border-color: var(--faint);
+ background: #191714;
}
.np__art {
- width: 64px;
- height: 64px;
- flex-shrink: 0;
+ width: 60px;
+ height: 60px;
+ flex: none;
object-fit: cover;
- border: 1px solid var(--faint);
- border-radius: 4px;
- background: var(--faint);
+ border-radius: 5px;
+ background: var(--line);
}
.np__art--none {
background: linear-gradient(145deg, #2c2a26, #171614);
@@ -338,21 +379,25 @@ import { Icon } from "astro-icon/components";
flex: 1;
display: flex;
flex-direction: column;
- justify-content: center;
- gap: 0.05rem;
+ gap: 0.15rem;
font-family: var(--mono);
}
.np__title {
- color: #fff;
- font-size: 0.8rem;
- line-height: 1.35;
+ color: var(--ink);
+ font-size: 0.85rem;
+ line-height: 1.3;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
+ transition: color 0.18s ease;
}
- .np__artist {
+ .np:hover .np__title,
+ .np:focus-visible .np__title {
+ color: #fff;
+ }
+ .np__by {
+ font-size: 0.72rem;
color: var(--muted);
- font-size: 0.74rem;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -361,157 +406,41 @@ import { Icon } from "astro-icon/components";
display: flex;
align-items: center;
gap: 0.6rem;
- margin-top: 0.3rem;
+ margin-top: 0.32rem;
font-size: 0.68rem;
}
- .np__tx {
- display: inline-flex;
- align-items: center;
- gap: 0.32rem;
- color: var(--muted);
- flex-shrink: 0;
- }
- .np__tx svg {
- display: block;
- }
- .np__dur {
- color: var(--muted);
- white-space: nowrap;
- }
- .np__ago {
- color: var(--faint);
- white-space: nowrap;
- }
.np__src {
- margin-left: auto;
display: inline-flex;
align-items: center;
- gap: 0.3rem;
+ gap: 0.35ch;
color: var(--muted);
- text-decoration: none;
- white-space: nowrap;
}
- .np__src:hover {
+ .np:hover .np__src {
color: #fff;
}
.np__logo {
- width: 0.95em;
- height: 0.95em;
+ width: 1em;
+ height: 1em;
+ flex: none;
color: #1ed760;
- flex-shrink: 0;
- display: block;
}
- .np__prog {
- height: 2px;
- background: #2b2825;
+ .np--live .np__logo {
+ animation: np-glow 1.8s ease-in-out infinite;
}
- .np__prog-fill {
- height: 2px;
- width: 0%;
- background: linear-gradient(90deg, rgb(255, 224, 138), rgb(255, 171, 94), rgb(255, 95, 109));
- transition: width 1s linear;
- }
-
- .mosaic {
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- grid-template-rows: repeat(3, 1fr);
- grid-auto-flow: dense;
- gap: 3px;
- aspect-ratio: 4 / 3;
- width: 100%;
- }
- .mosaic__cell {
- position: relative;
- display: block;
- overflow: hidden;
- min-width: 0;
- background: rgba(255, 255, 255, 0.04);
- }
- .mosaic__cell--xl {
- grid-column: span 2;
- grid-row: span 2;
- }
- .mosaic__cell img {
- display: block;
- width: 100%;
- height: 100%;
- object-fit: cover;
- filter: saturate(0.7) brightness(0.82);
- transition:
- filter 0.18s ease,
- transform 0.3s cubic-bezier(0.16, 1, 0.3, 1);
- }
- .mosaic__cell:hover img,
- .mosaic__cell:focus-visible img {
- filter: none;
- transform: scale(1.08);
- }
- .mosaic__caps {
- position: relative;
- margin-top: 0.5rem;
- min-height: 1.35em;
- font-family: var(--mono);
- font-size: 0.74rem;
- }
- .mosaic__cap {
- position: absolute;
- inset: 0;
- display: flex;
- align-items: baseline;
- gap: 0.55rem;
- opacity: 0;
- transition: opacity 0.14s ease;
- pointer-events: none;
- white-space: normal;
- }
- .mosaic__rank {
- color: var(--faint);
- font-variant-numeric: tabular-nums;
- flex-shrink: 0;
- }
- .mosaic__title {
- color: var(--ink);
- overflow: hidden;
- text-overflow: ellipsis;
- flex-shrink: 1;
- min-width: 0;
- }
- .mosaic__artist {
- color: var(--faint);
- overflow: hidden;
- text-overflow: ellipsis;
- flex: 1;
- min-width: 0;
- }
- .mosaic__cap:first-child {
- opacity: 1;
- }
-
- @supports selector(:has(*)) {
- .top:has(.mosaic__cell:hover) .mosaic__cap,
- .top:has(.mosaic__cell:focus-visible) .mosaic__cap {
- opacity: 0;
+ @keyframes np-glow {
+ 50% {
+ filter: drop-shadow(0 0 4px rgba(30, 215, 96, 0.8));
}
- .top:has(.mosaic__cell:nth-child(1):hover) .mosaic__cap:nth-child(1),
- .top:has(.mosaic__cell:nth-child(1):focus-visible) .mosaic__cap:nth-child(1),
- .top:has(.mosaic__cell:nth-child(2):hover) .mosaic__cap:nth-child(2),
- .top:has(.mosaic__cell:nth-child(2):focus-visible) .mosaic__cap:nth-child(2),
- .top:has(.mosaic__cell:nth-child(3):hover) .mosaic__cap:nth-child(3),
- .top:has(.mosaic__cell:nth-child(3):focus-visible) .mosaic__cap:nth-child(3),
- .top:has(.mosaic__cell:nth-child(4):hover) .mosaic__cap:nth-child(4),
- .top:has(.mosaic__cell:nth-child(4):focus-visible) .mosaic__cap:nth-child(4),
- .top:has(.mosaic__cell:nth-child(5):hover) .mosaic__cap:nth-child(5),
- .top:has(.mosaic__cell:nth-child(5):focus-visible) .mosaic__cap:nth-child(5),
- .top:has(.mosaic__cell:nth-child(6):hover) .mosaic__cap:nth-child(6),
- .top:has(.mosaic__cell:nth-child(6):focus-visible) .mosaic__cap:nth-child(6),
- .top:has(.mosaic__cell:nth-child(7):hover) .mosaic__cap:nth-child(7),
- .top:has(.mosaic__cell:nth-child(7):focus-visible) .mosaic__cap:nth-child(7),
- .top:has(.mosaic__cell:nth-child(8):hover) .mosaic__cap:nth-child(8),
- .top:has(.mosaic__cell:nth-child(8):focus-visible) .mosaic__cap:nth-child(8),
- .top:has(.mosaic__cell:nth-child(9):hover) .mosaic__cap:nth-child(9),
- .top:has(.mosaic__cell:nth-child(9):focus-visible) .mosaic__cap:nth-child(9) {
- opacity: 1;
+ }
+ .np__ago {
+ margin-left: auto;
+ flex: none;
+ color: var(--faint);
+ white-space: nowrap;
+ }
+ @media (prefers-reduced-motion: reduce) {
+ .np--live .np__logo {
+ animation: none;
}
}
diff --git a/src/components/Stats.astro b/src/components/Stats.astro
index 6abd8e8..a159ab2 100644
--- a/src/components/Stats.astro
+++ b/src/components/Stats.astro
@@ -54,7 +54,7 @@ import { Icon } from "astro-icon/components";