dev #5
+41
@@ -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
|
||||
@@ -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>
|
||||
@@ -1,6 +1,14 @@
|
||||
import { defineConfig } from 'astro/config';
|
||||
import sitemap from '@astrojs/sitemap';
|
||||
|
||||
// https://astro.build/config
|
||||
export default defineConfig({
|
||||
site: 'https://hiddenden.cafe',
|
||||
integrations: [
|
||||
sitemap({
|
||||
changefreq: 'weekly',
|
||||
priority: 0.7,
|
||||
lastmod: new Date(),
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
+2
-1
@@ -10,6 +10,7 @@
|
||||
"astro": "astro"
|
||||
},
|
||||
"dependencies": {
|
||||
"astro": "^4.16.18"
|
||||
"astro": "^4.16.18",
|
||||
"@astrojs/sitemap": "^3.2.2"
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 204 B After Width: | Height: | Size: 204 B |
@@ -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: /
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -2,23 +2,28 @@
|
||||
import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
---
|
||||
|
||||
<BaseLayout title="Hidden Den Cafe">
|
||||
<main>
|
||||
<BaseLayout
|
||||
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 -->
|
||||
<section class="hero">
|
||||
<section class="hero" aria-labelledby="hero-title">
|
||||
<div class="container">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</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="card fade-in">
|
||||
<h2>☕ About Hidden Den</h2>
|
||||
<h2 id="about-den-heading"><span aria-hidden="true">☕</span> About Hidden Den</h2>
|
||||
<p>
|
||||
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,
|
||||
@@ -34,10 +39,10 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
</section>
|
||||
|
||||
<!-- About Latte Section -->
|
||||
<section class="section about-me">
|
||||
<section class="section about-me" aria-labelledby="about-me-heading">
|
||||
<div class="container">
|
||||
<div class="card fade-in">
|
||||
<h2>🦊 About Me</h2>
|
||||
<h2 id="about-me-heading"><span aria-hidden="true">🦊</span> About Me</h2>
|
||||
<p>
|
||||
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
|
||||
@@ -58,24 +63,24 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
</section>
|
||||
|
||||
<!-- Services Section -->
|
||||
<section class="section services">
|
||||
<section class="section services" aria-labelledby="services-heading">
|
||||
<div class="container">
|
||||
<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>
|
||||
|
||||
<div class="service-list">
|
||||
<div class="service-item">
|
||||
<div class="service-list" role="list">
|
||||
<div class="service-item" role="listitem">
|
||||
<h3>
|
||||
<a href="https://git.hiddenden.cafe" target="_blank" rel="noopener noreferrer">
|
||||
📦 Gitea
|
||||
<a href="https://git.hiddenden.cafe" target="_blank" rel="noopener noreferrer" aria-label="Visit Gitea - Self-hosted Git service">
|
||||
<span aria-hidden="true">📦</span> Gitea
|
||||
</a>
|
||||
</h3>
|
||||
<p>Self-hosted Git service for all my projects and code repositories.</p>
|
||||
</div>
|
||||
|
||||
<div class="service-item coming-soon">
|
||||
<h3>🔜 More Coming Soon</h3>
|
||||
<div class="service-item coming-soon" role="listitem">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
@@ -84,36 +89,36 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
</section>
|
||||
|
||||
<!-- Support Section -->
|
||||
<section class="section support">
|
||||
<section class="section support" aria-labelledby="support-heading">
|
||||
<div class="container">
|
||||
<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>
|
||||
If you'd like to support the Hidden Den and help keep the lights on,
|
||||
here are some ways you can contribute:
|
||||
</p>
|
||||
|
||||
<div class="support-list">
|
||||
<div class="support-item">
|
||||
<h3>🌟 Share & Spread the Word</h3>
|
||||
<div class="support-list" role="list">
|
||||
<div class="support-item" role="listitem">
|
||||
<h3><span aria-hidden="true">🌟</span> Share & Spread the Word</h3>
|
||||
<p>Tell others about the projects and services hosted here!</p>
|
||||
</div>
|
||||
|
||||
<div class="support-item">
|
||||
<h3>🐛 Report Issues</h3>
|
||||
<div class="support-item" role="listitem">
|
||||
<h3><span aria-hidden="true">🐛</span> Report Issues</h3>
|
||||
<p>Found a bug or have a suggestion? Let me know!</p>
|
||||
</div>
|
||||
|
||||
<div class="support-item">
|
||||
<h3>☕ Buy Me a Coffee</h3>
|
||||
<div class="support-item" role="listitem">
|
||||
<h3><span aria-hidden="true">☕</span> Buy Me a Coffee</h3>
|
||||
<p>
|
||||
Donations help cover server costs and keep the den cozy.
|
||||
<span class="coming-soon-text">(Payment links coming soon!)</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="support-item">
|
||||
<h3>🤝 Contribute</h3>
|
||||
<div class="support-item" role="listitem">
|
||||
<h3><span aria-hidden="true">🤝</span> Contribute</h3>
|
||||
<p>Check out the projects on Gitea - contributions are always welcome!</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -122,14 +127,16 @@ import BaseLayout from '../layouts/BaseLayout.astro';
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<footer class="footer" role="contentinfo">
|
||||
<div class="container">
|
||||
<p>Made with 💖 by Latte</p>
|
||||
<p class="footer-links">
|
||||
<a href="https://git.hiddenden.cafe" target="_blank" rel="noopener noreferrer">Gitea</a>
|
||||
<span class="separator">•</span>
|
||||
<a href="https://dmush.cloud" target="_blank" rel="noopener noreferrer">dmush.cloud</a>
|
||||
</p>
|
||||
<p>Made with <span aria-hidden="true">💖</span><span class="sr-only">love</span> by Latte</p>
|
||||
<nav aria-label="Footer navigation">
|
||||
<p class="footer-links">
|
||||
<a href="https://git.hiddenden.cafe" target="_blank" rel="noopener noreferrer">Gitea</a>
|
||||
<span class="separator" aria-hidden="true">•</span>
|
||||
<a href="https://dmush.cloud" target="_blank" rel="noopener noreferrer">dmush.cloud</a>
|
||||
</p>
|
||||
</nav>
|
||||
</div>
|
||||
</footer>
|
||||
</main>
|
||||
Reference in New Issue
Block a user