feat: make AGS colorshell configuration fully declarative

- Add complete colorshell v2.0.3 configuration to home/ags-config/
- Disable runner plugin and NightLight tile (incompatible with NixOS)
- Customize SCSS with full opacity (no transparency)
- Add dark pale blue color scheme in home/pywal-colors/
- Configure Papirus-Dark icon theme via home-manager
- Make ~/.config/ags/ immutable and managed by Nix store
- Auto-deploy pywal colors to ~/.cache/wal/colors.json

All AGS configuration is now reproducible and version controlled.
This commit is contained in:
2025-11-04 21:36:38 +00:00
parent 593735370a
commit b2ae32a078
240 changed files with 1024921 additions and 3 deletions

View File

@@ -0,0 +1,50 @@
@use "sass:color";
@use "./colors";
.apps-window .popup-window-container {
$radius: 48px;
padding: 28px;
background: colors.$bg-translucent;
border-radius: $radius $radius 0 0;
& entry {
background: transparent;
margin-bottom: 32px;
min-width: 450px;
padding: 14px;
border-radius: 18px;
&:focus-within {
box-shadow: inset 0 0 0 2px colors.$bg-tertiary;
background: rgba(colors.$bg-primary, .2);
}
}
& flowbox {
padding: 16px 24px;
& > flowboxchild {
& > button {
padding: 10px;
border-radius: 24px;
& image {
-gtk-icon-size: 64px;
}
& label {
margin-top: 24px;
text-shadow: 1px 1px 1px rgba(colors.$bg-primary, .2);
font-weight: 500;
}
}
&:focus > button,
&:selected > button,
& > button:hover {
background-color: rgba($color: colors.$bg-secondary, $alpha: .5);
}
}
}
}

View File

@@ -0,0 +1,210 @@
@use "sass:color";
@use "./mixins";
@use "./colors";
$radius: 18px;
$padding: 4px;
$color-hover: colors.$bg-primary;
@mixin button-reactivity {
&:active {
box-shadow: 0 0 0 2px $color-hover;
}
}
.bar-container {
padding: 6px;
padding-bottom: 0px;
label {
@include mixins.reset-props;
font-size: 12px;
font-weight: 600;
}
// Style widget groups
& > .bar-centerbox > * {
background: rgba(colors.$bg-translucent, 1.0);
border-radius: $radius;
padding: 0 $padding;
& > box:not(.workspaces-row):not(.tray):not(.focused-client):not(.media),
& > button {
@include button-reactivity;
border-radius: calc($radius - $padding);
margin: $padding 0;
padding: 0 8px;
&:hover {
background: $color-hover;
}
}
}
.workspaces-row {
padding: 4px;
& .workspace {
transition: 80ms linear;
margin: 3px 0;
border-radius: 16px;
min-width: 14px;
padding: 0 6px;
background: colors.$bg-tertiary;
&:active {
border-radius: 10px;
}
& label.id {
font-weight: 600;
margin-right: 4px;
opacity: 0;
}
&.focus {
background: colors.$fg-primary;
min-width: 32px;
& label.id {
opacity: 0;
color: colors.$fg-light;
margin-right: 0;
}
}
& icon {
font-size: 16px;
}
&.show label.id {
opacity: 1;
}
&:hover:not(.last-client-icon):not(.focus) {
background: color.scale($color: colors.$bg-tertiary, $lightness: 10%);
}
}
}
.focused-client {
padding: 0 6px;
& image {
margin-right: 6px;
-gtk-icon-size: 18px;
}
& .text-content {
& .class {
font-size: 9px;
font-family: monospace;
font-weight: 600;
color: colors.$fg-disabled;
margin-top: 0px;
}
& .title {
font-size: 12px;
font-weight: 500;
margin-top: -2px;
}
}
}
.clock.open {
background: colors.$bg-primary;
}
.media {
$spacing: 5px;
$hover-color: color.scale($color: colors.$bg-primary, $lightness: 15%);
background: colors.$bg-primary;
border-radius: calc($radius - $padding);
margin: $padding 0;
padding: 0 calc($padding + 3px);
& image.player-icon {
-gtk-icon-size: 14px;
margin-right: $spacing;
}
& .buttons {
margin-left: $spacing;
}
& .button-row {
border-top-right-radius: 12px;
border-bottom-right-radius: 12px;
padding: 4px 0;
& > button image {
margin: 0;
-gtk-icon-size: 10px;
}
}
&:hover {
background: $hover-color;
}
&:active {
box-shadow: 0 0 0 2px $hover-color;
}
}
.tray {
padding: 0 6px;
& .item {
all: unset;
}
}
.status {
@include mixins.reset-props;
&.open {
background: colors.$bg-primary;
}
& image {
-gtk-icon-size: 14px;
}
& revealer > box {
background: rgba($color: colors.$bg-tertiary, $alpha: 1.0);
border-radius: 12px;
margin: 4px 0;
margin-left: 5px;
padding: 2px 6px;
}
& .status-icons {
padding-left: 4px;
& image.notification-count {
-gtk-icon-size: 6px;
margin-top: -14px;
}
}
}
.apps {
min-width: 18px;
& image {
transition: 120ms linear;
-gtk-icon-size: 14px;
}
&.open {
background: colors.$bg-primary;
}
}
}

View File

@@ -0,0 +1,129 @@
@use "sass:color";
@use "./wal";
@use "./colors";
@use "./mixins";
.popup-window.center-window .center-window-container {
background: colors.$bg-translucent;
border-radius: 24px;
padding: 12px;
& .big-media {
margin-top: 9px;
& .image {
background-size: cover;
background-position: center center;
border-radius: 10px;
}
& .info {
padding: {
top: 4px;
bottom: 6px;
};
& .title {
font-size: 16px;
font-weight: 700;
}
& .artist {
font-size: 14px;
font-weight: 600;
color: colors.$fg-disabled;
}
}
& slider {
all: unset;
opacity: 0;
min-height: .6em;
}
& trough {
border-radius: 4px;
}
& trough highlight {
min-height: .65em;
border-top-right-radius: 2px;
border-bottom-right-radius: 2px;
}
& .bottom {
& .button-row {
margin-top: 9px;
& button {
padding: 7px;
& label {
font-size: 9px;
}
}
}
& .elapsed,
& .length {
font-size: 12px;
color: colors.$fg-disabled;
}
}
}
& .left .datetime {
padding-bottom: 10px;
& .time {
font-size: 28px;
font-weight: 800;
}
& .date {
font-size: 14px;
font-weight: 500;
color: colors.$fg-disabled;
}
}
& calendar.view {
$border-radius: 14px;
font-weight: 600;
background: colors.$bg-primary;
border-radius: $border-radius;
& header {
background: colors.$bg-secondary;
padding: 6px;
border-top-left-radius: $border-radius;
border-top-right-radius: $border-radius;
}
& grid {
margin: 4px;
label.day-number {
$size: 24px;
min-height: $size;
min-width: $size;
}
}
& button {
transition: 80ms linear;
border-radius: 6px;
&:hover {
background-color: colors.$bg-tertiary;
}
}
& label:selected {
background: colors.$bg-secondary;
border-radius: 6px;
}
}
}

View File

@@ -0,0 +1,13 @@
@use "sass:color";
@use "./wal";
$bg-primary: color.adjust($color: wal.$color1, $lightness: -34%);
$bg-secondary: color.adjust($color: wal.$color1, $lightness: -16%);
$bg-tertiary: color.adjust($color: $bg-secondary, $lightness: 10%);
$bg-light: wal.$foreground;
$bg-translucent: color.change($color: $bg-primary, $alpha: 100%);
$bg-translucent-primary: $bg-translucent;
$bg-translucent-secondary: color.change($color: $bg-translucent, $alpha: 100%);
$fg-primary: wal.$foreground;
$fg-light: $bg-primary;
$fg-disabled: color.adjust($color: wal.$foreground, $lightness: -11%);

View File

@@ -0,0 +1,301 @@
@use "sass:color";
@use "./wal";
@use "./colors";
@use "./functions" as funs;
@use "./mixins";
.control-center-container {
@include mixins.reset-props;
background: colors.$bg-translucent;
border-radius: 28px;
padding: 20px;
& > * {
margin: 9px 0;
&:first-child {
margin-top: 0;
}
&:last-child {
margin-bottom: 0;
}
}
& button:focus-visible {
box-shadow: inset 0 0 0 1px colors.$fg-primary;
}
& .quickactions {
margin-bottom: .8em;
& .user-face {
background-position: center;
background-repeat: no-repeat;
background-size: cover;
min-height: 32px;
min-width: 34px;
margin-right: 6px;
border-radius: 50%;
}
& .user-host {
.user {
font-size: 15px;
font-weight: 600;
}
.host {
color: colors.$fg-disabled;
font-size: 10px;
font-weight: 500;
}
}
& > box:not(.button-row) image {
-gtk-icon-size: 12px;
color: colors.$fg-disabled;
margin-right: 3px;
}
& .uptime {
font-size: 10.1px;
font-family: "Symbols Nerd Font Mono";
color: colors.$fg-disabled;
}
& .button-row {
& button {
padding: 7px;
margin: {
top: 2px;
bottom: 2px;
};
}
}
}
& .sliders {
icon {
font-size: 16px;
}
button {
padding: 4px;
border-radius: 16px;
icon {
font-size: 14px;
}
&:hover {
background: rgba(colors.$fg-primary, .2);
}
}
& .page .content {
& label.name {
font-size: 14px;
font-weight: 500;
}
& trough {
margin-right: 10px;
}
& label.sub-header {
margin-top: 6px;
}
}
}
& #page {
transition: 120ms linear;
background: colors.$bg-secondary;
padding: 14px;
border-radius: 24px;
& .header {
margin-bottom: 12px;
& .top .title {
font-size: 20px;
font-weight: 600;
}
& .description {
font-size: 12px;
font-weight: 500;
color: colors.$fg-disabled;
}
}
& .sub-header {
font-size: 14px;
font-weight: 500;
margin-bottom: 4px;
}
& .page-button, .extra-buttons {
& button {
padding: 6px;
border-radius: 12px;
&.selected {
background: colors.$bg-tertiary;
}
&:hover {
background: rgba(colors.$fg-primary, .1);
}
&:active {
border-radius: 10px;
}
}
& label.title {
font-size: 14px;
}
& label.description {
font-size: 10px;
font-weight: 400;
color: colors.$fg-disabled;
}
& icon {
font-size: 16px;
}
}
& .bottom-buttons button {
& label.title {
font-size: 14px;
font-weight: 500;
}
& label.description {
font-size: 10px;
margin-top: -1px;
font-weight: 400;
color: colors.$fg-disabled;
}
}
& .extra-buttons {
margin-left: 2px;
button {
border-radius: 10px;
&:active {
border-radius: 8px;
}
}
}
}
}
.tiles-container {
@include mixins.reset-props;
& .tile {
$radius: 18px;
$padding: 4px;
background: color.scale($color: colors.$bg-primary, $lightness: -25%);
border-radius: $radius;
padding: $padding;
min-height: 40px;
& .icon {
transition: 120ms ease-in;
border-radius: calc($radius - $padding);
padding: 8px 12px;
margin-right: 6px;
background: color.scale($color: colors.$bg-primary, $lightness: 10%);
& image {
-gtk-icon-size: 18px;
}
&:hover {
background: color.scale($color: colors.$bg-primary, $lightness: 15%);
}
&:active {
border-radius: calc($radius - $padding - 2px);
}
}
& .content {
& .title {
font-weight: 600;
font-size: 15.1px;
}
& .description {
font-size: 12px;
color: colors.$fg-disabled;
font-weight: 400;
}
}
& .arrow {
-gtk-icon-size: 12px;
color: rgba(colors.$fg-disabled, .4);
}
&:hover {
background: color.scale($color: colors.$bg-primary, $lightness: 5%);
}
&.enabled .icon {
background: colors.$bg-secondary;
&:hover {
background: colors.$bg-tertiary;
}
}
&:active {
border-radius: calc($radius - 2px);
}
}
}
.tile-pages #page {
margin-top: 10px;
}
box.notif-history {
background: colors.$bg-translucent;
border-radius: 24px;
padding: 18px;
transition: 120ms linear;
&.hide {
opacity: 0;
}
& .notifications {
& .notification {
background: colors.$bg-translucent-primary;
padding: 3px;
}
}
& .button-row {
margin-top: 12px;
& button {
@include mixins.button-reactive-secondary;
padding: 7px;
& label {
font-size: 12px;
font-weight: 600;
}
}
}
}

View File

@@ -0,0 +1,18 @@
@use "./colors";
@use "./mixins";
.floating-notifications-container {
padding: 16px;
& .float-notification {
$radius: 18px;
box-shadow: 0 0 8px 1px colors.$bg-translucent;
border-radius: $radius;
& .notification {
padding: 4px;
border-radius: $radius;
}
}
}

View File

@@ -0,0 +1,52 @@
@use "./colors";
.logout-menu-container {
background: rgba($color: colors.$bg-translucent-primary, $alpha: .4);
.top {
.time {
font-size: 128px;
font-weight: 900;
color: colors.$fg-primary;
text-shadow: 1px 1px 2px colors.$bg-translucent;
}
.date {
font-size: 24px;
font-weight: 500;
text-shadow: 1px 1px 2px colors.$bg-translucent;
}
}
.button-row {
$radius: 32px;
all: unset;
margin: 0 150px;
& > button {
& image {
-gtk-icon-size: 128px;
}
&:focus-visible {
box-shadow: inset 0 0 0 5px colors.$fg-primary;
}
&:active {
border-radius: calc($radius - 6px);
}
margin: 0 4px;
border-radius: 6px;
&:first-child:not(:active) {
border-top-left-radius: $radius;
border-bottom-left-radius: $radius;
}
&:last-child:not(:active) {
border-top-right-radius: $radius;
border-bottom-right-radius: $radius;
}
}
}
}

View File

@@ -0,0 +1,41 @@
@use "sass:color";
@use "./colors";
@mixin reset-props {
all: unset;
transition: 120ms linear;
font-family: "Adwaita Sans", "Cantarell", "Noto Sans",
"Noto Sans CJK JP", "Noto Sans CJK KR",
"Noto Sans CJK HK", "Noto Sans CJK SC",
"Noto Sans CJK TC", sans-serif,
"Symbols Nerd Font Mono";
color: colors.$fg-primary;
}
@mixin button-reactive-primary {
background: colors.$bg-primary;
border-radius: 14px;
padding: 6px;
&:hover {
background: colors.$bg-secondary;
}
&:active {
border-radius: 10px;
}
}
@mixin button-reactive-secondary {
background: colors.$bg-secondary;
border-radius: 12px;
padding: 6px;
&:hover {
background: colors.$bg-tertiary;
}
&:active {
border-radius: 9px;
}
}

View File

@@ -0,0 +1,34 @@
@use "sass:color";
@use "colors";
.osd {
background: rgba(colors.$bg-translucent-secondary, .6);
padding: 14px 14px;
border-radius: 24px;
min-width: 180px;
.icon {
margin-right: 10px;
-gtk-icon-size: 24px;
}
.level {
margin-top: -6px;
.text {
margin-bottom: 4px;
font-size: 14px;
font-weight: 600;
}
levelbar trough block {
border-radius: 4px;
background: colors.$bg-primary;
&.filled {
min-height: 10px;
background: colors.$bg-secondary;
}
}
}
}

View File

@@ -0,0 +1,73 @@
@use "./colors";
.runner .popup-window-container {
all: unset;
$radius: 24px;
background: rgba($color: colors.$bg-primary, $alpha: .8);
border-radius: $radius;
box-shadow: inset 0 0 0 1px colors.$bg-secondary,
0 0 8px 1px colors.$bg-translucent;
padding: 4px;
& entry {
transition: 80ms ease-in;
min-height: 1.6em;
padding: 14px;
border-radius: inherit;
background: none;
&:focus {
box-shadow: none;
}
& image {
margin-right: 6px;
-gtk-icon-size: 16px;
}
}
& scrolledwindow {
margin: 6px;
}
& list {
& .result {
padding: 10px;
background: colors.$bg-primary;
margin: 2px 0;
border-radius: 14px;
& image {
-gtk-icon-size: 28px;
margin-right: 6px;
}
& .title {
font-weight: 500;
font-size: 16px;
}
& .description {
font-size: 12px;
color: colors.$fg-disabled;
}
}
& > *:selected .result,
& > *:active .result,
& > *:hover .result {
background: colors.$bg-secondary;
}
& > *:first-child {
margin-top: 12px;
}
&:last-child {
margin-bottom: 0;
}
}
}

View File

@@ -0,0 +1,314 @@
@use "sass:color";
@use "./style/wal";
@use "./style/mixins";
@use "./style/functions";
@use "./style/colors";
@use "./style/bar";
@use "./style/osd";
@use "./style/control-center";
@use "./style/center-window";
@use "./style/float-notifications";
@use "./style/logout-menu";
@use "./style/apps-window";
@use "./style/runner";
* {
@include mixins.reset-props;
}
entry {
background: colors.$bg-primary;
padding: 10px 9px;
border-radius: 12px;
&:focus {
box-shadow: inset 0 0 0 2px colors.$bg-secondary;
}
& image.left {
margin-right: 6px;
}
}
.custom-dialog-container {
background: colors.$bg-translucent;
padding: 18px;
border-radius: 24px;
& .title {
font-size: 21px;
font-weight: 700;
margin-bottom: 10px;
}
& .text {
font-size: 16px;
font-weight: 400;
}
& .options {
& button {
@include mixins.button-reactive-primary;
background: colors.$bg-primary;
border-radius: 12px;
padding: 9px 6px;
& label {
font-size: 16px;
font-weight: 600;
}
margin: {
left: 4px;
right: 4px;
};
}
}
&.entry-popup-box entry {
margin-bottom: 10px;
&.password {
font-size: 14px;
font-family: "Adwaita Mono", "Cantarell Mono", "Noto Sans Mono", monospace;
font-weight: 400;
}
}
}
.notification {
background: colors.$bg-translucent-secondary;
border-radius: 16px;
& > .top {
padding: 8px;
padding-bottom: 0;
& .app-icon {
margin-right: 6px;
}
& .app-name {
font-size: 12px;
}
& label.time {
font-size: 11px;
font-weight: 500;
color: colors.$fg-disabled;
margin-right: 6px;
}
& button.close {
padding: 2px;
border-radius: 8px;
&:hover {
background: colors.$bg-secondary;
}
}
& icon.close {
font-size: 16px;
}
}
& .content {
padding: 6px;
padding-top: 0;
& .image {
$size: 78px;
min-width: $size;
min-height: $size;
background-size: cover;
background-position: center;
margin: 6px;
border-radius: 8px;
}
& .summary {
font-size: 17.3px;
font-weight: 700;
margin-bottom: 4px;
}
& .body {
font-size: 14.5px;
font-weight: 400;
}
}
& .actions {
padding: 6px;
& button.action {
border-radius: 4px;
background: colors.$bg-secondary;
padding: 6px;
& label {
font-size: 14px;
font-weight: 600;
}
&:hover {
background: colors.$bg-tertiary;
}
&:first-child {
border-top-left-radius: 12px;
border-bottom-left-radius: 12px;
}
&:last-child {
border-top-right-radius: 12px;
border-bottom-right-radius: 12px;
}
}
}
}
tooltip > box {
padding: 7px 8px;
margin: 12px;
margin-top: 0;
border-radius: 12px;
background: rgba(colors.$bg-primary, .98);
box-shadow: 0 5px 6px 1px colors.$bg-translucent-primary;
& label {
font-size: 13.1px;
font-weight: 500;
color: colors.$fg-primary;
}
}
popover.menu contents {
background: wal.$background;
border-radius: 14px;
padding: 4px;
& viewport > stack > * > * > * {
& > separator {
min-height: .5px;
margin: 3px 2px;
background: rgba(colors.$fg-disabled, .1);
}
& > *:not(separator) > * {
padding: 6px;
border-radius: 10px;
font-size: 12px;
font-weight: 600;
&:hover, &:focus {
background: wal.$color1;
}
}
}
}
.button-row {
& > button {
$active-radius: 8px;
$corner-radius: calc($active-radius + 2px);
background: colors.$bg-secondary;
margin: 0 1px;
padding: 4px 6px;
border-radius: 2px;
transition: 120ms linear;
&:hover {
background: colors.$bg-tertiary;
}
&:active {
border-radius: $active-radius;
}
&:first-child {
margin-left: 0;
&:not(:active) {
border-top-left-radius: $corner-radius;
border-bottom-left-radius: $corner-radius;
}
}
&:last-child {
margin-right: 0;
&:not(:active) {
border-top-right-radius: $corner-radius;
border-bottom-right-radius: $corner-radius;
}
}
}
}
selection {
background: colors.$bg-tertiary;
}
trough {
background: color.adjust($color: colors.$bg-primary, $lightness: -5%);
border-radius: 8px;
margin: 2px 0;
}
trough highlight {
background: wal.$color1;
min-height: .9em;
}
trough slider {
border-radius: 50%;
margin: -4px 0;
background: wal.$foreground;
min-width: 1.2em;
min-height: 1.2em;
}
scrollbar trough {
@include mixins.reset-props;
background: colors.$bg-translucent;
border-radius: 8px;
& slider {
@include mixins.reset-props;
min-width: .45em;
background: colors.$bg-tertiary;
border-radius: 12px;
&:hover, &:active, &:focus {
margin: 2px;
}
}
&:hover, &:active, &:focus {
padding: 2px;
}
}
scale {
& marks mark {
& indicator {
color: colors.$fg-disabled;
min-width: 1px;
min-height: 6px;
}
& label {
font-size: 11px;
font-weight: 400;
color: colors.$fg-disabled;
}
}
}