dev #5

Merged
Latte merged 8 commits from dev into main 2026-01-01 14:04:36 +00:00
9 changed files with 439 additions and 135 deletions
Showing only changes of commit f318a6bdaf - Show all commits
+41
View File
@@ -0,0 +1,41 @@
# Build output
dist/
.astro/
# Dependencies
node_modules/
# Logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Environment variables
.env
.env.local
.env.production
.env.*.local
# macOS
.DS_Store
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# OS
Thumbs.db
# Package lock files (keep package-lock.json but ignore others)
yarn.lock
pnpm-lock.yaml
# Local development
*.local
# Build artifacts
*.tsbuildinfo
-93
View File
@@ -1,93 +0,0 @@
---
interface Props {
title: string;
}
const { title } = Astro.props;
---
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="description" content="Hidden Den Cafe - A cozy corner of the internet" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="generator" content={Astro.generator} />
<title>{title}</title>
</head>
<body>
<slot />
</body>
</html>
<style is:global>
:root {
/* Cozy Den Color Palette */
--color-bg: #1a1410;
--color-bg-light: #2a1f18;
--color-text: #f4e9d8;
--color-text-dim: #c4b5a0;
--color-accent: #d4a574;
--color-accent-bright: #e8bf8e;
--color-warm: #8b6f47;
/* Spacing */
--space-xs: 0.5rem;
--space-sm: 1rem;
--space-md: 1.5rem;
--space-lg: 2rem;
--space-xl: 3rem;
/* Typography */
--font-body: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-family: var(--font-body);
background: var(--color-bg);
color: var(--color-text);
}
body {
min-height: 100vh;
line-height: 1.6;
}
h1, h2, h3, h4, h5, h6 {
color: var(--color-accent-bright);
line-height: 1.2;
}
a {
color: var(--color-accent-bright);
text-decoration: none;
transition: color 0.2s ease;
}
a:hover {
color: var(--color-accent);
}
/* Smooth animations */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in {
animation: fadeIn 0.6s ease-out;
}
</style>
+8
View File
@@ -1,6 +1,14 @@
import { defineConfig } from 'astro/config'; import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
// https://astro.build/config // https://astro.build/config
export default defineConfig({ export default defineConfig({
site: 'https://hiddenden.cafe', site: 'https://hiddenden.cafe',
integrations: [
sitemap({
changefreq: 'weekly',
priority: 0.7,
lastmod: new Date(),
}),
],
}); });
+2 -1
View File
@@ -10,6 +10,7 @@
"astro": "astro" "astro": "astro"
}, },
"dependencies": { "dependencies": {
"astro": "^4.16.18" "astro": "^4.16.18",
"@astrojs/sitemap": "^3.2.2"
} }
} }
View File

Before

Width:  |  Height:  |  Size: 204 B

After

Width:  |  Height:  |  Size: 204 B

+16
View File
@@ -0,0 +1,16 @@
# Hidden Den Cafe - Robots.txt
User-agent: *
Allow: /
# Sitemap
Sitemap: https://hiddenden.cafe/sitemap-index.xml
# Crawl-delay for polite crawlers
Crawl-delay: 1
# Block aggressive bots (optional - uncomment if needed)
# User-agent: AhrefsBot
# Disallow: /
# User-agent: SemrushBot
# Disallow: /
+174
View File
@@ -0,0 +1,174 @@
---
interface Props {
title: string;
description?: string;
ogImage?: string;
canonicalURL?: string;
}
const {
title,
description = "Hidden Den Cafe - A cozy, self-hosted corner of the internet. Privacy-focused, furry-friendly, and built with love.",
ogImage = "/og-image.png",
canonicalURL = Astro.url.pathname
} = Astro.props;
const fullCanonicalURL = new URL(canonicalURL, Astro.site).href;
const fullOgImage = new URL(ogImage, Astro.site).href;
---
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="generator" content={Astro.generator} />
<!-- Primary Meta Tags -->
<title>{title}</title>
<meta name="title" content={title} />
<meta name="description" content={description} />
<link rel="canonical" href={fullCanonicalURL} />
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website" />
<meta property="og:url" content={fullCanonicalURL} />
<meta property="og:title" content={title} />
<meta property="og:description" content={description} />
<meta property="og:image" content={fullOgImage} />
<meta property="og:site_name" content="Hidden Den Cafe" />
<meta property="og:locale" content="en_US" />
<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content={fullCanonicalURL} />
<meta name="twitter:title" content={title} />
<meta name="twitter:description" content={description} />
<meta name="twitter:image" content={fullOgImage} />
<!-- Additional Meta Tags -->
<meta name="author" content="Latte" />
<meta name="keywords" content="self-hosted, privacy, open-source, furry, developer, cozy, hidden den" />
<meta name="theme-color" content="#d4a574" />
<meta name="color-scheme" content="dark" />
<!-- Favicon -->
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="apple-touch-icon" href="/favicon.svg" />
<!-- Preconnect for performance (if needed for future external resources) -->
<!-- <link rel="preconnect" href="https://example.com" crossorigin /> -->
</head>
<body>
<slot />
</body>
</html>
<style is:global>
:root {
/* Cozy Den Color Palette */
--color-bg: #1a1410;
--color-bg-light: #2a1f18;
--color-text: #f4e9d8;
--color-text-dim: #c4b5a0;
--color-accent: #d4a574;
--color-accent-bright: #e8bf8e;
--color-warm: #8b6f47;
/* Spacing */
--space-xs: 0.5rem;
--space-sm: 1rem;
--space-md: 1.5rem;
--space-lg: 2rem;
--space-xl: 3rem;
/* Typography */
--font-body: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-family: var(--font-body);
background: var(--color-bg);
color: var(--color-text);
scroll-behavior: smooth;
}
body {
min-height: 100vh;
line-height: 1.6;
}
h1, h2, h3, h4, h5, h6 {
color: var(--color-accent-bright);
line-height: 1.2;
}
a {
color: var(--color-accent-bright);
text-decoration: none;
transition: color 0.2s ease;
}
a:hover {
color: var(--color-accent);
}
a:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 2px;
border-radius: 2px;
}
/* Smooth animations */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in {
animation: fadeIn 0.6s ease-out;
}
/* Respect user's motion preferences */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
/* Improve focus visibility for keyboard navigation */
*:focus-visible {
outline: 2px solid var(--color-accent);
outline-offset: 2px;
}
/* Screen reader only content */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
</style>
+150
View File
@@ -0,0 +1,150 @@
---
import BaseLayout from '../layouts/BaseLayout.astro';
---
<BaseLayout
title="404 - Page Not Found | Hidden Den Cafe"
description="This page doesn't exist in the Hidden Den. Let's get you back to somewhere cozy."
>
<main class="not-found-page">
<div class="container">
<div class="card fade-in">
<div class="not-found-content">
<h1 class="error-code">404</h1>
<h2 class="error-title">Lost in the Den?</h2>
<p class="error-message">
Oops! This cozy corner doesn't seem to exist. Maybe it's still being built,
or perhaps you've wandered into a part of the den that hasn't been opened yet.
</p>
<div class="actions">
<a href="/" class="btn-primary">
<span aria-hidden="true">🏡</span> Back to Home
</a>
<a href="https://git.hiddenden.cafe" class="btn-secondary" target="_blank" rel="noopener noreferrer">
<span aria-hidden="true">📦</span> Visit Gitea
</a>
</div>
</div>
</div>
</div>
</main>
</BaseLayout>
<style>
.not-found-page {
display: flex;
align-items: center;
justify-content: center;
min-height: 100vh;
padding: var(--space-md);
}
.container {
max-width: 600px;
width: 100%;
}
.card {
background: var(--color-bg-light);
border-radius: 12px;
padding: var(--space-xl);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
border: 1px solid rgba(212, 165, 116, 0.1);
text-align: center;
}
.not-found-content {
display: flex;
flex-direction: column;
gap: var(--space-md);
}
.error-code {
font-size: 6rem;
font-weight: bold;
color: var(--color-accent);
line-height: 1;
margin: 0;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
.error-title {
font-size: 2rem;
margin: 0;
color: var(--color-accent-bright);
}
.error-message {
font-size: 1.1rem;
color: var(--color-text-dim);
line-height: 1.6;
margin: 0;
}
.actions {
display: flex;
gap: var(--space-md);
justify-content: center;
flex-wrap: wrap;
margin-top: var(--space-md);
}
.btn-primary,
.btn-secondary {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
padding: var(--space-sm) var(--space-lg);
border-radius: 8px;
font-weight: 500;
transition: all 0.2s ease;
text-decoration: none;
}
.btn-primary {
background: var(--color-accent);
color: var(--color-bg);
}
.btn-primary:hover {
background: var(--color-accent-bright);
transform: translateY(-2px);
box-shadow: 0 4px 8px rgba(212, 165, 116, 0.3);
}
.btn-secondary {
background: transparent;
color: var(--color-accent-bright);
border: 2px solid var(--color-accent);
}
.btn-secondary:hover {
background: rgba(212, 165, 116, 0.1);
border-color: var(--color-accent-bright);
transform: translateY(-2px);
}
@media (max-width: 768px) {
.error-code {
font-size: 4rem;
}
.error-title {
font-size: 1.5rem;
}
.error-message {
font-size: 1rem;
}
.actions {
flex-direction: column;
}
.btn-primary,
.btn-secondary {
width: 100%;
justify-content: center;
}
}
</style>
+41 -34
View File
@@ -2,23 +2,28 @@
import BaseLayout from '../layouts/BaseLayout.astro'; import BaseLayout from '../layouts/BaseLayout.astro';
--- ---
<BaseLayout title="Hidden Den Cafe"> <BaseLayout
<main> title="Hidden Den Cafe - Cozy Self-Hosted Services"
description="Welcome to Hidden Den Cafe - a warm, self-hosted space where technology meets comfort. Privacy-focused, furry-friendly, and built with love by Latte."
>
<main id="main-content">
<!-- Hero Section --> <!-- Hero Section -->
<section class="hero"> <section class="hero" aria-labelledby="hero-title">
<div class="container"> <div class="container">
<div class="hero-content fade-in"> <div class="hero-content fade-in">
<h1 class="hero-title">🏡 Hidden Den Cafe</h1> <h1 id="hero-title" class="hero-title">
<span aria-hidden="true">🏡</span> Hidden Den Cafe
</h1>
<p class="hero-subtitle">A cozy corner of the internet</p> <p class="hero-subtitle">A cozy corner of the internet</p>
</div> </div>
</div> </div>
</section> </section>
<!-- About Hidden Den Section --> <!-- About Hidden Den Section -->
<section class="section about-den"> <section class="section about-den" aria-labelledby="about-den-heading">
<div class="container"> <div class="container">
<div class="card fade-in"> <div class="card fade-in">
<h2> About Hidden Den</h2> <h2 id="about-den-heading"><span aria-hidden="true">☕</span> About Hidden Den</h2>
<p> <p>
Welcome to Hidden Den Cafe - a warm, self-hosted space where technology Welcome to Hidden Den Cafe - a warm, self-hosted space where technology
meets comfort. This is a personal corner of the internet built with love, meets comfort. This is a personal corner of the internet built with love,
@@ -34,10 +39,10 @@ import BaseLayout from '../layouts/BaseLayout.astro';
</section> </section>
<!-- About Latte Section --> <!-- About Latte Section -->
<section class="section about-me"> <section class="section about-me" aria-labelledby="about-me-heading">
<div class="container"> <div class="container">
<div class="card fade-in"> <div class="card fade-in">
<h2>🦊 About Me</h2> <h2 id="about-me-heading"><span aria-hidden="true">🦊</span> About Me</h2>
<p> <p>
Hey there! I'm Latte, a gay furry developer who loves building things Hey there! I'm Latte, a gay furry developer who loves building things
and being part of the warm, welcoming furry community. I'm passionate and being part of the warm, welcoming furry community. I'm passionate
@@ -58,24 +63,24 @@ import BaseLayout from '../layouts/BaseLayout.astro';
</section> </section>
<!-- Services Section --> <!-- Services Section -->
<section class="section services"> <section class="section services" aria-labelledby="services-heading">
<div class="container"> <div class="container">
<div class="card fade-in"> <div class="card fade-in">
<h2>🛠️ Services</h2> <h2 id="services-heading"><span aria-hidden="true">🛠️</span> Services</h2>
<p>Here are the services currently running in the den:</p> <p>Here are the services currently running in the den:</p>
<div class="service-list"> <div class="service-list" role="list">
<div class="service-item"> <div class="service-item" role="listitem">
<h3> <h3>
<a href="https://git.hiddenden.cafe" target="_blank" rel="noopener noreferrer"> <a href="https://git.hiddenden.cafe" target="_blank" rel="noopener noreferrer" aria-label="Visit Gitea - Self-hosted Git service">
📦 Gitea <span aria-hidden="true">📦</span> Gitea
</a> </a>
</h3> </h3>
<p>Self-hosted Git service for all my projects and code repositories.</p> <p>Self-hosted Git service for all my projects and code repositories.</p>
</div> </div>
<div class="service-item coming-soon"> <div class="service-item coming-soon" role="listitem">
<h3>🔜 More Coming Soon</h3> <h3><span aria-hidden="true">🔜</span> More Coming Soon</h3>
<p>The den is always growing! More services will be added as they're developed and deployed.</p> <p>The den is always growing! More services will be added as they're developed and deployed.</p>
</div> </div>
</div> </div>
@@ -84,36 +89,36 @@ import BaseLayout from '../layouts/BaseLayout.astro';
</section> </section>
<!-- Support Section --> <!-- Support Section -->
<section class="section support"> <section class="section support" aria-labelledby="support-heading">
<div class="container"> <div class="container">
<div class="card fade-in"> <div class="card fade-in">
<h2>💝 How to Help Out</h2> <h2 id="support-heading"><span aria-hidden="true">💝</span> How to Help Out</h2>
<p> <p>
If you'd like to support the Hidden Den and help keep the lights on, If you'd like to support the Hidden Den and help keep the lights on,
here are some ways you can contribute: here are some ways you can contribute:
</p> </p>
<div class="support-list"> <div class="support-list" role="list">
<div class="support-item"> <div class="support-item" role="listitem">
<h3>🌟 Share & Spread the Word</h3> <h3><span aria-hidden="true">🌟</span> Share & Spread the Word</h3>
<p>Tell others about the projects and services hosted here!</p> <p>Tell others about the projects and services hosted here!</p>
</div> </div>
<div class="support-item"> <div class="support-item" role="listitem">
<h3>🐛 Report Issues</h3> <h3><span aria-hidden="true">🐛</span> Report Issues</h3>
<p>Found a bug or have a suggestion? Let me know!</p> <p>Found a bug or have a suggestion? Let me know!</p>
</div> </div>
<div class="support-item"> <div class="support-item" role="listitem">
<h3> Buy Me a Coffee</h3> <h3><span aria-hidden="true">☕</span> Buy Me a Coffee</h3>
<p> <p>
Donations help cover server costs and keep the den cozy. Donations help cover server costs and keep the den cozy.
<span class="coming-soon-text">(Payment links coming soon!)</span> <span class="coming-soon-text">(Payment links coming soon!)</span>
</p> </p>
</div> </div>
<div class="support-item"> <div class="support-item" role="listitem">
<h3>🤝 Contribute</h3> <h3><span aria-hidden="true">🤝</span> Contribute</h3>
<p>Check out the projects on Gitea - contributions are always welcome!</p> <p>Check out the projects on Gitea - contributions are always welcome!</p>
</div> </div>
</div> </div>
@@ -122,14 +127,16 @@ import BaseLayout from '../layouts/BaseLayout.astro';
</section> </section>
<!-- Footer --> <!-- Footer -->
<footer class="footer"> <footer class="footer" role="contentinfo">
<div class="container"> <div class="container">
<p>Made with 💖 by Latte</p> <p>Made with <span aria-hidden="true">💖</span><span class="sr-only">love</span> by Latte</p>
<p class="footer-links"> <nav aria-label="Footer navigation">
<a href="https://git.hiddenden.cafe" target="_blank" rel="noopener noreferrer">Gitea</a> <p class="footer-links">
<span class="separator">•</span> <a href="https://git.hiddenden.cafe" target="_blank" rel="noopener noreferrer">Gitea</a>
<a href="https://dmush.cloud" target="_blank" rel="noopener noreferrer">dmush.cloud</a> <span class="separator" aria-hidden="true">•</span>
</p> <a href="https://dmush.cloud" target="_blank" rel="noopener noreferrer">dmush.cloud</a>
</p>
</nav>
</div> </div>
</footer> </footer>
</main> </main>