Compare commits

..

27 Commits

Author SHA1 Message Date
spetznas 6101a72fd5 Rebuilt site and deleted old stuff in public 2026-05-17 08:40:43 +02:00
spetznas 69a5cc6ee0 Updated Form with E-Mail and JS-obfuscation 2026-05-17 08:39:09 +02:00
spetznas 1cb22384fd Commented out debug lines in rsvp-submit.php 2026-05-17 00:55:18 +02:00
spetznas 7fa3b132f9 Commented out debug lines in rsvp-submit.php 2026-05-17 00:53:21 +02:00
spetznas bc4f4331c8 Commented out debug lines in rsvp-submit.php 2026-05-17 00:51:35 +02:00
spetznas 9b49a1a024 Commented out debug lines in rsvp-submit.php 2026-05-17 00:50:42 +02:00
spetznas b05ac218c3 Commented out debug lines in rsvp-submit.php 2026-05-17 00:48:48 +02:00
spetznas 3496f41596 Added final UTF-8 support to rsvp-submit.php 2026-05-17 00:46:26 +02:00
spetznas 767d37ff88 Added UTF-8 support to rsvp-submit.php #5 2026-05-17 00:17:53 +02:00
spetznas 9de6e8a1d1 Added UTF-8 support to rsvp-submit.php #3 2026-05-16 23:50:29 +02:00
spetznas c518654da5 Added UTF-8 support to rsvp-submit.php #2 2026-05-16 23:45:24 +02:00
spetznas fceeeda68e Added UTF-8 support to rsvp-submit.php 2026-05-16 23:41:03 +02:00
spetznas eb925f2eab Rewrote rsvp-submit.php again #6 2026-05-16 23:38:33 +02:00
spetznas 2a6cb3fbd0 Rewrote rsvp-submit.php again #5 2026-05-16 23:33:07 +02:00
spetznas f7e9968d74 Rewrote rsvp-submit.php again #4 2026-05-16 23:28:25 +02:00
spetznas 49f0826d8b Rewrote rsvp-submit.php again #3 2026-05-16 23:13:08 +02:00
spetznas 7ce7b4f179 Rewrote rsvp-submit.php again #2 2026-05-16 23:08:43 +02:00
spetznas b111696c26 Reverted rsvp-submit.php again #2 2026-05-16 23:04:29 +02:00
spetznas 7e7e473279 Reverted to old rsvp-submit.php 2026-05-16 22:55:44 +02:00
spetznas 7a9232b992 Updated rsvp-submit.php 2026-05-16 22:47:53 +02:00
spetznas 838dabccca Added updated RSVP-form 2026-05-16 22:22:24 +02:00
spetznas b7ad462786 Updated multiple things on wedding-page 2026-05-16 20:13:04 +02:00
spetznas 9bd514dac0 Added music button 2026-05-04 19:13:52 +02:00
spetznas eccb229f03 Updated wedding invitation content 2026-05-04 18:22:45 +02:00
spetznas 8346dd5754 Updated wedding invitation content and added translations 2026-05-04 13:12:37 +02:00
spetznas 85128647a3 Updated site, added logos 2026-04-28 09:15:23 +02:00
spetznas c5e553ea35 Added Gitea, Mail and XMPP Logo 2026-04-28 09:14:26 +02:00
51 changed files with 15062 additions and 51 deletions
-1
View File
@@ -1,4 +1,3 @@
public/
resources/_gen/
.hugo_build.lock
.DS_Store
Executable → Regular
View File
+30
View File
@@ -0,0 +1,30 @@
+++
title = "Hochzeit von Stefan und Mariia"
layout = "wedding"
slug = "hochzeit"
aliases = [
"/hochzeit/",
"/mariia-und-stefan/",
"/heirat/"
]
bg_image = "/images/hochzeit-bg.jpg"
[event]
date = "2026-08-31"
ceremony_time = "14:00"
reception_time = "17:00"
venue = "München, Deutschland"
map_embed = """<iframe src="https://www.google.com/maps?q=Russische+Orthodoxe+Kirche+Auferstehungs-Gemeinde+Dachau+M%C3%BCnchen&hl=de&z=19&output=embed" width="600" height="450" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>"""
[rsvp]
deadline = "30. Juni"
email = "hochzeit@markinstefan.xyz"
+++
Wir freuen uns, Euch zu unserer Hochzeit von Stefan und Mariia einzuladen!
Feiern Sie mit uns diesen besonderen Tag voller Liebe, Freude und wundervoller Erinnerungen!
Wir freuen uns darauf, Sie dort zu sehen!
+29
View File
@@ -0,0 +1,29 @@
+++
title = "Marriage of Stefan and Mariia"
layout = "wedding"
slug = "wedding"
aliases = [
"/wedding/",
"/mariia-and-stefan/"
]
[event]
date = "2026-08-31"
ceremony_time = "14:00"
reception_time = "17:00"
venue = "Munich, Germany"
map_embed = """<iframe src="https://www.google.com/maps?q=Russische+Orthodoxe+Kirche+Auferstehungs-Gemeinde+Dachau+M%C3%BCnchen&hl=en&z=19&output=embed" width="600" height="450" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>"""
[rsvp]
deadline = "June 30"
email = "hochzeit@markinstefan.xyz"
details = "Dress code: Smart casual. Please bring a light jacket, as the evening might get chilly."
+++
We are happy to invite you to our wedding of Stefan and Mariia!
Join us in celebrating this special day with love, joy, and wonderful memories.
We look forward to seeing you there!
+31
View File
@@ -0,0 +1,31 @@
+++
title = "Свадьба Стефана и Марии"
layout = "wedding"
slug = "svadba"
aliases = [
"/svadba/",
"/mariia-i-stefan/",
"/brak/"
]
[event]
date = "2026-08-31"
ceremony_time = "14:00"
reception_time = "17:00"
venue = "Мюнхен, Германия"
map_embed = """<iframe src="https://www.google.com/maps?q=Russische+Orthodoxe+Kirche+Auferstehungs-Gemeinde+Dachau+M%C3%BCnchen&hl=ru&z=19&output=embed" width="600" height="450" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>"""
[rsvp]
deadline = "30 июня"
email = "hochzeit@markinstefan.xyz"
details = "Дресс-код: Smart casual. Пожалуйста, возьмите с собой легкую куртку, так как вечер может быть прохладным."
+++
С радостью приглашаем вас на свадьбу Стефана и Марии!
Мы приглашаем вас разделить с нами этот особенный день, наполненный любовью, радостью и незабываемыми воспоминаниями!
С нетерпением ждем встречи с вами!
Executable → Regular
View File
+32 -20
View File
@@ -32,7 +32,7 @@ avatarURL = "images/avatar.jpg"
dateFormat = "January 2, 2006"
# since = 2019
# Git Commit in Footer, uncomment the line below to enable it
commit = "https://github.com/luizdepra/hugo-coder/tree/"
# commit = "https://github.com/luizdepra/hugo-coder/tree/"
# Right To Left, shift content direction for languages such as Arabic
rtl = false
# Specify light/dark colorscheme
@@ -151,11 +151,23 @@ author = "authors"
# weight = 1
# url = "https://github.com/johndoe/"
# [[params.social]]
# name = "Gitlab"
# icon = "fa-brands fa-gitlab fa-2x"
# weight = 2
# url = "https://gitlab.com/johndoe/"
[[params.social]]
name = "Gitea"
icon = "fa-brands fa-git-alt fa-2x"
weight = 2
url = "https://git.netinfection.xyz/iroxol"
[[params.social]]
name = "Email"
icon = "fa-solid fa-envelope fa-2x"
weight = 3
url = "contact"
[[params.social]]
name = "XMPP"
icon = "fa-solid fa-comment-dots fa-2x"
weight = 4
url = "xmpp:iroxol@netinfection.xyz"
# [[params.social]]
# name = "LinkedIn"
@@ -180,16 +192,16 @@ author = "authors"
[languages.en]
languageName = ":uk:"
# [[languages.en.menu.main]]
# name = "About"
# weight = 1
# url = "about/"
# [[languages.en.menu.main]]
# name = "Blog"
# weight = 2
# url = "posts/"
[[languages.en.menu.main]]
name = "About"
weight = 1
url = "about/"
[[languages.en.menu.main]]
name = "Projects"
weight = 3
@@ -210,16 +222,16 @@ info = ["Ausgebildeter Elektroniker für Geräte und Systeme ", "Informatikstude
description = "Sítio pessoal de João Ninguém"
keywords = "blog,desenvolvedor,pessoal"
# [[languages.de.menu.main]]
# name = "Sobre"
# weight = 1
# url = "about/"
# [[languages.de.menu.main]]
# name = "Blog"
# weight = 2
# url = "posts/"
[[languages.de.menu.main]]
name = "Über mich"
weight = 1
url = "about/"
[[languages.de.menu.main]]
name = "Projekte"
weight = 3
@@ -240,10 +252,10 @@ info = ["Квалифицированный электротехник по об
description = "Sítio pessoal de João Ninguém"
keywords = "blog,desenvolvedor,pessoal"
# [[languages.ru.menu.main]]
# name = "Sobre"
# weight = 1
# url = "about/"
[[languages.ru.menu.main]]
name = "Обо мне"
weight = 1
url = "about/"
# [[languages.ru.menu.main]]
# name = "Blog"
+26
View File
@@ -1,2 +1,28 @@
javascript = "Bitte erlauben Sie JavaScript um diesen Inhalt zu sehen."
redirect_message = "Weiterleitung zu {{ .URL }} in {{ .Seconds }} Sekunden..."
click_here_redirect = "Hier klicken, falls Sie nicht weitergeleitet werden"
countdown_title = "Countdown zu unserer Hochzeit:"
day = "T"
hour = "Std"
minute = "min"
second = "s"
event_title = "Veranstaltung"
ceremony = "Zeremonie"
ceremony_time = "um"
reception = "Empfang"
location = "Ort"
rsvp_title = "RSVP"
rsvp_deadline = "Bitte antworten bis"
rsvp_email = "E-Mail"
rsvp_form = "RSVP Formular"
rsvp_firstname = "Vorname"
rsvp_lastname = "Nachname"
rsvp_drinks = "Getränkevorlieben"
rsvp_drinks_wine = "Wein"
rsvp_drinks_beer = "Bier"
rsvp_drinks_juice = "Saft"
rsvp_allergies = "Allergisch auf"
rsvp_send = "Abschicken"
details_title = "Details"
footer_message = "Wir freuen uns darauf, mit euch zu feiern ❤️"
big_day = "Der große Tag ist da!"
Regular → Executable
+26
View File
@@ -1,2 +1,28 @@
javascript = "Please enable JavaScript to see this content."
redirect_message = "Redirecting to {{ .URL }} in {{ .Seconds }} seconds..."
click_here_redirect = "Click here if you are not redirected"
countdown_title = "Countdown to our Wedding:"
day = "d"
hour = "h"
minute = "m"
second = "s"
event_title = "Event"
ceremony = "Ceremony"
ceremony_time = "at"
reception = "Reception"
location = "Location"
rsvp_title = "RSVP"
rsvp_deadline = "Please respond by"
rsvp_email = "Email"
rsvp_form = "RSVP Form"
rsvp_firstname = "First name"
rsvp_lastname = "Last name"
rsvp_drinks = "Drink preferences:"
rsvp_drinks_wine = "Wine"
rsvp_drinks_beer = "Beer"
rsvp_drinks_juice = "Juice"
rsvp_allergies = "Allergic to"
rsvp_send = "Send"
details_title = "Details"
footer_message = "We look forward to celebrating with you ❤️"
big_day = "The big day is here!"
Regular → Executable
+26
View File
@@ -1,2 +1,28 @@
javascript = "Пожалуйста, разрешите JavaScript для просмотра этого контента."
redirect_message = "Перенаправление на {{ .URL }} через {{ .Seconds }} секунд..."
click_here_redirect = "Нажмите здесь, если перенаправление не произошло"
countdown_title = "До нашей свадьбы осталось:"
day = "Д."
hour = "ч."
minute = "м."
second = "c."
event_title = "Мероприятие"
ceremony = "Церемония"
ceremony_time = "в"
reception = "Начало"
location = "Место"
rsvp_title = "RSVP"
rsvp_deadline = "Пожалуйста, ответьте до"
rsvp_email = "Электронная почта"
rsvp_form = "Форма RSVP"
rsvp_firstname = "Имя"
rsvp_lastname = "Фамилия"
rsvp_drinks = "Предпочтения по напиткам:"
rsvp_drinks_wine = "Вино"
rsvp_drinks_beer = "Пиво"
rsvp_drinks_juice = "Сок"
rsvp_allergies = "Аллергия на"
rsvp_send = "Отправить"
details_title = "Детали"
footer_message = "❤️ Мы с нетерпением ждем встречи с вами ❤️"
big_day = "Наступил великий день!"
Executable → Regular
View File
+237
View File
@@ -0,0 +1,237 @@
{{ define "content" }}
<style>
body {
background-color: #fff; /* light bg */
color: #222; /* dark text */
/* NEW: background image */
background-image: url('/images/hochzeit-bg.jpg'); /* path to your image */
background-size: cover; /* cover whole container */
background-position: center; /* center the image */
background-repeat: repeat; /* don't tile */
border-radius: 8px; /* optional: match your hero border-radius */
}
.wedding-container {
max-width: 1600px;
margin: 0 auto;
padding: 2rem;
font-family: system-ui, sans-serif;
line-height: 1.6;
}
.hero {
text-align: center;
margin-bottom: 3rem;
}
.hero img {
width: 100%;
border-radius: 8px;
}
.hero h1 {
font-size: 2.5rem;
margin-bottom: 0.5rem;
}
.hero .date {
font-size: 1.2rem;
color: #666;
}
.section {
margin-bottom: 2.5rem;
}
.section h2 {
font-size: 1.5rem;
margin-bottom: 0.5rem;
border-bottom: 1px solid #eee;
padding-bottom: 0.3rem;
}
.map iframe {
width: 100%;
background-color: rgba(255, 255, 255, 0.5); /* subtle white overlay */
padding: 1rem;
height: 400px;
border: 0;
border-radius: 8px;
}
.rsvp {
background-color: rgba(255, 255, 255, 0.8); /* subtle white overlay */
padding: 1rem;
border-radius: 8px;
}
.countdown {
text-align: center; margin-bottom: 2rem;
font-size: 5rem;
}
.footer {
text-align: center;
margin-top: 3rem;
color: #888;
font-size: 2rem;
padding-top: 1rem;
}
.footer a {
color: #0066cc;
text-decoration: none;
}
.footer a:hover {
text-decoration: underline;
}
</style>
<div class="wedding-container">
{{ partial "audio.html" . }}
<!-- Countdown Timer -->
<div class="countdown">
<h3>{{ i18n "countdown_title" }}</h3>
<p id="timer"></p>
</div>
<!-- Hero -->
<div class="hero">
<img src="/images/hochzeit-header.jpg" alt="Wedding Header Image">
<h1>{{ .Title }}</h1>
<div class="date">
{{ .Params.event.date | time | time.Format ":date_long" }}
</div>
</div>
<!-- Intro -->
{{ if .Content }}
<div class="section">
{{ .Content }}
</div>
{{ end }}
<!-- Event Details -->
<div class="section">
<h2>📅 {{ i18n "event_title" }}</h2>
{{ with .Params.event.date }}
<p>
<strong>{{ i18n "ceremony" }}:</strong>
{{ . | time | time.Format ":date_long" }}{{ with $.Params.event.ceremony_time }}, {{ i18n "ceremony_time" }} {{ . }}
{{ end }}
</p>
{{ end }}
{{ with .Params.event.reception_time }}
<p><strong>{{ i18n "reception" }}:</strong> {{ . }}</p>
{{ end }}
{{ with .Params.event.venue }}
<p><strong>{{ i18n "location" }}:</strong> {{ . }}</p>
{{ end }}
</div>
<!-- Map -->
{{ with .Params.event.map_embed }}
<div class="section map">
<h2>📍 {{ i18n "location" }}</h2>
{{ . | safeHTML }}
</div>
{{ end }}
<!-- <!-1- RSVP -1-> -->
<!-- <div class="section rsvp"> -->
<!-- <h2>📝 {{ i18n "rsvp_title" }}</h2> -->
<!-- {{ with .Params.rsvp.deadline }} -->
<!-- <p>{{ i18n "rsvp_deadline" }} <strong>{{ . }}</strong>.</p> -->
<!-- {{ end }} -->
<!-- {{ with .Params.rsvp.form }} -->
<!-- <p><a href="{{ . }}" target="_blank">{{ i18n "rsvp_form" }}</a></p> -->
<!-- {{ end }} -->
<!-- </div> -->
<!-- RSVP -->
<div class="section rsvp">
<h2>📝 {{ i18n "rsvp_title" }}</h2>
{{ with .Params.rsvp.deadline }}
<p>{{ i18n "rsvp_deadline" }} <strong>{{ . }}</strong>.</p>
{{ end }}
{{ with .Params.rsvp.email }}
<p>{{ i18n "rsvp_email" }}: {{ partial "obfuscate_email.html" . }}</p>
{{ end }}
<!-- RSVP Form -->
<form action="/rsvp-submit.php" method="POST">
<label for="first_name">{{ i18n "rsvp_firstname" }}:</label><br>
<input type="text" id="first_name" name="first_name" required><br><br>
<label for="last_name">{{ i18n "rsvp_lastname" }}:</label><br>
<input type="text" id="last_name" name="last_name" required><br><br>
<label>{{ i18n "rsvp_drinks" }}:</label><br>
<input type="checkbox" id="wine" name="drinks[]" value="Wine">
<label for="wine">{{ i18n "rsvp_drinks_wine" }}</label><br>
<input type="checkbox" id="beer" name="drinks[]" value="Beer">
<label for="beer">{{ i18n "rsvp_drinks_beer" }}</label><br>
<input type="checkbox" id="juice" name="drinks[]" value="Juice">
<label for="juice">{{ i18n "rsvp_drinks_juice" }}</label><br><br>
<label for="allergies">{{ i18n "rsvp_allergies" }}:</label><br>
<input type="text" id="allergies" name="allergies"><br><br>
<!-- optional but recommended: helps prevent spam bots -->
<input type="text" name="website" style="display:none">
<button type="submit">{{ i18n "rsvp_send" }}</button>
</form>
</div>
<!-- Extra Info -->
{{ with .Params.details }}
<div class="section">
<h2>️ {{ i18n "details_title" }}</h2>
<p>{{ . }}</p>
</div>
{{ end }}
<!-- Footer -->
<div class="footer">
<p>{{ i18n "footer_message" }}</p>
</div>
</div>
<script>
var labels = {
day: "{{ i18n "day" }}",
hour: "{{ i18n "hour" }}",
minute: "{{ i18n "minute" }}",
second: "{{ i18n "second" }}"
};
var countDownDate = new Date("{{ .Params.event.date }} {{ .Params.event.ceremony_time }}").getTime();
var x = setInterval(function() {
var now = new Date().getTime();
var distance = countDownDate - now;
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
document.getElementById("timer").innerHTML =
days + " " + labels.day + " " +
hours + " " + labels.hour + " " +
minutes + " " + labels.minute + " " +
seconds + " " + labels.second;
if (distance < 0) {
clearInterval(x);
document.getElementById("timer").innerHTML = "{{ i18n "big_day" }}";
}
}, 1000);
</script>
{{ end }}
+65
View File
@@ -0,0 +1,65 @@
<style>
.music-fab {
position: fixed;
bottom: 20px;
left: 20px;
z-index: 9999;
}
.fab-button {
width: 52px;
height: 52px;
border-radius: 50%;
border: none;
background: white;
box-shadow: 0 6px 18px rgba(0,0,0,0.2);
font-size: 20px;
cursor: pointer;
transition: transform 0.15s ease;
}
.fab-button:active {
transform: scale(0.95);
}
</style>
<div class="music-fab">
<button id="music-btn" class="fab-button">⏸️</button>
</div>
<audio id="bg-music" autoplay loop>
<source src="/audio/canon-in-d.mp3" type="audio/mpeg">
</audio>
<script>
const btn = document.getElementById("music-btn");
const audio = document.getElementById("bg-music");
audio.volume = 0.3;
// Initial state: assume autoplay started
let isPlaying = true;
btn.textContent = "⏸️"; // pause icon
// Handle autoplay blocked by some browsers
audio.play().catch(() => {
isPlaying = false;
btn.textContent = "▶️"; // play icon
});
btn.addEventListener("click", async () => {
if (!isPlaying) {
try {
await audio.play();
isPlaying = true;
btn.textContent = "⏸️"; // pause icon
} catch (e) {
console.log("Playback blocked:", e);
}
} else {
audio.pause();
isPlaying = false;
btn.textContent = "▶️"; // play icon
}
});
</script>
+17
View File
@@ -0,0 +1,17 @@
{{ $email := . }}
<span class="email"><b>{{ i18n "javascript" }}</b></span>
<script>
(function() {
var email = "{{ $email }}";
var user = email.split('@')[0];
var domain = email.split('@')[1];
var link = document.createElement('a');
link.href = 'mailto:' + user + '@' + domain;
link.textContent = user + '@' + domain;
// Replace the placeholder text with the actual link
var span = document.currentScript.previousElementSibling;
span.textContent = ""; // clear the fallback text
span.appendChild(link);
})();
</script>
+8
View File
@@ -0,0 +1,8 @@
// layouts/shortcodes/email.html
{{ $user := .Get "user" }}
{{ $domain := .Get "domain" }}
<script>
const e = '{{ $user }}' + '@' + '{{ $domain }}';
document.write('<a href="mailto:' + e + '">' + e + '</a>');
</script>
+2 -2
View File
@@ -136,14 +136,14 @@
<li class="navigation-item">
<a href="/ru/404.html">🇷🇺</a>
<a href="/de/404.html">🇩🇪</a>
</li>
<li class="navigation-item">
<a href="/de/404.html">🇩🇪</a>
<a href="/ru/404.html">🇷🇺</a>
</li>
BIN
View File
Binary file not shown.
+835
View File
@@ -0,0 +1,835 @@
body.colorscheme-dark {
color: #dadada;
background-color: #212121; }
body.colorscheme-dark a {
color: #42a5f5; }
body.colorscheme-dark h1,
body.colorscheme-dark h2,
body.colorscheme-dark h3,
body.colorscheme-dark h4,
body.colorscheme-dark h5,
body.colorscheme-dark h6 {
color: #dadada; }
body.colorscheme-dark h1:hover .heading-link,
body.colorscheme-dark h2:hover .heading-link,
body.colorscheme-dark h3:hover .heading-link,
body.colorscheme-dark h4:hover .heading-link,
body.colorscheme-dark h5:hover .heading-link,
body.colorscheme-dark h6:hover .heading-link {
visibility: visible; }
body.colorscheme-dark h1 .heading-link,
body.colorscheme-dark h2 .heading-link,
body.colorscheme-dark h3 .heading-link,
body.colorscheme-dark h4 .heading-link,
body.colorscheme-dark h5 .heading-link,
body.colorscheme-dark h6 .heading-link {
color: #42a5f5;
font-weight: inherit;
text-decoration: none;
font-size: 80%;
visibility: hidden; }
body.colorscheme-dark h1 .title-link,
body.colorscheme-dark h2 .title-link,
body.colorscheme-dark h3 .title-link,
body.colorscheme-dark h4 .title-link,
body.colorscheme-dark h5 .title-link,
body.colorscheme-dark h6 .title-link {
color: inherit;
font-weight: inherit;
text-decoration: none; }
body.colorscheme-dark pre code {
background-color: inherit;
color: inherit; }
body.colorscheme-dark code {
background-color: #4f4f4f;
color: #dadada; }
body.colorscheme-dark blockquote {
border-left: 2px solid #424242; }
body.colorscheme-dark th,
body.colorscheme-dark td {
padding: 1.6rem; }
body.colorscheme-dark table {
border-collapse: collapse; }
body.colorscheme-dark table td,
body.colorscheme-dark table th {
border: 2px solid #dadada; }
body.colorscheme-dark table tr:first-child th {
border-top: 0; }
body.colorscheme-dark table tr:last-child td {
border-bottom: 0; }
body.colorscheme-dark table tr td:first-child,
body.colorscheme-dark table tr th:first-child {
border-left: 0; }
body.colorscheme-dark table tr td:last-child,
body.colorscheme-dark table tr th:last-child {
border-right: 0; }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto {
color: #dadada;
background-color: #212121; }
body.colorscheme-auto a {
color: #42a5f5; }
body.colorscheme-auto h1,
body.colorscheme-auto h2,
body.colorscheme-auto h3,
body.colorscheme-auto h4,
body.colorscheme-auto h5,
body.colorscheme-auto h6 {
color: #dadada; }
body.colorscheme-auto h1:hover .heading-link,
body.colorscheme-auto h2:hover .heading-link,
body.colorscheme-auto h3:hover .heading-link,
body.colorscheme-auto h4:hover .heading-link,
body.colorscheme-auto h5:hover .heading-link,
body.colorscheme-auto h6:hover .heading-link {
visibility: visible; }
body.colorscheme-auto h1 .heading-link,
body.colorscheme-auto h2 .heading-link,
body.colorscheme-auto h3 .heading-link,
body.colorscheme-auto h4 .heading-link,
body.colorscheme-auto h5 .heading-link,
body.colorscheme-auto h6 .heading-link {
color: #42a5f5;
font-weight: inherit;
text-decoration: none;
font-size: 80%;
visibility: hidden; }
body.colorscheme-auto h1 .title-link,
body.colorscheme-auto h2 .title-link,
body.colorscheme-auto h3 .title-link,
body.colorscheme-auto h4 .title-link,
body.colorscheme-auto h5 .title-link,
body.colorscheme-auto h6 .title-link {
color: inherit;
font-weight: inherit;
text-decoration: none; }
body.colorscheme-auto pre code {
background-color: inherit;
color: inherit; }
body.colorscheme-auto code {
background-color: #4f4f4f;
color: #dadada; }
body.colorscheme-auto blockquote {
border-left: 2px solid #424242; }
body.colorscheme-auto th,
body.colorscheme-auto td {
padding: 1.6rem; }
body.colorscheme-auto table {
border-collapse: collapse; }
body.colorscheme-auto table td,
body.colorscheme-auto table th {
border: 2px solid #dadada; }
body.colorscheme-auto table tr:first-child th {
border-top: 0; }
body.colorscheme-auto table tr:last-child td {
border-bottom: 0; }
body.colorscheme-auto table tr td:first-child,
body.colorscheme-auto table tr th:first-child {
border-left: 0; }
body.colorscheme-auto table tr td:last-child,
body.colorscheme-auto table tr th:last-child {
border-right: 0; } }
body.colorscheme-dark .content .post .tags .tag {
background-color: #424242; }
body.colorscheme-dark .content .post .tags .tag a {
color: #dadada; }
body.colorscheme-dark .content .post .tags .tag a:active {
color: #dadada; }
body.colorscheme-dark .content .list ul li .title {
color: #dadada; }
body.colorscheme-dark .content .list ul li .title:hover, body.colorscheme-dark .content .list ul li .title:focus {
color: #42a5f5; }
body.colorscheme-dark .content .centered .about ul li a {
color: #dadada; }
body.colorscheme-dark .content .centered .about ul li a:hover, body.colorscheme-dark .content .centered .about ul li a:focus {
color: #42a5f5; }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto .content .post .tags .tag {
background-color: #424242; }
body.colorscheme-auto .content .post .tags .tag a {
color: #dadada; }
body.colorscheme-auto .content .post .tags .tag a:active {
color: #dadada; }
body.colorscheme-auto .content .list ul li .title {
color: #dadada; }
body.colorscheme-auto .content .list ul li .title:hover, body.colorscheme-auto .content .list ul li .title:focus {
color: #42a5f5; }
body.colorscheme-auto .content .centered .about ul li a {
color: #dadada; }
body.colorscheme-auto .content .centered .about ul li a:hover, body.colorscheme-auto .content .centered .about ul li a:focus {
color: #42a5f5; } }
body.colorscheme-dark .notice .notice-title {
border-bottom: 1px solid #212121; }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto .notice .notice-title {
border-bottom: 1px solid #212121; } }
body.colorscheme-dark .navigation a,
body.colorscheme-dark .navigation span {
color: #dadada; }
body.colorscheme-dark .navigation a:hover, body.colorscheme-dark .navigation a:focus {
color: #42a5f5; }
@media only screen and (max-width: 768px) {
body.colorscheme-dark .navigation .navigation-list {
background-color: #212121;
border-top: solid 2px #424242;
border-bottom: solid 2px #424242; } }
@media only screen and (max-width: 768px) {
body.colorscheme-dark .navigation .navigation-list .menu-separator {
border-top: 2px solid #dadada; } }
@media only screen and (max-width: 768px) {
body.colorscheme-dark .navigation #menu-toggle:checked + label > i {
color: #424242; } }
body.colorscheme-dark .navigation i {
color: #dadada; }
body.colorscheme-dark .navigation i:hover, body.colorscheme-dark .navigation i:focus {
color: #42a5f5; }
body.colorscheme-dark .navigation .menu-button i:hover, body.colorscheme-dark .navigation .menu-button i:focus {
color: #dadada; }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto .navigation a,
body.colorscheme-auto .navigation span {
color: #dadada; }
body.colorscheme-auto .navigation a:hover, body.colorscheme-auto .navigation a:focus {
color: #42a5f5; } }
@media only screen and (prefers-color-scheme: dark) and (max-width: 768px) {
body.colorscheme-auto .navigation .navigation-list {
background-color: #212121;
border-top: solid 2px #424242;
border-bottom: solid 2px #424242; } }
@media only screen and (prefers-color-scheme: dark) and (max-width: 768px) {
body.colorscheme-auto .navigation .navigation-list .menu-separator {
border-top: 2px solid #dadada; } }
@media only screen and (prefers-color-scheme: dark) and (max-width: 768px) {
body.colorscheme-auto .navigation #menu-toggle:checked + label > i {
color: #424242; } }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto .navigation i {
color: #dadada; }
body.colorscheme-auto .navigation i:hover, body.colorscheme-auto .navigation i:focus {
color: #42a5f5; }
body.colorscheme-auto .navigation .menu-button i:hover, body.colorscheme-auto .navigation .menu-button i:focus {
color: #dadada; } }
body.colorscheme-dark .tabs label.tab-label {
background-color: #424242;
border-color: #4f4f4f; }
body.colorscheme-dark .tabs input.tab-input:checked + label.tab-label {
background-color: #212121; }
body.colorscheme-dark .tabs .tab-content {
background-color: #212121;
border-color: #4f4f4f; }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto .tabs label.tab-label {
background-color: #424242;
border-color: #4f4f4f; }
body.colorscheme-auto .tabs input.tab-input:checked + label.tab-label {
background-color: #212121; }
body.colorscheme-auto .tabs .tab-content {
background-color: #212121;
border-color: #4f4f4f; } }
body.colorscheme-dark .taxonomy-element {
background-color: #424242; }
body.colorscheme-dark .taxonomy-element a {
color: #dadada; }
body.colorscheme-dark .taxonomy-element a:active {
color: #dadada; }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto .taxonomy-element {
background-color: #424242; }
body.colorscheme-auto .taxonomy-element a {
color: #dadada; }
body.colorscheme-auto .taxonomy-element a:active {
color: #dadada; } }
body.colorscheme-dark .footer a {
color: #42a5f5; }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto .footer a {
color: #42a5f5; } }
body.colorscheme-dark .float-container a {
color: #dadada;
background-color: #424242; }
body.colorscheme-dark .float-container a:hover, body.colorscheme-dark .float-container a:focus {
color: #42a5f5; }
@media only screen and (max-width: 768px) {
body.colorscheme-dark .float-container a:hover, body.colorscheme-dark .float-container a:focus {
color: #dadada; } }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto .float-container a {
color: #dadada;
background-color: #424242; }
body.colorscheme-auto .float-container a:hover, body.colorscheme-auto .float-container a:focus {
color: #42a5f5; } }
@media only screen and (prefers-color-scheme: dark) and (max-width: 768px) {
body.colorscheme-auto .float-container a:hover, body.colorscheme-auto .float-container a:focus {
color: #dadada; } }
body.colorscheme-dark {
/* Background */
/* PreWrapper */
/* Other */
/* Error */
/* CodeLine */
/* LineLink */
/* LineTableTD */
/* LineTable */
/* LineHighlight */
/* LineNumbersTable */
/* LineNumbers */
/* Line */
/* Keyword */
/* KeywordConstant */
/* KeywordDeclaration */
/* KeywordNamespace */
/* KeywordPseudo */
/* KeywordReserved */
/* KeywordType */
/* Name */
/* NameAttribute */
/* NameBuiltin */
/* NameBuiltinPseudo */
/* NameClass */
/* NameConstant */
/* NameDecorator */
/* NameEntity */
/* NameException */
/* NameFunction */
/* NameFunctionMagic */
/* NameLabel */
/* NameNamespace */
/* NameOther */
/* NameProperty */
/* NameTag */
/* NameVariable */
/* NameVariableClass */
/* NameVariableGlobal */
/* NameVariableInstance */
/* NameVariableMagic */
/* Literal */
/* LiteralDate */
/* LiteralString */
/* LiteralStringAffix */
/* LiteralStringBacktick */
/* LiteralStringChar */
/* LiteralStringDelimiter */
/* LiteralStringDoc */
/* LiteralStringDouble */
/* LiteralStringEscape */
/* LiteralStringHeredoc */
/* LiteralStringInterpol */
/* LiteralStringOther */
/* LiteralStringRegex */
/* LiteralStringSingle */
/* LiteralStringSymbol */
/* LiteralNumber */
/* LiteralNumberBin */
/* LiteralNumberFloat */
/* LiteralNumberHex */
/* LiteralNumberInteger */
/* LiteralNumberIntegerLong */
/* LiteralNumberOct */
/* Operator */
/* OperatorWord */
/* Punctuation */
/* Comment */
/* CommentHashbang */
/* CommentMultiline */
/* CommentSingle */
/* CommentSpecial */
/* CommentPreproc */
/* CommentPreprocFile */
/* Generic */
/* GenericDeleted */
/* GenericEmph */
/* GenericError */
/* GenericHeading */
/* GenericInserted */
/* GenericOutput */
/* GenericPrompt */
/* GenericStrong */
/* GenericSubheading */
/* GenericTraceback */
/* GenericUnderline */
/* TextWhitespace */ }
body.colorscheme-dark .bg {
color: #c9d1d9;
background-color: #0d1117; }
body.colorscheme-dark .chroma {
color: #c9d1d9;
background-color: #0d1117; }
body.colorscheme-dark .chroma .err {
color: #f85149; }
body.colorscheme-dark .chroma .lnlinks {
outline: none;
text-decoration: none;
color: inherit; }
body.colorscheme-dark .chroma .lntd {
vertical-align: top;
padding: 0;
margin: 0;
border: 0; }
body.colorscheme-dark .chroma .lntable {
border-spacing: 0;
padding: 0;
margin: 0;
border: 0; }
body.colorscheme-dark .chroma .hl {
background-color: #ffffcc; }
body.colorscheme-dark .chroma .lnt {
white-space: pre;
user-select: none;
margin-right: 0.4em;
padding: 0 0.4em 0 0.4em;
color: #64686c; }
body.colorscheme-dark .chroma .ln {
white-space: pre;
user-select: none;
margin-right: 0.4em;
padding: 0 0.4em 0 0.4em;
color: #6e7681; }
body.colorscheme-dark .chroma .line {
display: flex; }
body.colorscheme-dark .chroma .k {
color: #ff7b72; }
body.colorscheme-dark .chroma .kc {
color: #79c0ff; }
body.colorscheme-dark .chroma .kd {
color: #ff7b72; }
body.colorscheme-dark .chroma .kn {
color: #ff7b72; }
body.colorscheme-dark .chroma .kp {
color: #79c0ff; }
body.colorscheme-dark .chroma .kr {
color: #ff7b72; }
body.colorscheme-dark .chroma .kt {
color: #ff7b72; }
body.colorscheme-dark .chroma .nc {
color: #f0883e;
font-weight: bold; }
body.colorscheme-dark .chroma .no {
color: #79c0ff;
font-weight: bold; }
body.colorscheme-dark .chroma .nd {
color: #d2a8ff;
font-weight: bold; }
body.colorscheme-dark .chroma .ni {
color: #ffa657; }
body.colorscheme-dark .chroma .ne {
color: #f0883e;
font-weight: bold; }
body.colorscheme-dark .chroma .nf {
color: #d2a8ff;
font-weight: bold; }
body.colorscheme-dark .chroma .nl {
color: #79c0ff;
font-weight: bold; }
body.colorscheme-dark .chroma .nn {
color: #ff7b72; }
body.colorscheme-dark .chroma .py {
color: #79c0ff; }
body.colorscheme-dark .chroma .nt {
color: #7ee787; }
body.colorscheme-dark .chroma .nv {
color: #79c0ff; }
body.colorscheme-dark .chroma .l {
color: #a5d6ff; }
body.colorscheme-dark .chroma .ld {
color: #79c0ff; }
body.colorscheme-dark .chroma .s {
color: #a5d6ff; }
body.colorscheme-dark .chroma .sa {
color: #79c0ff; }
body.colorscheme-dark .chroma .sb {
color: #a5d6ff; }
body.colorscheme-dark .chroma .sc {
color: #a5d6ff; }
body.colorscheme-dark .chroma .dl {
color: #79c0ff; }
body.colorscheme-dark .chroma .sd {
color: #a5d6ff; }
body.colorscheme-dark .chroma .s2 {
color: #a5d6ff; }
body.colorscheme-dark .chroma .se {
color: #79c0ff; }
body.colorscheme-dark .chroma .sh {
color: #79c0ff; }
body.colorscheme-dark .chroma .si {
color: #a5d6ff; }
body.colorscheme-dark .chroma .sx {
color: #a5d6ff; }
body.colorscheme-dark .chroma .sr {
color: #79c0ff; }
body.colorscheme-dark .chroma .s1 {
color: #a5d6ff; }
body.colorscheme-dark .chroma .ss {
color: #a5d6ff; }
body.colorscheme-dark .chroma .m {
color: #a5d6ff; }
body.colorscheme-dark .chroma .mb {
color: #a5d6ff; }
body.colorscheme-dark .chroma .mf {
color: #a5d6ff; }
body.colorscheme-dark .chroma .mh {
color: #a5d6ff; }
body.colorscheme-dark .chroma .mi {
color: #a5d6ff; }
body.colorscheme-dark .chroma .il {
color: #a5d6ff; }
body.colorscheme-dark .chroma .mo {
color: #a5d6ff; }
body.colorscheme-dark .chroma .o {
color: #ff7b72;
font-weight: bold; }
body.colorscheme-dark .chroma .ow {
color: #ff7b72;
font-weight: bold; }
body.colorscheme-dark .chroma .c {
color: #8b949e;
font-style: italic; }
body.colorscheme-dark .chroma .ch {
color: #8b949e;
font-style: italic; }
body.colorscheme-dark .chroma .cm {
color: #8b949e;
font-style: italic; }
body.colorscheme-dark .chroma .c1 {
color: #8b949e;
font-style: italic; }
body.colorscheme-dark .chroma .cs {
color: #8b949e;
font-weight: bold;
font-style: italic; }
body.colorscheme-dark .chroma .cp {
color: #8b949e;
font-weight: bold;
font-style: italic; }
body.colorscheme-dark .chroma .cpf {
color: #8b949e;
font-weight: bold;
font-style: italic; }
body.colorscheme-dark .chroma .gd {
color: #ffa198;
background-color: #490202; }
body.colorscheme-dark .chroma .ge {
font-style: italic; }
body.colorscheme-dark .chroma .gr {
color: #ffa198; }
body.colorscheme-dark .chroma .gh {
color: #79c0ff;
font-weight: bold; }
body.colorscheme-dark .chroma .gi {
color: #56d364;
background-color: #0f5323; }
body.colorscheme-dark .chroma .go {
color: #8b949e; }
body.colorscheme-dark .chroma .gp {
color: #8b949e; }
body.colorscheme-dark .chroma .gs {
font-weight: bold; }
body.colorscheme-dark .chroma .gu {
color: #79c0ff; }
body.colorscheme-dark .chroma .gt {
color: #ff7b72; }
body.colorscheme-dark .chroma .gl {
text-decoration: underline; }
body.colorscheme-dark .chroma .w {
color: #6e7681; }
@media (prefers-color-scheme: dark) {
body.colorscheme-auto {
/* Background */
/* PreWrapper */
/* Other */
/* Error */
/* CodeLine */
/* LineLink */
/* LineTableTD */
/* LineTable */
/* LineHighlight */
/* LineNumbersTable */
/* LineNumbers */
/* Line */
/* Keyword */
/* KeywordConstant */
/* KeywordDeclaration */
/* KeywordNamespace */
/* KeywordPseudo */
/* KeywordReserved */
/* KeywordType */
/* Name */
/* NameAttribute */
/* NameBuiltin */
/* NameBuiltinPseudo */
/* NameClass */
/* NameConstant */
/* NameDecorator */
/* NameEntity */
/* NameException */
/* NameFunction */
/* NameFunctionMagic */
/* NameLabel */
/* NameNamespace */
/* NameOther */
/* NameProperty */
/* NameTag */
/* NameVariable */
/* NameVariableClass */
/* NameVariableGlobal */
/* NameVariableInstance */
/* NameVariableMagic */
/* Literal */
/* LiteralDate */
/* LiteralString */
/* LiteralStringAffix */
/* LiteralStringBacktick */
/* LiteralStringChar */
/* LiteralStringDelimiter */
/* LiteralStringDoc */
/* LiteralStringDouble */
/* LiteralStringEscape */
/* LiteralStringHeredoc */
/* LiteralStringInterpol */
/* LiteralStringOther */
/* LiteralStringRegex */
/* LiteralStringSingle */
/* LiteralStringSymbol */
/* LiteralNumber */
/* LiteralNumberBin */
/* LiteralNumberFloat */
/* LiteralNumberHex */
/* LiteralNumberInteger */
/* LiteralNumberIntegerLong */
/* LiteralNumberOct */
/* Operator */
/* OperatorWord */
/* Punctuation */
/* Comment */
/* CommentHashbang */
/* CommentMultiline */
/* CommentSingle */
/* CommentSpecial */
/* CommentPreproc */
/* CommentPreprocFile */
/* Generic */
/* GenericDeleted */
/* GenericEmph */
/* GenericError */
/* GenericHeading */
/* GenericInserted */
/* GenericOutput */
/* GenericPrompt */
/* GenericStrong */
/* GenericSubheading */
/* GenericTraceback */
/* GenericUnderline */
/* TextWhitespace */ }
body.colorscheme-auto .bg {
color: #c9d1d9;
background-color: #0d1117; }
body.colorscheme-auto .chroma {
color: #c9d1d9;
background-color: #0d1117; }
body.colorscheme-auto .chroma .err {
color: #f85149; }
body.colorscheme-auto .chroma .lnlinks {
outline: none;
text-decoration: none;
color: inherit; }
body.colorscheme-auto .chroma .lntd {
vertical-align: top;
padding: 0;
margin: 0;
border: 0; }
body.colorscheme-auto .chroma .lntable {
border-spacing: 0;
padding: 0;
margin: 0;
border: 0; }
body.colorscheme-auto .chroma .hl {
background-color: #ffffcc; }
body.colorscheme-auto .chroma .lnt {
white-space: pre;
user-select: none;
margin-right: 0.4em;
padding: 0 0.4em 0 0.4em;
color: #64686c; }
body.colorscheme-auto .chroma .ln {
white-space: pre;
user-select: none;
margin-right: 0.4em;
padding: 0 0.4em 0 0.4em;
color: #6e7681; }
body.colorscheme-auto .chroma .line {
display: flex; }
body.colorscheme-auto .chroma .k {
color: #ff7b72; }
body.colorscheme-auto .chroma .kc {
color: #79c0ff; }
body.colorscheme-auto .chroma .kd {
color: #ff7b72; }
body.colorscheme-auto .chroma .kn {
color: #ff7b72; }
body.colorscheme-auto .chroma .kp {
color: #79c0ff; }
body.colorscheme-auto .chroma .kr {
color: #ff7b72; }
body.colorscheme-auto .chroma .kt {
color: #ff7b72; }
body.colorscheme-auto .chroma .nc {
color: #f0883e;
font-weight: bold; }
body.colorscheme-auto .chroma .no {
color: #79c0ff;
font-weight: bold; }
body.colorscheme-auto .chroma .nd {
color: #d2a8ff;
font-weight: bold; }
body.colorscheme-auto .chroma .ni {
color: #ffa657; }
body.colorscheme-auto .chroma .ne {
color: #f0883e;
font-weight: bold; }
body.colorscheme-auto .chroma .nf {
color: #d2a8ff;
font-weight: bold; }
body.colorscheme-auto .chroma .nl {
color: #79c0ff;
font-weight: bold; }
body.colorscheme-auto .chroma .nn {
color: #ff7b72; }
body.colorscheme-auto .chroma .py {
color: #79c0ff; }
body.colorscheme-auto .chroma .nt {
color: #7ee787; }
body.colorscheme-auto .chroma .nv {
color: #79c0ff; }
body.colorscheme-auto .chroma .l {
color: #a5d6ff; }
body.colorscheme-auto .chroma .ld {
color: #79c0ff; }
body.colorscheme-auto .chroma .s {
color: #a5d6ff; }
body.colorscheme-auto .chroma .sa {
color: #79c0ff; }
body.colorscheme-auto .chroma .sb {
color: #a5d6ff; }
body.colorscheme-auto .chroma .sc {
color: #a5d6ff; }
body.colorscheme-auto .chroma .dl {
color: #79c0ff; }
body.colorscheme-auto .chroma .sd {
color: #a5d6ff; }
body.colorscheme-auto .chroma .s2 {
color: #a5d6ff; }
body.colorscheme-auto .chroma .se {
color: #79c0ff; }
body.colorscheme-auto .chroma .sh {
color: #79c0ff; }
body.colorscheme-auto .chroma .si {
color: #a5d6ff; }
body.colorscheme-auto .chroma .sx {
color: #a5d6ff; }
body.colorscheme-auto .chroma .sr {
color: #79c0ff; }
body.colorscheme-auto .chroma .s1 {
color: #a5d6ff; }
body.colorscheme-auto .chroma .ss {
color: #a5d6ff; }
body.colorscheme-auto .chroma .m {
color: #a5d6ff; }
body.colorscheme-auto .chroma .mb {
color: #a5d6ff; }
body.colorscheme-auto .chroma .mf {
color: #a5d6ff; }
body.colorscheme-auto .chroma .mh {
color: #a5d6ff; }
body.colorscheme-auto .chroma .mi {
color: #a5d6ff; }
body.colorscheme-auto .chroma .il {
color: #a5d6ff; }
body.colorscheme-auto .chroma .mo {
color: #a5d6ff; }
body.colorscheme-auto .chroma .o {
color: #ff7b72;
font-weight: bold; }
body.colorscheme-auto .chroma .ow {
color: #ff7b72;
font-weight: bold; }
body.colorscheme-auto .chroma .c {
color: #8b949e;
font-style: italic; }
body.colorscheme-auto .chroma .ch {
color: #8b949e;
font-style: italic; }
body.colorscheme-auto .chroma .cm {
color: #8b949e;
font-style: italic; }
body.colorscheme-auto .chroma .c1 {
color: #8b949e;
font-style: italic; }
body.colorscheme-auto .chroma .cs {
color: #8b949e;
font-weight: bold;
font-style: italic; }
body.colorscheme-auto .chroma .cp {
color: #8b949e;
font-weight: bold;
font-style: italic; }
body.colorscheme-auto .chroma .cpf {
color: #8b949e;
font-weight: bold;
font-style: italic; }
body.colorscheme-auto .chroma .gd {
color: #ffa198;
background-color: #490202; }
body.colorscheme-auto .chroma .ge {
font-style: italic; }
body.colorscheme-auto .chroma .gr {
color: #ffa198; }
body.colorscheme-auto .chroma .gh {
color: #79c0ff;
font-weight: bold; }
body.colorscheme-auto .chroma .gi {
color: #56d364;
background-color: #0f5323; }
body.colorscheme-auto .chroma .go {
color: #8b949e; }
body.colorscheme-auto .chroma .gp {
color: #8b949e; }
body.colorscheme-auto .chroma .gs {
font-weight: bold; }
body.colorscheme-auto .chroma .gu {
color: #79c0ff; }
body.colorscheme-auto .chroma .gt {
color: #ff7b72; }
body.colorscheme-auto .chroma .gl {
text-decoration: underline; }
body.colorscheme-auto .chroma .w {
color: #6e7681; } }
/*# sourceMappingURL=coder-dark.css.map */
File diff suppressed because one or more lines are too long
+11498
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -137,14 +137,14 @@
<li class="navigation-item">
<a href="/ru/categories/">🇷🇺</a>
<a href="/categories/">🇬🇧</a>
</li>
<li class="navigation-item">
<a href="/categories/">🇬🇧</a>
<a href="/ru/categories/">🇷🇺</a>
</li>
+9
View File
@@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="de">
<head>
<title>http://markinstefan.xyz/de/hochzeit/</title>
<link rel="canonical" href="http://markinstefan.xyz/de/hochzeit/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://markinstefan.xyz/de/hochzeit/">
</head>
</html>
+544
View File
@@ -0,0 +1,544 @@
<!DOCTYPE html>
<html lang="de">
<head>
<title>Markin Stefan</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="light dark">
<meta name="author" content="Markin Stefan">
<meta name="description" content="Wir freuen uns, Euch zu unserer Hochzeit von Stefan und Mariia einzuladen!
Feiern Sie mit uns diesen besonderen Tag voller Liebe, Freude und wundervoller Erinnerungen!
Wir freuen uns darauf, Sie dort zu sehen!">
<meta name="keywords" content="blog,desenvolvedor,pessoal">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Hochzeit von Stefan und Mariia">
<meta name="twitter:description" content="Wir freuen uns, Euch zu unserer Hochzeit von Stefan und Mariia einzuladen!
Feiern Sie mit uns diesen besonderen Tag voller Liebe, Freude und wundervoller Erinnerungen!
Wir freuen uns darauf, Sie dort zu sehen!">
<meta property="og:url" content="http://markinstefan.xyz/de/hochzeit/">
<meta property="og:site_name" content="Markin Stefan">
<meta property="og:title" content="Hochzeit von Stefan und Mariia">
<meta property="og:description" content="Wir freuen uns, Euch zu unserer Hochzeit von Stefan und Mariia einzuladen!
Feiern Sie mit uns diesen besonderen Tag voller Liebe, Freude und wundervoller Erinnerungen!
Wir freuen uns darauf, Sie dort zu sehen!">
<meta property="og:locale" content="de">
<meta property="og:type" content="article">
<link rel="canonical" href="http://markinstefan.xyz/de/hochzeit/">
<link rel="preload" href="/fonts/fa-brands-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/fa-regular-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/fa-solid-900.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/css/coder.min.f6b1b35a7b02521b25338f6cf58975f9980a6c12847763fe35a48307758cd1e7.css" integrity="sha256-9rGzWnsCUhslM49s9Yl1&#43;ZgKbBKEd2P&#43;NaSDB3WM0ec=" crossorigin="anonymous" media="screen" />
<link rel="stylesheet" href="/css/coder-dark.min.ad48f476275974885bdc03d5251e3cdbe1678c54a63ff772376b0ed2adc468dd.css" integrity="sha256-rUj0didZdIhb3APVJR482&#43;FnjFSmP/dyN2sO0q3EaN0=" crossorigin="anonymous" media="screen" />
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" sizes="any">
<link rel="icon" type="image/png" href="/images/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/images/favicon-16x16.png" sizes="16x16">
<link rel="apple-touch-icon" href="/images/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/images/safari-pinned-tab.svg" color="#5bbad5">
</head>
<body class="preload-transitions colorscheme-auto">
<div class="float-container">
<a id="dark-mode-toggle" class="colorscheme-toggle">
<i class="fa-solid fa-adjust fa-fw" aria-hidden="true"></i>
</a>
</div>
<main class="wrapper">
<nav class="navigation">
<section class="container">
<a class="navigation-title" href="http://markinstefan.xyz/de/">
Markin Stefan
</a>
<input type="checkbox" id="menu-toggle" />
<label class="menu-button float-right" for="menu-toggle">
<i class="fa-solid fa-bars fa-fw" aria-hidden="true"></i>
</label>
<ul class="navigation-list">
<li class="navigation-item">
<a class="navigation-link " href="/de/about/">Über mich</a>
</li>
<li class="navigation-item">
<a class="navigation-link " href="/de/projects/">Projekte</a>
</li>
<li class="navigation-item">
<a class="navigation-link " href="/de/contact/">Kontakt</a>
</li>
<li class="navigation-item menu-separator">
<span>|</span>
</li>
<li class="navigation-item">
<a href="/wedding/">🇬🇧</a>
</li>
<li class="navigation-item">
<a href="/ru/svadba/">🇷🇺</a>
</li>
</ul>
</section>
</nav>
<div class="content">
<style>
body {
background-color: #fff;
color: #222;
background-image: url('/images/hochzeit-bg.jpg');
background-size: cover;
background-position: center;
background-repeat: repeat;
border-radius: 8px;
}
.wedding-container {
max-width: 1600px;
margin: 0 auto;
padding: 2rem;
font-family: system-ui, sans-serif;
line-height: 1.6;
}
.hero {
text-align: center;
margin-bottom: 3rem;
}
.hero img {
width: 100%;
border-radius: 8px;
}
.hero h1 {
font-size: 2.5rem;
margin-bottom: 0.5rem;
}
.hero .date {
font-size: 1.2rem;
color: #666;
}
.section {
margin-bottom: 2.5rem;
}
.section h2 {
font-size: 1.5rem;
margin-bottom: 0.5rem;
border-bottom: 1px solid #eee;
padding-bottom: 0.3rem;
}
.map iframe {
width: 100%;
background-color: rgba(255, 255, 255, 0.5);
padding: 1rem;
height: 400px;
border: 0;
border-radius: 8px;
}
.rsvp {
background-color: rgba(255, 255, 255, 0.8);
padding: 1rem;
border-radius: 8px;
}
.countdown {
text-align: center; margin-bottom: 2rem;
font-size: 5rem;
}
.footer {
text-align: center;
margin-top: 3rem;
color: #888;
font-size: 2rem;
padding-top: 1rem;
}
.footer a {
color: #0066cc;
text-decoration: none;
}
.footer a:hover {
text-decoration: underline;
}
</style>
<div class="wedding-container">
<style>
.music-fab {
position: fixed;
bottom: 20px;
left: 20px;
z-index: 9999;
}
.fab-button {
width: 52px;
height: 52px;
border-radius: 50%;
border: none;
background: white;
box-shadow: 0 6px 18px rgba(0,0,0,0.2);
font-size: 20px;
cursor: pointer;
transition: transform 0.15s ease;
}
.fab-button:active {
transform: scale(0.95);
}
</style>
<div class="music-fab">
<button id="music-btn" class="fab-button">⏸️</button>
</div>
<audio id="bg-music" autoplay loop>
<source src="/audio/canon-in-d.mp3" type="audio/mpeg">
</audio>
<script>
const btn = document.getElementById("music-btn");
const audio = document.getElementById("bg-music");
audio.volume = 0.3;
let isPlaying = true;
btn.textContent = "⏸️";
audio.play().catch(() => {
isPlaying = false;
btn.textContent = "▶️";
});
btn.addEventListener("click", async () => {
if (!isPlaying) {
try {
await audio.play();
isPlaying = true;
btn.textContent = "⏸️";
} catch (e) {
console.log("Playback blocked:", e);
}
} else {
audio.pause();
isPlaying = false;
btn.textContent = "▶️";
}
});
</script>
<div class="countdown">
<h3>Countdown zu unserer Hochzeit:</h3>
<p id="timer"></p>
</div>
<div class="hero">
<img src="/images/hochzeit-header.jpg" alt="Wedding Header Image">
<h1>Hochzeit von Stefan und Mariia</h1>
<div class="date">
31. August 2026
</div>
</div>
<div class="section">
<p>Wir freuen uns, Euch zu unserer Hochzeit von Stefan und Mariia einzuladen!</p>
<p>Feiern Sie mit uns diesen besonderen Tag voller Liebe, Freude und wundervoller Erinnerungen!</p>
<p>Wir freuen uns darauf, Sie dort zu sehen!</p>
</div>
<div class="section">
<h2>📅 Veranstaltung</h2>
<p>
<strong>Zeremonie:</strong>
31. August 2026, um 14:00
</p>
<p><strong>Empfang:</strong> 17:00</p>
<p><strong>Ort:</strong> München, Deutschland</p>
</div>
<div class="section map">
<h2>📍 Ort</h2>
<iframe src="https://www.google.com/maps?q=Russische+Orthodoxe+Kirche+Auferstehungs-Gemeinde+Dachau+M%C3%BCnchen&hl=de&z=19&output=embed" width="600" height="450" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>
</div>
<div class="section rsvp">
<h2>📝 RSVP</h2>
<p>Bitte antworten bis <strong>30. Juni</strong>.</p>
<p>E-Mail:
<span class="email"><b>Bitte erlauben Sie JavaScript um diesen Inhalt zu sehen.</b></span>
<script>
(function() {
var email = "hochzeit@markinstefan.xyz";
var user = email.split('@')[0];
var domain = email.split('@')[1];
var link = document.createElement('a');
link.href = 'mailto:' + user + '@' + domain;
link.textContent = user + '@' + domain;
var span = document.currentScript.previousElementSibling;
span.textContent = "";
span.appendChild(link);
})();
</script>
</p>
<form action="/rsvp-submit.php" method="POST">
<label for="first_name">Vorname:</label><br>
<input type="text" id="first_name" name="first_name" required><br><br>
<label for="last_name">Nachname:</label><br>
<input type="text" id="last_name" name="last_name" required><br><br>
<label>Getränkevorlieben:</label><br>
<input type="checkbox" id="wine" name="drinks[]" value="Wine">
<label for="wine">Wein</label><br>
<input type="checkbox" id="beer" name="drinks[]" value="Beer">
<label for="beer">Bier</label><br>
<input type="checkbox" id="juice" name="drinks[]" value="Juice">
<label for="juice">Saft</label><br><br>
<label for="allergies">Allergisch auf:</label><br>
<input type="text" id="allergies" name="allergies"><br><br>
<input type="text" name="website" style="display:none">
<button type="submit">Abschicken</button>
</form>
</div>
<div class="footer">
<p>Wir freuen uns darauf, mit euch zu feiern ❤️</p>
</div>
</div>
<script>
var labels = {
day: "T",
hour: "Std",
minute: "min",
second: "s"
};
var countDownDate = new Date("2026-08-31 14:00").getTime();
var x = setInterval(function() {
var now = new Date().getTime();
var distance = countDownDate - now;
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
document.getElementById("timer").innerHTML =
days + " " + labels.day + " " +
hours + " " + labels.hour + " " +
minutes + " " + labels.minute + " " +
seconds + " " + labels.second;
if (distance < 0) {
clearInterval(x);
document.getElementById("timer").innerHTML = "Der große Tag ist da!";
}
}, 1000);
</script>
</div>
<footer class="footer">
<section class="container">
©
2026
Markin Stefan
·
Gestaltet mit <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> & <a href="https://github.com/luizdepra/hugo-coder/" target="_blank" rel="noopener">Coder</a>.
</section>
</footer>
</main>
<script src="/js/coder.min.6ae284be93d2d19dad1f02b0039508d9aab3180a12a06dcc71b0b0ef7825a317.js" integrity="sha256-auKEvpPS0Z2tHwKwA5UI2aqzGAoSoG3McbCw73gloxc="></script>
</body>
</html>
+29 -1
View File
@@ -74,7 +74,7 @@
<link rel="alternate" type="application/rss+xml" href="/de/index.xml" title="Markin Stefan" />
<meta name="generator" content="Hugo 0.160.1">
<meta name="generator" content="Hugo 0.161.0">
@@ -175,6 +175,34 @@
<ul>
<li>
<a href="https://git.netinfection.xyz/iroxol" aria-label="Gitea" >
<i class="fa-brands fa-git-alt fa-2x" aria-hidden="true"></i>
</a>
</li>
<li>
<a href="contact" aria-label="Email" >
<i class="fa-solid fa-envelope fa-2x" aria-hidden="true"></i>
</a>
</li>
<li>
<a href="xmpp:iroxol@netinfection.xyz" aria-label="XMPP" >
<i class="fa-solid fa-comment-dots fa-2x" aria-hidden="true"></i>
</a>
</li>
</ul>
</div>
+7
View File
@@ -7,6 +7,13 @@
<generator>Hugo</generator>
<language>de</language>
<atom:link href="http://markinstefan.xyz/de/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Hochzeit von Stefan und Mariia</title>
<link>http://markinstefan.xyz/de/hochzeit/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>http://markinstefan.xyz/de/hochzeit/</guid>
<description>&lt;p&gt;Wir freuen uns, Euch zu unserer Hochzeit von Stefan und Mariia einzuladen!&lt;/p&gt;&#xA;&lt;p&gt;Feiern Sie mit uns diesen besonderen Tag voller Liebe, Freude und wundervoller Erinnerungen!&lt;/p&gt;&#xA;&lt;p&gt;Wir freuen uns darauf, Sie dort zu sehen!&lt;/p&gt;</description>
</item>
<item>
<title>Kontakt</title>
<link>http://markinstefan.xyz/de/contact/</link>
+9
View File
@@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="de">
<head>
<title>http://markinstefan.xyz/de/hochzeit/</title>
<link rel="canonical" href="http://markinstefan.xyz/de/hochzeit/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://markinstefan.xyz/de/hochzeit/">
</head>
</html>
+2 -2
View File
@@ -137,14 +137,14 @@
<li class="navigation-item">
<a href="/series/">🇬🇧</a>
<a href="/ru/series/">🇷🇺</a>
</li>
<li class="navigation-item">
<a href="/ru/series/">🇷🇺</a>
<a href="/series/">🇬🇧</a>
</li>
+26 -9
View File
@@ -20,21 +20,38 @@
/>
</url><url>
<loc>http://markinstefan.xyz/de/categories/</loc>
<xhtml:link
rel="alternate"
hreflang="ru"
href="http://markinstefan.xyz/ru/categories/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="http://markinstefan.xyz/categories/"
/>
<xhtml:link
rel="alternate"
hreflang="ru"
href="http://markinstefan.xyz/ru/categories/"
/>
<xhtml:link
rel="alternate"
hreflang="de"
href="http://markinstefan.xyz/de/categories/"
/>
</url><url>
<loc>http://markinstefan.xyz/de/hochzeit/</loc>
<xhtml:link
rel="alternate"
hreflang="en"
href="http://markinstefan.xyz/wedding/"
/>
<xhtml:link
rel="alternate"
hreflang="ru"
href="http://markinstefan.xyz/ru/svadba/"
/>
<xhtml:link
rel="alternate"
hreflang="de"
href="http://markinstefan.xyz/de/hochzeit/"
/>
</url><url>
<loc>http://markinstefan.xyz/de/contact/</loc>
<xhtml:link
@@ -73,13 +90,13 @@
<loc>http://markinstefan.xyz/de/series/</loc>
<xhtml:link
rel="alternate"
hreflang="en"
href="http://markinstefan.xyz/series/"
hreflang="ru"
href="http://markinstefan.xyz/ru/series/"
/>
<xhtml:link
rel="alternate"
hreflang="ru"
href="http://markinstefan.xyz/ru/series/"
hreflang="en"
href="http://markinstefan.xyz/series/"
/>
<xhtml:link
rel="alternate"
+21 -4
View File
@@ -69,6 +69,23 @@
hreflang="en"
href="http://markinstefan.xyz/"
/>
</url><url>
<loc>http://markinstefan.xyz/wedding/</loc>
<xhtml:link
rel="alternate"
hreflang="de"
href="http://markinstefan.xyz/de/hochzeit/"
/>
<xhtml:link
rel="alternate"
hreflang="ru"
href="http://markinstefan.xyz/ru/svadba/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="http://markinstefan.xyz/wedding/"
/>
</url><url>
<loc>http://markinstefan.xyz/about/</loc>
<xhtml:link
@@ -124,13 +141,13 @@
<loc>http://markinstefan.xyz/tags/</loc>
<xhtml:link
rel="alternate"
hreflang="ru"
href="http://markinstefan.xyz/ru/tags/"
hreflang="de"
href="http://markinstefan.xyz/de/tags/"
/>
<xhtml:link
rel="alternate"
hreflang="de"
href="http://markinstefan.xyz/de/tags/"
hreflang="ru"
href="http://markinstefan.xyz/ru/tags/"
/>
<xhtml:link
rel="alternate"
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 MiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

+29 -1
View File
@@ -74,7 +74,7 @@
<link rel="alternate" type="application/rss+xml" href="/index.xml" title="Markin Stefan" />
<meta name="generator" content="Hugo 0.160.1">
<meta name="generator" content="Hugo 0.161.0">
@@ -175,6 +175,34 @@
<ul>
<li>
<a href="https://git.netinfection.xyz/iroxol" aria-label="Gitea" >
<i class="fa-brands fa-git-alt fa-2x" aria-hidden="true"></i>
</a>
</li>
<li>
<a href="contact" aria-label="Email" >
<i class="fa-solid fa-envelope fa-2x" aria-hidden="true"></i>
</a>
</li>
<li>
<a href="xmpp:iroxol@netinfection.xyz" aria-label="XMPP" >
<i class="fa-solid fa-comment-dots fa-2x" aria-hidden="true"></i>
</a>
</li>
</ul>
</div>
+7
View File
@@ -14,6 +14,13 @@
<guid>http://markinstefan.xyz/contact/</guid>
<description>&lt;p&gt;If you have my phone number, &lt;strong&gt;only&lt;/strong&gt; through:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SMS&lt;/li&gt;&#xA;&lt;li&gt;Directly calling&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://signal.org/&#34; class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Signal&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I do &lt;strong&gt;not&lt;/strong&gt; use WhatsApp or Telegram &lt;strong&gt;for personal conversations&lt;/strong&gt;.&lt;br&gt;&#xA;Write to me using one of the three recommendations mentioned.&lt;/p&gt;</description>
</item>
<item>
<title>Marriage of Stefan and Mariia</title>
<link>http://markinstefan.xyz/wedding/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>http://markinstefan.xyz/wedding/</guid>
<description>&lt;p&gt;We are happy to invite you to our wedding of Stefan and Mariia!&lt;/p&gt;&#xA;&lt;p&gt;Join us in celebrating this special day with love, joy, and wonderful memories.&lt;/p&gt;&#xA;&lt;p&gt;We look forward to seeing you there!&lt;/p&gt;</description>
</item>
<item>
<title>Redirecting to Gitea Profile</title>
<link>http://markinstefan.xyz/about/</link>
+97
View File
@@ -0,0 +1,97 @@
const body = document.body;
const darkModeToggle = document.getElementById('dark-mode-toggle');
const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
// Check if user preference is set, if not check value of body class for light or dark else it means that colorscheme = auto
if (localStorage.getItem("colorscheme")) {
setTheme(localStorage.getItem("colorscheme"));
} else if (body.classList.contains('colorscheme-light') || body.classList.contains('colorscheme-dark')) {
setTheme(body.classList.contains("colorscheme-dark") ? "dark" : "light");
} else {
setTheme(darkModeMediaQuery.matches ? "dark" : "light");
}
if (darkModeToggle) {
darkModeToggle.addEventListener('click', () => {
let theme = body.classList.contains("colorscheme-dark") ? "light" : "dark";
setTheme(theme);
rememberTheme(theme);
});
}
darkModeMediaQuery.addListener((event) => {
setTheme(event.matches ? "dark" : "light");
});
document.addEventListener("DOMContentLoaded", function () {
let node = document.querySelector('.preload-transitions');
node.classList.remove('preload-transitions');
});
function setTheme(theme) {
body.classList.remove('colorscheme-auto');
let inverse = theme === 'dark' ? 'light' : 'dark';
body.classList.remove('colorscheme-' + inverse);
body.classList.add('colorscheme-' + theme);
document.documentElement.style['color-scheme'] = theme;
function waitForElm(selector) {
return new Promise(resolve => {
if (document.querySelector(selector)) {
return resolve(document.querySelector(selector));
}
const observer = new MutationObserver(mutations => {
if (document.querySelector(selector)) {
resolve(document.querySelector(selector));
observer.disconnect();
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
});
}
if (theme === 'dark') {
const message = {
type: 'set-theme',
theme: 'github-dark'
};
waitForElm('.utterances-frame').then((iframe) => {
iframe.contentWindow.postMessage(message, 'https://utteranc.es');
})
}
else {
const message = {
type: 'set-theme',
theme: 'github-light'
};
waitForElm('.utterances-frame').then((iframe) => {
iframe.contentWindow.postMessage(message, 'https://utteranc.es');
})
}
function sendMessage(message) {
const iframe = document.querySelector('iframe.giscus-frame');
if (!iframe) return;
iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
}
sendMessage({
setConfig: {
theme: theme,
},
});
// Create and send event
const event = new Event('themeChanged');
document.dispatchEvent(event);
}
function rememberTheme(theme) {
localStorage.setItem('colorscheme', theme);
}
+9
View File
@@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>http://markinstefan.xyz/wedding/</title>
<link rel="canonical" href="http://markinstefan.xyz/wedding/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://markinstefan.xyz/wedding/">
</head>
</html>
+58
View File
@@ -0,0 +1,58 @@
<?php
require __DIR__ . '/vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use Dotenv\Dotenv;
$dotenv = Dotenv::createImmutable(__DIR__ . '/../');
$dotenv->safeLoad();
// Get form values
$first_name = $_POST['first_name'] ?? '';
$last_name = $_POST['last_name'] ?? '';
$name = trim("$first_name $last_name") ?: 'No Name';
// Drinks can be an array
$drinks = $_POST['drinks'] ?? 'None';
if (is_array($drinks)) {
$drinks = implode(', ', $drinks);
}
// Allergies
$allergies = $_POST['allergies'] ?? 'None';
// Convert to UTF-8
$name = mb_convert_encoding($name, 'UTF-8', 'auto');
$drinks = mb_convert_encoding($drinks, 'UTF-8', 'auto');
$allergies = mb_convert_encoding($allergies, 'UTF-8', 'auto');
// PHPMailer setup
$mail = new PHPMailer(true);
try {
$mail->CharSet = 'UTF-8';
$mail->isSMTP();
$mail->Host = $_ENV['SMTP_HOST'];
$mail->SMTPAuth = true;
$mail->Username = $_ENV['SMTP_USER'];
$mail->Password = $_ENV['SMTP_PASS'];
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = (int)$_ENV['SMTP_PORT'];
$mail->setFrom($_ENV['FROM_EMAIL'], $_ENV['FROM_NAME']);
$mail->addAddress($_ENV['TO_EMAIL']);
$mail->Subject = mb_encode_mimeheader("New Wedding Guest: $name", 'UTF-8');
$body = <<<EOD
Name: $name
Drinks: $drinks
Allergies: $allergies
EOD;
$mail->Body = $body;
$mail->send();
echo 'RSVP submitted successfully.';
} catch (Exception $e) {
echo "RSVP could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
+9
View File
@@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://markinstefan.xyz/ru/svadba/</title>
<link rel="canonical" href="http://markinstefan.xyz/ru/svadba/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://markinstefan.xyz/ru/svadba/">
</head>
</html>
+29 -1
View File
@@ -74,7 +74,7 @@
<link rel="alternate" type="application/rss+xml" href="/ru/index.xml" title="Маркин Степан" />
<meta name="generator" content="Hugo 0.160.1">
<meta name="generator" content="Hugo 0.161.0">
@@ -175,6 +175,34 @@
<ul>
<li>
<a href="https://git.netinfection.xyz/iroxol" aria-label="Gitea" >
<i class="fa-brands fa-git-alt fa-2x" aria-hidden="true"></i>
</a>
</li>
<li>
<a href="contact" aria-label="Email" >
<i class="fa-solid fa-envelope fa-2x" aria-hidden="true"></i>
</a>
</li>
<li>
<a href="xmpp:iroxol@netinfection.xyz" aria-label="XMPP" >
<i class="fa-solid fa-comment-dots fa-2x" aria-hidden="true"></i>
</a>
</li>
</ul>
</div>
+7
View File
@@ -28,5 +28,12 @@
<guid>http://markinstefan.xyz/ru/about/</guid>
<description></description>
</item>
<item>
<title>Свадьба Стефана и Марии</title>
<link>http://markinstefan.xyz/ru/svadba/</link>
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
<guid>http://markinstefan.xyz/ru/svadba/</guid>
<description>&lt;p&gt;С радостью приглашаем вас на свадьбу Стефана и Марии!&lt;/p&gt;&#xA;&lt;p&gt;Мы приглашаем вас разделить с нами этот особенный день, наполненный любовью, радостью и незабываемыми воспоминаниями!&lt;/p&gt;&#xA;&lt;p&gt;С нетерпением ждем встречи с вами!&lt;/p&gt;</description>
</item>
</channel>
</rss>
+9
View File
@@ -0,0 +1,9 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>http://markinstefan.xyz/ru/svadba/</title>
<link rel="canonical" href="http://markinstefan.xyz/ru/svadba/">
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url=http://markinstefan.xyz/ru/svadba/">
</head>
</html>
+2 -2
View File
@@ -137,14 +137,14 @@
<li class="navigation-item">
<a href="/de/series/">🇩🇪</a>
<a href="/series/">🇬🇧</a>
</li>
<li class="navigation-item">
<a href="/series/">🇬🇧</a>
<a href="/de/series/">🇩🇪</a>
</li>
+21 -4
View File
@@ -39,13 +39,13 @@
<loc>http://markinstefan.xyz/ru/series/</loc>
<xhtml:link
rel="alternate"
hreflang="de"
href="http://markinstefan.xyz/de/series/"
hreflang="en"
href="http://markinstefan.xyz/series/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="http://markinstefan.xyz/series/"
hreflang="de"
href="http://markinstefan.xyz/de/series/"
/>
<xhtml:link
rel="alternate"
@@ -137,5 +137,22 @@
hreflang="ru"
href="http://markinstefan.xyz/ru/about/"
/>
</url><url>
<loc>http://markinstefan.xyz/ru/svadba/</loc>
<xhtml:link
rel="alternate"
hreflang="de"
href="http://markinstefan.xyz/de/hochzeit/"
/>
<xhtml:link
rel="alternate"
hreflang="en"
href="http://markinstefan.xyz/wedding/"
/>
<xhtml:link
rel="alternate"
hreflang="ru"
href="http://markinstefan.xyz/ru/svadba/"
/>
</url>
</urlset>
+544
View File
@@ -0,0 +1,544 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<title>Маркин Степан</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="light dark">
<meta name="author" content="Маркин Степан">
<meta name="description" content="С радостью приглашаем вас на свадьбу Стефана и Марии!
Мы приглашаем вас разделить с нами этот особенный день, наполненный любовью, радостью и незабываемыми воспоминаниями!
С нетерпением ждем встречи с вами!">
<meta name="keywords" content="blog,desenvolvedor,pessoal">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Свадьба Стефана и Марии">
<meta name="twitter:description" content="С радостью приглашаем вас на свадьбу Стефана и Марии!
Мы приглашаем вас разделить с нами этот особенный день, наполненный любовью, радостью и незабываемыми воспоминаниями!
С нетерпением ждем встречи с вами!">
<meta property="og:url" content="http://markinstefan.xyz/ru/svadba/">
<meta property="og:site_name" content="Маркин Степан">
<meta property="og:title" content="Свадьба Стефана и Марии">
<meta property="og:description" content="С радостью приглашаем вас на свадьбу Стефана и Марии!
Мы приглашаем вас разделить с нами этот особенный день, наполненный любовью, радостью и незабываемыми воспоминаниями!
С нетерпением ждем встречи с вами!">
<meta property="og:locale" content="ru">
<meta property="og:type" content="article">
<link rel="canonical" href="http://markinstefan.xyz/ru/svadba/">
<link rel="preload" href="/fonts/fa-brands-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/fa-regular-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/fa-solid-900.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/css/coder.min.f6b1b35a7b02521b25338f6cf58975f9980a6c12847763fe35a48307758cd1e7.css" integrity="sha256-9rGzWnsCUhslM49s9Yl1&#43;ZgKbBKEd2P&#43;NaSDB3WM0ec=" crossorigin="anonymous" media="screen" />
<link rel="stylesheet" href="/css/coder-dark.min.ad48f476275974885bdc03d5251e3cdbe1678c54a63ff772376b0ed2adc468dd.css" integrity="sha256-rUj0didZdIhb3APVJR482&#43;FnjFSmP/dyN2sO0q3EaN0=" crossorigin="anonymous" media="screen" />
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" sizes="any">
<link rel="icon" type="image/png" href="/images/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/images/favicon-16x16.png" sizes="16x16">
<link rel="apple-touch-icon" href="/images/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/images/safari-pinned-tab.svg" color="#5bbad5">
</head>
<body class="preload-transitions colorscheme-auto">
<div class="float-container">
<a id="dark-mode-toggle" class="colorscheme-toggle">
<i class="fa-solid fa-adjust fa-fw" aria-hidden="true"></i>
</a>
</div>
<main class="wrapper">
<nav class="navigation">
<section class="container">
<a class="navigation-title" href="http://markinstefan.xyz/ru/">
Маркин Степан
</a>
<input type="checkbox" id="menu-toggle" />
<label class="menu-button float-right" for="menu-toggle">
<i class="fa-solid fa-bars fa-fw" aria-hidden="true"></i>
</label>
<ul class="navigation-list">
<li class="navigation-item">
<a class="navigation-link " href="/ru/about/">Обо мне</a>
</li>
<li class="navigation-item">
<a class="navigation-link " href="/ru/projects/">Проекты</a>
</li>
<li class="navigation-item">
<a class="navigation-link " href="/ru/contact/">Контакты</a>
</li>
<li class="navigation-item menu-separator">
<span>|</span>
</li>
<li class="navigation-item">
<a href="/de/hochzeit/">🇩🇪</a>
</li>
<li class="navigation-item">
<a href="/wedding/">🇬🇧</a>
</li>
</ul>
</section>
</nav>
<div class="content">
<style>
body {
background-color: #fff;
color: #222;
background-image: url('/images/hochzeit-bg.jpg');
background-size: cover;
background-position: center;
background-repeat: repeat;
border-radius: 8px;
}
.wedding-container {
max-width: 1600px;
margin: 0 auto;
padding: 2rem;
font-family: system-ui, sans-serif;
line-height: 1.6;
}
.hero {
text-align: center;
margin-bottom: 3rem;
}
.hero img {
width: 100%;
border-radius: 8px;
}
.hero h1 {
font-size: 2.5rem;
margin-bottom: 0.5rem;
}
.hero .date {
font-size: 1.2rem;
color: #666;
}
.section {
margin-bottom: 2.5rem;
}
.section h2 {
font-size: 1.5rem;
margin-bottom: 0.5rem;
border-bottom: 1px solid #eee;
padding-bottom: 0.3rem;
}
.map iframe {
width: 100%;
background-color: rgba(255, 255, 255, 0.5);
padding: 1rem;
height: 400px;
border: 0;
border-radius: 8px;
}
.rsvp {
background-color: rgba(255, 255, 255, 0.8);
padding: 1rem;
border-radius: 8px;
}
.countdown {
text-align: center; margin-bottom: 2rem;
font-size: 5rem;
}
.footer {
text-align: center;
margin-top: 3rem;
color: #888;
font-size: 2rem;
padding-top: 1rem;
}
.footer a {
color: #0066cc;
text-decoration: none;
}
.footer a:hover {
text-decoration: underline;
}
</style>
<div class="wedding-container">
<style>
.music-fab {
position: fixed;
bottom: 20px;
left: 20px;
z-index: 9999;
}
.fab-button {
width: 52px;
height: 52px;
border-radius: 50%;
border: none;
background: white;
box-shadow: 0 6px 18px rgba(0,0,0,0.2);
font-size: 20px;
cursor: pointer;
transition: transform 0.15s ease;
}
.fab-button:active {
transform: scale(0.95);
}
</style>
<div class="music-fab">
<button id="music-btn" class="fab-button">⏸️</button>
</div>
<audio id="bg-music" autoplay loop>
<source src="/audio/canon-in-d.mp3" type="audio/mpeg">
</audio>
<script>
const btn = document.getElementById("music-btn");
const audio = document.getElementById("bg-music");
audio.volume = 0.3;
let isPlaying = true;
btn.textContent = "⏸️";
audio.play().catch(() => {
isPlaying = false;
btn.textContent = "▶️";
});
btn.addEventListener("click", async () => {
if (!isPlaying) {
try {
await audio.play();
isPlaying = true;
btn.textContent = "⏸️";
} catch (e) {
console.log("Playback blocked:", e);
}
} else {
audio.pause();
isPlaying = false;
btn.textContent = "▶️";
}
});
</script>
<div class="countdown">
<h3>До нашей свадьбы осталось:</h3>
<p id="timer"></p>
</div>
<div class="hero">
<img src="/images/hochzeit-header.jpg" alt="Wedding Header Image">
<h1>Свадьба Стефана и Марии</h1>
<div class="date">
31 августа 2026 г.
</div>
</div>
<div class="section">
<p>С радостью приглашаем вас на свадьбу Стефана и Марии!</p>
<p>Мы приглашаем вас разделить с нами этот особенный день, наполненный любовью, радостью и незабываемыми воспоминаниями!</p>
<p>С нетерпением ждем встречи с вами!</p>
</div>
<div class="section">
<h2>📅 Мероприятие</h2>
<p>
<strong>Церемония:</strong>
31 августа 2026 г., в 14:00
</p>
<p><strong>Начало:</strong> 17:00</p>
<p><strong>Место:</strong> Мюнхен, Германия</p>
</div>
<div class="section map">
<h2>📍 Место</h2>
<iframe src="https://www.google.com/maps?q=Russische+Orthodoxe+Kirche+Auferstehungs-Gemeinde+Dachau+M%C3%BCnchen&hl=ru&z=19&output=embed" width="600" height="450" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>
</div>
<div class="section rsvp">
<h2>📝 RSVP</h2>
<p>Пожалуйста, ответьте до <strong>30 июня</strong>.</p>
<p>Электронная почта:
<span class="email"><b>Пожалуйста, разрешите JavaScript для просмотра этого контента.</b></span>
<script>
(function() {
var email = "hochzeit@markinstefan.xyz";
var user = email.split('@')[0];
var domain = email.split('@')[1];
var link = document.createElement('a');
link.href = 'mailto:' + user + '@' + domain;
link.textContent = user + '@' + domain;
var span = document.currentScript.previousElementSibling;
span.textContent = "";
span.appendChild(link);
})();
</script>
</p>
<form action="/rsvp-submit.php" method="POST">
<label for="first_name">Имя:</label><br>
<input type="text" id="first_name" name="first_name" required><br><br>
<label for="last_name">Фамилия:</label><br>
<input type="text" id="last_name" name="last_name" required><br><br>
<label>Предпочтения по напиткам::</label><br>
<input type="checkbox" id="wine" name="drinks[]" value="Wine">
<label for="wine">Вино</label><br>
<input type="checkbox" id="beer" name="drinks[]" value="Beer">
<label for="beer">Пиво</label><br>
<input type="checkbox" id="juice" name="drinks[]" value="Juice">
<label for="juice">Сок</label><br><br>
<label for="allergies">Аллергия на:</label><br>
<input type="text" id="allergies" name="allergies"><br><br>
<input type="text" name="website" style="display:none">
<button type="submit">Отправить</button>
</form>
</div>
<div class="footer">
<p>❤️ Мы с нетерпением ждем встречи с вами ❤️</p>
</div>
</div>
<script>
var labels = {
day: "Д.",
hour: "ч.",
minute: "м.",
second: "c."
};
var countDownDate = new Date("2026-08-31 14:00").getTime();
var x = setInterval(function() {
var now = new Date().getTime();
var distance = countDownDate - now;
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
document.getElementById("timer").innerHTML =
days + " " + labels.day + " " +
hours + " " + labels.hour + " " +
minutes + " " + labels.minute + " " +
seconds + " " + labels.second;
if (distance < 0) {
clearInterval(x);
document.getElementById("timer").innerHTML = "Наступил великий день!";
}
}, 1000);
</script>
</div>
<footer class="footer">
<section class="container">
©
2026
Маркин Степан
·
Работает на <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> & <a href="https://github.com/luizdepra/hugo-coder/" target="_blank" rel="noopener">Coder</a>.
</section>
</footer>
</main>
<script src="/js/coder.min.6ae284be93d2d19dad1f02b0039508d9aab3180a12a06dcc71b0b0ef7825a317.js" integrity="sha256-auKEvpPS0Z2tHwKwA5UI2aqzGAoSoG3McbCw73gloxc="></script>
</body>
</html>
+2 -2
View File
@@ -137,14 +137,14 @@
<li class="navigation-item">
<a href="/ru/tags/">🇷🇺</a>
<a href="/de/tags/">🇩🇪</a>
</li>
<li class="navigation-item">
<a href="/de/tags/">🇩🇪</a>
<a href="/ru/tags/">🇷🇺</a>
</li>
+544
View File
@@ -0,0 +1,544 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>Markin Stefan</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="light dark">
<meta name="author" content="Markin Stefan">
<meta name="description" content="We are happy to invite you to our wedding of Stefan and Mariia!
Join us in celebrating this special day with love, joy, and wonderful memories.
We look forward to seeing you there!">
<meta name="keywords" content="blog,developer,personal">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Marriage of Stefan and Mariia">
<meta name="twitter:description" content="We are happy to invite you to our wedding of Stefan and Mariia!
Join us in celebrating this special day with love, joy, and wonderful memories.
We look forward to seeing you there!">
<meta property="og:url" content="http://markinstefan.xyz/wedding/">
<meta property="og:site_name" content="Markin Stefan">
<meta property="og:title" content="Marriage of Stefan and Mariia">
<meta property="og:description" content="We are happy to invite you to our wedding of Stefan and Mariia!
Join us in celebrating this special day with love, joy, and wonderful memories.
We look forward to seeing you there!">
<meta property="og:locale" content="en">
<meta property="og:type" content="article">
<link rel="canonical" href="http://markinstefan.xyz/wedding/">
<link rel="preload" href="/fonts/fa-brands-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/fa-regular-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/fonts/fa-solid-900.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/css/coder.min.f6b1b35a7b02521b25338f6cf58975f9980a6c12847763fe35a48307758cd1e7.css" integrity="sha256-9rGzWnsCUhslM49s9Yl1&#43;ZgKbBKEd2P&#43;NaSDB3WM0ec=" crossorigin="anonymous" media="screen" />
<link rel="stylesheet" href="/css/coder-dark.min.ad48f476275974885bdc03d5251e3cdbe1678c54a63ff772376b0ed2adc468dd.css" integrity="sha256-rUj0didZdIhb3APVJR482&#43;FnjFSmP/dyN2sO0q3EaN0=" crossorigin="anonymous" media="screen" />
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" sizes="any">
<link rel="icon" type="image/png" href="/images/favicon-32x32.png" sizes="32x32">
<link rel="icon" type="image/png" href="/images/favicon-16x16.png" sizes="16x16">
<link rel="apple-touch-icon" href="/images/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<link rel="mask-icon" href="/images/safari-pinned-tab.svg" color="#5bbad5">
</head>
<body class="preload-transitions colorscheme-auto">
<div class="float-container">
<a id="dark-mode-toggle" class="colorscheme-toggle">
<i class="fa-solid fa-adjust fa-fw" aria-hidden="true"></i>
</a>
</div>
<main class="wrapper">
<nav class="navigation">
<section class="container">
<a class="navigation-title" href="http://markinstefan.xyz/">
Markin Stefan
</a>
<input type="checkbox" id="menu-toggle" />
<label class="menu-button float-right" for="menu-toggle">
<i class="fa-solid fa-bars fa-fw" aria-hidden="true"></i>
</label>
<ul class="navigation-list">
<li class="navigation-item">
<a class="navigation-link " href="/about/">About</a>
</li>
<li class="navigation-item">
<a class="navigation-link " href="/projects/">Projects</a>
</li>
<li class="navigation-item">
<a class="navigation-link " href="/contact/">Contact me</a>
</li>
<li class="navigation-item menu-separator">
<span>|</span>
</li>
<li class="navigation-item">
<a href="/de/hochzeit/">🇩🇪</a>
</li>
<li class="navigation-item">
<a href="/ru/svadba/">🇷🇺</a>
</li>
</ul>
</section>
</nav>
<div class="content">
<style>
body {
background-color: #fff;
color: #222;
background-image: url('/images/hochzeit-bg.jpg');
background-size: cover;
background-position: center;
background-repeat: repeat;
border-radius: 8px;
}
.wedding-container {
max-width: 1600px;
margin: 0 auto;
padding: 2rem;
font-family: system-ui, sans-serif;
line-height: 1.6;
}
.hero {
text-align: center;
margin-bottom: 3rem;
}
.hero img {
width: 100%;
border-radius: 8px;
}
.hero h1 {
font-size: 2.5rem;
margin-bottom: 0.5rem;
}
.hero .date {
font-size: 1.2rem;
color: #666;
}
.section {
margin-bottom: 2.5rem;
}
.section h2 {
font-size: 1.5rem;
margin-bottom: 0.5rem;
border-bottom: 1px solid #eee;
padding-bottom: 0.3rem;
}
.map iframe {
width: 100%;
background-color: rgba(255, 255, 255, 0.5);
padding: 1rem;
height: 400px;
border: 0;
border-radius: 8px;
}
.rsvp {
background-color: rgba(255, 255, 255, 0.8);
padding: 1rem;
border-radius: 8px;
}
.countdown {
text-align: center; margin-bottom: 2rem;
font-size: 5rem;
}
.footer {
text-align: center;
margin-top: 3rem;
color: #888;
font-size: 2rem;
padding-top: 1rem;
}
.footer a {
color: #0066cc;
text-decoration: none;
}
.footer a:hover {
text-decoration: underline;
}
</style>
<div class="wedding-container">
<style>
.music-fab {
position: fixed;
bottom: 20px;
left: 20px;
z-index: 9999;
}
.fab-button {
width: 52px;
height: 52px;
border-radius: 50%;
border: none;
background: white;
box-shadow: 0 6px 18px rgba(0,0,0,0.2);
font-size: 20px;
cursor: pointer;
transition: transform 0.15s ease;
}
.fab-button:active {
transform: scale(0.95);
}
</style>
<div class="music-fab">
<button id="music-btn" class="fab-button">⏸️</button>
</div>
<audio id="bg-music" autoplay loop>
<source src="/audio/canon-in-d.mp3" type="audio/mpeg">
</audio>
<script>
const btn = document.getElementById("music-btn");
const audio = document.getElementById("bg-music");
audio.volume = 0.3;
let isPlaying = true;
btn.textContent = "⏸️";
audio.play().catch(() => {
isPlaying = false;
btn.textContent = "▶️";
});
btn.addEventListener("click", async () => {
if (!isPlaying) {
try {
await audio.play();
isPlaying = true;
btn.textContent = "⏸️";
} catch (e) {
console.log("Playback blocked:", e);
}
} else {
audio.pause();
isPlaying = false;
btn.textContent = "▶️";
}
});
</script>
<div class="countdown">
<h3>Countdown to our Wedding:</h3>
<p id="timer"></p>
</div>
<div class="hero">
<img src="/images/hochzeit-header.jpg" alt="Wedding Header Image">
<h1>Marriage of Stefan and Mariia</h1>
<div class="date">
August 31, 2026
</div>
</div>
<div class="section">
<p>We are happy to invite you to our wedding of Stefan and Mariia!</p>
<p>Join us in celebrating this special day with love, joy, and wonderful memories.</p>
<p>We look forward to seeing you there!</p>
</div>
<div class="section">
<h2>📅 Event</h2>
<p>
<strong>Ceremony:</strong>
August 31, 2026, at 14:00
</p>
<p><strong>Reception:</strong> 17:00</p>
<p><strong>Location:</strong> Munich, Germany</p>
</div>
<div class="section map">
<h2>📍 Location</h2>
<iframe src="https://www.google.com/maps?q=Russische+Orthodoxe+Kirche+Auferstehungs-Gemeinde+Dachau+M%C3%BCnchen&hl=en&z=19&output=embed" width="600" height="450" frameborder="0" style="border:0;" allowfullscreen="" aria-hidden="false" tabindex="0"></iframe>
</div>
<div class="section rsvp">
<h2>📝 RSVP</h2>
<p>Please respond by <strong>June 30</strong>.</p>
<p>Email:
<span class="email"><b>Please enable JavaScript to see this content.</b></span>
<script>
(function() {
var email = "hochzeit@markinstefan.xyz";
var user = email.split('@')[0];
var domain = email.split('@')[1];
var link = document.createElement('a');
link.href = 'mailto:' + user + '@' + domain;
link.textContent = user + '@' + domain;
var span = document.currentScript.previousElementSibling;
span.textContent = "";
span.appendChild(link);
})();
</script>
</p>
<form action="/rsvp-submit.php" method="POST">
<label for="first_name">First name:</label><br>
<input type="text" id="first_name" name="first_name" required><br><br>
<label for="last_name">Last name:</label><br>
<input type="text" id="last_name" name="last_name" required><br><br>
<label>Drink preferences::</label><br>
<input type="checkbox" id="wine" name="drinks[]" value="Wine">
<label for="wine">Wine</label><br>
<input type="checkbox" id="beer" name="drinks[]" value="Beer">
<label for="beer">Beer</label><br>
<input type="checkbox" id="juice" name="drinks[]" value="Juice">
<label for="juice">Juice</label><br><br>
<label for="allergies">Allergic to:</label><br>
<input type="text" id="allergies" name="allergies"><br><br>
<input type="text" name="website" style="display:none">
<button type="submit">Send</button>
</form>
</div>
<div class="footer">
<p>We look forward to celebrating with you ❤️</p>
</div>
</div>
<script>
var labels = {
day: "d",
hour: "h",
minute: "m",
second: "s"
};
var countDownDate = new Date("2026-08-31 14:00").getTime();
var x = setInterval(function() {
var now = new Date().getTime();
var distance = countDownDate - now;
var days = Math.floor(distance / (1000 * 60 * 60 * 24));
var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
var seconds = Math.floor((distance % (1000 * 60)) / 1000);
document.getElementById("timer").innerHTML =
days + " " + labels.day + " " +
hours + " " + labels.hour + " " +
minutes + " " + labels.minute + " " +
seconds + " " + labels.second;
if (distance < 0) {
clearInterval(x);
document.getElementById("timer").innerHTML = "The big day is here!";
}
}, 1000);
</script>
</div>
<footer class="footer">
<section class="container">
©
2026
Markin Stefan
·
Powered by <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a> & <a href="https://github.com/luizdepra/hugo-coder/" target="_blank" rel="noopener">Coder</a>.
</section>
</footer>
</main>
<script src="/js/coder.min.6ae284be93d2d19dad1f02b0039508d9aab3180a12a06dcc71b0b0ef7825a317.js" integrity="sha256-auKEvpPS0Z2tHwKwA5UI2aqzGAoSoG3McbCw73gloxc="></script>
</body>
</html>
Executable → Regular
View File
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 MiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 MiB

+58
View File
@@ -0,0 +1,58 @@
<?php
require __DIR__ . '/vendor/autoload.php';
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use Dotenv\Dotenv;
$dotenv = Dotenv::createImmutable(__DIR__ . '/../');
$dotenv->safeLoad();
// Get form values
$first_name = $_POST['first_name'] ?? '';
$last_name = $_POST['last_name'] ?? '';
$name = trim("$first_name $last_name") ?: 'No Name';
// Drinks can be an array
$drinks = $_POST['drinks'] ?? 'None';
if (is_array($drinks)) {
$drinks = implode(', ', $drinks);
}
// Allergies
$allergies = $_POST['allergies'] ?? 'None';
// Convert to UTF-8
$name = mb_convert_encoding($name, 'UTF-8', 'auto');
$drinks = mb_convert_encoding($drinks, 'UTF-8', 'auto');
$allergies = mb_convert_encoding($allergies, 'UTF-8', 'auto');
// PHPMailer setup
$mail = new PHPMailer(true);
try {
$mail->CharSet = 'UTF-8';
$mail->isSMTP();
$mail->Host = $_ENV['SMTP_HOST'];
$mail->SMTPAuth = true;
$mail->Username = $_ENV['SMTP_USER'];
$mail->Password = $_ENV['SMTP_PASS'];
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = (int)$_ENV['SMTP_PORT'];
$mail->setFrom($_ENV['FROM_EMAIL'], $_ENV['FROM_NAME']);
$mail->addAddress($_ENV['TO_EMAIL']);
$mail->Subject = mb_encode_mimeheader("New Wedding Guest: $name", 'UTF-8');
$body = <<<EOD
Name: $name
Drinks: $drinks
Allergies: $allergies
EOD;
$mail->Body = $body;
$mail->send();
echo 'RSVP submitted successfully.';
} catch (Exception $e) {
echo "RSVP could not be sent. Mailer Error: {$mail->ErrorInfo}";
}