first commit
1
automodpack_fingerprint.txt
Executable file
@@ -0,0 +1 @@
|
||||
3b180a41fe913487c1c86ad79c6dc085d01a272ac2da556f4bf7379ee3a535f8
|
||||
81
back.py
Executable file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate a top-to-bottom linear gradient PNG from three hex colors.
|
||||
|
||||
Matches: linear-gradient(#2a1a5e, #8b4789, #f4a261)
|
||||
|
||||
Usage:
|
||||
python gradient_to_png.py --width 1920 --height 1080 --out bg.png
|
||||
"""
|
||||
|
||||
import argparse
|
||||
from PIL import Image
|
||||
|
||||
def hex_to_rgb(h: str):
|
||||
"""Convert #rrggbb or rrggbb to (r,g,b)."""
|
||||
h = h.strip()
|
||||
if h.startswith("#"):
|
||||
h = h[1:]
|
||||
if len(h) != 6:
|
||||
raise ValueError("Hex color must be 6 hex digits, got: " + h)
|
||||
return tuple(int(h[i:i+2], 16) for i in (0, 2, 4))
|
||||
|
||||
def lerp(a: int, b: int, t: float) -> int:
|
||||
"""Linear interpolation between integers a and b, t in [0,1]."""
|
||||
return int(round(a + (b - a) * t))
|
||||
|
||||
def mix_color(c1, c2, t: float):
|
||||
"""Interpolate between two RGB colors (tuple of 3 ints)."""
|
||||
return (lerp(c1[0], c2[0], t),
|
||||
lerp(c1[1], c2[1], t),
|
||||
lerp(c1[2], c2[2], t))
|
||||
|
||||
def make_three_stop_vertical_gradient(width: int, height: int, hex1: str, hex2: str, hex3: str) -> Image.Image:
|
||||
"""
|
||||
Create a Pillow Image with a vertical gradient going through three colors evenly:
|
||||
- color1 at top (0%)
|
||||
- color2 at 50%
|
||||
- color3 at bottom (100%)
|
||||
This mirrors `linear-gradient(color1, color2, color3)` in CSS with no explicit stops.
|
||||
"""
|
||||
c1 = hex_to_rgb(hex1)
|
||||
c2 = hex_to_rgb(hex2)
|
||||
c3 = hex_to_rgb(hex3)
|
||||
|
||||
img = Image.new("RGB", (width, height))
|
||||
pixels = img.load()
|
||||
|
||||
# For each row compute color:
|
||||
for y in range(height):
|
||||
t = y / float(max(1, height - 1)) # 0.0..1.0
|
||||
if t <= 0.5:
|
||||
# interpolate between c1 and c2 (0.0..0.5 -> 0.0..1.0)
|
||||
local_t = t / 0.5
|
||||
color = mix_color(c1, c2, local_t)
|
||||
else:
|
||||
# interpolate between c2 and c3 (0.5..1.0 -> 0.0..1.0)
|
||||
local_t = (t - 0.5) / 0.5
|
||||
color = mix_color(c2, c3, local_t)
|
||||
|
||||
# fill the row with the computed color
|
||||
for x in range(width):
|
||||
pixels[x, y] = color
|
||||
|
||||
return img
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Render a 3-stop vertical CSS-like gradient to PNG")
|
||||
parser.add_argument("--width", "-W", type=int, default=1920, help="Output image width in pixels")
|
||||
parser.add_argument("--height", "-H", type=int, default=1080, help="Output image height in pixels")
|
||||
parser.add_argument("--out", "-o", default="gradient.png", help="Output PNG filename")
|
||||
parser.add_argument("--c1", default="#2a1a5e", help="Top color (hex)")
|
||||
parser.add_argument("--c2", default="#8b4789", help="Middle color (hex)")
|
||||
parser.add_argument("--c3", default="#f4a261", help="Bottom color (hex)")
|
||||
args = parser.parse_args()
|
||||
|
||||
img = make_three_stop_vertical_gradient(args.width, args.height, args.c1, args.c2, args.c3)
|
||||
img.save(args.out, "PNG")
|
||||
print(f"Saved {args.out} ({args.width}x{args.height})")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
BIN
favicon.ico
Executable file
|
After Width: | Height: | Size: 755 B |
BIN
favicons/favicon-128x128.png
Executable file
|
After Width: | Height: | Size: 7.9 KiB |
BIN
favicons/favicon-16x16.png
Executable file
|
After Width: | Height: | Size: 759 B |
BIN
favicons/favicon-180x180.png
Executable file
|
After Width: | Height: | Size: 11 KiB |
BIN
favicons/favicon-192x192.png
Executable file
|
After Width: | Height: | Size: 12 KiB |
BIN
favicons/favicon-256x256.png
Executable file
|
After Width: | Height: | Size: 17 KiB |
BIN
favicons/favicon-32x32.png
Executable file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
favicons/favicon-384x384.png
Executable file
|
After Width: | Height: | Size: 26 KiB |
BIN
favicons/favicon-48x48.png
Executable file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
favicons/favicon-512x512.png
Executable file
|
After Width: | Height: | Size: 36 KiB |
BIN
favicons/favicon-64x64.png
Executable file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
favicons/favicon-96x96.png
Executable file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
favicons/favicon.ico
Executable file
|
After Width: | Height: | Size: 755 B |
11
favicons/favicon.svg
Executable file
@@ -0,0 +1,11 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="65.895" height="65.895" viewBox="0 0 65.895 65.895">
|
||||
<g transform="translate(0.0, 4.947499999999998)">
|
||||
|
||||
<path fill="#2a1a5e" d="M4.56 51.07 0 44.175 13.43 32.13s9.206-4.666 13.972-4.835c2.139-.076 1.802-6.447 2.815-5.621.27.22 15.366-3.758 19.977-3.55 3.751.17 1.781 3.663 2.028 4.287.708 1.791-12.793 3.684-16.85 5.625-2.767 1.324-1.141 3.899-1.076 4 .508.782-16.906 6.19-16.906 6.19z"/>
|
||||
<path fill="#f4a261" stroke="#dda15e" stroke-width="3" d="M21.395 11.4c0-5.468 4.432-9.9 9.9-9.9 5.467 0 9.9 4.432 9.9 9.9s-4.433 9.9-9.9 9.9c-5.468 0-9.9-4.432-9.9-9.9zm28.4 6.4a7.3 7.3 0 1 1 14.6 0 7.3 7.3 0 0 1-14.6 0zm-29.2 25.9c0-5.965 4.835-10.8 10.8-10.8 5.964 0 10.8 4.835 10.8 10.8 0 5.965-4.836 10.8-10.8 10.8-5.965 0-10.8-4.835-10.8-10.8z"/>
|
||||
<path fill="#8b4789" d="M6.795 29.7c-3.178-4.635-1-15.8-1-15.8s9.021 1.165 12.2 5.8c3.178 4.635 2.2 15.2 2.2 15.2s-10.222-.565-13.4-5.2zm36.8 7.8c-6.831-5.201-4-13.6-4-13.6s7.231-2.554 14 2.6 7.8 14 7.8 14-10.97 2.201-17.8-3z"/>
|
||||
<path fill="#ffe8d6" d="M31.895 5.393c.481.995-.338 2.386-1.83 3.107-1.49.722-3.09.501-3.57-.493-.482-.995.337-2.386 1.829-3.107 1.491-.722 3.09-.501 3.571.493zm25.338 8.56c.265.667-.478 1.588-1.66 2.056-1.18.467-2.352.306-2.616-.362-.265-.667.478-1.588 1.659-2.056 1.18-.468 2.353-.306 2.617.362zm-26.218 23.66c.477.872-.354 2.245-1.857 3.066-1.502.822-3.106.78-3.583-.092-.477-.872.354-2.245 1.856-3.066 1.502-.822 3.107-.78 3.584.092z"/>
|
||||
<path fill="none" stroke="#f4a261" stroke-linecap="round" stroke-width=".5" d="M7.195 16.3s3.909 4.733 5.41 7.277c1.563 2.651 3.79 8.323 3.79 8.323m24.8-5.6s3.5 5.176 6.36 7.172c2.873 2.004 10.84 4.828 10.84 4.828"/>
|
||||
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
228
index.html
Executable file
@@ -0,0 +1,228 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>Krzak.org</title>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<!-- Favicons -->
|
||||
<link rel="icon" type="image/svg+xml" href="/favicons/favicon.svg">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicons/favicon-16x16.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="48x48" href="/favicons/favicon-48x48.png">
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="/favicons/favicon-96x96.png">
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/favicons/favicon-192x192.png">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/favicons/favicon-180x180.png">
|
||||
<link rel="shortcut icon" href="/favicons/favicon.ico">
|
||||
|
||||
<!-- Android Chrome -->
|
||||
<link rel="icon" type="image/png" sizes="192x192" href="/favicons/favicon-192x192.png">
|
||||
<link rel="icon" type="image/png" sizes="512x512" href="/favicons/favicon-512x512.png">
|
||||
|
||||
<!-- PWA -->
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
<meta name="theme-color" content="#2a1a5e">
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--bg-gradient-1: #2a1a5e;
|
||||
--bg-gradient-2: #8b4789;
|
||||
--bg-gradient-3: #f4a261;
|
||||
--container-bg: rgba(42, 26, 94, 0.7);
|
||||
--container-border: rgba(244, 162, 97, 0.8);
|
||||
--text-color: #ffe8d6;
|
||||
--link-color: #f4a261;
|
||||
--link-bg: rgba(139, 71, 137, 0.3);
|
||||
--link-hover-bg: rgba(244, 162, 97, 0.3);
|
||||
--link-hover-border: rgba(244, 162, 97, 0.8);
|
||||
--subtitle-color: #dda15e;
|
||||
}
|
||||
|
||||
body {
|
||||
background: linear-gradient(
|
||||
var(--bg-gradient-1),
|
||||
var(--bg-gradient-2),
|
||||
var(--bg-gradient-3)
|
||||
)
|
||||
no-repeat fixed;
|
||||
color: var(--text-color);
|
||||
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
min-height: 100vh;
|
||||
transition: all 0.5s ease;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
body::before {
|
||||
content: "";
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
pointer-events: none;
|
||||
z-index: 0;
|
||||
transition: 0.5s ease;
|
||||
background: radial-gradient(
|
||||
circle at 20% 50%,
|
||||
rgba(255, 255, 255, 0.08) 0%,
|
||||
transparent 50%
|
||||
);
|
||||
}
|
||||
|
||||
.container {
|
||||
background: var(--container-bg);
|
||||
border-radius: 15px;
|
||||
padding: 25px;
|
||||
border: 1px solid var(--container-border);
|
||||
backdrop-filter: blur(12px);
|
||||
-webkit-backdrop-filter: blur(12px);
|
||||
width: 40%;
|
||||
margin: auto;
|
||||
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
|
||||
transition: all 0.3s ease;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin: 20px 0;
|
||||
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7);
|
||||
color: var(--text-color);
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
p {
|
||||
color: var(--text-color);
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
li a {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 15px;
|
||||
border-radius: 8px;
|
||||
color: var(--text-color);
|
||||
text-decoration: none;
|
||||
transition: all 0.3s ease;
|
||||
margin-bottom: 10px;
|
||||
background-color: var(--link-bg);
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
li a:hover {
|
||||
background-color: var(--link-hover-bg);
|
||||
border-color: var(--link-hover-border);
|
||||
transform: scale(1.02);
|
||||
}
|
||||
|
||||
li a strong {
|
||||
font-weight: 600;
|
||||
color: var(--link-color);
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
li a span {
|
||||
font-weight: 300;
|
||||
color: var(--subtitle-color);
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) {
|
||||
.container {
|
||||
width: 60%;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
body {
|
||||
display: block;
|
||||
}
|
||||
.container {
|
||||
width: 80%;
|
||||
}
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.container {
|
||||
width: 90%;
|
||||
padding: 15px;
|
||||
}
|
||||
h1 {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
}
|
||||
|
||||
.icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin-right: 8px;
|
||||
background-size: contain;
|
||||
background-repeat: no-repeat;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
h1 {
|
||||
vertical-align: middle;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>
|
||||
<span class="icon">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="65.895" height="56">
|
||||
<path fill="#2a1a5e" d="M4.56 51.07 0 44.175 13.43 32.13s9.206-4.666 13.972-4.835c2.139-.076 1.802-6.447 2.815-5.621.27.22 15.366-3.758 19.977-3.55 3.751.17 1.781 3.663 2.028 4.287.708 1.791-12.793 3.684-16.85 5.625-2.767 1.324-1.141 3.899-1.076 4 .508.782-16.906 6.19-16.906 6.19z"/>
|
||||
<path fill="#f4a261" stroke="#dda15e" stroke-width="3" d="M21.395 11.4c0-5.468 4.432-9.9 9.9-9.9 5.467 0 9.9 4.432 9.9 9.9s-4.433 9.9-9.9 9.9c-5.468 0-9.9-4.432-9.9-9.9zm28.4 6.4a7.3 7.3 0 1 1 14.6 0 7.3 7.3 0 0 1-14.6 0zm-29.2 25.9c0-5.965 4.835-10.8 10.8-10.8 5.964 0 10.8 4.835 10.8 10.8 0 5.965-4.836 10.8-10.8 10.8-5.965 0-10.8-4.835-10.8-10.8z"/>
|
||||
<path fill="#8b4789" d="M6.795 29.7c-3.178-4.635-1-15.8-1-15.8s9.021 1.165 12.2 5.8c3.178 4.635 2.2 15.2 2.2 15.2s-10.222-.565-13.4-5.2zm36.8 7.8c-6.831-5.201-4-13.6-4-13.6s7.231-2.554 14 2.6 7.8 14 7.8 14-10.97 2.201-17.8-3z"/>
|
||||
<path fill="#ffe8d6" d="M31.895 5.393c.481.995-.338 2.386-1.83 3.107-1.49.722-3.09.501-3.57-.493-.482-.995.337-2.386 1.829-3.107 1.491-.722 3.09-.501 3.571.493zm25.338 8.56c.265.667-.478 1.588-1.66 2.056-1.18.467-2.352.306-2.616-.362-.265-.667.478-1.588 1.659-2.056 1.18-.468 2.353-.306 2.617.362zm-26.218 23.66c.477.872-.354 2.245-1.857 3.066-1.502.822-3.106.78-3.583-.092-.477-.872.354-2.245 1.856-3.066 1.502-.822 3.107-.78 3.584.092z"/>
|
||||
<path fill="none" stroke="#f4a261" stroke-linecap="round" stroke-width=".5" d="M7.195 16.3s3.909 4.733 5.41 7.277c1.563 2.651 3.79 8.323 3.79 8.323m24.8-5.6s3.5 5.176 6.36 7.172c2.873 2.004 10.84 4.828 10.84 4.828"/>
|
||||
</svg>
|
||||
</span>
|
||||
Krzak.org
|
||||
</h1>
|
||||
<p>Hi, welcome to krzak.org</p>
|
||||
<p>We host:</p>
|
||||
<ul>
|
||||
<li>
|
||||
<a href="https://fedi.krzak.org">
|
||||
<strong>Fediverse</strong>
|
||||
<span>Sharkey</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://mail.krzak.org">
|
||||
<strong>Mail</strong>
|
||||
<span>Mailu</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://music.krzak.org">
|
||||
<strong>Music</strong>
|
||||
<span>Navidrome</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://git.krzak.org">
|
||||
<strong>Git</strong>
|
||||
<span>Gitea</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
BIN
krzak-icon.png
Executable file
|
After Width: | Height: | Size: 22 KiB |
19
manifest.json
Executable file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "Krzak.org",
|
||||
"short_name": "Krzak",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/favicons/favicon-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/favicons/favicon-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"theme_color": "#2a1a5e",
|
||||
"background_color": "#2a1a5e",
|
||||
"display": "standalone"
|
||||
}
|
||||