Design: Envelope back with distinct V-flap closure, top-left sender address only, and completely sealed interior

This commit is contained in:
kobold-ai
2026-09-21 17:41:19 +02:00
parent 3e5c3c1eeb
commit 7e20d243e8
4 changed files with 2269 additions and 2293 deletions
+65 -84
View File
@@ -329,131 +329,110 @@ body {
} }
/* ========================================= /* =========================================
FOUR-FLAP REALISTIC CLOSED ENVELOPE SYSTEM ENVELOPE BACK WITH V-FLAP CLOSURE
Flaps: Left, Right, Bottom, and Top Flap - Solid back body
- Sender address in top-left
- Prominent triangular V-flap
- Sketched wax seal at apex
========================================= */ ========================================= */
.envelope-flap {
/* Solid Envelope Back Body */
.envelope-back-body {
position: absolute; position: absolute;
inset: 0; inset: 0;
pointer-events: none; border-radius: 6px;
} background-color: #ebd8ae;
/* Left Triangular Flap */
.envelope-flap.flap-left {
background-color: #ebdcb9;
background-image: background-image:
radial-gradient(ellipse at 0% 50%, rgba(255, 255, 255, 0.22) 0%, rgba(130, 95, 45, 0.22) 100%), radial-gradient(ellipse at 50% 60%, rgba(255, 255, 255, 0.22) 0%, rgba(130, 95, 45, 0.22) 100%),
url('/static/img/parchment_texture.jpg'); url('/static/img/parchment_texture.jpg');
background-size: cover; background-size: cover;
clip-path: polygon(0 0, 50% 50%, 0 100%); border: 1.5px solid #8e6c43;
z-index: 3; z-index: 3;
filter: drop-shadow(2px 0 4px rgba(60, 40, 15, 0.25)); overflow: hidden;
} }
/* Right Triangular Flap */ /* Absender oben links auf der Rückseite (sonst kein Text) */
.envelope-flap.flap-right { .envelope-sender-block {
background-color: #ebdcb9;
background-image:
radial-gradient(ellipse at 100% 50%, rgba(255, 255, 255, 0.22) 0%, rgba(130, 95, 45, 0.22) 100%),
url('/static/img/parchment_texture.jpg');
background-size: cover;
clip-path: polygon(100% 0, 50% 50%, 100% 100%);
z-index: 3;
filter: drop-shadow(-2px 0 4px rgba(60, 40, 15, 0.25));
}
/* Bottom Flap (Folds up from bottom, overlaps left/right flaps, holds the address) */
.envelope-flap.flap-bottom {
background-color: #dfcd9f;
background-image:
radial-gradient(ellipse at 50% 80%, rgba(255, 255, 255, 0.28) 0%, rgba(130, 95, 45, 0.25) 100%),
url('/static/img/parchment_texture.jpg');
background-size: cover;
clip-path: polygon(0 100%, 50% 48%, 100% 100%);
z-index: 4;
filter: drop-shadow(0 -4px 6px rgba(50, 35, 10, 0.35));
display: flex;
align-items: flex-end;
justify-content: center;
padding-bottom: 20px;
}
.envelope-sketch-border {
position: absolute; position: absolute;
bottom: 8px; top: 14px;
left: 8px; left: 16px;
right: 8px; z-index: 8;
height: 48%; text-align: left;
border: 1px dashed rgba(120, 85, 45, 0.4);
border-radius: 3px;
pointer-events: none;
}
/* Handwritten Address in Emerald Ink on Envelope Bottom Flap */
.envelope-address-block {
position: relative;
z-index: 5;
text-align: center;
font-family: 'Marck Script', 'Caveat', cursive; font-family: 'Marck Script', 'Caveat', cursive;
color: #0d3820; /* Authentic Hogwarts Emerald Ink */ color: #0d3820; /* Authentic Hogwarts Emerald Ink */
padding: 0 15px; max-width: 48%;
text-shadow: 0 0 1px rgba(13, 56, 32, 0.35); line-height: 1.25;
pointer-events: none;
transition: opacity 0.4s ease;
}
.envelope-opened .envelope-sender-block {
opacity: 0;
}
.sender-label {
display: block;
font-size: clamp(0.72rem, 2.2vw, 0.85rem);
font-family: 'MedievalSharp', serif;
color: #4a6352;
text-transform: uppercase;
letter-spacing: 0.8px;
margin-bottom: 2px; margin-bottom: 2px;
} }
.addr-school { .sender-name {
font-size: clamp(0.85rem, 2.9vw, 1.08rem); font-size: clamp(0.92rem, 2.9vw, 1.15rem);
font-weight: 700; font-weight: 700;
color: #082816; color: #082816;
margin-bottom: 1px; margin-bottom: 1px;
text-shadow: 0 0 1px rgba(8, 40, 22, 0.35);
} }
.addr-recipient { .sender-location {
font-size: clamp(1.05rem, 3.4vw, 1.28rem); font-size: clamp(0.78rem, 2.4vw, 0.95rem);
font-weight: 700;
color: #0b3a20;
margin-bottom: 1px;
}
.addr-location {
font-size: clamp(0.8rem, 2.5vw, 0.96rem);
font-style: italic; font-style: italic;
color: #1e4530; color: #1e4530;
} }
/* Top Closing Flap (Folds down from top, overlaps all flaps, sealed by wax seal) */ /* Distinct Triangular V-Closure Flap */
.envelope-closing-flap.flap-top { .envelope-closing-flap.envelope-v-flap {
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
background-color: #e5d4a6; background-color: #dfcd9b;
background-image: background-image:
radial-gradient(ellipse at 50% 20%, rgba(255, 255, 255, 0.35) 0%, rgba(130, 95, 45, 0.25) 100%), radial-gradient(ellipse at 50% 18%, rgba(255, 255, 255, 0.35) 0%, rgba(125, 90, 40, 0.28) 100%),
url('/static/img/parchment_texture.jpg'); url('/static/img/parchment_texture.jpg');
background-size: cover; background-size: cover;
clip-path: polygon(0 0, 100% 0, 50% 54%); clip-path: polygon(0 0, 100% 0, 50% 56%);
transform-origin: top center; transform-origin: top center;
transform-style: preserve-3d; transform-style: preserve-3d;
transition: transform 0.8s cubic-bezier(0.4, 0, 0.2, 1); transition: transform 0.8s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 6; z-index: 6;
border-top: 2px solid #8e6c43; border-top: 2px solid #7c5830;
filter: drop-shadow(0 6px 9px rgba(45, 30, 10, 0.55)); filter: drop-shadow(0 7px 14px rgba(35, 18, 5, 0.65));
} }
.flap-sketch-line { .envelope-opened .envelope-closing-flap.envelope-v-flap {
transform: rotateX(180deg);
z-index: 1;
filter: drop-shadow(0 -4px 6px rgba(50, 35, 10, 0.4));
}
.v-flap-sketch-line {
position: absolute; position: absolute;
inset: 4px; inset: 4px;
clip-path: polygon(2% 2%, 98% 2%, 50% 52%); clip-path: polygon(2% 2%, 98% 2%, 50% 53.5%);
border-top: 1px dashed rgba(120, 85, 45, 0.4); border-top: 1.5px dashed rgba(110, 75, 35, 0.45);
pointer-events: none; pointer-events: none;
} }
/* Sketched Wax Seal placed right over the flap intersection in the center */ /* Sketched Wax Seal placed right at the tip of the V-flap */
.sketched-wax-seal { .sketched-wax-seal {
position: absolute; position: absolute;
top: 50%; top: 56%;
left: 50%; left: 50%;
transform: translate(-50%, -50%) rotate(-3deg); transform: translate(-50%, -50%) rotate(-3deg);
width: 74px; width: 74px;
@@ -772,7 +751,12 @@ body {
.sketched-wax-seal { .sketched-wax-seal {
width: 62px; width: 62px;
height: 62px; height: 62px;
top: 50%; top: 56%;
}
.envelope-sender-block {
top: 10px;
left: 12px;
max-width: 55%;
} }
.letter-sheet { .letter-sheet {
top: 10px; top: 10px;
@@ -790,9 +774,6 @@ body {
line-height: 1.42; line-height: 1.42;
margin-bottom: 6px; margin-bottom: 6px;
} }
.envelope-flap.flap-bottom {
padding-bottom: 12px;
}
.btn-launch-quiz { .btn-launch-quiz {
padding: 12px 20px; padding: 12px 20px;
font-size: 1.0rem; font-size: 1.0rem;
+12 -11
View File
@@ -14,9 +14,9 @@ const UI_TEXT = {
de: { de: {
pageTitle: "✨ Magisches Hogwarts-Escape-Quiz ✨", pageTitle: "✨ Magisches Hogwarts-Escape-Quiz ✨",
pageSubtitle: "10 knifflige Rätsel aus der Zauberwelt warten auf dich", pageSubtitle: "10 knifflige Rätsel aus der Zauberwelt warten auf dich",
envelopeLetter: "Hogwarts-Schule für Hexerei und Zauberei", senderLabel: "Absender:",
envelopeRecipient: "An den ehrenwerten Zauberschüler", envelopeSender: "Hogwarts-Schule für Hexerei und Zauberei",
envelopeLocation: "Auf dem Prüfungspfad • Schloss Hogwarts", envelopeSenderLocation: "Schulleitung • Schloss Hogwarts",
letterSchoolTitle: "Hogwarts-Schule für Hexerei und Zauberei", letterSchoolTitle: "Hogwarts-Schule für Hexerei und Zauberei",
letterHeadmaster: "Schulleiter: Albus Dumbledore<br><span>(Großhexenmeister, Träger des Merlin-Ordens Erster Klasse)</span>", letterHeadmaster: "Schulleiter: Albus Dumbledore<br><span>(Großhexenmeister, Träger des Merlin-Ordens Erster Klasse)</span>",
letterSalutation: "Liebe Hexe, lieber Zauberer,", letterSalutation: "Liebe Hexe, lieber Zauberer,",
@@ -59,9 +59,9 @@ const UI_TEXT = {
en: { en: {
pageTitle: "✨ Magical Hogwarts Escape Quiz ✨", pageTitle: "✨ Magical Hogwarts Escape Quiz ✨",
pageSubtitle: "10 tricky wizarding world puzzles await you", pageSubtitle: "10 tricky wizarding world puzzles await you",
envelopeLetter: "Hogwarts School of Witchcraft and Wizardry", senderLabel: "Sender:",
envelopeRecipient: "To the Esteemed Wizarding Student", envelopeSender: "Hogwarts School of Witchcraft and Wizardry",
envelopeLocation: "On the Path of Trials • Hogwarts Castle", envelopeSenderLocation: "Headmaster's Office • Hogwarts Castle",
letterSchoolTitle: "Hogwarts School of Witchcraft and Wizardry", letterSchoolTitle: "Hogwarts School of Witchcraft and Wizardry",
letterHeadmaster: "Headmaster: Albus Dumbledore<br><span>(Order of Merlin, First Class, Grand Sorc.)</span>", letterHeadmaster: "Headmaster: Albus Dumbledore<br><span>(Order of Merlin, First Class, Grand Sorc.)</span>",
letterSalutation: "Dear Witch or Wizard,", letterSalutation: "Dear Witch or Wizard,",
@@ -180,17 +180,18 @@ function applyQuizTranslations(lang) {
const letterSignature = document.getElementById("letterSignature"); const letterSignature = document.getElementById("letterSignature");
const letterSignTitle = document.getElementById("letterSignTitle"); const letterSignTitle = document.getElementById("letterSignTitle");
const envelopeRecipient = document.getElementById("envelopeRecipient"); const senderLabel = document.getElementById("senderLabel");
const envelopeLocation = document.getElementById("envelopeLocation"); const envelopeSender = document.getElementById("envelopeSender");
const envelopeSenderLocation = document.getElementById("envelopeSenderLocation");
const breakSealBtn = document.getElementById("breakSealBtn"); const breakSealBtn = document.getElementById("breakSealBtn");
const startQuizBtn = document.getElementById("startQuizBtn"); const startQuizBtn = document.getElementById("startQuizBtn");
const closeLetterBtn = document.getElementById("closeLetterBtn"); const closeLetterBtn = document.getElementById("closeLetterBtn");
if (pageTitle) pageTitle.innerText = t.pageTitle; if (pageTitle) pageTitle.innerText = t.pageTitle;
if (pageSubtitle) pageSubtitle.innerText = t.pageSubtitle; if (pageSubtitle) pageSubtitle.innerText = t.pageSubtitle;
if (envelopeLetter) envelopeLetter.innerText = t.envelopeLetter; if (senderLabel && t.senderLabel) senderLabel.innerText = t.senderLabel;
if (envelopeRecipient && t.envelopeRecipient) envelopeRecipient.innerText = t.envelopeRecipient; if (envelopeSender && t.envelopeSender) envelopeSender.innerText = t.envelopeSender;
if (envelopeLocation && t.envelopeLocation) envelopeLocation.innerText = t.envelopeLocation; if (envelopeSenderLocation && t.envelopeSenderLocation) envelopeSenderLocation.innerText = t.envelopeSenderLocation;
if (letterSchoolTitle && t.letterSchoolTitle) letterSchoolTitle.innerText = t.letterSchoolTitle; if (letterSchoolTitle && t.letterSchoolTitle) letterSchoolTitle.innerText = t.letterSchoolTitle;
if (letterHeadmaster && t.letterHeadmaster) letterHeadmaster.innerHTML = t.letterHeadmaster; if (letterHeadmaster && t.letterHeadmaster) letterHeadmaster.innerHTML = t.letterHeadmaster;
if (letterSalutation && t.letterSalutation) letterSalutation.innerText = t.letterSalutation; if (letterSalutation && t.letterSalutation) letterSalutation.innerText = t.letterSalutation;
+1 -1
View File
@@ -8,7 +8,7 @@
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Caveat:wght@500;700&family=Marck+Script&family=MedievalSharp&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Caveat:wght@500;700&family=Marck+Script&family=MedievalSharp&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/static/css/style.css?v=2.7"> <link rel="stylesheet" href="/static/css/style.css?v=2.8">
{% block head %}{% endblock %} {% block head %}{% endblock %}
</head> </head>
<body> <body>
+11 -17
View File
@@ -55,25 +55,19 @@
</footer> </footer>
</div> </div>
<!-- Linke Klappe des Umschlags --> <!-- Solide Rückseite des Briefumschlags -->
<div class="envelope-flap flap-left"></div> <div class="envelope-back-body">
<!-- Absender oben links auf der Rückseite (sonst kein Text) -->
<!-- Rechte Klappe des Umschlags --> <div class="envelope-sender-block" id="envelopeSenderBlock">
<div class="envelope-flap flap-right"></div> <span class="sender-label" id="senderLabel">Absender:</span>
<p class="sender-name" id="envelopeSender">Hogwarts-Schule für Hexerei und Zauberei</p>
<!-- Untere Klappe des Umschlags mit handschriftlicher Smaragd-Anschrift --> <p class="sender-location" id="envelopeSenderLocation">Schulleitung • Schloss Hogwarts</p>
<div class="envelope-flap flap-bottom">
<div class="envelope-sketch-border"></div>
<div class="envelope-address-block">
<p class="addr-line addr-school" id="envelopeLetter">Hogwarts-Schule für Hexerei und Zauberei</p>
<p class="addr-line addr-recipient" id="envelopeRecipient">An den ehrenwerten Zauberschüler</p>
<p class="addr-line addr-location" id="envelopeLocation">Auf dem Prüfungspfad • Schloss Hogwarts</p>
</div> </div>
</div> </div>
<!-- Obere Klappe des Umschlags (überdeckt alle Falten und wird vom Siegel gehalten) --> <!-- Markante dreieckige V-Verschluss-Lasche -->
<div class="envelope-closing-flap flap-top" id="envelopeFlap"> <div class="envelope-closing-flap envelope-v-flap" id="envelopeFlap">
<div class="flap-sketch-line"></div> <div class="v-flap-sketch-line"></div>
</div> </div>
<!-- Handgezeichnetes Wachssiegel über der Klappenspitze --> <!-- Handgezeichnetes Wachssiegel über der Klappenspitze -->
@@ -189,5 +183,5 @@
{% endblock %} {% endblock %}
{% block scripts %} {% block scripts %}
<script src="/static/js/quiz.js?v=2.7"></script> <script src="/static/js/quiz.js?v=2.8"></script>
{% endblock %} {% endblock %}