nosignal-shell/scss/sidebar.scss
2 * r + 2 * t 6f62023574 sidebar: better headlines
No tooltip, instead show title when expand
Sort articles by source priority
Also allow excluding domains and exclude google news by default (its just an aggregator so it causes lots of duplicates)
2025-04-10 19:56:40 +10:00

1118 lines
28 KiB
SCSS

@use "sass:color";
@use "sass:list";
@use "scheme";
@use "lib";
@use "font";
@mixin notification($accent) {
.separator {
background-color: $accent;
}
.image {
@include lib.border($accent, 0.05);
}
}
@mixin button {
@include lib.element-decel;
background-color: color.change(scheme.$surface1, $alpha: 0.5);
&:hover,
&:focus {
background-color: color.change(scheme.$surface2, $alpha: 0.5);
}
&:active {
background-color: color.change(scheme.$overlay0, $alpha: 0.5);
}
&:disabled {
color: scheme.$subtext0;
}
}
@mixin button-active {
@include lib.element-decel;
background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.5);
&:hover,
&:focus {
background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 30%), $alpha: 0.5);
}
&:active {
background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 20%), $alpha: 0.5);
}
}
@mixin media-button {
@include lib.element-decel;
&:disabled {
color: color.change(scheme.$overlay2, $alpha: 1);
}
&:hover,
&:focus {
color: color.mix(scheme.$subtext1, scheme.$subtext0, 50%);
}
&:active {
color: scheme.$subtext0;
}
}
.sidebar {
@include font.mono;
background-color: scheme.$mantle;
color: scheme.$text;
padding: lib.s(18) lib.s(20);
min-width: lib.s(380);
.pane {
@include lib.spacing(20, true);
}
.separator {
background-color: if(scheme.$light, scheme.$surface1, scheme.$overlay0);
margin: 0 lib.s(10);
}
.header-bar {
margin-bottom: lib.s(10);
@include lib.spacing;
& > :not(button) {
font-weight: bold;
font-size: lib.s(16);
}
& > button {
@include lib.element-decel;
@include lib.rounded(10);
padding: lib.s(3) lib.s(8);
&:disabled {
color: color.change(scheme.$overlay0, $alpha: 1);
}
&:hover,
&:focus {
color: scheme.$subtext0;
}
&:active {
color: color.change(scheme.$overlay2, $alpha: 1);
}
&.enabled {
$-base: color.change(scheme.$base, $alpha: 1);
background-color: scheme.$primary;
color: $-base;
&:hover,
&:focus {
background-color: color.mix(scheme.$primary, $-base, 80%);
}
&:active {
background-color: color.mix(scheme.$primary, $-base, 70%);
}
}
}
}
.empty {
color: scheme.$subtext0;
font-size: lib.s(18);
.icon {
font-size: lib.s(48);
}
}
.user {
@include lib.spacing(15);
.face {
@include lib.rounded(10);
background-position: center;
background-repeat: no-repeat;
background-size: cover;
min-width: lib.s(96);
min-height: lib.s(96);
font-size: lib.s(48);
font-weight: bold;
background-color: scheme.$base;
}
.details {
font-size: lib.s(14);
@include lib.spacing(8, true);
.name {
font-size: lib.s(18);
color: scheme.$text;
margin-bottom: lib.s(10);
}
$-colours: scheme.$yellow, scheme.$blue;
@for $i from 1 through list.length($-colours) {
:nth-child(#{$i + 1}) {
color: list.nth($-colours, $i);
}
}
}
}
.media {
@include lib.spacing(15);
.cover-art {
@include lib.rounded(10);
@include lib.element-decel;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
min-width: lib.s(128);
min-height: lib.s(128);
font-size: lib.s(64);
font-weight: bold;
background-color: scheme.$base;
color: scheme.$subtext0;
}
.details {
font-size: lib.s(14);
.title {
font-size: lib.s(16);
color: scheme.$text;
}
.artist {
color: scheme.$green;
}
.controls {
margin-top: lib.s(20);
margin-bottom: lib.s(5);
font-size: lib.s(24);
& > button {
@include media-button;
}
}
.slider {
@include lib.rounded(5);
@include lib.fluent-decel(1000ms);
min-height: lib.s(8);
background-color: scheme.$overlay0;
color: scheme.$subtext1;
}
.time {
margin-top: lib.s(5);
font-size: lib.s(13);
color: scheme.$subtext0;
}
}
}
.notification {
.wrapper {
padding-bottom: lib.s(10);
}
.inner {
@include lib.rounded(20);
background-color: color.change(scheme.$surface1, $alpha: 0.4);
&.low {
@include notification(if(scheme.$light, scheme.$surface1, scheme.$overlay0));
@if not scheme.$borders {
background-color: color.change(scheme.$surface0, $alpha: 0.4);
}
}
&.normal {
@include lib.border(scheme.$primary, if(scheme.$light, 0.5, 0.3));
@include notification(scheme.$primary);
}
&.critical {
@include lib.border(scheme.$error, 0.8);
@include notification(scheme.$error);
@if not scheme.$borders {
background-color: color.change(color.mix(scheme.$surface1, scheme.$error, 80%), $alpha: 0.4);
}
}
}
.actions {
@include lib.spacing;
& > button {
@include button;
@include lib.rounded(10);
padding: lib.s(5) lib.s(10);
}
}
}
.upcoming {
.list {
min-height: lib.s(300);
}
.day {
@include lib.spacing($vertical: true);
&:not(:first-child) {
margin-top: lib.s(20);
}
.date {
margin-left: lib.s(10);
}
.sublabel {
font-size: lib.s(14);
color: scheme.$subtext0;
}
.events {
@include lib.rounded(20);
background-color: color.change(scheme.$surface1, $alpha: 0.4);
padding: lib.s(10) lib.s(15);
@include lib.spacing(10, true);
}
.event {
@include lib.spacing(8);
}
.calendar-indicator {
@include lib.rounded(5);
min-width: lib.s(1);
$-colours: scheme.$red, scheme.$sapphire, scheme.$flamingo, scheme.$maroon, scheme.$pink, scheme.$sky,
scheme.$peach, scheme.$yellow, scheme.$green, scheme.$rosewater, scheme.$mauve, scheme.$teal,
scheme.$blue;
@for $i from 1 through list.length($-colours) {
&.calendar-#{$i} {
background-color: list.nth($-colours, $i);
}
}
}
}
}
.players {
.player {
@include lib.spacing(40, true);
.cover-art {
@include lib.rounded(10);
@include lib.element-decel;
@include lib.shadow(scheme.$mantle, $blur: 5, $spread: 2);
background-position: center;
background-repeat: no-repeat;
background-size: cover;
min-width: lib.s(256);
min-height: lib.s(256);
font-size: lib.s(96);
font-weight: bold;
background-color: scheme.$base;
color: scheme.$subtext0;
margin-top: lib.s(20);
}
.progress {
margin: 0 lib.s(40);
.slider {
@include lib.rounded(8);
@include lib.fluent-decel(1000ms);
min-height: lib.s(15);
background-color: scheme.$overlay0;
color: scheme.$subtext1;
}
.time {
margin-top: lib.s(5);
font-size: lib.s(13);
color: scheme.$subtext1;
}
}
.details {
font-size: lib.s(14);
margin-top: lib.s(20);
@include lib.spacing(3, true);
.title {
font-size: lib.s(18);
color: scheme.$text;
font-weight: bold;
}
.artist {
color: scheme.$green;
}
.album {
color: scheme.$subtext0;
}
}
.controls {
margin-top: lib.s(-20);
margin-bottom: lib.s(5);
button {
@include media-button;
// Cause some nerd font icons don't have the correct width
&.needs-adjustment {
padding-right: lib.s(5);
}
}
.playback {
font-size: lib.s(32);
@include lib.spacing(40);
}
.options {
margin: 0 lib.s(40);
margin-top: lib.s(-10);
font-size: lib.s(20);
@include lib.spacing(20);
}
}
}
.indicators {
@include lib.spacing(10);
& > button {
@include lib.rounded(1000);
@include lib.element-decel;
min-width: lib.s(10);
min-height: lib.s(10);
background-color: color.change(scheme.$overlay0, $alpha: 0.5);
&:hover,
&:focus {
background-color: color.change(scheme.$overlay1, $alpha: 0.5);
}
&:active {
background-color: color.change(scheme.$overlay2, $alpha: 0.5);
}
&.active {
background-color: color.change(scheme.$primary, $alpha: 0.9);
&:hover,
&:focus {
background-color: color.change(scheme.$primary, $alpha: 0.7);
}
&:active {
background-color: color.change(scheme.$primary, $alpha: 0.6);
}
}
}
}
}
.no-wp-prompt {
font-size: lib.s(16);
color: scheme.$error;
margin-top: lib.s(8);
}
.streams {
.list {
@include lib.spacing(10, true);
}
.stream {
@include lib.rounded(20);
@include lib.element-decel;
background-color: color.change(scheme.$surface1, $alpha: 0.4);
padding: lib.s(10) lib.s(15);
@include lib.spacing(5);
&.playing {
background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.4);
}
.icon {
font-size: lib.s(28);
margin-right: lib.s(12);
}
.sublabel {
font-size: lib.s(14);
color: scheme.$subtext0;
}
trough {
@include lib.rounded(10);
min-width: lib.s(100);
min-height: lib.s(10);
background-color: color.change(scheme.$error, $alpha: 0.3);
fill {
@include lib.rounded(10);
background-color: color.change(scheme.$overlay0, $alpha: 1);
}
highlight {
@include lib.rounded(10);
background-color: scheme.$subtext1;
}
}
& > button {
@include media-button;
font-size: lib.s(18);
min-width: lib.s(20);
min-height: lib.s(20);
}
}
}
.device-selector {
@include lib.spacing(10, true);
.selector {
@include lib.rounded(20);
background-color: color.change(scheme.$surface1, $alpha: 0.4);
padding: lib.s(10) lib.s(15);
.icon {
font-size: lib.s(20);
}
.separator {
margin-bottom: lib.s(8);
margin-top: lib.s(5);
background-color: if(scheme.$light, scheme.$overlay1, scheme.$overlay0);
}
.list {
color: scheme.$subtext0;
@include lib.spacing(3, true);
}
.device {
@include lib.spacing;
}
.selected {
color: scheme.$text;
@include lib.spacing(10);
.icon {
font-size: lib.s(32);
}
.sublabel {
color: scheme.$subtext0;
}
}
button {
@include lib.element-decel;
&:hover,
&:focus {
color: scheme.$subtext1;
}
&:active {
color: scheme.$text;
}
}
}
.stream {
@include lib.rounded(20);
@include lib.element-decel;
background-color: color.change(scheme.$surface1, $alpha: 0.4);
padding: lib.s(10) lib.s(15);
@include lib.spacing(5);
&.playing {
background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.4);
}
.icon {
font-size: lib.s(28);
margin-right: lib.s(12);
}
.sublabel {
font-size: lib.s(14);
color: scheme.$subtext0;
}
trough {
@include lib.rounded(10);
min-width: lib.s(100);
min-height: lib.s(10);
background-color: color.change(scheme.$error, $alpha: 0.3);
fill {
@include lib.rounded(10);
background-color: color.change(scheme.$overlay0, $alpha: 1);
}
highlight {
@include lib.rounded(10);
background-color: scheme.$subtext1;
}
}
& > button {
@include media-button;
font-size: lib.s(18);
min-width: lib.s(20);
min-height: lib.s(20);
}
}
}
.networks {
.list {
@include lib.spacing(10, true);
}
.network {
@include lib.rounded(20);
@include lib.element-decel;
background-color: color.change(scheme.$surface1, $alpha: 0.4);
padding: lib.s(10) lib.s(15);
@include lib.spacing(5);
&.connected {
background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.4);
& > button {
@include button-active;
}
}
.icon {
font-size: lib.s(28);
margin-right: lib.s(12);
}
.sublabel {
font-size: lib.s(14);
color: scheme.$subtext0;
}
& > button {
@include button;
@include lib.rounded(1000);
@include font.icon;
font-size: lib.s(18);
min-width: lib.s(30);
min-height: lib.s(30);
}
}
}
.bluetooth {
.list {
@include lib.spacing(10, true);
}
.device {
@include lib.rounded(20);
@include lib.element-decel;
background-color: color.change(scheme.$surface1, $alpha: 0.4);
padding: lib.s(10) lib.s(15);
@include lib.spacing(5);
&.connected {
background-color: color.change(color.mix(scheme.$surface1, scheme.$primary, 50%), $alpha: 0.4);
& > button {
@include button-active;
}
}
.icon {
font-size: lib.s(28);
margin-right: lib.s(12);
}
.sublabel {
font-size: lib.s(14);
color: scheme.$subtext0;
}
& > button {
@include button;
@include lib.rounded(1000);
@include font.icon;
font-size: lib.s(18);
min-width: lib.s(30);
min-height: lib.s(30);
}
}
}
.updates {
.list {
@include lib.spacing(10, true);
}
.repo {
@include lib.rounded(20);
@include lib.element-decel;
background-color: color.change(scheme.$surface1, $alpha: 0.4);
padding: lib.s(10) lib.s(15);
@include lib.spacing(5);
.icon {
font-size: lib.s(28);
&:not(:last-child) {
margin-right: lib.s(12);
}
}
.sublabel {
font-size: lib.s(14);
color: scheme.$subtext0;
}
.body {
margin-top: lib.s(10);
font-size: lib.s(14);
}
}
}
.news {
min-height: lib.s(200);
.empty {
margin-top: lib.s(40);
}
.list {
@include lib.spacing(10, true);
}
.article {
@include lib.rounded(20);
@include lib.element-decel;
background-color: color.change(scheme.$surface1, $alpha: 0.4);
padding: lib.s(10) lib.s(15);
@include lib.spacing(5);
.icon {
font-size: lib.s(28);
&:not(:last-child) {
margin-right: lib.s(12);
}
}
.sublabel {
font-size: lib.s(14);
color: scheme.$subtext0;
}
.body {
margin-top: lib.s(10);
font-size: lib.s(14);
}
}
}
.headlines {
min-height: lib.s(200);
.empty {
margin-top: lib.s(40);
}
.list {
@include lib.spacing(10, true);
}
.category {
@include lib.rounded(20);
@include lib.element-decel;
background-color: color.change(scheme.$surface0, $alpha: 0.5);
padding: lib.s(10) lib.s(15);
@include lib.spacing(5);
.icon {
font-size: lib.s(28);
&:not(:last-child) {
margin-right: lib.s(12);
}
}
.sublabel {
font-size: lib.s(14);
color: scheme.$subtext0;
}
.body {
margin-top: lib.s(10);
font-size: lib.s(14);
@include lib.spacing(8, true);
}
}
.article {
@include lib.rounded(20);
@include lib.element-decel;
background-color: color.change(scheme.$surface1, $alpha: 0.3);
padding: lib.s(10) lib.s(15);
.article-body {
@include font.reading;
@include lib.element-decel;
font-size: lib.s(15);
margin-top: lib.s(10);
color: scheme.$subtext1;
& > :last-child {
margin-top: lib.s(8);
}
.title {
@include font.title;
font-size: lib.s(18);
font-weight: 500;
margin-bottom: lib.s(3);
}
}
button:hover .article-body,
button:focus .article-body {
color: color.mix(scheme.$subtext0, scheme.$blue, 60%);
}
}
}
.time-date {
padding: lib.s(12) lib.s(8);
font-size: lib.s(48);
font-weight: bold;
color: scheme.$primary;
& > * {
@include lib.spacing(3);
}
.ampm {
font-size: lib.s(24);
font-weight: normal;
margin-top: lib.s(18);
color: scheme.$secondary;
}
.date {
font-size: lib.s(20);
color: scheme.$tertiary;
}
}
.calendar {
@include lib.rounded(20);
background-color: color.change(scheme.$surface1, $alpha: 0.4);
padding: lib.s(15);
.calendar-view {
@include lib.spacing(10, true);
.header {
@include lib.spacing(10);
& > button {
@include lib.rounded(1000);
@include lib.element-decel;
background-color: color.change(scheme.$surface2, $alpha: 0.4);
min-width: lib.s(28);
min-height: lib.s(28);
font-size: lib.s(18);
&:first-child {
padding: 0 lib.s(10);
}
&:hover,
&:focus {
background-color: color.change(scheme.$surface2, $alpha: 0.6);
}
&:active {
background-color: color.change(scheme.$surface2, $alpha: 0.8);
}
}
}
.weekdays {
@include lib.spacing(10);
& > label {
min-width: lib.s(40);
font-weight: bold;
color: scheme.$subtext1;
}
}
.month {
@include lib.spacing(10, true);
}
.week {
@include lib.spacing(10);
}
.day {
@include lib.rounded(1000);
@include lib.element-decel;
min-width: lib.s(40);
min-height: lib.s(40);
&.dim {
color: scheme.$subtext0;
}
&.today:not(.dim) {
background-color: scheme.$primary;
color: color.change(scheme.$base, $alpha: 1);
}
&:hover,
&:focus {
color: scheme.$subtext0;
}
&:active {
color: color.change(scheme.$overlay2, $alpha: 1);
}
&.dim {
color: scheme.$subtext0;
&:hover,
&:focus {
color: color.change(scheme.$overlay2, $alpha: 1);
}
&:active {
color: color.change(scheme.$overlay1, $alpha: 1);
}
}
&.today:not(.dim) {
background-color: scheme.$primary;
color: color.change(scheme.$base, $alpha: 1);
&:hover,
&:focus {
background-color: color.mix(scheme.$primary, scheme.$base, 80%);
}
&:active {
background-color: color.mix(scheme.$primary, scheme.$base, 70%);
}
}
label {
margin-top: lib.s(8);
}
.indicator {
@include lib.rounded(10);
@include lib.element-decel;
min-height: lib.s(3);
margin: 0 lib.s(8);
}
$-max: 5;
@for $i from 1 through $-max {
&.events-#{$i} {
$-colour: color.mix(scheme.$red, scheme.$green, calc(100% / $-max) * $i);
.indicator {
background-color: $-colour;
}
&:hover .indicator,
&:focus .indicator {
background-color: color.mix($-colour, scheme.$base, 80%);
}
&:active .indicator {
background-color: color.mix($-colour, scheme.$base, 70%);
}
&.dim .indicator {
background-color: color.mix($-colour, scheme.$base, 60%);
}
&.today:not(.dim) {
$-colour: color.mix($-colour, color.complement(scheme.$primary), 50%);
.indicator {
background-color: $-colour;
}
&:hover .indicator,
&:focus .indicator {
background-color: color.mix($-colour, scheme.$base, 80%);
}
&:active .indicator {
background-color: color.mix($-colour, scheme.$base, 70%);
}
}
}
}
}
}
.events {
@include lib.spacing(10, true);
.header {
font-weight: bold;
@include lib.spacing(10);
& > button {
@include lib.rounded(1000);
@include lib.element-decel;
min-width: lib.s(24);
min-height: lib.s(24);
&:hover,
&:focus {
color: scheme.$subtext0;
}
&:active {
color: color.change(scheme.$overlay2, $alpha: 1);
}
}
}
scrollable {
min-height: lib.s(315);
}
.date {
margin-left: lib.s(10);
}
.sublabel {
font-size: lib.s(14);
color: scheme.$subtext0;
}
.list {
padding: lib.s(5);
@include lib.spacing(10, true);
}
.event {
@include lib.spacing(8);
}
.calendar-indicator {
@include lib.rounded(5);
min-width: lib.s(1);
$-colours: scheme.$red, scheme.$sapphire, scheme.$flamingo, scheme.$maroon, scheme.$pink, scheme.$sky,
scheme.$peach, scheme.$yellow, scheme.$green, scheme.$rosewater, scheme.$mauve, scheme.$teal,
scheme.$blue;
@for $i from 1 through list.length($-colours) {
&.calendar-#{$i} {
background-color: list.nth($-colours, $i);
}
}
}
}
}
}