Files

1441 lines
19 KiB
CSS

:root {
color-scheme: dark;
--bg: #101313;
--surface: #191d1d;
--surface2: #202626;
--border: #303737;
--text: #f0f3ed;
--muted: #9aa7a4;
--accent: #d2ef92;
--ink: #182015;
--shadow: 0 12px 36px #0002;
font-family: Inter, "Segoe UI", sans-serif;
}
* {
box-sizing: border-box;
}
body {
margin: 0px;
background: var(--bg);
color: var(--text);
}
button, input, select {
font: inherit;
}
button, a, input, select {
-webkit-tap-highlight-color: transparent;
}
button, a {
touch-action: manipulation;
}
button, select {
cursor: pointer;
}
a {
color: inherit;
text-decoration: none;
}
button {
color: var(--text);
background: var(--surface2);
border: 1px solid var(--border);
border-radius: 12px;
min-height: 44px;
padding: 10px 15px;
}
button:hover, a.pill:hover {
filter: brightness(1.15);
}
:focus-visible {
outline: 3px solid var(--accent);
outline-offset: 4px;
}
[hidden] {
display: none !important;
}
.shell {
display: flex;
min-height: 100dvh;
}
.rail {
width: 106px;
flex-shrink: 0;
border-right: 1px solid var(--border);
display: flex;
align-items: center;
flex-direction: column;
padding: 22px 10px;
gap: 35px;
background: rgb(20, 24, 24);
}
.rail nav {
display: flex;
flex-direction: column;
gap: 14px;
width: 100%;
margin: auto 0px;
}
.rail nav a, .settings-button {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 8px;
min-height: 78px;
font-size: 11px;
font-weight: 600;
border-radius: 15px;
color: var(--muted);
border: 1px solid transparent;
background: none;
width: 100%;
}
.rail nav a:hover {
background: var(--surface2);
}
.rail nav a.active {
background: var(--accent);
color: var(--ink);
}
.icon {
font-size: 27px;
line-height: 1;
}
.workspace {
flex: 1 1 0%;
min-width: 0px;
display: flex;
flex-direction: column;
}
header {
height: 85px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0px 36px;
border-bottom: 1px solid var(--border);
gap: 18px;
}
.header-right {
display: flex;
align-items: center;
gap: 24px;
font-variant-numeric: tabular-nums;
}
.header-right time {
font-size: 18px;
}
.header-temp {
font-size: 18px;
}
.header-temp small {
font-size: 9px;
color: var(--muted);
}
.badge, .label {
font-size: 9px;
font-weight: 650;
letter-spacing: 1px;
border: 1px solid var(--border);
border-radius: 6px;
padding: 6px 9px;
white-space: nowrap;
}
.badge {
color: var(--accent);
}
.badge.error {
color: rgb(255, 179, 151);
}
.header-right button {
background: none;
font-size: 25px;
border: 0px;
padding: 4px 10px;
}
main {
padding: 28px 36px;
flex: 1 1 0%;
}
.page-heading {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 24px;
gap: 15px;
}
.eyebrow {
font-size: 10px;
letter-spacing: 1.8px;
color: var(--muted);
font-weight: 600;
margin: 0px 0px 10px;
}
h1 {
font-weight: 500;
font-size: 29px;
letter-spacing: -1px;
margin: 0px;
}
h2 {
font-size: 21px;
font-weight: 500;
margin: 0px 0px 10px;
}
h3 {
font-weight: 500;
}
p {
line-height: 1.6;
}
.subtle {
color: var(--muted);
font-size: 12px;
}
.accent {
color: var(--accent);
}
.card {
border: 1px solid var(--border);
border-radius: 19px;
background: var(--surface);
padding: 24px;
overflow: hidden;
box-shadow: var(--shadow);
}
.card-top {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
}
.card-top .eyebrow {
margin: 0px;
}
.tiny-dot {
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--accent);
box-shadow: rgba(210, 239, 146, 0.25) 0px 0px 12px;
}
.home-grid {
display: grid;
grid-template-columns: 1.45fr 1fr;
gap: 18px;
}
.clock-card {
min-height: 310px;
position: relative;
background: rgb(34, 46, 43);
}
.clock-card > time {
position: relative;
z-index: 2;
display: block;
font-size: clamp(60px, 8vw, 108px);
font-weight: 300;
letter-spacing: -6px;
margin-top: 16px;
line-height: 1.1;
font-variant-numeric: tabular-nums;
}
.clock-card > p {
position: relative;
z-index: 2;
color: rgb(189, 201, 192);
font-size: 14px;
margin-top: 8px;
}
.clock-bottom {
position: absolute;
bottom: 22px;
left: 24px;
right: 24px;
display: flex;
justify-content: space-between;
gap: 12px;
font-size: 10px;
color: rgb(187, 202, 188);
z-index: 2;
}
.clock-bottom span:last-child {
font-size: 8px;
letter-spacing: 1px;
}
.horizon {
position: absolute;
right: 0px;
bottom: 0px;
width: 70%;
height: 85%;
overflow: hidden;
opacity: 0.7;
}
.sun {
width: 83px;
height: 83px;
border-radius: 50%;
background: rgb(201, 219, 154);
position: absolute;
right: 15%;
top: 20%;
box-shadow: rgba(210, 239, 146, 0.19) 0px 0px 80px;
}
.mountain {
position: absolute;
width: 130%;
height: 80%;
background: rgb(52, 77, 65);
clip-path: polygon(0px 100%, 40% 4%, 100% 100%);
bottom: -15%;
right: -30%;
transform: rotate(-6deg);
}
.mountain.two {
right: -47%;
bottom: -30%;
background: rgb(23, 43, 40);
transform: rotate(20deg);
}
.road {
position: absolute;
bottom: -20px;
left: 0px;
width: 100%;
height: 65%;
background: rgb(117, 131, 114);
clip-path: polygon(67% 10%, 69% 10%, 42% 65%, 65% 100%, 49% 100%, 37% 65%);
}
.weather-card {
display: flex;
flex-direction: column;
}
.weather-main {
display: flex;
align-items: center;
gap: 24px;
margin: 18px 0px 10px;
}
.weather-sun {
color: var(--accent);
font-size: 65px;
}
.weather-main strong {
font-size: 67px;
line-height: 1;
font-weight: 300;
}
.weather-main strong span {
color: var(--muted);
}
.weather-card p {
color: var(--muted);
font-size: 12px;
margin-top: 0px;
}
.weather-bottom {
display: flex;
justify-content: space-between;
padding-top: 20px;
border-top: 1px solid var(--border);
margin-top: auto;
gap: 8px;
font-size: 10px;
color: var(--muted);
}
.weather-bottom b {
color: var(--text);
font-weight: 500;
}
.vehicle-card h2 {
margin-top: 20px;
}
.vehicle-stats {
display: flex;
justify-content: space-between;
margin-top: 16px;
}
.vehicle-stats strong {
display: block;
font-size: 30px;
font-weight: 400;
}
.vehicle-stats div > span {
font-size: 11px;
color: var(--muted);
}
small {
font-size: 14px;
}
.fuel-track {
height: 5px;
background: var(--border);
border-radius: 5px;
margin: 16px 0px;
overflow: hidden;
}
.fuel-track span {
height: 100%;
width: 0px;
background: var(--accent);
display: block;
transition: width 0.4s;
}
.text-link {
display: flex;
justify-content: space-between;
font-size: 12px;
padding: 5px 0px;
min-height: 34px;
}
.text-link span {
color: var(--accent);
}
.music-card {
display: flex;
align-items: center;
gap: 22px;
}
.music-card h2 {
font-size: 21px;
overflow-wrap: anywhere;
}
.music-card p:not(.eyebrow) {
font-size: 12px;
color: var(--muted);
}
.album-art {
position: relative;
aspect-ratio: 1 / 1;
width: 125px;
flex-shrink: 0;
border-radius: 12px;
background: linear-gradient(140deg, rgb(164, 183, 147), rgb(56, 84, 74));
overflow: hidden;
display: grid;
place-items: center;
}
.record {
width: 80%;
height: 80%;
border-radius: 50%;
background: repeating-radial-gradient(circle, rgb(20, 34, 31) 0px, rgb(20, 34, 31) 2px, rgb(47, 66, 59) 3px, rgb(24, 40, 33) 4px);
box-shadow: rgba(0, 0, 0, 0.333) 8px 12px 20px;
position: relative;
}
.record::after {
content: "";
position: absolute;
inset: 36%;
background: var(--accent);
border: 10px solid rgb(110, 138, 98);
border-radius: 50%;
}
.album-art > span {
position: absolute;
bottom: 10px;
left: 10px;
font-size: 8px;
letter-spacing: 2px;
color: rgb(233, 240, 221);
}
.pill {
display: inline-flex;
justify-content: center;
align-items: center;
gap: 12px;
border: 0px;
background: var(--accent);
color: var(--ink);
border-radius: 10px;
padding: 13px 18px;
min-height: 44px;
font-size: 12px;
font-weight: 650;
}
.profile-label {
color: var(--muted);
font-size: 11px;
display: flex;
align-items: center;
gap: 10px;
}
select, input[type="url"] {
background: var(--surface2);
border: 1px solid var(--border);
border-radius: 8px;
min-height: 44px;
color: var(--text);
padding: 10px;
max-width: 100%;
}
.cluster {
padding: 18px 24px 0px;
}
.cluster-top, .cluster-bottom {
display: flex;
justify-content: space-between;
align-items: center;
font-size: 10px;
letter-spacing: 1px;
gap: 8px;
}
.gauges {
display: grid;
grid-template-columns: minmax(0px, 1fr) 80px minmax(0px, 1fr);
align-items: center;
max-width: 950px;
margin: 0px auto;
}
.gauge svg {
display: block;
width: 100%;
max-height: 330px;
}
.gauge .tick {
stroke: var(--muted);
stroke-width: 1;
}
.gauge .major {
stroke: var(--text);
stroke-width: 2;
}
.gauge text {
fill: var(--muted);
font-family: inherit;
font-size: 12px;
text-anchor: middle;
}
.gauge .dial-value {
fill: var(--text);
font-size: 39px;
font-weight: 500;
font-variant-numeric: tabular-nums;
}
.gauge .dial-label {
font-size: 10px;
letter-spacing: 2px;
}
.needle {
stroke: var(--accent);
stroke-width: 3;
stroke-linecap: round;
transition: transform 0.45s linear;
}
.gear {
text-align: center;
}
.gear strong {
font-size: 52px;
font-weight: 300;
display: block;
}
.gear > span {
font-size: 8px;
color: var(--accent);
letter-spacing: 2px;
}
.cluster-bottom {
border-top: 1px solid var(--border);
padding: 16px 0px;
color: var(--muted);
letter-spacing: 0px;
}
.cluster-bottom b {
color: var(--text);
margin-left: 8px;
font-weight: 500;
}
.player-grid {
display: grid;
grid-template-columns: 1fr 1.2fr;
gap: 18px;
}
.player {
text-align: center;
}
.album-art.large {
width: 180px;
margin: 0px auto 24px;
}
.player audio {
width: 100%;
margin: 14px 0px;
}
.player h2 {
overflow-wrap: anywhere;
}
.player p {
font-size: 12px;
color: var(--muted);
}
.player-actions {
display: flex;
justify-content: center;
gap: 12px;
}
.file-picker {
cursor: pointer;
position: relative;
}
.file-picker input {
position: absolute;
inset: 0px;
opacity: 0;
width: 100%;
cursor: pointer;
}
.file-picker:focus-within {
outline: 3px solid var(--accent);
outline-offset: 3px;
}
#playlist {
list-style: none;
padding: 0px;
max-height: 440px;
overflow: auto;
}
#playlist button {
width: 100%;
display: flex;
align-items: center;
gap: 14px;
text-align: left;
margin-bottom: 7px;
background: transparent;
border-color: transparent;
}
#playlist button span {
color: var(--muted);
font-size: 11px;
}
#playlist button b {
font-size: 13px;
font-weight: 400;
overflow-wrap: anywhere;
}
#playlist button.selected {
background: var(--surface2);
border-color: var(--accent);
}
#empty-library {
text-align: center;
padding: 65px 8px;
color: var(--muted);
}
#empty-library > span {
font-size: 55px;
color: var(--accent);
}
#empty-library p {
font-size: 12px;
}
.stream-card {
text-align: center;
padding: 45px 25px;
}
.stream-symbol {
font-size: 80px;
color: var(--accent);
display: block;
}
.stream-card h2 {
font-size: 28px;
}
.stream-card > p {
color: var(--muted);
font-size: 13px;
}
.stream-card .pill {
margin: 15px 4px;
}
.stream-card .subtle {
font-size: 11px;
}
footer {
display: flex;
justify-content: space-between;
gap: 12px;
padding: 18px 36px;
font-size: 8px;
letter-spacing: 1px;
border-top: 1px solid var(--border);
color: var(--muted);
}
footer .subtle {
font-size: 8px;
}
footer .tiny-dot {
margin-right: 7px;
}
dialog {
background: var(--surface);
color: var(--text);
border: 1px solid var(--border);
border-radius: 20px;
width: min(500px, 100% - 32px);
padding: 25px;
max-height: 90dvh;
}
dialog::backdrop {
background: rgba(0, 0, 0, 0.667);
backdrop-filter: blur(5px);
}
dialog label {
display: flex;
flex-direction: column;
gap: 10px;
margin-top: 22px;
font-size: 13px;
}
dialog p {
font-size: 12px;
color: var(--muted);
}
#toast {
position: fixed;
bottom: 35px;
left: 50%;
transform: translateX(-50%);
background: var(--accent);
color: var(--ink);
padding: 14px 20px;
border-radius: 10px;
z-index: 10;
max-width: 90vw;
font-size: 13px;
}
.stale [data-value] {
color: var(--muted);
}
body.light {
color-scheme: light;
--bg: #edf0e8;
--surface: #fff;
--surface2: #edf1e8;
--border: #d7dfd2;
--text: #202c25;
--muted: #59685c;
--accent: #567a2e;
--ink: #fff;
--shadow: 0 12px 36px #253d1710;
}
body.light .rail {
background: rgb(228, 234, 221);
}
body.light .clock-card {
color: rgb(240, 243, 237);
}
body.light .clock-card .eyebrow {
color: rgb(197, 208, 200);
}
body.light .rail nav a.active {
color: rgb(255, 255, 255);
}
@media (min-width: 1600px) {
main {
max-width: 1550px;
width: 100%;
margin: auto;
}
.home-grid {
grid-template-columns: 1.45fr 1fr;
}
.clock-card {
min-height: 370px;
}
.card {
padding: 30px;
}
.music-card {
gap: 35px;
}
.album-art {
width: 165px;
}
}
@media (max-width: 1100px) {
header {
padding: 0px 24px;
height: 70px;
}
.header-right {
gap: 16px;
}
main {
padding: 22px 24px;
}
.rail {
width: 88px;
}
.home-grid {
gap: 14px;
}
.card {
padding: 20px;
}
.clock-card {
min-height: 280px;
}
.music-card {
gap: 14px;
}
.album-art {
width: 95px;
}
.music-card h2 {
font-size: 18px;
}
.music-card .eyebrow {
font-size: 8px;
}
.music-card .pill {
padding: 12px;
}
.clock-bottom span:last-child {
display: none;
}
footer {
padding: 15px 24px;
}
.page-heading > .subtle {
display: none;
}
.gauge svg {
max-height: 270px;
}
}
@media (max-height: 650px) and (min-width: 760px) {
.rail {
padding-top: 12px;
gap: 10px;
}
.rail nav {
gap: 6px;
}
.rail nav a {
min-height: 64px;
}
header {
height: 58px;
}
main {
padding: 15px 22px;
}
.page-heading {
margin-bottom: 15px;
}
h1 {
font-size: 24px;
}
.eyebrow {
font-size: 9px;
margin-bottom: 6px;
}
.clock-card {
min-height: 230px;
}
.clock-card > time {
font-size: 72px;
margin-top: 8px;
}
.weather-main {
margin: 8px 0px;
}
.weather-main strong {
font-size: 50px;
}
.weather-sun {
font-size: 46px;
}
.weather-bottom {
padding-top: 12px;
}
.card {
padding: 16px;
}
.vehicle-card h2 {
margin-top: 12px;
}
.vehicle-stats {
margin-top: 8px;
}
.vehicle-stats strong {
font-size: 24px;
}
.fuel-track {
margin: 12px 0px;
}
.music-card h2 {
font-size: 17px;
}
.clock-bottom {
bottom: 15px;
left: 16px;
}
.gauge svg {
max-height: 220px;
}
.cluster-bottom {
padding: 10px 0px;
}
footer {
padding: 10px 22px;
}
.album-art.large {
width: 120px;
margin-bottom: 12px;
}
.player audio {
margin: 4px 0px;
}
.stream-card {
padding: 20px;
}
.stream-symbol {
font-size: 55px;
}
}
@media (max-width: 759px) {
.rail {
width: 72px;
padding: 15px 6px;
}
.rail nav a {
font-size: 9px;
min-height: 68px;
}
.icon {
font-size: 23px;
}
.settings-button {
font-size: 9px;
}
header {
padding: 0px 16px;
gap: 10px;
}
.header-right {
gap: 8px;
}
.header-temp {
display: none;
}
.header-right time {
font-size: 13px;
}
.badge {
font-size: 7px;
padding: 5px;
}
main {
padding: 20px 16px;
}
.page-heading {
align-items: flex-start;
}
h1 {
font-size: 25px;
}
.home-grid, .player-grid {
grid-template-columns: 1fr;
}
.clock-card {
min-height: 275px;
}
.weather-card {
min-height: 240px;
}
.music-card {
min-height: 190px;
}
.gauges {
grid-template-columns: 1fr 1fr;
position: relative;
}
.gear {
grid-area: 2 / 1 / auto / -1;
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
padding-bottom: 15px;
}
.gear strong {
font-size: 28px;
}
.gear p {
margin: 0px;
}
.gauge svg {
max-height: none;
}
.cluster {
padding: 12px 8px 0px;
}
.cluster-top {
flex-wrap: wrap;
justify-content: center;
line-height: 1.6;
}
.cluster-top > .label {
font-size: 7px;
}
.cluster-bottom {
font-size: 9px;
flex-wrap: wrap;
justify-content: center;
}
.page-heading {
flex-wrap: wrap;
}
.profile-label {
margin-top: 4px;
}
footer {
padding: 15px;
font-size: 7px;
letter-spacing: 0px;
flex-wrap: wrap;
}
footer > span:last-child {
display: none;
}
.stream-card h2 {
font-size: 24px;
}
}
@media (min-width: 760px) {
.vehicle-card h2 {
margin-top: 12px;
margin-bottom: 4px;
}
.vehicle-stats {
margin-top: 8px;
}
.home-grid .vehicle-card {
padding-top: 18px;
padding-bottom: 18px;
}
.home-grid .vehicle-card .fuel-track {
margin: 12px 0px;
}
.home-grid .vehicle-card .text-link {
min-height: 28px;
}
}
@media (max-height: 650px) and (min-width: 760px) {
.home-grid .vehicle-card h2 {
display: none;
}
.home-grid .vehicle-card {
padding: 14px 16px;
}
.home-grid .vehicle-stats {
margin-top: 10px;
}
.home-grid .vehicle-card .fuel-track {
margin: 10px 0px;
}
.clock-card {
min-height: 205px;
}
.weather-card h2 {
font-size: 18px;
margin-bottom: 4px;
}
.weather-card p {
font-size: 11px;
line-height: 1.3;
margin-bottom: 10px;
}
.weather-main {
margin: 8px 0px;
}
.weather-bottom {
padding-top: 10px;
}
.gauge svg {
max-height: 185px;
}
.cluster-bottom {
padding: 8px 0px;
}
}
@media (max-height: 520px) and (min-width: 760px) {
header {
height: 48px;
}
main {
padding: 12px 18px;
}
.page-heading {
margin-bottom: 10px;
}
.page-heading .eyebrow {
display: none;
}
.page-heading h1 {
font-size: 22px;
}
.home-grid {
gap: 10px;
}
.clock-card {
min-height: 160px;
}
.clock-card > time {
font-size: 58px;
}
.clock-card > p {
font-size: 11px;
}
.clock-bottom {
font-size: 8px;
}
.weather-main {
margin: 5px 0px;
}
.weather-main strong {
font-size: 38px;
}
.weather-sun {
font-size: 35px;
}
.weather-card h2 {
font-size: 16px;
}
.weather-card > p {
display: none;
}
.weather-bottom {
padding-top: 8px;
font-size: 8px;
}
.home-grid .vehicle-card {
padding: 10px 14px;
}
.vehicle-stats strong {
font-size: 20px;
}
.music-card .eyebrow {
display: none;
}
.music-card h2 {
font-size: 16px;
}
.music-card p:not(.eyebrow) {
margin: 5px 0px;
font-size: 10px;
}
.album-art {
width: 70px;
}
.music-card .pill {
padding: 10px;
font-size: 10px;
}
.gauge svg {
max-height: 145px;
}
.cluster-top {
font-size: 8px;
}
.cluster-top .label {
font-size: 7px;
}
.profile-label select {
min-height: 40px;
}
footer {
padding: 8px 18px;
}
.rail nav a {
min-height: 59px;
}
.rail nav {
gap: 5px;
}
.rail {
gap: 5px;
}
.settings-button {
min-height: 50px;
}
}
@media (min-height: 651px) and (max-height: 850px) and (min-width: 1101px) {
.clock-card {
min-height: 270px;
}
}
@media (prefers-reduced-motion: reduce) {
*, ::before, ::after {
transition: none !important;
scroll-behavior: auto !important;
}
}