add seymour icons

This commit is contained in:
2025-12-07 14:15:26 +01:00
parent a7e7697fec
commit 5738815b91
17 changed files with 217 additions and 26 deletions

View File

@@ -156,13 +156,8 @@ async function createOptimizedBuild() {
// Step 5: Copy assets and SEO files // Step 5: Copy assets and SEO files
console.log('📁 Step 5: Copying assets and SEO files...'); console.log('📁 Step 5: Copying assets and SEO files...');
try { try {
const assets = await fs.readdir('public/assets'); await copyDirectoryRecursive('public/assets', 'dist/assets');
for (const asset of assets) { console.log(' ✅ Assets directory copied recursively');
await fs.copyFile(
path.join('public/assets', asset),
path.join('dist/assets', asset)
);
}
} catch (err) { } catch (err) {
console.log(' No assets directory found, skipping...'); console.log(' No assets directory found, skipping...');
} }
@@ -296,6 +291,27 @@ async function bundleAndMinifyJS() {
} }
} }
async function copyDirectoryRecursive(src, dest) {
// Create destination directory if it doesn't exist
await fs.mkdir(dest, { recursive: true });
// Read all items in source directory
const entries = await fs.readdir(src, { withFileTypes: true });
for (const entry of entries) {
const srcPath = path.join(src, entry.name);
const destPath = path.join(dest, entry.name);
if (entry.isDirectory()) {
// Recursively copy subdirectories
await copyDirectoryRecursive(srcPath, destPath);
} else {
// Copy files
await fs.copyFile(srcPath, destPath);
}
}
}
async function minifyHTMLFile(inputPath, outputPath) { async function minifyHTMLFile(inputPath, outputPath) {
const html = await fs.readFile(inputPath, 'utf8'); const html = await fs.readFile(inputPath, 'utf8');

View File

@@ -41,6 +41,12 @@ http {
add_header X-XSS-Protection "1; mode=block" always; add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Logo assets: 1 hour cache
location ~* ^/assets/logos/ {
expires 1h;
add_header Cache-Control "public, max-age=3600";
}
# Temporary: Disable caching during development # Temporary: Disable caching during development
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 10m; expires 10m;

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 313 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 153 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 157 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 154 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 157 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 153 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 160 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 155 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 163 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 157 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 180 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 179 KiB

View File

@@ -100,8 +100,12 @@
</header> </header>
<section class="banner-container" role="banner" aria-labelledby="main-heading"> <section class="banner-container" role="banner" aria-labelledby="main-heading">
<img src="https://picsur.keyboardvagabond.com/i/076a5b88-20d3-426e-ad7f-f24a68d3fa70.jpg?width=2048" alt="Scenic mountain road with snow-capped peaks representing the journey of digital nomads and travelers" class="banner"> <picture>
<h1 id="main-heading" class="banner-title">Keyboard Vagabond</h1> <source media="(min-width: 1500px" srcset="https://picsur.michaeldileo.org/i/bb68d2b9-32d6-4bf9-9eab-4df313d78864.jpg">
<source media="(min-width: 1000px" srcset="https://picsur.michaeldileo.org/i/bb68d2b9-32d6-4bf9-9eab-4df313d78864.jpg?width=1500&shrinkonly=true">
<source media="(min-width: 500px" srcset="https://picsur.michaeldileo.org/i/bb68d2b9-32d6-4bf9-9eab-4df313d78864.jpg?width=1000&shrinkonly=true">
<img src="https://picsur.michaeldileo.org/i/bb68d2b9-32d6-4bf9-9eab-4df313d78864.jpg" alt="Cartoon view of mountains with a dirt trail in the center. A wooden sign reads Keyboard Vagabond.">
</picture>
<p class="banner-subtitle">A fediverse community for digital nomads, remote workers, and travel enthusiasts</p> <p class="banner-subtitle">A fediverse community for digital nomads, remote workers, and travel enthusiasts</p>
</section> </section>
@@ -114,34 +118,92 @@
<p><strong>Here, you are a member, not just a user</strong> - We want to create community in this space, being <p><strong>Here, you are a member, not just a user</strong> - We want to create community in this space, being
respectful of each other as well as the places we go and the people we see. This space is what we make of it. respectful of each other as well as the places we go and the people we see. This space is what we make of it.
</p> </p>
<div class="mascot-section">
<div class="mascot-image">
<picture>
<source srcset="assets/logos/primary-dark.svg" media="(prefers-color-scheme: dark)" type="image/svg+xml" />
<source srcset="assets/logos/primary-light.svg" media="(prefers-color-scheme: light)" type="image/svg+xml" />
<img src="assets/logos/primary-light.svg" alt="Otter mascot holding a laptop with the words Keyboard Vagabond circling it" width="200" type="image/svg+xml" />
</picture>
</div>
<span class="mascot-text">
Seymour is the official mascot of Keyboard Vagabond and a nomadic otter who always wants to see more!
He makes his home wherever he goes and adapts to his new environments.
Let our adorable friend guide you through the fediverse and give you a break from the
algorithms and attention grabbing of corporate social media.
He was lovingly created by nomad and designer Lori Kendall at <a href="https://branddesigncreate.com" target="_blank" rel="nofollow">branddesigncreate.com</a>,
Instagram at <a target="_blank" rel="nofollow" href="https://www.instagram.com/branddesigncreate/">@branddesigncreate</a>.
</span>
</div>
</section> </section>
<section aria-labelledby="services-heading">
<h2 id="services-heading">Our Fediverse Services</h2>
<p>Keyboard Vagabond hosts various fediverse alternatives to big tech and participates in the network.
Available to you are:</p>
<section aria-labelledby="services-heading">
<!-- Services Summary for SEO --> <!-- Services Summary for SEO -->
<div class="services-summary" role="region" aria-label="Quick access to all services"> <div class="services-summary" role="region" aria-label="Quick access to all services">
<h3>Quick Access to All Services</h3> <h3>Our Fediverse Services</h3>
<div class="service-links"> <div class="service-links">
<a href="https://mastodon.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Mastodon - Social Media Alternative"> <a href="https://mastodon.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Mastodon - Social Media Alternative">
<picture class="service-icon">
<source srcset="assets/logos/mastodon-dark.svg" media="(prefers-color-scheme: dark)" type="image/svg+xml"/>
<source srcset="assets/logos/mastodon-light.svg" media="(prefers-color-scheme: light)" type="image/svg+xml"/>
<img src="assets/logos/mastodon-light.svg" alt="Mastodon mascot holding a phone with mastodon mascot" width="60" height="60" type="image/svg+xml"/>
</picture>
<span class="service-text">
<strong>Mastodon</strong> - Microblogging <strong>Mastodon</strong> - Microblogging
</span>
</a> </a>
<a href="https://piefed.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Piefed - Community Forum"> <a href="https://piefed.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Piefed - Community Forum">
<picture class="service-icon">
<source srcset="assets/logos/piefed-dark.svg" media="(prefers-color-scheme: dark)" type="image/svg+xml" />
<source srcset="assets/logos/piefed-light.svg" media="(prefers-color-scheme: light)" type="image/svg+xml" />
<img src="assets/logos/piefed-light.svg" alt="Piefed mascot holding a pie" width="60" height="60" type="image/svg+xml" />
</picture>
<span class="service-text">
<strong>Piefed</strong> - Community Forum <strong>Piefed</strong> - Community Forum
</span>
</a> </a>
<a href="https://pixelfed.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Pixelfed - Photo Sharing"> <a href="https://pixelfed.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Pixelfed - Photo Sharing">
<picture class="service-icon">
<source srcset="assets/logos/pixelfed-dark.svg" media="(prefers-color-scheme: dark)" type="image/svg+xml"/>
<source srcset="assets/logos/pixelfed-light.svg" media="(prefers-color-scheme: light)" type="image/svg+xml"/>
<img src="assets/logos/pixelfed-light.svg" alt="Pixelfed mascot holding camera" width="60" height="60" type="image/svg+xml"/>
</picture>
<span class="service-text">
<strong>Pixelfed</strong> - Photo Sharing <strong>Pixelfed</strong> - Photo Sharing
</span>
</a> </a>
<a href="https://bookwyrm.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Bookwyrm - Book Reviews"> <a href="https://bookwyrm.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Bookwyrm - Book Reviews">
<picture class="service-icon">
<source srcset="assets/logos/bookwyrm-dark.svg" media="(prefers-color-scheme: dark)" type="image/svg+xml"/>
<source srcset="assets/logos/bookwyrm-light.svg" media="(prefers-color-scheme: light)" type="image/svg+xml"/>
<img src="assets/logos/bookwyrm-light.svg" alt="Bookwyrm mascot holding book" width="60" height="60" type="image/svg+xml"/>
</picture>
<span class="service-text">
<strong>Bookwyrm</strong> - Book Reviews <strong>Bookwyrm</strong> - Book Reviews
</span>
</a> </a>
<a href="https://blog.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Write Freely - Blogging"> <a href="https://blog.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Write Freely - Blogging">
<picture class="service-icon">
<source srcset="assets/logos/default-dark.svg" media="(prefers-color-scheme: dark)" type="image/svg+xml"/>
<source srcset="assets/logos/default-light.svg" media="(prefers-color-scheme: light)" type="image/svg+xml"/>
<img src="assets/logos/default-light.svg" alt="Default mascot holding laptop" width="60" height="60" type="image/svg+xml"/>
</picture>
<span class="service-text">
<strong>Write Freely</strong> - Blogging <strong>Write Freely</strong> - Blogging
</span>
</a> </a>
<a href="https://picsur.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Picsur - Image Hosting"> <a href="https://picsur.keyboardvagabond.com" target="_blank" class="service-link" aria-label="Picsur - Image Hosting">
<picture class="service-icon">
<source srcset="assets/logos/default-dark.svg" media="(prefers-color-scheme: dark)" type="image/svg+xml"/>
<source srcset="assets/logos/default-light.svg" media="(prefers-color-scheme: light)" type="image/svg+xml"/>
<img src="assets/logos/default-light.svg" alt="Default mascot holding laptop" width="60" height="60" type="image/svg+xml"/>
</picture>
<span class="service-text">
<strong>Picsur</strong> - Image Hosting <strong>Picsur</strong> - Image Hosting
</span>
</a> </a>
</div> </div>
</div> </div>
@@ -246,7 +308,7 @@
<div class="photo-gallery"> <div class="photo-gallery">
<div class="photo-item"> <div class="photo-item">
<small>Check out that Explore button on the main page.</small> <small>Check out that Explore button on the main page.</small>
<img src="https://picsur.keyboardvagabond.com/i/e8ab899f-5bb4-4cf1-b531-8621ac93670e.png?width=400" <img src="https://picsur.keyboardvagabond.com/i/e8ab899f-5bb4-4cf1-b531-8621ac93670e.png?width=600"
alt="Explore button on main page" loading="lazy" /> alt="Explore button on main page" loading="lazy" />
</div> </div>
<div class="photo-item"> <div class="photo-item">

View File

@@ -1,11 +1,20 @@
.banner-container { .banner-container {
position: relative; position: relative;
width: 100%; width: 100%;
max-height: 40vh;
min-height: 200px;
overflow: hidden; overflow: hidden;
} }
.banner-container picture {
width: 100%;
display: block;
}
.banner-container img {
width: 100%;
height: auto;
display: block;
}
.banner { .banner {
width: 100%; width: 100%;
max-height: 40vh; max-height: 40vh;
@@ -380,7 +389,10 @@
} }
.service-link { .service-link {
display: block; display: flex;
flex-direction: column;
align-items: center;
gap: calc(var(--pico-spacing) * 0.75);
padding: calc(var(--pico-spacing) * 0.75); padding: calc(var(--pico-spacing) * 0.75);
background: var(--pico-background-color); background: var(--pico-background-color);
border: 1px solid var(--pico-muted-border-color); border: 1px solid var(--pico-muted-border-color);
@@ -399,6 +411,28 @@
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
} }
.service-icon {
flex-shrink: 0;
display: block;
width: 60px;
height: 60px;
}
.service-icon img {
width: 100%;
height: 100%;
object-fit: contain;
display: block;
}
.service-text {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
.service-link strong { .service-link strong {
display: block; display: block;
font-size: 1.1em; font-size: 1.1em;
@@ -537,3 +571,64 @@ footer li:not(:last-child)::after {
content: none; /* Remove delimiters on mobile */ content: none; /* Remove delimiters on mobile */
} }
} }
/* Mascot section styling */
.mascot-section {
display: flex;
align-items: center;
gap: calc(var(--pico-spacing) * 2);
margin: var(--pico-typography-spacing-vertical) 0;
}
.mascot-image {
flex-shrink: 0;
min-width: 120px; /* Prevent image from disappearing on thin screens */
}
.mascot-image picture,
.mascot-image img {
display: block;
max-width: 100%;
height: auto;
}
.mascot-image img {
width: 200px;
max-width: min(200px, 30vw);
min-width: 120px; /* Ensure image stays visible on very thin screens */
}
.mascot-text {
flex: 1;
min-width: 0; /* Allows text to shrink properly */
}
/* Stack on small devices */
@media (max-width: 576px) {
.mascot-section {
flex-direction: column;
align-items: center;
gap: var(--pico-spacing);
}
.mascot-image {
min-width: auto; /* Reset min-width when stacked */
}
.mascot-image img {
width: 100%;
max-width: 200px;
min-width: 120px; /* Keep minimum size even when stacked */
}
.mascot-text {
text-align: center;
}
}
/* Very thin screens - ensure image stays visible */
@media (max-width: 400px) {
.mascot-image img {
min-width: 100px; /* Smaller but still visible on very thin screens */
}
}

View File

@@ -8,7 +8,7 @@
"publisher": { "publisher": {
"@type": "Organization", "@type": "Organization",
"name": "Keyboard Vagabond", "name": "Keyboard Vagabond",
"logo": "https://picsur.keyboardvagabond.com/i/076a5b88-20d3-426e-ad7f-f24a68d3fa70.jpg?width=400", "logo": "https://picsur.michaeldileo.org/i/b4579222-367e-4601-b634-87e6d66e3a99.png?width=400",
"foundingDate": "2025", "foundingDate": "2025",
"areaServed": "Global", "areaServed": "Global",
"knowsAbout": ["Fediverse", "Digital Nomadism", "Remote Work", "Travel", "Social Media Alternatives"] "knowsAbout": ["Fediverse", "Digital Nomadism", "Remote Work", "Travel", "Social Media Alternatives"]
@@ -81,7 +81,7 @@
"@type": "Organization", "@type": "Organization",
"name": "Keyboard Vagabond", "name": "Keyboard Vagabond",
"url": "https://www.keyboardvagabond.com", "url": "https://www.keyboardvagabond.com",
"logo": "https://picsur.keyboardvagabond.com/i/076a5b88-20d3-426e-ad7f-f24a68d3fa70.jpg?width=400", "logo": "https://picsur.michaeldileo.org/i/b4579222-367e-4601-b634-87e6d66e3a99.png?width=400",
"description": "A fediverse community for digital nomads, remote workers, and travel enthusiasts offering multiple social media alternatives including Mastodon, Piefed, Pixelfed, Bookwyrm, and Write Freely.", "description": "A fediverse community for digital nomads, remote workers, and travel enthusiasts offering multiple social media alternatives including Mastodon, Piefed, Pixelfed, Bookwyrm, and Write Freely.",
"sameAs": [ "sameAs": [
"https://mastodon.keyboardvagabond.com", "https://mastodon.keyboardvagabond.com",