Compare commits
373 Commits
redirect
...
6ee608c2e8
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ee608c2e8 | |||
| 7411dc8ee3 | |||
| 5c145c83ae | |||
| a60e29ee17 | |||
| 1416589456 | |||
| 3a348089b2 | |||
| c13a21f35b | |||
| b26fa4e969 | |||
| 3389197695 | |||
| f3b9a41862 | |||
| a68b088dae | |||
| c872a3f226 | |||
| 517cfb8e93 | |||
| 6c68c9063b | |||
| 92022114fb | |||
| a9612de0b0 | |||
| dc904c44ae | |||
| ca6b93bf55 | |||
| 2b4e93431a | |||
| 38694db0c9 | |||
| b56a3c6946 | |||
| 3208fa286d | |||
| 354943de0c | |||
| 27d6ad2fcd | |||
| 997fb5e27e | |||
| 74ac074588 | |||
| 53cdd6e4a8 | |||
| e8d4b7c498 | |||
| e7731a09b1 | |||
| ab8d8bf2f1 | |||
| e4d051fdb6 | |||
| 212a8b35c6 | |||
| f418290a30 | |||
| af10335593 | |||
| 608f6d334d | |||
| bf3562b8b7 | |||
| e1fd5eb296 | |||
| 549782c484 | |||
| 57f0caefd6 | |||
| e0fca7224f | |||
| c0a4f2cd4c | |||
| 54605ad14e | |||
| 0f3baa21aa | |||
| 85549a18e5 | |||
| f54801299a | |||
| 4c6a16a1a4 | |||
| 4482bbccba | |||
| 9a65ffc32f | |||
| 63a8c1c17b | |||
| 4cf21b392c | |||
| 3208e6d455 | |||
| 279c86c8dd | |||
| a9603bf5f6 | |||
| 128e50100a | |||
| dad7df37e5 | |||
| 1619078eea | |||
| 6018121056 | |||
| 46c4cfcc70 | |||
| af1a21834e | |||
| d02f551c14 | |||
| e0612b8542 | |||
| 90df2c7119 | |||
| ceeea304e6 | |||
| 70e7299afd | |||
| b7d25d80df | |||
| bde4094f9e | |||
| b57a4368cc | |||
| 85d3a44f8d | |||
| db216b4063 | |||
| 04c6d3478d | |||
| 5afb04921b | |||
| ec720b2f8c | |||
| a676c94544 | |||
| 6515c3ffbf | |||
| afa8935b3e | |||
| 09e8961b48 | |||
| 40d16de38f | |||
| 9301c64e99 | |||
| 2c85563907 | |||
| e5b3c1beb1 | |||
| aa3f952178 | |||
| a64dc0f900 | |||
| 93ad5df691 | |||
| a97cdc3f29 | |||
| 0785bf9fe0 | |||
| be4ac55137 | |||
| 1d4fd02844 | |||
| aae8a3e746 | |||
| 4dfa1b2c66 | |||
| 47cf991c32 | |||
| 816720c965 | |||
| a47f76f5ed | |||
| ae0e474113 | |||
| 56c18fbc7f | |||
| 8557efa44b | |||
| 43dce677fd | |||
| 6ae616835e | |||
| cc0f8ed5ba | |||
| b1bd18dc78 | |||
| 34d163bdd6 | |||
| 34ca9f78ad | |||
| ed4888c5d5 | |||
| d09bbc5645 | |||
| 53cc1d6cdf | |||
| 694f5bf7a6 | |||
| 6dece815f5 | |||
| 435811a74d | |||
| 02f0c03e9d | |||
| b7e82843e1 | |||
| 7e0cafd350 | |||
| 72e58c18dc | |||
| bb38fb9d89 | |||
| dc25073a5e | |||
| dbb5e48513 | |||
| 7bc1a8ca5d | |||
| 975490479b | |||
| 07bdfe17de | |||
| e28e0eb694 | |||
| 6d4f195bf8 | |||
| cf5f1b4e49 | |||
| eb5b979f52 | |||
| eaf28a91c9 | |||
| 2b51018758 | |||
| 0433696bad | |||
| df26d20ba7 | |||
| 962814cb1b | |||
| 725fefba8b | |||
| e1e98cb97b | |||
| aea563acb4 | |||
| f2a635f585 | |||
| d900060d62 | |||
| 32817ad442 | |||
| 16658275b1 | |||
| 28c142ac53 | |||
| 5fea0cae30 | |||
| ee31dfd8cc | |||
| 42e80aaf7a | |||
| d3b07d3ec4 | |||
| ac23685be5 | |||
| b210a7432d | |||
| 306fad3db8 | |||
| e5322d8d50 | |||
| 1ebfa70174 | |||
| bd074b4a99 | |||
| c097da93a0 | |||
| e1d98318e6 | |||
| 5ece2d831e | |||
| 509d3ddc91 | |||
| 06325d17fe | |||
| 53e3809591 | |||
| 4164e617dc | |||
| 7d5b2064d1 | |||
| 9c68496d42 | |||
| cac93e87f0 | |||
| 610a3ba816 | |||
| e73070e430 | |||
| 545fe46e5a | |||
| 18a76f7c15 | |||
| c875ee0f52 | |||
| d2c1fd9f25 | |||
| d496054722 | |||
| 7a2f51a7f2 | |||
| 511f33dbc4 | |||
| a84806bb91 | |||
| 4ff8caecb6 | |||
| 75889c4a37 | |||
| 83fb97458e | |||
| cf7dceb9a1 | |||
| 57a16c4d93 | |||
| 52c44d409c | |||
| f7d3a2d58a | |||
| 8bfef10c3d | |||
| f54f0ff3f5 | |||
| 181f5acd04 | |||
| 8c78d03d70 | |||
| bb3d4a7df9 | |||
| 68763c4bc4 | |||
| 0609f7258f | |||
| 658a10034c | |||
| edb315e711 | |||
| eb5caaccb4 | |||
| d42d226e83 | |||
| 6e0c1ebca9 | |||
| 836b5c4d07 | |||
| 9573c78a90 | |||
| 7b7726fc69 | |||
| 58917ee8c7 | |||
| c23ea139d7 | |||
| 37629bf4e9 | |||
| 879717cfaa | |||
| 3bd3380a3c | |||
| 4be1241aed | |||
| b2aced73df | |||
| 3510f231fa | |||
| 3fd21999a2 | |||
| 46ba442fc5 | |||
| 4ff371f85a | |||
| 8e54edc078 | |||
| fe1fe80748 | |||
| f84b65ab55 | |||
| ba2ab83067 | |||
| ca324d2a4c | |||
| cd8abe91b7 | |||
| e63bcb1ded | |||
| 806261381d | |||
| 8015c5ff21 | |||
| 1b316126fc | |||
| 23ea5d0be0 | |||
| 97dafc128c | |||
| 0fc4b75bc3 | |||
| 79f55607c7 | |||
| 9b72a50974 | |||
| f4a5a2df43 | |||
| 4354a17030 | |||
| 88cdda4dad | |||
| a06f012dc9 | |||
| aa567f877a | |||
| f38ab2b946 | |||
| 95a509b657 | |||
| 2e4f702715 | |||
| f48204667c | |||
| aac330bf39 | |||
| 456fee12dd | |||
| 3a8114ed5a | |||
| 44974374d3 | |||
| a9e7548984 | |||
| 7feadcae55 | |||
| f9b3a62d1c | |||
| bd3a0de00c | |||
| d7e2ad0566 | |||
| 1314b9aa5d | |||
| 290c06e8e4 | |||
| 0713acf2f7 | |||
| f77d639965 | |||
| 6397501d26 | |||
| 8f7eeef6e8 | |||
| 258f464878 | |||
| 676699b0e3 | |||
| 9d69078b22 | |||
| 6adadfe8f3 | |||
| ccba4a364d | |||
| 5466b16adb | |||
| ef7d2f1bb2 | |||
| 8e745f6f62 | |||
| 96e43c06be | |||
| 78705d188c | |||
| f94cdf6d5b | |||
| 5f40e4af20 | |||
| 74d8545d54 | |||
| 68a9933db0 | |||
| 438e77f61d | |||
| 0c2c66435c | |||
| 2b881d3a8c | |||
| 5a93b2dc5b | |||
| e5805dcb25 | |||
| bf2aa1f130 | |||
| e7ec6bb2f9 | |||
| 098e2c2e22 | |||
| 52f710cfd7 | |||
| c428959edc | |||
| 9706a4b71e | |||
| acb3623ed8 | |||
| 16b686d33d | |||
| 8abd1c6f5e | |||
| 24920190a6 | |||
| f1b84ff78b | |||
| 2c31069fb0 | |||
| 0448e3b406 | |||
| e73217a8f7 | |||
| 9506419666 | |||
| 7f4bce9be7 | |||
| 028d9947a6 | |||
| 344e3e4cc5 | |||
| 1c6ea8b9a6 | |||
| 518d2a5321 | |||
| b3900a7f51 | |||
| 111fbec077 | |||
| 9fcfb9a41d | |||
| cd4853c388 | |||
| e09f5b0ab6 | |||
| c4bb604bb8 | |||
| f6fce1995e | |||
| 2ff849faa8 | |||
| a941f364cf | |||
| 58907eb22a | |||
| c1c08c87b7 | |||
| 27cad112c3 | |||
| 7242a8187f | |||
| d6a204a5fd | |||
| 4899b3d32d | |||
| cbe2e52507 | |||
| 7c7c9f9fc8 | |||
| 4d63eea921 | |||
| 9f6e2b0525 | |||
| 575d88e485 | |||
| 6299537d22 | |||
| 0f839b54e2 | |||
| 0dfad27294 | |||
| 4a1caafdfe | |||
| cf81ba31f9 | |||
| 841e75f581 | |||
| 96eef9616a | |||
| c5aab3de19 | |||
| 5992f48512 | |||
| 0a3cdc17f2 | |||
| 9d9ad8f367 | |||
| d0eee7a6a4 | |||
| 6409642dc3 | |||
| 5a73cf5341 | |||
| 4e5b68630c | |||
| 1db5c74b2c | |||
| fbbfef9b82 | |||
| f298aa85e8 | |||
| 6bbb48fb26 | |||
| 321c915bad | |||
| 7e65737868 | |||
| 0c740aacf1 | |||
| 9f6ea14b1b | |||
| 6a5ab1386b | |||
| 7f3e1caea9 | |||
| 38c2464a60 | |||
| 6721b3133e | |||
| b93ab73dbf | |||
| 3fe9a9033a | |||
| 4da423e5e9 | |||
| 99e24e6b91 | |||
| 705117d906 | |||
| 73ec37569a | |||
| 6f6441610d | |||
| fbd09f9f8e | |||
| f03f1c255a | |||
| 912e4f627c | |||
| b3322d5f4d | |||
| 40e7e82e92 | |||
| b4bf22ceed | |||
| bcdb2fb8d8 | |||
| 71eb608650 | |||
| aa8684c638 | |||
| c620ff7f47 | |||
| 0fc2228295 | |||
| c0d9a49b8c | |||
| dc6a4c8b78 | |||
| bc7c7b28d5 | |||
| f4eae59224 | |||
| 4f6c5390ca | |||
| 3f45cb4698 | |||
| fb7beaf7c6 | |||
| 7d4e2609e8 | |||
| 0333a4f6f9 | |||
| 46324eb663 | |||
| 6fcde95a85 | |||
| 8bd4d3e282 | |||
| 1ec7c3f708 | |||
| bec5605b4c | |||
| 739d1df5e7 | |||
| 558f45f53e | |||
| 660f4e4785 | |||
| c16fce4adb | |||
| c357526872 | |||
| f0ef341c7c | |||
| fb07b1f2a9 | |||
| 4308da29f5 | |||
| 8f5f9cf8e4 | |||
| 7699bff551 | |||
| dd033ec972 | |||
| 458828e054 | |||
| b9bdba8553 | |||
| 98dc560aa6 | |||
| 532c8ef745 | |||
| 20941c26f8 | |||
| 31048baa6f | |||
| 65f08f1b6a | |||
| 66111d0694 |
@@ -1 +1,3 @@
|
||||
index.html
|
||||
*.html
|
||||
thumbnails/
|
||||
*.js
|
||||
@@ -1,10 +1,53 @@
|
||||
# Gruvbox Wallpapers
|
||||
A place where to find gruvbox theme wallpapers.
|
||||
[https://gruvbox-wallpapers.onrender.com/](https://gruvbox-wallpapers.onrender.com/ 'Gruvbox Wallpapers')
|
||||
[https://gruvbox-wallpapers.pages.dev/](https://gruvbox-wallpapers.pages.dev/ 'Gruvbox Wallpapers')
|
||||
## Contributions
|
||||
|
||||
1. Fork the project.
|
||||
2. Add the wallpapers that you have in their respective folder.
|
||||
3. For light variants: Place the light-themed wallpapers in a light/ subfolder within the category.
|
||||
3. Make a pull request.
|
||||
|
||||
If your wallpaper does not fit in any of the folders we can debate the creation of a new one.
|
||||
> [!CAUTION]
|
||||
> - Use files under 25mb
|
||||
> - Avoid spaces in names
|
||||
|
||||
> [!TIP]
|
||||
> If your wallpaper does not fit in any of the folders we can debate the creation of a new one.
|
||||
|
||||
I tend to accept any contributions, but let's keep the site with images that match or look good with the gruvbox's color scheme :').
|
||||
|
||||
|
||||
## Nix package
|
||||
|
||||
1. **Use [nix flakes](https://wiki.nixos.org/wiki/Flakes)**:
|
||||
|
||||
2. Add the following to your `flake.nix` file:
|
||||
|
||||
```nix
|
||||
inputs = {
|
||||
gruvbox-wallpapers.url = "github:AngelJumbo/gruvbox-wallpapers";
|
||||
# ...
|
||||
};
|
||||
```
|
||||
|
||||
3. Then, in your Home Manager configuration:
|
||||
|
||||
```nix
|
||||
{
|
||||
inputs,
|
||||
pkgs,
|
||||
...
|
||||
}: {
|
||||
home.file = {
|
||||
"path/to/dir" = {
|
||||
source = inputs.gruvbox-wallpapers.packages."${pkgs.stdenv.hostPlatform.system}".default;
|
||||
recursive = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
## Disclaimer
|
||||
|
||||
Most of the images shared here are community contributions, and their original sources are often unknown. If you are the rightful owner of any image and would like it removed, please contact me by opening an issue. For any use beyond personal scope, I recommend performing a reverse image search to verify the origin.
|
||||
|
||||
@@ -1,92 +1,506 @@
|
||||
#!/bin/sh
|
||||
#!/usr/bin/env bash
|
||||
|
||||
touch ./index.html
|
||||
# MIT License
|
||||
# Copyright (c) 2022 Angel Jumbo <anarjumb@protonmail.com>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
echo "<!DOCTYPE html>
|
||||
<html lang=\"en\">
|
||||
|
||||
<head>
|
||||
<meta charset=\"utf-8\">
|
||||
<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">
|
||||
<title>Gruvbox wallpapers</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Wallpapers for gruvbox</h1>" > ./index.html
|
||||
|
||||
color=1
|
||||
for subdir in ./wallpapers/*
|
||||
do
|
||||
|
||||
echo "<h2 id=s"$color">" >> ./index.html
|
||||
echo "${subdir##*/}" | tr a-z A-Z >> ./index.html
|
||||
echo "</h2>" >> ./index.html
|
||||
generate_thumbnails() {
|
||||
echo "generate thumbnails ..."
|
||||
mkdir -p thumbnails
|
||||
rm -rf thumbnails/*
|
||||
|
||||
echo "<div id=c>" >> ./index.html
|
||||
# Count total number of images
|
||||
total_images=$(find ./wallpapers -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | wc -l)
|
||||
current_image=0
|
||||
|
||||
count=1;
|
||||
for wallpaper in ${subdir}/*
|
||||
do
|
||||
if [ "$count" -lt 11 ]; then #limit the amount of images per section in index
|
||||
echo " <a target=\"_blank\" href=\"$wallpaper\">
|
||||
<img loading=\"lazy\" src=\"$wallpaper\" alt="$wallpaper" width=\"200\"></a>" >> ./index.html
|
||||
count=$((count+1))
|
||||
else #if the limit is exceeded then create a new html with all the images of the section
|
||||
# TODO: make this part cleaner, this is really ugly.
|
||||
subhtml="${subdir##*/}.html"
|
||||
nimgs=$(ls "${subdir}" | wc -l)
|
||||
echo " <a target=\"_blank\" class = \"showmore\" href=\"${subhtml}\">
|
||||
<div class = \"showmore\">show all ${nimgs} ${subdir##*/} wallpapers </div></a>" >> ./index.html
|
||||
touch "${subhtml}"
|
||||
|
||||
echo "<!DOCTYPE html>
|
||||
<html lang=\"en\">
|
||||
|
||||
<head>
|
||||
<meta charset=\"utf-8\">
|
||||
<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">
|
||||
<title>Gruvbox wallpapers</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Wallpapers for gruvbox</h1>" > "${subhtml}"
|
||||
|
||||
echo "<h2 id=s"$color">" >> "${subhtml}"
|
||||
echo "${subdir##*/}" | tr a-z A-Z >> "${subhtml}"
|
||||
echo "</h2>" >> "${subhtml}"
|
||||
|
||||
echo "<div id=c>" >> "${subhtml}"
|
||||
|
||||
for wallpaper2 in ${subdir}/*
|
||||
do
|
||||
echo " <a target=\"_blank\" href=\"$wallpaper2\">
|
||||
<img loading=\"lazy\" src=\"$wallpaper2\" alt="$wallpaper2" width=\"200\"></a>" >> "${subhtml}"
|
||||
done
|
||||
|
||||
echo "</div>" >> "${subhtml}"
|
||||
|
||||
echo "<p> Contributions <a href=\"https://github.com/AngelJumbo/gruvbox-wallpapers\">here</a>.</p>
|
||||
<p> This images are from random sites or contributions so I don't have a way to know who are their original artist.</p>
|
||||
<p> I want to keep this site as simple as possible, but if you are the creator of any of these images and you want acknowledgment I will happily add a section with your name. Just open an issue <a href=\"https://github.com/AngelJumbo/gruvbox-wallpapers/issues\">here</a>.</p>
|
||||
<p> The same goes, if you want me to remove your art.</p>
|
||||
</body>
|
||||
</html>" >> "${subhtml}"
|
||||
break
|
||||
fi
|
||||
for section_dir in ./wallpapers/*; do
|
||||
section_name="${section_dir##*/}"
|
||||
mkdir -p "thumbnails/$section_name"
|
||||
|
||||
# Process dark images (base directory)
|
||||
for img in "$section_dir"/*; do
|
||||
[ -f "$img" ] || continue
|
||||
case "$img" in
|
||||
*.jpg|*.jpeg|*.png|*.JPG|*.JPEG|*.PNG) ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
|
||||
current_image=$((current_image + 1))
|
||||
local img_filename="${img##*/}"
|
||||
local thumbnail="thumbnails/$section_name/$img_filename"
|
||||
echo "($current_image/$total_images): $img -> $thumbnail"
|
||||
convert "$img" -resize 300x300 "$thumbnail"
|
||||
done
|
||||
|
||||
# Process light images if light folder exists
|
||||
if [ -d "$section_dir/light" ]; then
|
||||
mkdir -p "thumbnails/$section_name/light"
|
||||
for img in "$section_dir/light"/*; do
|
||||
[ -f "$img" ] || continue
|
||||
case "$img" in
|
||||
*.jpg|*.jpeg|*.png|*.JPG|*.JPEG|*.PNG) ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
|
||||
current_image=$((current_image + 1))
|
||||
local img_filename="${img##*/}"
|
||||
local thumbnail="thumbnails/$section_name/light/$img_filename"
|
||||
echo "($current_image/$total_images): $img -> $thumbnail"
|
||||
convert "$img" -resize 300x300 "$thumbnail"
|
||||
done
|
||||
fi
|
||||
done
|
||||
|
||||
echo "</div>" >> ./index.html
|
||||
echo "Thumbnail generation complete: $total_images images processed"
|
||||
}
|
||||
|
||||
color=$((color+1))
|
||||
check_has_light_folder() {
|
||||
local section_dir=$1
|
||||
[ -d "$section_dir/light" ] && echo "true" || echo "false"
|
||||
}
|
||||
|
||||
count_images_in_dir() {
|
||||
local dir=$1
|
||||
find "$dir" -maxdepth 1 -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | wc -l
|
||||
}
|
||||
|
||||
create_section_data() {
|
||||
local section=$1
|
||||
local subdir=$2
|
||||
local maxPerPage=8
|
||||
local has_light=$(check_has_light_folder "$subdir")
|
||||
|
||||
echo "Creating data for section: $section"
|
||||
|
||||
# Create JSON data file for the section
|
||||
local data_file="${section}_data.js"
|
||||
|
||||
cat > "$data_file" << EOF
|
||||
// Data for $section section
|
||||
window.sectionData = window.sectionData || {};
|
||||
window.sectionData['$section'] = {
|
||||
hasLight: $has_light,
|
||||
maxPerPage: $maxPerPage,
|
||||
dark: [
|
||||
EOF
|
||||
|
||||
# Generate dark images data
|
||||
for wallpaper in "$subdir"/*; do
|
||||
[ -f "$wallpaper" ] || continue
|
||||
case "$wallpaper" in
|
||||
*.jpg|*.jpeg|*.png|*.JPG|*.JPEG|*.PNG) ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
|
||||
local img_path="${wallpaper#./}"
|
||||
local img_filename="${wallpaper##*/}"
|
||||
local thumbnail_path="thumbnails/$section/$img_filename"
|
||||
echo " { src: '$img_path', thumb: '$thumbnail_path', alt: '$img_filename' }," >> "$data_file"
|
||||
done
|
||||
|
||||
# Generate light images data if exists
|
||||
echo " ]," >> "$data_file"
|
||||
if [ "$has_light" = "true" ]; then
|
||||
echo " light: [" >> "$data_file"
|
||||
for wallpaper in "$subdir/light"/*; do
|
||||
[ -f "$wallpaper" ] || continue
|
||||
case "$wallpaper" in
|
||||
*.jpg|*.jpeg|*.png|*.JPG|*.JPEG|*.PNG) ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
|
||||
local img_path="${wallpaper#./}"
|
||||
local img_filename="${wallpaper##*/}"
|
||||
local thumbnail_path="thumbnails/$section/light/$img_filename"
|
||||
echo " { src: '$img_path', thumb: '$thumbnail_path', alt: '$img_filename' }," >> "$data_file"
|
||||
done
|
||||
echo " ]" >> "$data_file"
|
||||
else
|
||||
echo " light: []" >> "$data_file"
|
||||
fi
|
||||
|
||||
echo "};" >> "$data_file"
|
||||
}
|
||||
|
||||
# Clean up old files
|
||||
rm -f *.html *.js
|
||||
|
||||
# Generate thumbnails
|
||||
generate_thumbnails
|
||||
|
||||
# Create main index.html
|
||||
cat > index.html << 'EOF'
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='utf-8'>
|
||||
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
|
||||
<link rel='stylesheet' type='text/css' href='style.css'>
|
||||
<title>Gruvbox wallpapers</title>
|
||||
<style>
|
||||
.section-content {
|
||||
margin: 20px 0;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: all 0.3s ease-in-out;
|
||||
transform: translateY(10px);
|
||||
}
|
||||
|
||||
.section.selected .section-content {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
/* Theme switcher styles */
|
||||
.section-theme-switcher {
|
||||
text-align: center;
|
||||
margin: 15px 0;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: all 0.3s ease-in-out;
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
|
||||
.section.selected .section-theme-switcher {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
.theme-toggle {
|
||||
display: inline-flex;
|
||||
gap: 0;
|
||||
}
|
||||
|
||||
.theme-btn {
|
||||
padding: 10px 20px;
|
||||
background-color: var(--bg-color-reverse);
|
||||
color: var(--fg-color-reverse);
|
||||
border: 2px solid transparent;
|
||||
cursor: pointer;
|
||||
transition: border-color 0.3s ease;
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
argin: 0 5px 0 5px;
|
||||
}
|
||||
|
||||
.theme-btn:hover {
|
||||
background-color: var(--bg-color-reverse);
|
||||
}
|
||||
|
||||
.theme-btn.active {
|
||||
border: 4px solid var(--fg-color);
|
||||
background-color: var(--bg-color);
|
||||
color: var(--fg-color);
|
||||
}
|
||||
|
||||
.subsection-content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.subsection-content.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.loading {
|
||||
text-align: center;
|
||||
padding: 40px;
|
||||
color: var(--fg-color);
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class='float-btns'>
|
||||
<a href='https://github.com/AngelJumbo/gruvbox-wallpapers' target='_blank' class='btn float-btn' title='Source code'>
|
||||
<span>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-github-icon lucide-github"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"/><path d="M9 18c-4.51 2-5-2-7-2"/></svg>
|
||||
</span>
|
||||
</a>
|
||||
<button onclick='switchMainTheme()' class='btn float-btn' title='Switch theme'>
|
||||
<span>
|
||||
<svg id="light-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-sun-icon lucide-sun"><circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/><path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/><path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></svg>
|
||||
<svg id="dark-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-moon-icon lucide-moon"><path d="M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401"/></svg>
|
||||
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<main>
|
||||
<h1>Gruvbox Wallpapers</h1>
|
||||
EOF
|
||||
|
||||
# Generate sections
|
||||
color=1
|
||||
declare -a sections
|
||||
declare -a sections_with_light
|
||||
|
||||
for subdir in ./wallpapers/*; do
|
||||
section="${subdir##*/}"
|
||||
sections+=("$section")
|
||||
has_light=$(check_has_light_folder "$subdir")
|
||||
|
||||
if [ "$has_light" = "true" ]; then
|
||||
sections_with_light+=("$section")
|
||||
fi
|
||||
|
||||
# Create the data file
|
||||
create_section_data "$section" "$subdir"
|
||||
|
||||
# Add section to main page
|
||||
echo " <h2 class='s$color clickable' onclick='activeSection(\"$section\")'>" >> index.html
|
||||
echo " $(echo "$section" | tr a-z A-Z)" >> index.html
|
||||
echo " </h2>" >> index.html
|
||||
echo " <div class='section' id='$section'>" >> index.html
|
||||
|
||||
# Add theme switcher if section has light variant
|
||||
if [ "$has_light" = "true" ]; then
|
||||
echo " <div class='section-theme-switcher'>" >> index.html
|
||||
echo " <div class='theme-toggle'>" >> index.html
|
||||
echo " <button class='theme-btn active' onclick='switchSectionTheme(\"$section\", \"dark\")' id='$section-dark-btn'>Dark</button>" >> index.html
|
||||
echo " <button class='theme-btn' onclick='switchSectionTheme(\"$section\", \"light\")' id='$section-light-btn'>Light</button>" >> index.html
|
||||
echo " </div>" >> index.html
|
||||
echo " </div>" >> index.html
|
||||
fi
|
||||
|
||||
echo " <div class='section-content' id='$section-content'>" >> index.html
|
||||
echo " <div class='loading'>Loading...</div>" >> index.html
|
||||
echo " </div>" >> index.html
|
||||
echo " </div>" >> index.html
|
||||
|
||||
color=$((color + 1))
|
||||
if [ "$color" -eq 8 ]; then
|
||||
color=1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "<p> Contributions <a href=\"https://github.com/AngelJumbo/gruvbox-wallpapers\">here</a>.</p>
|
||||
<p> This images are from random sites or contributions so I don't have a way to know who are their original artist.</p>
|
||||
<p> I want to keep this site as simple as possible, but if you are the creator of any of these images and you want acknowledgment I will happily add a section with your name. Just open an issue <a href=\"https://github.com/AngelJumbo/gruvbox-wallpapers/issues\">here</a>.</p>
|
||||
<p> The same goes, if you want me to remove your art.</p>
|
||||
# Add all section data scripts
|
||||
for section in "${sections[@]}"; do
|
||||
echo " <script src='${section}_data.js'></script>" >> index.html
|
||||
done
|
||||
|
||||
# Add main JavaScript
|
||||
cat >> index.html << 'EOF'
|
||||
<script>
|
||||
// Global state
|
||||
let activeSectionName = null;
|
||||
let sectionStates = {};
|
||||
|
||||
// Initialize section state
|
||||
function initSectionState(section) {
|
||||
if (!sectionStates[section]) {
|
||||
sectionStates[section] = {
|
||||
currentTheme: 'dark',
|
||||
currentPages: { dark: 1, light: 1 },
|
||||
loaded: false
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
function activeSection(section) {
|
||||
hideAllSections();
|
||||
const targetSection = document.getElementById(section);
|
||||
|
||||
targetSection.classList.add('selected');
|
||||
activeSectionName = section;
|
||||
|
||||
initSectionState(section);
|
||||
|
||||
// Load content if not already loaded
|
||||
if (!sectionStates[section].loaded) {
|
||||
loadSectionContent(section);
|
||||
}
|
||||
|
||||
// Reset to dark theme
|
||||
if (window.sectionData[section].hasLight) {
|
||||
switchSectionTheme(section, 'dark');
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
targetSection.scrollIntoView({ block: 'start', behavior: 'smooth' });
|
||||
}, 100);
|
||||
}
|
||||
|
||||
function hideAllSections() {
|
||||
document.querySelectorAll('.section').forEach(s => {
|
||||
s.classList.remove('selected');
|
||||
});
|
||||
activeSectionName = null;
|
||||
}
|
||||
|
||||
function loadSectionContent(section) {
|
||||
const contentDiv = document.getElementById(section + '-content');
|
||||
const data = window.sectionData[section];
|
||||
|
||||
if (!data) {
|
||||
contentDiv.innerHTML = '<div class="loading">Error: Section data not found</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
let html = '';
|
||||
|
||||
// Dark content
|
||||
if (data.dark.length > 0) {
|
||||
html += `<div class="subsection-content active" id="${section}-dark">`;
|
||||
|
||||
// Dark pagination
|
||||
const darkPages = Math.ceil(data.dark.length / data.maxPerPage);
|
||||
if (darkPages > 1) {
|
||||
html += '<div class="pager">';
|
||||
for (let i = 1; i <= darkPages; i++) {
|
||||
const selectedClass = i === 1 ? ' selected' : '';
|
||||
html += `<button class="btn pager-btn${selectedClass}" onclick="loadPage('${section}', 'dark', ${i})">${i}</button>`;
|
||||
}
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
html += `<div id="${section}-dark-content">`;
|
||||
html += generateImageGrid(data.dark.slice(0, data.maxPerPage));
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
// Light content
|
||||
if (data.hasLight && data.light.length > 0) {
|
||||
html += `<div class="subsection-content" id="${section}-light">`;
|
||||
|
||||
// Light pagination
|
||||
const lightPages = Math.ceil(data.light.length / data.maxPerPage);
|
||||
if (lightPages > 1) {
|
||||
html += '<div class="pager">';
|
||||
for (let i = 1; i <= lightPages; i++) {
|
||||
const selectedClass = i === 1 ? ' selected' : '';
|
||||
html += `<button class="btn pager-btn${selectedClass}" onclick="loadPage('${section}', 'light', ${i})">${i}</button>`;
|
||||
}
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
html += `<div id="${section}-light-content">`;
|
||||
html += generateImageGrid(data.light.slice(0, data.maxPerPage));
|
||||
html += '</div>';
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
contentDiv.innerHTML = html;
|
||||
sectionStates[section].loaded = true;
|
||||
}
|
||||
|
||||
function generateImageGrid(images) {
|
||||
let html = '<div class="c">';
|
||||
images.forEach(img => {
|
||||
html += `<a target="_blank" href="${img.src}">
|
||||
<img loading="lazy" src="${img.thumb}" alt="${img.alt}" width="200">
|
||||
</a>`;
|
||||
});
|
||||
html += '</div>';
|
||||
return html;
|
||||
}
|
||||
|
||||
function switchSectionTheme(section, theme) {
|
||||
const darkBtn = document.getElementById(section + '-dark-btn');
|
||||
const lightBtn = document.getElementById(section + '-light-btn');
|
||||
const darkContent = document.getElementById(section + '-dark');
|
||||
const lightContent = document.getElementById(section + '-light');
|
||||
|
||||
initSectionState(section);
|
||||
sectionStates[section].currentTheme = theme;
|
||||
|
||||
// Update button states
|
||||
if (darkBtn && lightBtn) {
|
||||
darkBtn.classList.toggle('active', theme === 'dark');
|
||||
lightBtn.classList.toggle('active', theme === 'light');
|
||||
}
|
||||
|
||||
// Switch content visibility
|
||||
if (darkContent && lightContent) {
|
||||
darkContent.classList.toggle('active', theme === 'dark');
|
||||
lightContent.classList.toggle('active', theme === 'light');
|
||||
}
|
||||
|
||||
// Load first page of selected theme
|
||||
loadPage(section, theme, 1);
|
||||
}
|
||||
|
||||
function loadPage(section, theme, page) {
|
||||
const data = window.sectionData[section];
|
||||
const images = data[theme];
|
||||
const startIdx = (page - 1) * data.maxPerPage;
|
||||
const endIdx = Math.min(startIdx + data.maxPerPage, images.length);
|
||||
const pageImages = images.slice(startIdx, endIdx);
|
||||
|
||||
const contentDiv = document.getElementById(`${section}-${theme}-content`);
|
||||
if (contentDiv) {
|
||||
contentDiv.innerHTML = generateImageGrid(pageImages);
|
||||
}
|
||||
|
||||
// Update pagination buttons
|
||||
const pagerButtons = document.getElementById(`${section}-${theme}`)?.getElementsByClassName('pager-btn');
|
||||
if (pagerButtons) {
|
||||
for (let i = 0; i < pagerButtons.length; i++) {
|
||||
pagerButtons[i].classList.toggle('selected', i === page - 1);
|
||||
}
|
||||
}
|
||||
|
||||
initSectionState(section);
|
||||
sectionStates[section].currentPages[theme] = page;
|
||||
}
|
||||
|
||||
// Main theme functions
|
||||
const HIDDEN_CLASS = 'hidden';
|
||||
|
||||
function hideThemeSwitcher(currentTheme) {
|
||||
if (currentTheme === 'dark') {
|
||||
document.getElementById('dark-icon')?.classList.add(HIDDEN_CLASS);
|
||||
document.getElementById('light-icon')?.classList.remove(HIDDEN_CLASS);
|
||||
} else {
|
||||
document.getElementById('light-icon')?.classList.add(HIDDEN_CLASS);
|
||||
document.getElementById('dark-icon')?.classList.remove(HIDDEN_CLASS);
|
||||
}
|
||||
}
|
||||
|
||||
function setMainTheme(newTheme) {
|
||||
document.documentElement.style.setProperty('color-scheme', newTheme);
|
||||
hideThemeSwitcher(newTheme);
|
||||
}
|
||||
|
||||
function switchMainTheme() {
|
||||
const current = document.documentElement.style.getPropertyValue('color-scheme');
|
||||
setMainTheme(current === 'dark' ? 'light' : 'dark');
|
||||
}
|
||||
|
||||
// Initialize
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
EOF
|
||||
|
||||
echo " activeSection('${sections[0]}');" >> index.html
|
||||
|
||||
cat >> index.html << 'EOF'
|
||||
if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
setMainTheme('dark');
|
||||
} else {
|
||||
setMainTheme('light');
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>" >> ./index.html
|
||||
</html>
|
||||
EOF
|
||||
|
||||
echo "Build complete! Generated $(echo ${#sections[@]}) sections with dynamic content loading."
|
||||
echo "Sections with light variants: ${sections_with_light[*]}"
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1761907660,
|
||||
"narHash": "sha256-kJ8lIZsiPOmbkJypG+B5sReDXSD1KGu2VEPNqhRa/ew=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "2fb006b87f04c4d3bdf08cfdbc7fab9c13d94a15",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nixos",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
description = "Gruvbox-inspired wallpaper collection";
|
||||
|
||||
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
}: let
|
||||
systems = ["x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"];
|
||||
forAllSystems = f: nixpkgs.lib.genAttrs systems (system: f (import nixpkgs {inherit system;}));
|
||||
|
||||
mkWallpapersPkg = pkgs: name: path:
|
||||
pkgs.stdenv.mkDerivation {
|
||||
pname = "gruvbox-wallpapers-${name}";
|
||||
version = self.shortRev or "dev";
|
||||
src = ./.;
|
||||
installPhase = ''
|
||||
mkdir -p $out
|
||||
${
|
||||
if name == "default"
|
||||
then "find wallpapers -type f -exec cp {} $out/ \\;"
|
||||
else "cp -r ${path}/* $out/"
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
subdirs = {
|
||||
default = "wallpapers";
|
||||
anime = "wallpapers/anime";
|
||||
brands = "wallpapers/brands";
|
||||
game = "wallpapers/game";
|
||||
minimalistic = "wallpapers/minimalistic";
|
||||
mix = "wallpapers/mix";
|
||||
painting = "wallpapers/painting";
|
||||
photography = "wallpapers/photography";
|
||||
pixelart = "wallpapers/pixelart";
|
||||
renders = "wallpapers/renders";
|
||||
};
|
||||
in {
|
||||
formatter = forAllSystems (pkgs: pkgs.alejandra);
|
||||
|
||||
packages = forAllSystems (
|
||||
pkgs:
|
||||
nixpkgs.lib.mapAttrs (name: path: mkWallpapersPkg pkgs name path) subdirs
|
||||
);
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 0 1rem;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 640px) {
|
||||
main {
|
||||
padding: 0 4rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
main {
|
||||
padding: 0 8rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1024px) {
|
||||
main {
|
||||
padding: 0 12rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1280px) {
|
||||
main {
|
||||
padding: 0 14rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1536px) {
|
||||
main {
|
||||
padding: 0 18rem;
|
||||
}
|
||||
}
|
||||
@@ -1,98 +1,342 @@
|
||||
@import url("/layout.css");
|
||||
|
||||
:root {
|
||||
color-scheme: light dark;
|
||||
--bg-color: light-dark(#fbf1c7, #282828);
|
||||
--fg-color: light-dark(#3c3836, #ebdbb2);
|
||||
|
||||
--bg-color-reverse: light-dark(#3c3836, #ebdbb2);
|
||||
--fg-color-reverse: light-dark(#fbf1c7, #282828);
|
||||
|
||||
--bg-color-3: light-dark(#bdae93, #665c54);
|
||||
--bg-color-3-switch: light-dark(#665c54, #bdae93);
|
||||
--bg-color-hard: light-dark(#f9f5d7, #1d2021);
|
||||
--gray: light-dark(#7c6f64, #a89984);
|
||||
|
||||
--orange: #d65d0e;
|
||||
--red: #cc241d;
|
||||
--green: #98971a;
|
||||
--yellow: #d79921;
|
||||
--blue: #458588;
|
||||
--purple: #b16286;
|
||||
--aqua: #689d6a;
|
||||
|
||||
--orange-dim: light-dark(#af3a03, #fe8019);
|
||||
--red-dim: light-dark(#9d0006, #fb4934);
|
||||
--green-dim: light-dark(#79740e, #b8bb26);
|
||||
--yellow-dim: light-dark(#b57614, #fabd2f);
|
||||
--blue-dim: light-dark(#076678, #83a598);
|
||||
--purple-dim: light-dark(#8f3f71, #d3869d);
|
||||
--aqua-dim: light-dark(#427b58, #8ec07c);
|
||||
}
|
||||
|
||||
body {
|
||||
color: #ebdbb2;
|
||||
background-color: #282828;
|
||||
padding-left: 15%;
|
||||
padding-right: 15%;
|
||||
background-color: var(--bg-color);
|
||||
/*container-type: inline-size;*/
|
||||
font-family: "Curier New", monospace;
|
||||
margin: 0;
|
||||
min-height: 100svh;
|
||||
flex-direction: column;
|
||||
justify-content: space-evenly;
|
||||
}
|
||||
|
||||
h1 {
|
||||
background-color: #ebdbb2;
|
||||
color: #282828;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
* {
|
||||
color: var(--fg-color);
|
||||
border: none;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2 {
|
||||
background-color: #ebdbb2;
|
||||
color: #282828;
|
||||
background-color: var(--bg-color-reverse);
|
||||
color: var(--fg-color-reverse);
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #ebdbb2;
|
||||
/* background-color: #ebdbb2; */
|
||||
/* color: #282828; */
|
||||
.s1, .s2, .s3, .s4, .s5, .s6, .s7 {
|
||||
transition: background 0.7s ease-in-out;
|
||||
margin-bottom: 0;
|
||||
&:hover { background-color: var(--dim-color); }
|
||||
}
|
||||
|
||||
.showmore{
|
||||
text-align: center;
|
||||
background-color: #ebdbb2;
|
||||
color: #282828;
|
||||
/* border: 2px solid #ebdbb2; */
|
||||
}
|
||||
.s1 { background-color: var(--orange); --dim-color: var(--orange-dim); }
|
||||
.s2 { background-color: var(--red); --dim-color: var(--red-dim); }
|
||||
.s3 { background-color: var(--green); --dim-color: var(--green-dim); }
|
||||
.s4 { background-color: var(--yellow); --dim-color: var(--yellow-dim); }
|
||||
.s5 { background-color: var(--blue); --dim-color: var(--blue-dim); }
|
||||
.s6 { background-color: var(--purple); --dim-color: var(--purple-dim); }
|
||||
.s7 { background-color: var(--aqua); --dim-color: var(--aqua-dim); }
|
||||
|
||||
#s1 {
|
||||
background-color: #d65d0e;
|
||||
}
|
||||
#s2 {
|
||||
background-color: #cc241d;
|
||||
}
|
||||
#s3 {
|
||||
background-color: #98971a;
|
||||
}
|
||||
#s4 {
|
||||
background-color: #d79921;
|
||||
}
|
||||
#s5 {
|
||||
background-color: #458588;
|
||||
}
|
||||
#s6 {
|
||||
background-color: #b16286;
|
||||
}
|
||||
#s7 {
|
||||
background-color: #689d6a;
|
||||
}
|
||||
|
||||
/* #c1 { */
|
||||
/* background-color: #fe8019; */
|
||||
/* } */
|
||||
/* #c2 { */
|
||||
/* background-color: #fb4934; */
|
||||
/* } */
|
||||
/* #c3 { */
|
||||
/* background-color: #b8bb26; */
|
||||
/* } */
|
||||
/* #c4 { */
|
||||
/* background-color: #fabd2f; */
|
||||
/* } */
|
||||
/* #c5 { */
|
||||
/* background-color: #83a598; */
|
||||
/* } */
|
||||
/* #c6 { */
|
||||
/* background-color: #d3869b; */
|
||||
/* } */
|
||||
/* #c7 { */
|
||||
/* background-color: #8ec807; */
|
||||
/* } */
|
||||
|
||||
#c {
|
||||
.c {
|
||||
padding: 1em;
|
||||
background-color: #665c54;
|
||||
background-color: var(--bg-color-3);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
img {
|
||||
transition: all .2s ease-in-out;
|
||||
/* border: 2px solid #ebdbb2; */
|
||||
/* padding: 5px; */
|
||||
transition: all 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
img:hover {
|
||||
transform: scale(2.5);
|
||||
transform: scale(1.3);
|
||||
border: none;
|
||||
box-shadow: 5px 4px 10px #000000;
|
||||
/* padding: none; */
|
||||
|
||||
box-shadow: 5px 4px 10px black;
|
||||
}
|
||||
|
||||
.pager {
|
||||
margin-top: 5px;
|
||||
margin-bottom: 10px;
|
||||
padding: 5px;
|
||||
color: var(--fg-color-reverse);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.btn {
|
||||
transition: background 0.4s ease-in-out;
|
||||
|
||||
cursor: pointer;
|
||||
background-color: var(--bg-color-reverse);
|
||||
color: var(--fg-color-reverse);
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
&:hover {
|
||||
background-color: var(--bg-color-3-switch);
|
||||
}
|
||||
}
|
||||
|
||||
.btn.pager-btn {
|
||||
padding: 10px 20px;
|
||||
font-size: 16px;
|
||||
font-weight: 900;
|
||||
margin: 4px 2px;
|
||||
|
||||
&.selected {
|
||||
background-color: var(--bg-color);
|
||||
color: var(--fg-color);
|
||||
|
||||
border-color: var(--fg-color);
|
||||
border-width: thick;
|
||||
border-style: solid;
|
||||
}
|
||||
}
|
||||
|
||||
.clickable {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.section {
|
||||
display: none;
|
||||
|
||||
&.selected {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.float-btns {
|
||||
z-index: 10;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
margin-bottom: 1rem;
|
||||
margin-right: 1rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
justify-content: end;
|
||||
}
|
||||
|
||||
.btn.float-btn {
|
||||
height: 2.5rem;
|
||||
width: 2.5rem;
|
||||
font-size: 1.5rem;
|
||||
|
||||
& i {
|
||||
color: var(--fg-color-reverse);
|
||||
}
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* Add these styles to your existing style.css */
|
||||
|
||||
.subsection-theme-switch {
|
||||
text-align: center;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.btn.subsection-theme-btn {
|
||||
padding: 8px 16px;
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
margin: 0 4px;
|
||||
border-radius: 4px;
|
||||
|
||||
&.selected {
|
||||
background-color: var(--bg-color);
|
||||
color: var(--fg-color);
|
||||
border: 2px solid var(--fg-color);
|
||||
}
|
||||
|
||||
&:not(.selected) {
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
|
||||
.subsection-content {
|
||||
transition: opacity 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
/* Ensure subsection content containers are properly spaced */
|
||||
.section .subsection-content + .subsection-content {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
/* Enhanced theme switch styles - Add to your style.css */
|
||||
|
||||
.subsection-theme-switch {
|
||||
text-align: center;
|
||||
margin: 15px 0 20px 0;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: all 0.3s ease-in-out;
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
|
||||
/* Show theme switch only when section is selected */
|
||||
.section.selected .subsection-theme-switch {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
/* Theme switch container styled like a toggle */
|
||||
.theme-toggle-container {
|
||||
display: inline-flex;
|
||||
background-color: var(--bg-color-3);
|
||||
border-radius: 25px;
|
||||
padding: 4px;
|
||||
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);
|
||||
border: 2px solid var(--fg-color);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.theme-toggle-container::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
left: 4px;
|
||||
width: calc(50% - 4px);
|
||||
height: calc(100% - 8px);
|
||||
background: linear-gradient(135deg, var(--bg-color-reverse), var(--bg-color-3-switch));
|
||||
border-radius: 20px;
|
||||
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.theme-toggle-container.light-active::before {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
|
||||
.btn.subsection-theme-btn {
|
||||
padding: 12px 24px;
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--fg-color);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
border-radius: 20px;
|
||||
min-width: 80px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
|
||||
&:hover {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
&.selected {
|
||||
color: var(--fg-color-reverse);
|
||||
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
&:not(.selected) {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
/* Add subtle glow effect for selected button */
|
||||
&.selected {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
&.selected::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
border-radius: 20px;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Animation for button text */
|
||||
.btn.subsection-theme-btn {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.btn.subsection-theme-btn::before {
|
||||
content: attr(data-text);
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
transition: transform 0.3s ease;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.btn.subsection-theme-btn.selected::before {
|
||||
opacity: 1;
|
||||
transform: translate(-50%, -50%) scale(1.05);
|
||||
}
|
||||
|
||||
svg {
|
||||
stroke: var(--fg-color-reverse) !important;
|
||||
}
|
||||
|
||||
/* Responsive adjustments */
|
||||
@media screen and (max-width: 640px) {
|
||||
.btn.subsection-theme-btn {
|
||||
padding: 10px 20px;
|
||||
font-size: 12px;
|
||||
min-width: 70px;
|
||||
}
|
||||
|
||||
.theme-toggle-container {
|
||||
padding: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Dark mode specific adjustments */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.theme-toggle-container {
|
||||
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
.theme-toggle-container::before {
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 3.4 MiB |
|
After Width: | Height: | Size: 3.3 MiB |
|
After Width: | Height: | Size: 2.3 MiB |
|
After Width: | Height: | Size: 4.5 MiB |
|
After Width: | Height: | Size: 330 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 2.9 MiB |
|
After Width: | Height: | Size: 1006 KiB |
|
After Width: | Height: | Size: 2.5 MiB |
|
After Width: | Height: | Size: 775 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 1.5 MiB |
|
After Width: | Height: | Size: 1.4 MiB |
|
After Width: | Height: | Size: 442 KiB |
|
After Width: | Height: | Size: 387 KiB |
|
After Width: | Height: | Size: 60 KiB |
|
After Width: | Height: | Size: 14 MiB |
|
After Width: | Height: | Size: 801 KiB |
|
After Width: | Height: | Size: 5.4 MiB |
|
After Width: | Height: | Size: 850 KiB |
|
Before Width: | Height: | Size: 932 KiB |
|
After Width: | Height: | Size: 560 KiB |
|
After Width: | Height: | Size: 802 KiB |
|
After Width: | Height: | Size: 166 KiB |
|
After Width: | Height: | Size: 2.1 MiB |
|
After Width: | Height: | Size: 11 MiB |
|
After Width: | Height: | Size: 8.3 MiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 4.4 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 3.3 MiB |
|
After Width: | Height: | Size: 14 MiB |
|
Before Width: | Height: | Size: 4.0 MiB After Width: | Height: | Size: 4.0 MiB |
|
After Width: | Height: | Size: 256 KiB |
|
After Width: | Height: | Size: 291 KiB |
|
After Width: | Height: | Size: 435 KiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 1.7 MiB |
|
After Width: | Height: | Size: 3.1 MiB |
|
After Width: | Height: | Size: 1022 KiB |
|
After Width: | Height: | Size: 14 MiB |
|
After Width: | Height: | Size: 2.2 MiB |
|
After Width: | Height: | Size: 277 KiB |
|
After Width: | Height: | Size: 277 KiB |
|
After Width: | Height: | Size: 893 KiB |
|
After Width: | Height: | Size: 8.9 MiB |
|
After Width: | Height: | Size: 2.5 MiB |
|
After Width: | Height: | Size: 4.8 MiB |
|
After Width: | Height: | Size: 661 KiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 1.2 MiB |
|
After Width: | Height: | Size: 781 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 167 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 78 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 179 KiB |
|
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 270 KiB |
|
After Width: | Height: | Size: 343 KiB |
|
After Width: | Height: | Size: 287 KiB |
|
After Width: | Height: | Size: 283 KiB |
|
After Width: | Height: | Size: 74 KiB |
|
After Width: | Height: | Size: 286 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 100 KiB |
|
After Width: | Height: | Size: 169 KiB |
|
After Width: | Height: | Size: 175 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 71 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 7.9 MiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB |
|
After Width: | Height: | Size: 25 KiB |