diff --git a/README.md b/README.md index 5c9e960..7239cc3 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,32 @@ The main control script for the Caelestia dotfiles. +
Optional dependencies + +- [`papirus-folders`](https://github.com/PapirusDevelopmentTeam/papirus-folders) - automatic folder icon color syncing with theme + +> [!NOTE] +> For automatic Papirus folder icon color syncing, `papirus-folders` needs to be able to run with `sudo` without a password prompt. +> +> **Recommended** - Create a sudoers file: +> ```fish +> # Fish shell +> echo "$USER ALL=(ALL) NOPASSWD: "(which papirus-folders) | sudo tee /etc/sudoers.d/papirus-folders +> sudo chmod 440 /etc/sudoers.d/papirus-folders +> ``` +> ```sh +> # Bash/other shells +> echo "$USER ALL=(ALL) NOPASSWD: $(which papirus-folders)" | sudo tee /etc/sudoers.d/papirus-folders +> sudo chmod 440 /etc/sudoers.d/papirus-folders +> ``` +> +> **Alternatively** - Edit the main sudoers file by running `sudo visudo` and adding at the end: +> ``` +> your_username ALL=(ALL) NOPASSWD: /usr/bin/papirus-folders +> ``` + +
+ ## Installation ### Arch linux diff --git a/src/caelestia/data/schemes/darkgreen/hard/dark.txt b/src/caelestia/data/schemes/darkgreen/hard/dark.txt index 45ab558..dea54c4 100644 --- a/src/caelestia/data/schemes/darkgreen/hard/dark.txt +++ b/src/caelestia/data/schemes/darkgreen/hard/dark.txt @@ -4,7 +4,7 @@ tertiary_paletteKeyColor 376942 neutral_paletteKeyColor 1E1E26 neutral_variant_paletteKeyColor 23252D background 23262D -onBackground 02200B +onBackground F5F5F6 surface 050505 surfaceDim 1E1E24 surfaceBright 1E1E24 @@ -82,6 +82,16 @@ sky cefb97 sapphire 85ef77 blue 65eea0 lavender 90f79e +klink 65eea0 +klinkSelection 65eea0 +kvisited 73fa90 +kvisitedSelection 73fa90 +knegative 8affab +knegativeSelection 8affab +kneutral d0f9f4 +kneutralSelection d0f9f4 +kpositive 8af797 +kpositiveSelection 8af797 text e0e3e4 subtext1 bec8cc subtext0 889296 diff --git a/src/caelestia/data/schemes/darkgreen/medium/dark.txt b/src/caelestia/data/schemes/darkgreen/medium/dark.txt index 30723ba..1caff9e 100644 --- a/src/caelestia/data/schemes/darkgreen/medium/dark.txt +++ b/src/caelestia/data/schemes/darkgreen/medium/dark.txt @@ -4,7 +4,7 @@ tertiary_paletteKeyColor 376942 neutral_paletteKeyColor 1E1E26 neutral_variant_paletteKeyColor 23252D background 23262D -onBackground 02200B +onBackground F5F5F6 surface 1E1E24 surfaceDim 1E1E24 surfaceBright 1E1E24 @@ -82,6 +82,16 @@ sky cefb97 sapphire 85ef77 blue 65eea0 lavender 90f79e +klink 65eea0 +klinkSelection 65eea0 +kvisited 73fa90 +kvisitedSelection 73fa90 +knegative 8affab +knegativeSelection 8affab +kneutral d0f9f4 +kneutralSelection d0f9f4 +kpositive 8af797 +kpositiveSelection 8af797 text e0e3e4 subtext1 bec8cc subtext0 889296 diff --git a/src/caelestia/data/schemes/dracula/medium/dark.txt b/src/caelestia/data/schemes/dracula/medium/dark.txt new file mode 100644 index 0000000..4195f45 --- /dev/null +++ b/src/caelestia/data/schemes/dracula/medium/dark.txt @@ -0,0 +1,110 @@ +primary_paletteKeyColor BD93F9 +secondary_paletteKeyColor 50FA7B +tertiary_paletteKeyColor FF79C6 +neutral_paletteKeyColor 282A36 +neutral_variant_paletteKeyColor 44475A +background 282A36 +onBackground F8F8F2 +surface 343746 +surfaceDim 21222C +surfaceBright 4D4F66 +surfaceContainerLowest 191A21 +surfaceContainerLow 3C3F4E +surfaceContainer 3E4153 +surfaceContainerHigh 4D4F66 +surfaceContainerHighest 565970 +onSurface F8F8F2 +surfaceVariant 3E4153 +onSurfaceVariant F8F8F2 +inverseSurface F8F8F2 +inverseOnSurface 282A36 +outline 6272A4 +outlineVariant 4D4F66 +shadow 000000 +scrim 000000 +surfaceTint BD93F9 +primary BD93F9 +onPrimary 282A36 +primaryContainer 4D4F66 +onPrimaryContainer BD93F9 +inversePrimary 9D73D9 +secondary 50FA7B +onSecondary 282A36 +secondaryContainer 4D4F66 +onSecondaryContainer 50FA7B +tertiary FF79C6 +onTertiary 282A36 +tertiaryContainer 4D4F66 +onTertiaryContainer FF79C6 +error FF5555 +onError 282A36 +errorContainer 4C3743 +onErrorContainer FF5555 +primaryFixed BD93F9 +primaryFixedDim 9D73D9 +onPrimaryFixed 282A36 +onPrimaryFixedVariant 3E4153 +secondaryFixed 50FA7B +secondaryFixedDim 30DA5B +onSecondaryFixed 282A36 +onSecondaryFixedVariant 3E4153 +tertiaryFixed FF79C6 +tertiaryFixedDim DF59A6 +onTertiaryFixed 282A36 +onTertiaryFixedVariant 3E4153 +term0 282A36 +term1 FF5555 +term2 50FA7B +term3 F1FA8C +term4 BD93F9 +term5 FF79C6 +term6 8BE9FD +term7 F8F8F2 +term8 6272A4 +term9 FF6E6E +term10 69FF94 +term11 FFFFA5 +term12 D6ACFF +term13 FF92DF +term14 A4FFFF +term15 FFFFFF +rosewater F8F8F2 +flamingo FFB86C +pink FF79C6 +mauve BD93F9 +red FF5555 +maroon FF6E6E +peach FFB86C +yellow F1FA8C +green 50FA7B +teal 8BE9FD +sky 8BE9FD +sapphire 8BE9FD +blue BD93F9 +lavender BD93F9 +klink BD93F9 +klinkSelection BD93F9 +kvisited FF79C6 +kvisitedSelection FF79C6 +knegative FF5555 +knegativeSelection FF5555 +kneutral F1FA8C +kneutralSelection F1FA8C +kpositive 50FA7B +kpositiveSelection 50FA7B +text F8F8F2 +subtext1 F8F8F2 +subtext0 E6E6E6 +overlay2 A0A0A0 +overlay1 8A8A8A +overlay0 6272A4 +surface2 3E4153 +surface1 343746 +surface0 282A36 +base 282A36 +mantle 21222C +crust 191A21 +success 50FA7B +onSuccess 282A36 +successContainer 4D4F66 +onSuccessContainer F8F8F2 diff --git a/src/caelestia/data/schemes/everblush/medium/dark.txt b/src/caelestia/data/schemes/everblush/medium/dark.txt new file mode 100644 index 0000000..fefd5ac --- /dev/null +++ b/src/caelestia/data/schemes/everblush/medium/dark.txt @@ -0,0 +1,110 @@ +primary_paletteKeyColor 8CCFB0 +secondary_paletteKeyColor E5C76B +tertiary_paletteKeyColor E5A5C5 +neutral_paletteKeyColor 2D3139 +neutral_variant_paletteKeyColor 3A3F4B +background 141B1E +onBackground E8E8E8 +surface 232A2D +surfaceDim 0F1416 +surfaceBright 3A4145 +surfaceContainerLowest 0A0E10 +surfaceContainerLow 2A3235 +surfaceContainer 2E3538 +surfaceContainerHigh 3A4145 +surfaceContainerHighest 434A4E +onSurface E8E8E8 +surfaceVariant 2E3538 +onSurfaceVariant B3B9BE +inverseSurface E8E8E8 +inverseOnSurface 141B1E +outline 8A8F94 +outlineVariant 3A4145 +shadow 000000 +scrim 000000 +surfaceTint 8CCFB0 +primary 8CCFB0 +onPrimary 141B1E +primaryContainer 3A4145 +onPrimaryContainer 8CCFB0 +inversePrimary 6FA98C +secondary E5C76B +onSecondary 141B1E +secondaryContainer 3A4145 +onSecondaryContainer E5C76B +tertiary E5A5C5 +onTertiary 141B1E +tertiaryContainer 3A4145 +onTertiaryContainer E5A5C5 +error E57474 +onError 141B1E +errorContainer 4A2C2C +onErrorContainer E57474 +primaryFixed 8CCFB0 +primaryFixedDim 6FA98C +onPrimaryFixed 141B1E +onPrimaryFixedVariant 3A3F4B +secondaryFixed E5C76B +secondaryFixedDim C4A855 +onSecondaryFixed 141B1E +onSecondaryFixedVariant 3A3F4B +tertiaryFixed E5A5C5 +tertiaryFixedDim C888A4 +onTertiaryFixed 141B1E +onTertiaryFixedVariant 3A3F4B +term0 141B1E +term1 E57474 +term2 8CCFB0 +term3 E5C76B +term4 67B0E8 +term5 C47FD5 +term6 6CBFBF +term7 E8E8E8 +term8 8A8F94 +term9 E57474 +term10 8CCFB0 +term11 E5C76B +term12 67B0E8 +term13 C47FD5 +term14 6CBFBF +term15 E8E8E8 +rosewater E8E8E8 +flamingo E5A5C5 +pink E5A5C5 +mauve C47FD5 +red E57474 +maroon E57474 +peach E59A84 +yellow E5C76B +green 8CCFB0 +teal 6CBFBF +sky 67B0E8 +sapphire 67B0E8 +blue 67B0E8 +lavender 67B0E8 +klink 67B0E8 +klinkSelection 67B0E8 +kvisited C47FD5 +kvisitedSelection C47FD5 +knegative E57474 +knegativeSelection E57474 +kneutral E5C76B +kneutralSelection E5C76B +kpositive 8CCFB0 +kpositiveSelection 8CCFB0 +text E8E8E8 +subtext1 B3B9BE +subtext0 8A8F94 +overlay2 7A7F84 +overlay1 6A6F74 +overlay0 5A5F64 +surface2 2E3538 +surface1 232A2D +surface0 1A2023 +base 141B1E +mantle 0F1416 +crust 0A0E10 +success 8CCFB0 +onSuccess 141B1E +successContainer 3A4145 +onSuccessContainer E8E8E8 diff --git a/src/caelestia/data/schemes/everforest/hard/dark.txt b/src/caelestia/data/schemes/everforest/hard/dark.txt new file mode 100644 index 0000000..d482350 --- /dev/null +++ b/src/caelestia/data/schemes/everforest/hard/dark.txt @@ -0,0 +1,110 @@ +primary_paletteKeyColor 7FBBB3 +secondary_paletteKeyColor 83C092 +tertiary_paletteKeyColor A7C080 +neutral_paletteKeyColor 2E383C +neutral_variant_paletteKeyColor 374145 +background 1E2326 +onBackground D3C6AA +surface 252B2E +surfaceDim 15191C +surfaceBright 343E43 +surfaceContainerLowest 11161A +surfaceContainerLow 2A3338 +surfaceContainer 2E383C +surfaceContainerHigh 343E43 +surfaceContainerHighest 3A4448 +onSurface D3C6AA +surfaceVariant 374145 +onSurfaceVariant 9DA9A0 +inverseSurface D3C6AA +inverseOnSurface 1E2326 +outline 859289 +outlineVariant 414B50 +shadow 000000 +scrim 000000 +surfaceTint 7FBBB3 +primary 7FBBB3 +onPrimary 1E2326 +primaryContainer 414B50 +onPrimaryContainer A7C080 +inversePrimary 5A9A8F +secondary 83C092 +onSecondary 1E2326 +secondaryContainer 414B50 +onSecondaryContainer A7C080 +tertiary A7C080 +onTertiary 1E2326 +tertiaryContainer 414B50 +onTertiaryContainer D3C6AA +error E67E80 +onError 1E2326 +errorContainer 4C3743 +onErrorContainer E67E80 +primaryFixed 7FBBB3 +primaryFixedDim 5A9A8F +onPrimaryFixed 1E2326 +onPrimaryFixedVariant 374145 +secondaryFixed 83C092 +secondaryFixedDim 5F8C6F +onSecondaryFixed 1E2326 +onSecondaryFixedVariant 374145 +tertiaryFixed A7C080 +tertiaryFixedDim 7F9D5F +onTertiaryFixed 1E2326 +onTertiaryFixedVariant 374145 +term0 1E2326 +term1 E67E80 +term2 A7C080 +term3 DBBC7F +term4 7FBBB3 +term5 D699B6 +term6 83C092 +term7 D3C6AA +term8 859289 +term9 E67E80 +term10 A7C080 +term11 DBBC7F +term12 7FBBB3 +term13 D699B6 +term14 83C092 +term15 D3C6AA +rosewater D3C6AA +flamingo D699B6 +pink D699B6 +mauve D699B6 +red E67E80 +maroon E67E80 +peach E69875 +yellow DBBC7F +green A7C080 +teal 83C092 +sky 7FBBB3 +sapphire 7FBBB3 +blue 7FBBB3 +lavender 7FBBB3 +klink 7FBBB3 +klinkSelection 7FBBB3 +kvisited 83C092 +kvisitedSelection 83C092 +knegative E67E80 +knegativeSelection E67E80 +kneutral DBBC7F +kneutralSelection DBBC7F +kpositive A7C080 +kpositiveSelection A7C080 +text D3C6AA +subtext1 9DA9A0 +subtext0 859289 +overlay2 7A8478 +overlay1 6F7A6F +overlay0 5F6A5F +surface2 2E383C +surface1 252B2E +surface0 1E2326 +base 1E2326 +mantle 15191C +crust 11161A +success A7C080 +onSuccess 1E2326 +successContainer 414B50 +onSuccessContainer D3C6AA diff --git a/src/caelestia/data/schemes/everforest/medium/dark.txt b/src/caelestia/data/schemes/everforest/medium/dark.txt new file mode 100644 index 0000000..8616743 --- /dev/null +++ b/src/caelestia/data/schemes/everforest/medium/dark.txt @@ -0,0 +1,110 @@ +primary_paletteKeyColor 7FBBB3 +secondary_paletteKeyColor 83C092 +tertiary_paletteKeyColor A7C080 +neutral_paletteKeyColor 2E383C +neutral_variant_paletteKeyColor 374145 +background 2D353B +onBackground D3C6AA +surface 343F44 +surfaceDim 232A2E +surfaceBright 475258 +surfaceContainerLowest 1E2326 +surfaceContainerLow 3B474E +surfaceContainer 3D484D +surfaceContainerHigh 475258 +surfaceContainerHighest 4C5258 +onSurface D3C6AA +surfaceVariant 3D484D +onSurfaceVariant 9DA9A0 +inverseSurface D3C6AA +inverseOnSurface 2D353B +outline 859289 +outlineVariant 475258 +shadow 000000 +scrim 000000 +surfaceTint 7FBBB3 +primary 7FBBB3 +onPrimary 2D353B +primaryContainer 475258 +onPrimaryContainer A7C080 +inversePrimary 5A9A8F +secondary 83C092 +onSecondary 2D353B +secondaryContainer 475258 +onSecondaryContainer A7C080 +tertiary A7C080 +onTertiary 2D353B +tertiaryContainer 475258 +onTertiaryContainer D3C6AA +error E67E80 +onError 2D353B +errorContainer 4C3743 +onErrorContainer E67E80 +primaryFixed 7FBBB3 +primaryFixedDim 5A9A8F +onPrimaryFixed 2D353B +onPrimaryFixedVariant 374145 +secondaryFixed 83C092 +secondaryFixedDim 5F8C6F +onSecondaryFixed 2D353B +onSecondaryFixedVariant 374145 +tertiaryFixed A7C080 +tertiaryFixedDim 7F9D5F +onTertiaryFixed 2D353B +onTertiaryFixedVariant 374145 +term0 2D353B +term1 E67E80 +term2 A7C080 +term3 DBBC7F +term4 7FBBB3 +term5 D699B6 +term6 83C092 +term7 D3C6AA +term8 859289 +term9 E67E80 +term10 A7C080 +term11 DBBC7F +term12 7FBBB3 +term13 D699B6 +term14 83C092 +term15 D3C6AA +rosewater D3C6AA +flamingo D699B6 +pink D699B6 +mauve D699B6 +red E67E80 +maroon E67E80 +peach E69875 +yellow DBBC7F +green A7C080 +teal 83C092 +sky 7FBBB3 +sapphire 7FBBB3 +blue 7FBBB3 +lavender 7FBBB3 +klink 7FBBB3 +klinkSelection 7FBBB3 +kvisited 83C092 +kvisitedSelection 83C092 +knegative E67E80 +knegativeSelection E67E80 +kneutral DBBC7F +kneutralSelection DBBC7F +kpositive A7C080 +kpositiveSelection A7C080 +text D3C6AA +subtext1 9DA9A0 +subtext0 859289 +overlay2 7A8478 +overlay1 6F7A6F +overlay0 5F6A5F +surface2 3D484D +surface1 343F44 +surface0 2D353B +base 2D353B +mantle 232A2E +crust 1E2326 +success A7C080 +onSuccess 2D353B +successContainer 475258 +onSuccessContainer D3C6AA diff --git a/src/caelestia/data/schemes/everforest/medium/light.txt b/src/caelestia/data/schemes/everforest/medium/light.txt new file mode 100644 index 0000000..92fd1dc --- /dev/null +++ b/src/caelestia/data/schemes/everforest/medium/light.txt @@ -0,0 +1,110 @@ +primary_paletteKeyColor 3A94C5 +secondary_paletteKeyColor 35A77C +tertiary_paletteKeyColor 8DA101 +neutral_paletteKeyColor E6E2CC +neutral_variant_paletteKeyColor E0DCC7 +background FDF6E3 +onBackground 5C6A72 +surface F3EAD3 +surfaceDim FDF6E3 +surfaceBright FFFBF0 +surfaceContainerLowest FFFBF0 +surfaceContainerLow FDF6E3 +surfaceContainer F3EAD3 +surfaceContainerHigh EAE4CA +surfaceContainerHighest E0DCC7 +onSurface 5C6A72 +surfaceVariant EAE4CA +onSurfaceVariant 6F7C84 +inverseSurface 5C6A72 +inverseOnSurface FDF6E3 +outline 939F91 +outlineVariant E0DCC7 +shadow 000000 +scrim 000000 +surfaceTint 3A94C5 +primary 3A94C5 +onPrimary FFFBF0 +primaryContainer E0DCC7 +onPrimaryContainer 8DA101 +inversePrimary 5FAFD7 +secondary 35A77C +onSecondary FFFBF0 +secondaryContainer E0DCC7 +onSecondaryContainer 8DA101 +tertiary 8DA101 +onTertiary FFFBF0 +tertiaryContainer E0DCC7 +onTertiaryContainer 5C6A72 +error F85552 +onError FFFBF0 +errorContainer E6E2CC +onErrorContainer F85552 +primaryFixed 3A94C5 +primaryFixedDim 5FAFD7 +onPrimaryFixed FFFBF0 +onPrimaryFixedVariant E0DCC7 +secondaryFixed 35A77C +secondaryFixedDim 5FC198 +onSecondaryFixed FFFBF0 +onSecondaryFixedVariant E0DCC7 +tertiaryFixed 8DA101 +tertiaryFixedDim A7C080 +onTertiaryFixed FFFBF0 +onTertiaryFixedVariant E0DCC7 +term0 5C6A72 +term1 F85552 +term2 8DA101 +term3 DFA000 +term4 3A94C5 +term5 DF69BA +term6 35A77C +term7 5C6A72 +term8 939F91 +term9 F85552 +term10 8DA101 +term11 DFA000 +term12 3A94C5 +term13 DF69BA +term14 35A77C +term15 5C6A72 +rosewater 5C6A72 +flamingo DF69BA +pink DF69BA +mauve DF69BA +red F85552 +maroon F85552 +peach E66868 +yellow DFA000 +green 8DA101 +teal 35A77C +sky 3A94C5 +sapphire 3A94C5 +blue 3A94C5 +lavender 3A94C5 +klink 3A94C5 +klinkSelection 3A94C5 +kvisited 35A77C +kvisitedSelection 35A77C +knegative F85552 +knegativeSelection F85552 +kneutral DFA000 +kneutralSelection DFA000 +kpositive 8DA101 +kpositiveSelection 8DA101 +text 5C6A72 +subtext1 6F7C84 +subtext0 939F91 +overlay2 A6B0A0 +overlay1 B9C0B0 +overlay0 CCD3C2 +surface2 EAE4CA +surface1 F3EAD3 +surface0 FDF6E3 +base FDF6E3 +mantle FFFBF0 +crust FFFEF9 +success 8DA101 +onSuccess FFFBF0 +successContainer E0DCC7 +onSuccessContainer 5C6A72 diff --git a/src/caelestia/data/schemes/everforest/soft/dark.txt b/src/caelestia/data/schemes/everforest/soft/dark.txt new file mode 100644 index 0000000..817425b --- /dev/null +++ b/src/caelestia/data/schemes/everforest/soft/dark.txt @@ -0,0 +1,110 @@ +primary_paletteKeyColor 7FBBB3 +secondary_paletteKeyColor 83C092 +tertiary_paletteKeyColor A7C080 +neutral_paletteKeyColor 2E383C +neutral_variant_paletteKeyColor 374145 +background 323C41 +onBackground D3C6AA +surface 3A454A +surfaceDim 282F34 +surfaceBright 4D585D +surfaceContainerLowest 232A2E +surfaceContainerLow 414D54 +surfaceContainer 434E53 +surfaceContainerHigh 4D585D +surfaceContainerHighest 525C61 +onSurface D3C6AA +surfaceVariant 434E53 +onSurfaceVariant 9DA9A0 +inverseSurface D3C6AA +inverseOnSurface 323C41 +outline 859289 +outlineVariant 4D585D +shadow 000000 +scrim 000000 +surfaceTint 7FBBB3 +primary 7FBBB3 +onPrimary 323C41 +primaryContainer 4D585D +onPrimaryContainer A7C080 +inversePrimary 5A9A8F +secondary 83C092 +onSecondary 323C41 +secondaryContainer 4D585D +onSecondaryContainer A7C080 +tertiary A7C080 +onTertiary 323C41 +tertiaryContainer 4D585D +onTertiaryContainer D3C6AA +error E67E80 +onError 323C41 +errorContainer 4C3743 +onErrorContainer E67E80 +primaryFixed 7FBBB3 +primaryFixedDim 5A9A8F +onPrimaryFixed 323C41 +onPrimaryFixedVariant 374145 +secondaryFixed 83C092 +secondaryFixedDim 5F8C6F +onSecondaryFixed 323C41 +onSecondaryFixedVariant 374145 +tertiaryFixed A7C080 +tertiaryFixedDim 7F9D5F +onTertiaryFixed 323C41 +onTertiaryFixedVariant 374145 +term0 323C41 +term1 E67E80 +term2 A7C080 +term3 DBBC7F +term4 7FBBB3 +term5 D699B6 +term6 83C092 +term7 D3C6AA +term8 859289 +term9 E67E80 +term10 A7C080 +term11 DBBC7F +term12 7FBBB3 +term13 D699B6 +term14 83C092 +term15 D3C6AA +rosewater D3C6AA +flamingo D699B6 +pink D699B6 +mauve D699B6 +red E67E80 +maroon E67E80 +peach E69875 +yellow DBBC7F +green A7C080 +teal 83C092 +sky 7FBBB3 +sapphire 7FBBB3 +blue 7FBBB3 +lavender 7FBBB3 +klink 7FBBB3 +klinkSelection 7FBBB3 +kvisited 83C092 +kvisitedSelection 83C092 +knegative E67E80 +knegativeSelection E67E80 +kneutral DBBC7F +kneutralSelection DBBC7F +kpositive A7C080 +kpositiveSelection A7C080 +text D3C6AA +subtext1 9DA9A0 +subtext0 859289 +overlay2 7A8478 +overlay1 6F7A6F +overlay0 5F6A5F +surface2 434E53 +surface1 3A454A +surface0 323C41 +base 323C41 +mantle 282F34 +crust 232A2E +success A7C080 +onSuccess 323C41 +successContainer 4D585D +onSuccessContainer D3C6AA diff --git a/src/caelestia/data/schemes/nord/medium/dark.txt b/src/caelestia/data/schemes/nord/medium/dark.txt new file mode 100644 index 0000000..9e0cc02 --- /dev/null +++ b/src/caelestia/data/schemes/nord/medium/dark.txt @@ -0,0 +1,110 @@ +primary_paletteKeyColor 88C0D0 +secondary_paletteKeyColor 81A1C1 +tertiary_paletteKeyColor 5E81AC +neutral_paletteKeyColor 3B4252 +neutral_variant_paletteKeyColor 434C5E +background 2E3440 +onBackground ECEFF4 +surface 3B4252 +surfaceDim 242933 +surfaceBright 4C566A +surfaceContainerLowest 1F232C +surfaceContainerLow 424A5E +surfaceContainer 434C5E +surfaceContainerHigh 4C566A +surfaceContainerHighest 55606E +onSurface ECEFF4 +surfaceVariant 434C5E +onSurfaceVariant D8DEE9 +inverseSurface ECEFF4 +inverseOnSurface 2E3440 +outline 616E88 +outlineVariant 4C566A +shadow 000000 +scrim 000000 +surfaceTint 88C0D0 +primary 88C0D0 +onPrimary 2E3440 +primaryContainer 4C566A +onPrimaryContainer 88C0D0 +inversePrimary 6FA3B3 +secondary 81A1C1 +onSecondary 2E3440 +secondaryContainer 4C566A +onSecondaryContainer 81A1C1 +tertiary 5E81AC +onTertiary 2E3440 +tertiaryContainer 4C566A +onTertiaryContainer 5E81AC +error BF616A +onError 2E3440 +errorContainer 4C3743 +onErrorContainer BF616A +primaryFixed 88C0D0 +primaryFixedDim 6FA3B3 +onPrimaryFixed 2E3440 +onPrimaryFixedVariant 434C5E +secondaryFixed 81A1C1 +secondaryFixedDim 6A84A4 +onSecondaryFixed 2E3440 +onSecondaryFixedVariant 434C5E +tertiaryFixed 5E81AC +tertiaryFixedDim 4A6A8F +onTertiaryFixed 2E3440 +onTertiaryFixedVariant 434C5E +term0 3B4252 +term1 BF616A +term2 A3BE8C +term3 EBCB8B +term4 81A1C1 +term5 B48EAD +term6 88C0D0 +term7 E5E9F0 +term8 4C566A +term9 BF616A +term10 A3BE8C +term11 EBCB8B +term12 81A1C1 +term13 B48EAD +term14 8FBCBB +term15 ECEFF4 +rosewater ECEFF4 +flamingo B48EAD +pink B48EAD +mauve B48EAD +red BF616A +maroon BF616A +peach D08770 +yellow EBCB8B +green A3BE8C +teal 8FBCBB +sky 88C0D0 +sapphire 81A1C1 +blue 5E81AC +lavender 5E81AC +klink 88C0D0 +klinkSelection 88C0D0 +kvisited 81A1C1 +kvisitedSelection 81A1C1 +knegative BF616A +knegativeSelection BF616A +kneutral EBCB8B +kneutralSelection EBCB8B +kpositive A3BE8C +kpositiveSelection A3BE8C +text ECEFF4 +subtext1 D8DEE9 +subtext0 616E88 +overlay2 5A677E +overlay1 4F5B73 +overlay0 434C5E +surface2 434C5E +surface1 3B4252 +surface0 2E3440 +base 2E3440 +mantle 242933 +crust 1F232C +success A3BE8C +onSuccess 2E3440 +successContainer 4C566A +onSuccessContainer ECEFF4 diff --git a/src/caelestia/data/schemes/solarized/medium/dark.txt b/src/caelestia/data/schemes/solarized/medium/dark.txt new file mode 100644 index 0000000..7000788 --- /dev/null +++ b/src/caelestia/data/schemes/solarized/medium/dark.txt @@ -0,0 +1,110 @@ +primary_paletteKeyColor 268BD2 +secondary_paletteKeyColor 2AA198 +tertiary_paletteKeyColor 6C71C4 +neutral_paletteKeyColor 002B36 +neutral_variant_paletteKeyColor 073642 +background 002B36 +onBackground FDF6E3 +surface 073642 +surfaceDim 001F29 +surfaceBright 0D4250 +surfaceContainerLowest 00151D +surfaceContainerLow 0A404E +surfaceContainer 094B59 +surfaceContainerHigh 0D4250 +surfaceContainerHighest 11505E +onSurface FDF6E3 +surfaceVariant 094B59 +onSurfaceVariant 93A1A1 +inverseSurface FDF6E3 +inverseOnSurface 002B36 +outline 586E75 +outlineVariant 0D4250 +shadow 000000 +scrim 000000 +surfaceTint 268BD2 +primary 268BD2 +onPrimary 002B36 +primaryContainer 0D4250 +onPrimaryContainer 268BD2 +inversePrimary 2075B2 +secondary 2AA198 +onSecondary 002B36 +secondaryContainer 0D4250 +onSecondaryContainer 2AA198 +tertiary 6C71C4 +onTertiary 002B36 +tertiaryContainer 0D4250 +onTertiaryContainer 6C71C4 +error DC322F +onError 002B36 +errorContainer 4C3743 +onErrorContainer DC322F +primaryFixed 268BD2 +primaryFixedDim 2075B2 +onPrimaryFixed 002B36 +onPrimaryFixedVariant 094B59 +secondaryFixed 2AA198 +secondaryFixedDim 228178 +onSecondaryFixed 002B36 +onSecondaryFixedVariant 094B59 +tertiaryFixed 6C71C4 +tertiaryFixedDim 5C61A4 +onTertiaryFixed 002B36 +onTertiaryFixedVariant 094B59 +term0 002B36 +term1 DC322F +term2 859900 +term3 B58900 +term4 268BD2 +term5 D33682 +term6 2AA198 +term7 EEE8D5 +term8 586E75 +term9 CB4B16 +term10 859900 +term11 B58900 +term12 268BD2 +term13 6C71C4 +term14 2AA198 +term15 FDF6E3 +rosewater FDF6E3 +flamingo EEE8D5 +pink D33682 +mauve 6C71C4 +red DC322F +maroon CB4B16 +peach CB4B16 +yellow B58900 +green 859900 +teal 2AA198 +sky 2AA198 +sapphire 268BD2 +blue 268BD2 +lavender 6C71C4 +klink 268BD2 +klinkSelection 268BD2 +kvisited 6C71C4 +kvisitedSelection 6C71C4 +knegative DC322F +knegativeSelection DC322F +kneutral B58900 +kneutralSelection B58900 +kpositive 859900 +kpositiveSelection 859900 +text FDF6E3 +subtext1 93A1A1 +subtext0 839496 +overlay2 657B83 +overlay1 586E75 +overlay0 073642 +surface2 094B59 +surface1 073642 +surface0 002B36 +base 002B36 +mantle 001F29 +crust 00151D +success 859900 +onSuccess 002B36 +successContainer 0D4250 +onSuccessContainer FDF6E3 diff --git a/src/caelestia/data/schemes/tokyonight/medium/dark.txt b/src/caelestia/data/schemes/tokyonight/medium/dark.txt new file mode 100644 index 0000000..0fbb87a --- /dev/null +++ b/src/caelestia/data/schemes/tokyonight/medium/dark.txt @@ -0,0 +1,110 @@ +primary_paletteKeyColor 7AA2F7 +secondary_paletteKeyColor 9ECE6A +tertiary_paletteKeyColor BB9AF7 +neutral_paletteKeyColor 1A1B26 +neutral_variant_paletteKeyColor 292E42 +background 1A1B26 +onBackground C0CAF5 +surface 24283B +surfaceDim 16161E +surfaceBright 3B4261 +surfaceContainerLowest 0F0F14 +surfaceContainerLow 2B3048 +surfaceContainer 2A2F41 +surfaceContainerHigh 3B4261 +surfaceContainerHighest 414868 +onSurface C0CAF5 +surfaceVariant 2A2F41 +onSurfaceVariant A9B1D6 +inverseSurface C0CAF5 +inverseOnSurface 1A1B26 +outline 565F89 +outlineVariant 3B4261 +shadow 000000 +scrim 000000 +surfaceTint 7AA2F7 +primary 7AA2F7 +onPrimary 1A1B26 +primaryContainer 3B4261 +onPrimaryContainer 7AA2F7 +inversePrimary 5A7FD7 +secondary 9ECE6A +onSecondary 1A1B26 +secondaryContainer 3B4261 +onSecondaryContainer 9ECE6A +tertiary BB9AF7 +onTertiary 1A1B26 +tertiaryContainer 3B4261 +onTertiaryContainer BB9AF7 +error F7768E +onError 1A1B26 +errorContainer 4C3743 +onErrorContainer F7768E +primaryFixed 7AA2F7 +primaryFixedDim 5A7FD7 +onPrimaryFixed 1A1B26 +onPrimaryFixedVariant 2A2F41 +secondaryFixed 9ECE6A +secondaryFixedDim 7EAE4A +onSecondaryFixed 1A1B26 +onSecondaryFixedVariant 2A2F41 +tertiaryFixed BB9AF7 +tertiaryFixedDim 9B7AD7 +onTertiaryFixed 1A1B26 +onTertiaryFixedVariant 2A2F41 +term0 1A1B26 +term1 F7768E +term2 9ECE6A +term3 E0AF68 +term4 7AA2F7 +term5 BB9AF7 +term6 7DCFFF +term7 C0CAF5 +term8 565F89 +term9 F7768E +term10 9ECE6A +term11 E0AF68 +term12 7AA2F7 +term13 BB9AF7 +term14 7DCFFF +term15 C0CAF5 +rosewater C0CAF5 +flamingo BB9AF7 +pink F7768E +mauve BB9AF7 +red F7768E +maroon E0AF68 +peach FF9E64 +yellow E0AF68 +green 9ECE6A +teal 1ABC9C +sky 7DCFFF +sapphire 2AC3DE +blue 7AA2F7 +lavender 7DCFFF +klink 7AA2F7 +klinkSelection 7AA2F7 +kvisited BB9AF7 +kvisitedSelection BB9AF7 +knegative F7768E +knegativeSelection F7768E +kneutral E0AF68 +kneutralSelection E0AF68 +kpositive 9ECE6A +kpositiveSelection 9ECE6A +text C0CAF5 +subtext1 A9B1D6 +subtext0 9AA5CE +overlay2 787C99 +overlay1 696D85 +overlay0 565F89 +surface2 2A2F41 +surface1 24283B +surface0 1A1B26 +base 1A1B26 +mantle 16161E +crust 0F0F14 +success 9ECE6A +onSuccess 1A1B26 +successContainer 3B4261 +onSuccessContainer C0CAF5 diff --git a/src/caelestia/data/templates/gtk.css b/src/caelestia/data/templates/gtk.css index bc9e558..35d16a1 100644 --- a/src/caelestia/data/templates/gtk.css +++ b/src/caelestia/data/templates/gtk.css @@ -15,3 +15,7 @@ @define-color sidebar_fg_color @window_fg_color; @define-color sidebar_border_color @window_bg_color; @define-color sidebar_backdrop_color @window_bg_color; +@define-color theme_selected_bg_color alpha(@accent_color, 0.15); +@define-color theme_selected_fg_color @primary; + +@import "thunar.css"; diff --git a/src/caelestia/data/templates/thunar.css b/src/caelestia/data/templates/thunar.css new file mode 100644 index 0000000..548a9e0 --- /dev/null +++ b/src/caelestia/data/templates/thunar.css @@ -0,0 +1,202 @@ +/* Thunar theme */ + +/* ============================================================================= + Global Resets + ============================================================================= */ + +.thunar * { + outline: none; + border: none; +} + +/* ============================================================================= + Window & Background + ============================================================================= */ + +.thunar.background { + background: {{ $surface }}; +} + +.thunar .titlebar { + background: inherit; +} + +.thunar .titlebutton.close { + margin: 0 15px 0 0; +} + +/* ============================================================================= + Layout Containers + ============================================================================= */ + +/* Paned separator between sidebar and main view */ +.thunar paned > separator { + min-width: 4px; + margin-right: -7px; + margin-left: -7px; + background: none; + background-image: none; + box-shadow: none; +} + + +/* Main file view frame */ +.thunar .frame.standard-view { + padding: 10px; + margin: 10px 15px 0 0; + border-radius: 15px; + background-color: {{ $surfaceContainerLow }}; + animation: fading 400ms ease forwards; + opacity: 0; + animation-delay: 250ms; +} + +.thunar .frame.standard-view .view:not(.rubberband), +.thunar .frame.standard-view .view *:not(.rubberband) { + background-color: transparent; +} + +.thunar .frame.standard-view .view *:selected { + color: {{ $primary }}; +} + +.thunar .rubberband { + background-color: alpha({{ $primary }}, 0.15); + border: 1px solid alpha({{ $primary }}, 0.15); +} + + +/* Tabs */ +.thunar header.top { + background: none; + padding: 0 10px 0 0; + margin: 3px 0 -3px -2px; +} + +.thunar header.top tabs .reorderable-page { + margin: 0; + transition: all ease 300ms; +} +.thunar header.top tabs .reorderable-page + .reorderable-page { + margin: 0 0 0 10px; +} + +.thunar header.top tabs .reorderable-page:hover { + background-color: alpha({{ $primary }}, 0.08); + +} +.thunar header.top tabs .reorderable-page:checked { + color: {{ $primary }}; + background-color: alpha({{ $primary }}, 0.15); + +} + +/* ============================================================================= + Sidebar Navigation + ============================================================================= */ + +.thunar .sidebar { + padding: 0 20px; + background: none; + animation: fading 600ms ease forwards; + animation-delay: 100ms; + opacity: 0; +} + +.thunar .sidebar .view { + padding: 8px 4px; + border-radius: 10px; + background: none; + transition: all ease 300ms; +} + +.thunar .sidebar .view:hover { + background: alpha({{ $onSurface }}, 0.1); +} + +.thunar .sidebar .view:selected { + background: alpha({{ $primary }}, 0.15); + color: {{ $primary }}; +} + +/* ============================================================================= + Path Bar & Location Buttons + ============================================================================= */ + +.thunar .path-bar-button { + margin: 0; + padding: 8px 5px; + transition: all ease 0.4s; +} + +.thunar .location-button.toggle:checked, +.thunar .path-bar-button.toggle:checked { + padding: 8px 25px; + background: alpha({{ $primary }}, 0.15); + color: {{ $primary }}; + box-shadow: none; +} + +.thunar .location-button.path-bar-button:not(:checked) { + background-color: {{ $surfaceContainerLow }}; +} + +.thunar .location-button.path-bar-button:not(:checked):hover { + background: alpha({{ $primary }}, 0.08); + color: alpha({{ $primary }}, 0.8); +} + +.thunar .location-button.toggle+.location-button.toggle:checked { + margin-left: 0px; + padding: 0 25px; +} + +.thunar .titlebar { + padding: 15px 0 5px 0; +} + +/* ============================================================================= + Buttons + ============================================================================= */ + +.thunar button.toggle:checked { + color: {{ $primary }}; +} + +.thunar .image-button { + padding: 8px; + margin: 0 0 0 8px; + transition: all ease 0.4s; +} + +/* ============================================================================= + Status Bar + ============================================================================= */ + +.thunar statusbar { + background-color: {{ $surfaceContainerLow }}; + border-radius: 15px; + padding: 10px 10px; + margin: 15px 5px 15px -10px; + color: {{ $onSurface }}; +} + + +/* ============================================================================= + Image preview + ============================================================================= */ + +.thunar box.vertical .image { + margin: 15px; +} + + +/* ============================================================================= + Animation + ============================================================================= */ + +@keyframes fading { + to { + opacity: 1; + } +} diff --git a/src/caelestia/utils/theme.py b/src/caelestia/utils/theme.py index 66665a8..dc4db62 100644 --- a/src/caelestia/utils/theme.py +++ b/src/caelestia/utils/theme.py @@ -4,6 +4,8 @@ import subprocess from pathlib import Path import tempfile import shutil +import fcntl +import sys from caelestia.utils.colour import get_dynamic_colours from caelestia.utils.logging import log_exception @@ -58,7 +60,7 @@ def gen_replace_dynamic(colours: dict[str, str], template: Path, mode: str) -> s colours_dyn = get_dynamic_colours(colours) template_content = template.read_text() - template_filled = re.sub(dotField, fill_colour, template_content) + template_filled = re.sub(dotField, fill_colour, template_content) template_filled = re.sub(modeField, mode, template_filled) return template_filled @@ -125,9 +127,15 @@ def apply_terms(sequences: str) -> None: for pt in pts_path.iterdir(): if pt.name.isdigit(): try: - with pt.open("a") as f: - f.write(sequences) - except PermissionError: + # Use non-blocking write with timeout to prevent hangs + import os + fd = os.open(str(pt), os.O_WRONLY | os.O_NONBLOCK | os.O_NOCTTY) + try: + os.write(fd, sequences.encode()) + finally: + os.close(fd) + except (PermissionError, OSError, BlockingIOError): + # Skip terminals that are busy, closed, or inaccessible pass @@ -180,15 +188,130 @@ def apply_htop(colours: dict[str, str]) -> None: subprocess.run(["killall", "-USR2", "htop"], stderr=subprocess.DEVNULL) +def sync_papirus_colors(hex_color: str) -> None: + """Sync Papirus folder icon colors using hue/saturation analysis""" + try: + result = subprocess.run( + ["which", "papirus-folders"], + capture_output=True, + check=False + ) + if result.returncode != 0: + return + except Exception: + return + + papirus_paths = [ + Path("/usr/share/icons/Papirus"), + Path("/usr/share/icons/Papirus-Dark"), + Path.home() / ".local/share/icons/Papirus", + Path.home() / ".icons/Papirus", + ] + + if not any(p.exists() for p in papirus_paths): + return + + r = int(hex_color[0:2], 16) + g = int(hex_color[2:4], 16) + b = int(hex_color[4:6], 16) + + # Brightness and saturation + max_val = max(r, g, b) + min_val = min(r, g, b) + brightness = max_val + saturation = 0 if max_val == 0 else ((max_val - min_val) * 100) // max_val + + # Low saturation = grayscale + if saturation < 20: + if brightness < 85: + color = "black" + elif brightness < 170: + color = "grey" + else: + color = "white" + # Medium-low saturation with high brightness = pale variants + elif saturation < 60 and brightness > 180: + use_pale = True + color = _determine_hue_color(r, g, b, brightness, use_pale) + else: + color = _determine_hue_color(r, g, b, brightness, False) + + try: + subprocess.Popen( + ["sudo", "-n", "papirus-folders", "-C", color, "-u"], + stderr=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, + start_new_session=True + ) + except Exception: + pass + + +def _determine_hue_color(r: int, g: int, b: int, brightness: int, use_pale: bool) -> str: + if b > r and b > g: + # Blue dominant + r_ratio = (r * 100) // b if b > 0 else 0 + g_ratio = (g * 100) // b if b > 0 else 0 + rg_diff = abs(r - g) + + if r_ratio > 70 and g_ratio > 70: + # Both R and G high relative to B = light blue/periwinkle + if rg_diff < 15: + return "blue" + elif r > g: + return "violet" + else: + return "cyan" + elif r_ratio > 60 and r > g: + return "violet" + elif g_ratio > 60 and g > r: + return "cyan" + else: + return "blue" + elif r > g and r > b: + # Red dominant + if g > b + 30: + # Orange/yellow-ish/brown + rg_ratio = (g * 100) // r if r > 0 else 0 + if use_pale: + if rg_ratio > 70 and brightness < 220: + return "palebrown" + else: + return "paleorange" + else: + if rg_ratio > 70 and brightness < 180: + return "brown" + else: + return "orange" + elif b > g + 20: + return "pink" + else: + return "pink" if use_pale else "red" + elif g > r and g > b: + # Green dominant + if r > b + 30: + return "yellow" + else: + return "green" + else: + return "grey" + + @log_exception def apply_gtk(colours: dict[str, str], mode: str) -> None: - template = gen_replace(colours, templates_dir / "gtk.css", hash=True) - write_file(config_dir / "gtk-3.0/gtk.css", template) - write_file(config_dir / "gtk-4.0/gtk.css", template) + gtk_template = gen_replace(colours, templates_dir / "gtk.css", hash=True) + thunar_template = gen_replace(colours, templates_dir / "thunar.css", hash=True) + + for gtk_version in ["gtk-3.0", "gtk-4.0"]: + gtk_config_dir = config_dir / gtk_version + write_file(gtk_config_dir / "gtk.css", gtk_template) + write_file(gtk_config_dir / "thunar.css", thunar_template) subprocess.run(["dconf", "write", "/org/gnome/desktop/interface/gtk-theme", "'adw-gtk3-dark'"]) subprocess.run(["dconf", "write", "/org/gnome/desktop/interface/color-scheme", f"'prefer-{mode}'"]) subprocess.run(["dconf", "write", "/org/gnome/desktop/interface/icon-theme", f"'Papirus-{mode.capitalize()}'"]) + + sync_papirus_colors(colours["primary"]) @log_exception @@ -246,36 +369,53 @@ def apply_user_templates(colours: dict[str, str], mode: str) -> None: def apply_colours(colours: dict[str, str], mode: str) -> None: + # Use file-based lock to prevent concurrent theme changes + lock_file = c_state_dir / "theme.lock" + c_state_dir.mkdir(parents=True, exist_ok=True) + try: - cfg = json.loads(user_config_path.read_text())["theme"] - except (FileNotFoundError, json.JSONDecodeError, KeyError): - cfg = {} + with open(lock_file, 'w') as lock_fd: + try: + fcntl.flock(lock_fd.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) + except BlockingIOError: + return + + try: + cfg = json.loads(user_config_path.read_text())["theme"] + except (FileNotFoundError, json.JSONDecodeError, KeyError): + cfg = {} - def check(key: str) -> bool: - return cfg[key] if key in cfg else True + def check(key: str) -> bool: + return cfg[key] if key in cfg else True - if check("enableTerm"): - apply_terms(gen_sequences(colours)) - if check("enableHypr"): - apply_hypr(gen_conf(colours)) - if check("enableDiscord"): - apply_discord(gen_scss(colours)) - if check("enableSpicetify"): - apply_spicetify(colours, mode) - if check("enableFuzzel"): - apply_fuzzel(colours) - if check("enableBtop"): - apply_btop(colours) - if check("enableNvtop"): - apply_nvtop(colours) - if check("enableHtop"): - apply_htop(colours) - if check("enableGtk"): - apply_gtk(colours, mode) - if check("enableQt"): - apply_qt(colours, mode) - if check("enableWarp"): - apply_warp(colours, mode) - if check("enableCava"): - apply_cava(colours) - apply_user_templates(colours, mode) + if check("enableTerm"): + apply_terms(gen_sequences(colours)) + if check("enableHypr"): + apply_hypr(gen_conf(colours)) + if check("enableDiscord"): + apply_discord(gen_scss(colours)) + if check("enableSpicetify"): + apply_spicetify(colours, mode) + if check("enableFuzzel"): + apply_fuzzel(colours) + if check("enableBtop"): + apply_btop(colours) + if check("enableNvtop"): + apply_nvtop(colours) + if check("enableHtop"): + apply_htop(colours) + if check("enableGtk"): + apply_gtk(colours, mode) + if check("enableQt"): + apply_qt(colours, mode) + if check("enableWarp"): + apply_warp(colours, mode) + if check("enableCava"): + apply_cava(colours) + apply_user_templates(colours, mode) + + finally: + try: + lock_file.unlink() + except FileNotFoundError: + pass