Files
2026-06-08 23:36:35 +02:00

426 lines
12 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MAEL - Welcome</title>
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,600;1,300;1,400&family=Raleway:wght@300;400;500&display=swap" rel="stylesheet" />
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--cream: #fdf8f0;
--parchment: #f5edda;
--gold: #c9a84c;
--gold-light: #e8d08a;
--gold-dark: #9a6f2e;
--moss: #6b8c42;
--moss-light: #a8c06a;
--blush: #f0c8c0;
--blush-deep: #d48a82;
--lavender: #b89fd4;
--lavender-deep: #7a5fa8;
--text-main: #3a2e1e;
--text-soft: #7a6a52;
--border: rgba(201, 168, 76, 0.25);
}
html, body {
height: 100%;
font-family: 'Raleway', sans-serif;
background-color: var(--cream);
color: var(--text-main);
overflow-x: hidden;
}
/* === BACKGROUND === */
body::before {
content: '';
position: fixed;
inset: 0;
background:
radial-gradient(ellipse at 15% 20%, rgba(168, 192, 106, 0.18) 0%, transparent 55%),
radial-gradient(ellipse at 85% 10%, rgba(240, 200, 192, 0.22) 0%, transparent 50%),
radial-gradient(ellipse at 70% 80%, rgba(184, 159, 212, 0.15) 0%, transparent 50%),
radial-gradient(ellipse at 20% 85%, rgba(201, 168, 76, 0.12) 0%, transparent 45%),
var(--cream);
z-index: 0;
pointer-events: none;
}
/* Subtle grain overlay */
body::after {
content: '';
position: fixed;
inset: 0;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
opacity: 0.4;
z-index: 0;
pointer-events: none;
}
/* === SPARKLES === */
.sparkle {
position: fixed;
border-radius: 50%;
pointer-events: none;
z-index: 1;
animation: float-sparkle linear infinite;
opacity: 0;
}
@keyframes float-sparkle {
0% { transform: translateY(0) scale(0); opacity: 0; }
10% { opacity: 1; transform: translateY(-10px) scale(1); }
80% { opacity: 0.6; }
100% { transform: translateY(-80px) scale(0.3); opacity: 0; }
}
/* === LAYOUT === */
.page {
position: relative;
z-index: 2;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
padding: 4rem 2rem 3rem;
}
/* === DECORATIVE TOP LINE === */
.top-ornament {
display: flex;
align-items: center;
gap: 1rem;
margin-bottom: 3.5rem;
animation: fade-in 1.2s ease both;
}
.ornament-line {
width: 80px;
height: 1px;
background: linear-gradient(to right, transparent, var(--gold));
}
.ornament-line.right {
background: linear-gradient(to left, transparent, var(--gold));
}
.ornament-diamond {
width: 6px;
height: 6px;
background: var(--gold);
transform: rotate(45deg);
}
/* === HERO === */
.hero {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
flex: 1;
animation: fade-up 1.4s ease both 0.2s;
}
.logo-wrap {
position: relative;
width: min(360px, 80vw);
margin-bottom: 2.5rem;
filter: drop-shadow(0 8px 32px rgba(201, 168, 76, 0.2));
animation: logo-glow 4s ease-in-out infinite alternate;
}
@keyframes logo-glow {
from { filter: drop-shadow(0 8px 24px rgba(201, 168, 76, 0.15)); }
to { filter: drop-shadow(0 12px 40px rgba(184, 159, 212, 0.3)); }
}
.logo-wrap img {
width: 100%;
height: auto;
display: block;
}
.welcome-eyebrow {
font-family: 'Raleway', sans-serif;
font-weight: 300;
font-size: clamp(0.7rem, 2vw, 0.8rem);
letter-spacing: 0.35em;
text-transform: uppercase;
color: var(--gold-dark);
margin-bottom: 0.9rem;
}
.welcome-title {
font-family: 'Cormorant Garamond', serif;
font-weight: 300;
font-size: clamp(2rem, 6vw, 3.2rem);
line-height: 1.2;
color: var(--text-main);
letter-spacing: 0.02em;
}
.welcome-title em {
font-style: italic;
color: var(--gold-dark);
}
.divider {
display: flex;
align-items: center;
gap: 0.75rem;
margin: 2rem 0;
}
.divider-line {
width: 60px;
height: 1px;
background: var(--border);
}
.divider-dot {
width: 4px;
height: 4px;
border-radius: 50%;
background: var(--gold-light);
}
.welcome-sub {
font-family: 'Cormorant Garamond', serif;
font-style: italic;
font-weight: 300;
font-size: clamp(1rem, 3vw, 1.2rem);
color: var(--text-soft);
max-width: 460px;
line-height: 1.8;
}
/* === CONTACT SECTION === */
.contact-section {
width: 100%;
max-width: 500px;
margin-top: 4rem;
animation: fade-up 1.4s ease both 0.5s;
}
.contact-label {
font-family: 'Raleway', sans-serif;
font-weight: 300;
font-size: 0.7rem;
letter-spacing: 0.3em;
text-transform: uppercase;
color: var(--gold-dark);
text-align: center;
margin-bottom: 1.5rem;
}
.contact-card {
background: rgba(255, 255, 255, 0.55);
border: 1px solid var(--border);
border-radius: 16px;
padding: 2rem;
backdrop-filter: blur(8px);
}
.contact-card input,
.contact-card textarea {
width: 100%;
background: rgba(255, 255, 255, 0.7);
border: 1px solid rgba(201, 168, 76, 0.2);
border-radius: 8px;
padding: 0.75rem 1rem;
font-family: 'Raleway', sans-serif;
font-size: 0.88rem;
font-weight: 400;
color: var(--text-main);
outline: none;
transition: border-color 0.25s, box-shadow 0.25s;
margin-bottom: 0.9rem;
}
.contact-card input::placeholder,
.contact-card textarea::placeholder {
color: var(--text-soft);
opacity: 0.7;
}
.contact-card input:focus,
.contact-card textarea:focus {
border-color: var(--gold);
box-shadow: 0 0 0 3px rgba(201, 168, 76, 0.12);
}
.contact-card textarea {
resize: vertical;
min-height: 100px;
}
.contact-card button {
width: 100%;
padding: 0.85rem 1.5rem;
background: linear-gradient(135deg, var(--gold) 0%, var(--gold-dark) 100%);
color: #fff;
border: none;
border-radius: 8px;
font-family: 'Raleway', sans-serif;
font-size: 0.8rem;
font-weight: 500;
letter-spacing: 0.2em;
text-transform: uppercase;
cursor: pointer;
transition: opacity 0.2s, transform 0.15s;
margin-top: 0.2rem;
}
.contact-card button:hover { opacity: 0.88; transform: translateY(-1px); }
.contact-card button:active { transform: translateY(0); }
.form-note {
font-size: 0.72rem;
color: var(--text-soft);
text-align: center;
margin-top: 0.75rem;
font-style: italic;
}
.form-success {
display: none;
text-align: center;
font-family: 'Cormorant Garamond', serif;
font-style: italic;
font-size: 1.1rem;
color: var(--moss);
padding: 1rem 0;
}
/* === FOOTER === */
.footer {
margin-top: 3rem;
font-size: 0.7rem;
letter-spacing: 0.2em;
text-transform: uppercase;
color: rgba(122, 106, 82, 0.45);
animation: fade-in 2s ease both 1s;
}
/* === ANIMATIONS === */
@keyframes fade-up {
from { opacity: 0; transform: translateY(24px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}
@media (max-width: 480px) {
.page { padding: 2.5rem 1.25rem 2rem; }
.contact-card { padding: 1.5rem; }
}
</style>
</head>
<body>
<!-- Floating sparkles injected by JS -->
<div class="page">
<div class="top-ornament">
<div class="ornament-line"></div>
<div class="ornament-diamond"></div>
<div class="ornament-line right"></div>
</div>
<main class="hero">
<div class="logo-wrap">
<img src="logo.png" alt="MAEL" />
</div>
<p class="welcome-eyebrow">est. mael.dk</p>
<h1 class="welcome-title">
Welcome to the family of<br><em>MAEL's domain</em>
</h1>
<div class="divider">
<div class="divider-line"></div>
<div class="divider-dot"></div>
<div class="divider-line"></div>
</div>
<p class="welcome-sub">
A little corner of the internet, tended with love,<br>
curiosity, and a touch of magic.
</p>
</main>
<section class="contact-section">
<p class="contact-label">Send a note</p>
<div class="contact-card">
<input type="text" id="cf-name" placeholder="Your name" />
<input type="email" id="cf-email" placeholder="Your email" />
<textarea id="cf-message" placeholder="Your message"></textarea>
<button onclick="submitForm()">Send message</button>
<p class="form-note" id="form-note">? Mail delivery coming soon placeholder endpoint active</p>
<p class="form-success" id="form-success">Thank you your message is on its way. ?</p>
</div>
</section>
<footer class="footer">mael.dk &nbsp;&nbsp; all rights reserved</footer>
</div>
<script>
/* === SPARKLES === */
const colors = ['#c9a84c','#e8d08a','#b89fd4','#f0c8c0','#a8c06a'];
for (let i = 0; i < 18; i++) {
const s = document.createElement('div');
s.className = 'sparkle';
const size = 3 + Math.random() * 5;
s.style.cssText = `
width:${size}px; height:${size}px;
left:${Math.random()*100}vw;
top:${40+Math.random()*55}vh;
background:${colors[Math.floor(Math.random()*colors.length)]};
animation-duration:${4+Math.random()*6}s;
animation-delay:${Math.random()*8}s;
opacity:0;
`;
document.body.appendChild(s);
}
/* === CONTACT FORM === */
async function submitForm() {
const name = document.getElementById('cf-name').value.trim();
const email = document.getElementById('cf-email').value.trim();
const message = document.getElementById('cf-message').value.trim();
if (!name || !email || !message) {
document.getElementById('form-note').textContent = '? Please fill in all fields.';
return;
}
/* -- Replace this URL with your mail endpoint once Docker Mailserver is set up -- */
const ENDPOINT = '/api/contact';
try {
const res = await fetch(ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, email, message })
});
if (res.ok) {
document.getElementById('form-note').style.display = 'none';
document.getElementById('form-success').style.display = 'block';
} else {
document.getElementById('form-note').textContent = '? Something went wrong please try again.';
}
} catch {
document.getElementById('form-note').textContent = '? Mail endpoint not yet configured.';
}
}
</script>
</body>
</html>