forked from mirror/crumbs-original
feat: add marketing landing page for crumbs.bretzel.app
Static landing page with parchment/retro theme matching the app aesthetic. Includes GitHub Pages deploy workflow, responsive layout, feature grid, deploy quick-start, and 404 page. Screenshot placeholders ready for real captures. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
committed by
Fred Cabassut
co-authored by
Claude Opus 4.6
parent
1cfffa1a6e
commit
1a15cbc401
@@ -0,0 +1,36 @@
|
|||||||
|
name: Deploy Website
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
paths: ['website/**']
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pages: write
|
||||||
|
id-token: write
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: pages
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
name: Deploy to GitHub Pages
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
environment:
|
||||||
|
name: github-pages
|
||||||
|
url: ${{ steps.deployment.outputs.page_url }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: actions/configure-pages@v5
|
||||||
|
|
||||||
|
- uses: actions/upload-pages-artifact@v3
|
||||||
|
with:
|
||||||
|
path: website
|
||||||
|
|
||||||
|
- name: Deploy to GitHub Pages
|
||||||
|
id: deployment
|
||||||
|
uses: actions/deploy-pages@v4
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>404 - Page not found | Crumbs</title>
|
||||||
|
<link rel="icon" type="image/png" sizes="96x96" href="assets/favicon-96x96.png">
|
||||||
|
<link rel="icon" type="image/x-icon" href="assets/favicon.ico">
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
<style>
|
||||||
|
.error-page {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
min-height: 80vh;
|
||||||
|
text-align: center;
|
||||||
|
padding: 2rem;
|
||||||
|
}
|
||||||
|
.error-code {
|
||||||
|
font-size: clamp(3rem, 10vw, 6rem);
|
||||||
|
color: var(--primary);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
.error-message {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
max-width: 24rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="error-page">
|
||||||
|
<h1 class="error-code font-pixel">404</h1>
|
||||||
|
<p class="error-message">This note seems to have been deleted. Or maybe it never existed.</p>
|
||||||
|
<a href="/" class="btn btn-primary">Back to home</a>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
crumbs.bretzel.app
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,266 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Crumbs - Your notes. Your server. Your rules.</title>
|
||||||
|
<meta name="description" content="Crumbs is a self-hostable, offline-first note-taking app. A privacy-respecting Google Keep alternative you can run on your own server with a single Docker command.">
|
||||||
|
<meta property="og:title" content="Crumbs by Bretzel">
|
||||||
|
<meta property="og:description" content="Self-hostable, offline-first note-taking. A Google Keep alternative that respects your privacy.">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="https://crumbs.bretzel.app">
|
||||||
|
<meta property="og:image" content="https://crumbs.bretzel.app/assets/og-image.png">
|
||||||
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
|
<link rel="icon" type="image/png" sizes="96x96" href="assets/favicon-96x96.png">
|
||||||
|
<link rel="icon" type="image/x-icon" href="assets/favicon.ico">
|
||||||
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<!-- ── Header ── -->
|
||||||
|
<header class="site-header">
|
||||||
|
<div class="container">
|
||||||
|
<a href="/" class="logo">
|
||||||
|
<img src="assets/favicon-96x96.png" alt="Crumbs logo" width="32" height="32">
|
||||||
|
<span>Crumbs</span>
|
||||||
|
</a>
|
||||||
|
<button class="nav-toggle" aria-label="Toggle navigation" aria-expanded="false">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="3" y1="6" x2="21" y2="6"/><line x1="3" y1="12" x2="21" y2="12"/><line x1="3" y1="18" x2="21" y2="18"/></svg>
|
||||||
|
</button>
|
||||||
|
<nav>
|
||||||
|
<ul class="nav-links">
|
||||||
|
<li><a href="#features">Features</a></li>
|
||||||
|
<li><a href="#screenshots">Screenshots</a></li>
|
||||||
|
<li><a href="#deploy">Deploy</a></li>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/bretzel-app/crumbs" class="github-link" target="_blank" rel="noopener">
|
||||||
|
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
|
||||||
|
GitHub
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<!-- ── Hero ── -->
|
||||||
|
<div class="hero-wrapper">
|
||||||
|
<!-- Decorative floating note cards -->
|
||||||
|
<div class="deco-card deco-card-1">Buy groceries<br>- Milk<br>- Eggs</div>
|
||||||
|
<div class="deco-card deco-card-2">Meeting notes<br>Q3 planning...</div>
|
||||||
|
<div class="deco-card deco-card-3">Project ideas<br>#startup #saas</div>
|
||||||
|
<div class="deco-card deco-card-4">Remember to<br>call the vet</div>
|
||||||
|
|
||||||
|
<section class="hero">
|
||||||
|
<div class="container">
|
||||||
|
<h1 class="animate-in">
|
||||||
|
Your notes. Your server.<br><span>Your rules.</span>
|
||||||
|
</h1>
|
||||||
|
<p class="hero-subtitle animate-in delay-1">
|
||||||
|
A self-hostable, offline-first note-taking app. The Google Keep alternative that respects your privacy.
|
||||||
|
</p>
|
||||||
|
<div class="hero-buttons animate-in delay-2">
|
||||||
|
<a href="#deploy" class="btn btn-primary">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/></svg>
|
||||||
|
Get Started
|
||||||
|
</a>
|
||||||
|
<a href="https://github.com/bretzel-app/crumbs" class="btn btn-secondary" target="_blank" rel="noopener">
|
||||||
|
<svg viewBox="0 0 24 24" fill="currentColor" width="16" height="16"><path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"/></svg>
|
||||||
|
View on GitHub
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="hero-screenshot animate-in delay-3">
|
||||||
|
<div class="screenshot-placeholder"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- ── Features ── -->
|
||||||
|
<section class="features" id="features">
|
||||||
|
<div class="container">
|
||||||
|
<h2 class="animate-in">Everything you need,<br>nothing you don't</h2>
|
||||||
|
<div class="features-grid">
|
||||||
|
<!-- Rich Markdown Editor -->
|
||||||
|
<div class="feature-card animate-in delay-1">
|
||||||
|
<div class="feature-icon">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 20h9"/><path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"/></svg>
|
||||||
|
</div>
|
||||||
|
<h3>Rich Editor</h3>
|
||||||
|
<p>Tiptap-powered WYSIWYG with full Markdown support. Bold, lists, code blocks, and more.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Offline-first PWA -->
|
||||||
|
<div class="feature-card animate-in delay-2">
|
||||||
|
<div class="feature-icon">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12.55a11 11 0 0 1 14.08 0"/><path d="M1.42 9a16 16 0 0 1 21.16 0"/><path d="M8.53 16.11a6 6 0 0 1 6.95 0"/><line x1="12" y1="20" x2="12.01" y2="20"/></svg>
|
||||||
|
</div>
|
||||||
|
<h3>Offline-First</h3>
|
||||||
|
<p>Works without internet. PWA with CRDT-based sync means your notes are always available.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Self-hostable -->
|
||||||
|
<div class="feature-card animate-in delay-3">
|
||||||
|
<div class="feature-icon">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"/><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>
|
||||||
|
</div>
|
||||||
|
<h3>Self-Hostable</h3>
|
||||||
|
<p>One Docker command. Your data stays on your server. No cloud, no tracking, no nonsense.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tags, colors, pins -->
|
||||||
|
<div class="feature-card animate-in delay-4">
|
||||||
|
<div class="feature-icon">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M20.59 13.41l-7.17 7.17a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82z"/><line x1="7" y1="7" x2="7.01" y2="7"/></svg>
|
||||||
|
</div>
|
||||||
|
<h3>Tags & Colors</h3>
|
||||||
|
<p>Organize with tags, 12 note colors, and pinned notes. Your notes, your way.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Checklists -->
|
||||||
|
<div class="feature-card animate-in delay-5">
|
||||||
|
<div class="feature-icon">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 11 12 14 22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg>
|
||||||
|
</div>
|
||||||
|
<h3>Checklists</h3>
|
||||||
|
<p>Built-in task lists with checkbox support. Track to-dos right inside your notes.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Full-text search -->
|
||||||
|
<div class="feature-card animate-in delay-6">
|
||||||
|
<div class="feature-icon">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
|
||||||
|
</div>
|
||||||
|
<h3>Full-Text Search</h3>
|
||||||
|
<p>Find anything instantly. SQLite-powered search across all your notes and tags.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── Screenshots ── -->
|
||||||
|
<section class="screenshots" id="screenshots">
|
||||||
|
<div class="container">
|
||||||
|
<h2 class="animate-in">See it in action</h2>
|
||||||
|
<div class="screenshots-grid">
|
||||||
|
<div class="screenshot-card animate-in delay-1">
|
||||||
|
<div class="screenshot-placeholder"></div>
|
||||||
|
<div class="screenshot-label">Notes grid view</div>
|
||||||
|
</div>
|
||||||
|
<div class="screenshot-card animate-in delay-2">
|
||||||
|
<div class="screenshot-placeholder"></div>
|
||||||
|
<div class="screenshot-label">Rich text editor</div>
|
||||||
|
</div>
|
||||||
|
<div class="screenshot-card animate-in delay-3">
|
||||||
|
<div class="screenshot-placeholder"></div>
|
||||||
|
<div class="screenshot-label">Mobile view</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── Deploy ── -->
|
||||||
|
<section class="deploy" id="deploy">
|
||||||
|
<div class="container">
|
||||||
|
<h2 class="animate-in">Deploy in seconds</h2>
|
||||||
|
<p class="deploy-subtitle animate-in delay-1">One file. One command. Done.</p>
|
||||||
|
|
||||||
|
<div class="code-block animate-in delay-2">
|
||||||
|
<div class="code-header">
|
||||||
|
<span>docker-compose.yml</span>
|
||||||
|
<button class="copy-btn" onclick="copyCode()">copy</button>
|
||||||
|
</div>
|
||||||
|
<pre><code><span class="code-key">services</span>:
|
||||||
|
<span class="code-key">crumbs</span>:
|
||||||
|
<span class="code-key">image</span>: <span class="code-string">ghcr.io/bretzel-app/crumbs:latest</span>
|
||||||
|
<span class="code-key">ports</span>:
|
||||||
|
- <span class="code-string">"3000:3000"</span>
|
||||||
|
<span class="code-key">volumes</span>:
|
||||||
|
- <span class="code-string">crumbs_data:/data</span>
|
||||||
|
|
||||||
|
<span class="code-key">volumes</span>:
|
||||||
|
<span class="code-key">crumbs_data</span>:</code></pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="deploy-thats-it animate-in delay-3">
|
||||||
|
<p class="font-pixel">That's it.</p>
|
||||||
|
<p>Open <code>localhost:3000</code>, set a password, and start writing.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="deploy-cta animate-in delay-4">
|
||||||
|
<a href="https://github.com/bretzel-app/crumbs/blob/main/docs/DEPLOYMENT.md" class="btn btn-secondary" target="_blank" rel="noopener">
|
||||||
|
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"/><path d="M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"/></svg>
|
||||||
|
Full deployment docs
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- ── Footer ── -->
|
||||||
|
<footer class="site-footer">
|
||||||
|
<div class="container">
|
||||||
|
<p class="footer-brand font-pixel">Part of the Bretzel app universe</p>
|
||||||
|
<ul class="footer-links">
|
||||||
|
<li><a href="https://github.com/bretzel-app/crumbs" target="_blank" rel="noopener">GitHub</a></li>
|
||||||
|
<li><a href="https://github.com/bretzel-app/crumbs/blob/main/docs/DEPLOYMENT.md" target="_blank" rel="noopener">Docs</a></li>
|
||||||
|
<li><a href="https://github.com/bretzel-app/crumbs/blob/main/LICENSE" target="_blank" rel="noopener">License</a></li>
|
||||||
|
</ul>
|
||||||
|
<span class="footer-version">v0.3.3</span>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// Mobile nav toggle
|
||||||
|
const toggle = document.querySelector('.nav-toggle');
|
||||||
|
const navLinks = document.querySelector('.nav-links');
|
||||||
|
toggle.addEventListener('click', () => {
|
||||||
|
const open = navLinks.classList.toggle('open');
|
||||||
|
toggle.setAttribute('aria-expanded', open);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Close nav on link click (mobile)
|
||||||
|
navLinks.querySelectorAll('a').forEach(link => {
|
||||||
|
link.addEventListener('click', () => {
|
||||||
|
navLinks.classList.remove('open');
|
||||||
|
toggle.setAttribute('aria-expanded', 'false');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Copy docker-compose snippet
|
||||||
|
function copyCode() {
|
||||||
|
const code = `services:
|
||||||
|
crumbs:
|
||||||
|
image: ghcr.io/bretzel-app/crumbs:latest
|
||||||
|
ports:
|
||||||
|
- "3000:3000"
|
||||||
|
volumes:
|
||||||
|
- crumbs_data:/data
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
crumbs_data:`;
|
||||||
|
navigator.clipboard.writeText(code).then(() => {
|
||||||
|
const btn = document.querySelector('.copy-btn');
|
||||||
|
btn.textContent = 'copied!';
|
||||||
|
setTimeout(() => { btn.textContent = 'copy'; }, 2000);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Intersection Observer for scroll animations
|
||||||
|
const observer = new IntersectionObserver((entries) => {
|
||||||
|
entries.forEach(entry => {
|
||||||
|
if (entry.isIntersecting) {
|
||||||
|
entry.target.classList.add('animate-in');
|
||||||
|
observer.unobserve(entry.target);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, { threshold: 0.1 });
|
||||||
|
|
||||||
|
// Only observe elements that aren't in the hero (hero animates on load)
|
||||||
|
document.querySelectorAll('.features .animate-in, .screenshots .animate-in, .deploy .animate-in').forEach(el => {
|
||||||
|
el.style.opacity = '0';
|
||||||
|
el.classList.remove('animate-in');
|
||||||
|
observer.observe(el);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,654 @@
|
|||||||
|
@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&family=JetBrains+Mono:ital,wght@0,400;0,600;0,700;1,400&display=swap');
|
||||||
|
|
||||||
|
/* ── Design tokens (ported from app) ── */
|
||||||
|
:root {
|
||||||
|
--bg-base: #f0e6d3;
|
||||||
|
--bg-surface: #faf5eb;
|
||||||
|
--primary: #C8860A;
|
||||||
|
--primary-hover: #E8A020;
|
||||||
|
--text: #1a1a2e;
|
||||||
|
--text-muted: #6b6272;
|
||||||
|
--border: #1a1a2e;
|
||||||
|
--border-subtle: #d4cabb;
|
||||||
|
--destructive: #a63d2f;
|
||||||
|
--card-shadow: 2px 2px 0px var(--border-subtle);
|
||||||
|
--card-shadow-hover: 3px 3px 0px var(--primary);
|
||||||
|
|
||||||
|
/* Note colors for decorative elements */
|
||||||
|
--coral: #faafa8;
|
||||||
|
--peach: #f39f76;
|
||||||
|
--sand: #fff8b8;
|
||||||
|
--mint: #e2f6d3;
|
||||||
|
--sage: #b4ddd3;
|
||||||
|
--fog: #d4e4ed;
|
||||||
|
--storm: #aeccdc;
|
||||||
|
--dusk: #d3bfdb;
|
||||||
|
--blossom: #f6e2dd;
|
||||||
|
--clay: #e9e3d4;
|
||||||
|
--chalk: #efeff1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Reset ── */
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Base ── */
|
||||||
|
html {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
scroll-padding-top: 5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
color: var(--text);
|
||||||
|
background-color: var(--bg-base);
|
||||||
|
line-height: 1.6;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Pixel grid overlay */
|
||||||
|
body::before {
|
||||||
|
content: '';
|
||||||
|
position: fixed;
|
||||||
|
inset: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: 0.03;
|
||||||
|
background-image: repeating-conic-gradient(#1a1a2e 0% 25%, transparent 0% 50%);
|
||||||
|
background-size: 4px 4px;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body > * {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--primary);
|
||||||
|
text-decoration: none;
|
||||||
|
transition: color 150ms ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: var(--primary-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
img {
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Typography ── */
|
||||||
|
.font-pixel {
|
||||||
|
font-family: 'Press Start 2P', cursive;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3 {
|
||||||
|
font-family: 'Press Start 2P', cursive;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Layout ── */
|
||||||
|
.container {
|
||||||
|
max-width: 72rem;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
padding: 5rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Header ── */
|
||||||
|
.site-header {
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 100;
|
||||||
|
background: var(--bg-base);
|
||||||
|
border-bottom: 2px solid var(--border-subtle);
|
||||||
|
padding: 1rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-header .container {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.75rem;
|
||||||
|
color: var(--text);
|
||||||
|
font-family: 'Press Start 2P', cursive;
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo img {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
image-rendering: pixelated;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 1.5rem;
|
||||||
|
list-style: none;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a {
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links a:hover {
|
||||||
|
color: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.github-link {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.github-link svg {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Mobile nav toggle */
|
||||||
|
.nav-toggle {
|
||||||
|
display: none;
|
||||||
|
background: none;
|
||||||
|
border: 2px solid var(--border-subtle);
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 0.4rem;
|
||||||
|
cursor: pointer;
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-toggle svg {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Hero ── */
|
||||||
|
.hero {
|
||||||
|
padding: 6rem 0 4rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero h1 {
|
||||||
|
font-size: clamp(1.25rem, 4vw, 2rem);
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero h1 span {
|
||||||
|
color: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-subtitle {
|
||||||
|
font-size: clamp(0.85rem, 2vw, 1rem);
|
||||||
|
color: var(--text-muted);
|
||||||
|
max-width: 36rem;
|
||||||
|
margin: 0 auto 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-buttons {
|
||||||
|
display: flex;
|
||||||
|
gap: 1rem;
|
||||||
|
justify-content: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin-bottom: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Buttons ── */
|
||||||
|
.btn {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.5rem;
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
font-size: 0.85rem;
|
||||||
|
font-weight: 600;
|
||||||
|
padding: 0.75rem 1.5rem;
|
||||||
|
border-radius: 2px;
|
||||||
|
border: 2px solid var(--border);
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 150ms ease-out;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn svg {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary {
|
||||||
|
background: var(--primary);
|
||||||
|
color: var(--bg-surface);
|
||||||
|
border-color: var(--primary);
|
||||||
|
box-shadow: var(--card-shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary:hover {
|
||||||
|
background: var(--primary-hover);
|
||||||
|
border-color: var(--primary-hover);
|
||||||
|
color: var(--bg-surface);
|
||||||
|
box-shadow: var(--card-shadow-hover);
|
||||||
|
transform: translate(-1px, -1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-secondary {
|
||||||
|
background: var(--bg-surface);
|
||||||
|
color: var(--text);
|
||||||
|
box-shadow: var(--card-shadow);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-secondary:hover {
|
||||||
|
border-color: var(--primary);
|
||||||
|
box-shadow: var(--card-shadow-hover);
|
||||||
|
transform: translate(-1px, -1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Hero screenshot ── */
|
||||||
|
.hero-screenshot {
|
||||||
|
max-width: 56rem;
|
||||||
|
margin: 0 auto;
|
||||||
|
border: 2px solid var(--border-subtle);
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 4px 4px 0px var(--border-subtle);
|
||||||
|
overflow: hidden;
|
||||||
|
background: var(--bg-surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
.screenshot-placeholder {
|
||||||
|
aspect-ratio: 16 / 9;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: linear-gradient(135deg, var(--bg-surface), var(--clay));
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screenshot-placeholder::after {
|
||||||
|
content: 'screenshot coming soon';
|
||||||
|
font-family: 'Press Start 2P', cursive;
|
||||||
|
font-size: 0.65rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Decorative note cards (floating behind hero) ── */
|
||||||
|
.hero-wrapper {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deco-card {
|
||||||
|
position: absolute;
|
||||||
|
border: 2px solid var(--border-subtle);
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: var(--card-shadow);
|
||||||
|
padding: 1rem;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
opacity: 0.35;
|
||||||
|
pointer-events: none;
|
||||||
|
transform: rotate(var(--rotate, 0deg));
|
||||||
|
width: 10rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deco-card-1 {
|
||||||
|
background: var(--coral);
|
||||||
|
top: 8%;
|
||||||
|
left: 3%;
|
||||||
|
--rotate: -6deg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deco-card-2 {
|
||||||
|
background: var(--mint);
|
||||||
|
top: 20%;
|
||||||
|
right: 4%;
|
||||||
|
--rotate: 4deg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deco-card-3 {
|
||||||
|
background: var(--sand);
|
||||||
|
bottom: 15%;
|
||||||
|
left: 5%;
|
||||||
|
--rotate: 3deg;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deco-card-4 {
|
||||||
|
background: var(--fog);
|
||||||
|
bottom: 10%;
|
||||||
|
right: 6%;
|
||||||
|
--rotate: -3deg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Features grid ── */
|
||||||
|
.features {
|
||||||
|
background: var(--bg-surface);
|
||||||
|
border-top: 2px solid var(--border-subtle);
|
||||||
|
border-bottom: 2px solid var(--border-subtle);
|
||||||
|
}
|
||||||
|
|
||||||
|
.features h2 {
|
||||||
|
text-align: center;
|
||||||
|
font-size: clamp(0.9rem, 2.5vw, 1.25rem);
|
||||||
|
margin-bottom: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.features-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(18rem, 1fr));
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-card {
|
||||||
|
background: var(--bg-base);
|
||||||
|
border: 2px solid var(--border-subtle);
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 1.5rem;
|
||||||
|
box-shadow: var(--card-shadow);
|
||||||
|
transition: all 150ms ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-card:hover {
|
||||||
|
border-color: var(--primary);
|
||||||
|
box-shadow: var(--card-shadow-hover);
|
||||||
|
transform: translate(-1px, -1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-icon {
|
||||||
|
width: 2.5rem;
|
||||||
|
height: 2.5rem;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: var(--primary);
|
||||||
|
color: var(--bg-surface);
|
||||||
|
border-radius: 2px;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
box-shadow: 2px 2px 0px var(--border-subtle);
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-icon svg {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-card h3 {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.feature-card p {
|
||||||
|
font-size: 0.85rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Screenshots ── */
|
||||||
|
.screenshots h2 {
|
||||||
|
text-align: center;
|
||||||
|
font-size: clamp(0.9rem, 2.5vw, 1.25rem);
|
||||||
|
margin-bottom: 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screenshots-grid {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screenshot-card {
|
||||||
|
border: 2px solid var(--border-subtle);
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: var(--card-shadow);
|
||||||
|
overflow: hidden;
|
||||||
|
background: var(--bg-surface);
|
||||||
|
}
|
||||||
|
|
||||||
|
.screenshot-card .screenshot-placeholder {
|
||||||
|
aspect-ratio: 4 / 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screenshot-label {
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--text-muted);
|
||||||
|
border-top: 2px solid var(--border-subtle);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Deploy / Quick Start ── */
|
||||||
|
.deploy {
|
||||||
|
background: var(--bg-surface);
|
||||||
|
border-top: 2px solid var(--border-subtle);
|
||||||
|
border-bottom: 2px solid var(--border-subtle);
|
||||||
|
}
|
||||||
|
|
||||||
|
.deploy h2 {
|
||||||
|
text-align: center;
|
||||||
|
font-size: clamp(0.9rem, 2.5vw, 1.25rem);
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deploy-subtitle {
|
||||||
|
text-align: center;
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
margin-bottom: 2.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-block {
|
||||||
|
max-width: 40rem;
|
||||||
|
margin: 0 auto 2rem;
|
||||||
|
background: var(--text);
|
||||||
|
color: var(--bg-surface);
|
||||||
|
border: 2px solid var(--border);
|
||||||
|
border-radius: 2px;
|
||||||
|
box-shadow: 4px 4px 0px var(--border-subtle);
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 0.75rem 1rem;
|
||||||
|
background: rgba(255, 255, 255, 0.05);
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||||
|
font-size: 0.75rem;
|
||||||
|
color: rgba(255, 255, 255, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy-btn {
|
||||||
|
background: none;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 0.25rem 0.5rem;
|
||||||
|
color: rgba(255, 255, 255, 0.6);
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 150ms ease-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
.copy-btn:hover {
|
||||||
|
border-color: var(--primary);
|
||||||
|
color: var(--primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-block pre {
|
||||||
|
padding: 1.25rem;
|
||||||
|
overflow-x: auto;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-block code {
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-comment {
|
||||||
|
color: rgba(255, 255, 255, 0.35);
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-key {
|
||||||
|
color: var(--primary-hover);
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-string {
|
||||||
|
color: #b4ddd3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deploy-thats-it {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deploy-thats-it .font-pixel {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
color: var(--primary);
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deploy-thats-it p {
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deploy-cta {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Footer ── */
|
||||||
|
.site-footer {
|
||||||
|
padding: 3rem 0;
|
||||||
|
border-top: 2px solid var(--border-subtle);
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-brand {
|
||||||
|
font-size: 0.6rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-links {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 2rem;
|
||||||
|
list-style: none;
|
||||||
|
margin-bottom: 1.5rem;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-version {
|
||||||
|
display: inline-block;
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
font-size: 0.7rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
background: var(--bg-surface);
|
||||||
|
border: 1px solid var(--border-subtle);
|
||||||
|
border-radius: 2px;
|
||||||
|
padding: 0.2rem 0.6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Animations ── */
|
||||||
|
@keyframes fade-up {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(12px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.animate-in {
|
||||||
|
animation: fade-up 400ms ease-out both;
|
||||||
|
}
|
||||||
|
|
||||||
|
.delay-1 { animation-delay: 100ms; }
|
||||||
|
.delay-2 { animation-delay: 200ms; }
|
||||||
|
.delay-3 { animation-delay: 300ms; }
|
||||||
|
.delay-4 { animation-delay: 400ms; }
|
||||||
|
.delay-5 { animation-delay: 500ms; }
|
||||||
|
.delay-6 { animation-delay: 600ms; }
|
||||||
|
|
||||||
|
/* ── Responsive ── */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.nav-links {
|
||||||
|
display: none;
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
background: var(--bg-base);
|
||||||
|
border-bottom: 2px solid var(--border-subtle);
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 1rem 1.5rem;
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-links.open {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-toggle {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero {
|
||||||
|
padding: 4rem 0 3rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deco-card {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
section {
|
||||||
|
padding: 3.5rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.features-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.screenshots-grid {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.hero-buttons {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
width: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.code-block pre {
|
||||||
|
font-size: 0.7rem;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user