This commit is contained in:
Erik Thiele
2026-04-12 15:59:19 +02:00
parent bbc75d5c98
commit 20eacbb82f
70 changed files with 53580 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
{% extends "layout.html" %}
{% block content %}
<h2>{{ title }}.</h2>
<h3>{{ message }}</h3>
<p>Use this area to provide additional information.</p>
{% endblock %}

View File

@@ -0,0 +1,16 @@
{% extends "layout.html" %}
{% block content %}
<div style="text-align:center; margin-top:50px; color:#00ffcc;">
<h1>Admin</h1>
<form method="POST">
<input type="text" name="code" value="{{ code }}" required
style="padding:10px; font-size:20px; text-align:center;">
<br><br>
<button type="submit">Speichern</button>
</form>
</div>
{% endblock %}

View File

@@ -0,0 +1,20 @@
{% extends "layout.html" %}
{% block content %}
<h2>{{ title }}.</h2>
<h3>{{ message }}</h3>
<address>
One Microsoft Way<br />
Redmond, WA 98052-6399<br />
<abbr title="Phone">P:</abbr>
425.555.0100
</address>
<address>
<strong>Support:</strong> <a href="mailto:Support@example.com">Support@example.com</a><br />
<strong>Marketing:</strong> <a href="mailto:Marketing@example.com">Marketing@example.com</a>
</address>
{% endblock %}

View File

@@ -0,0 +1,165 @@
{% extends "layout.html" %}
{% block content %}
<div id="main" style="text-align:center; margin-top:50px; color:#00ffcc; position:relative; z-index:2;">
<h1>Girls Day Quiz</h1>
<p>Gib den Code ein</p>
{% if message %}
<p style="color: {{ color }}; font-weight:bold;">{{ message }}</p>
{% endif %}
{% if not success %}
<form method="POST" id="codeForm">
<div id="inputs"></div>
<input type="hidden" name="code" id="hiddenCode">
<button type="submit">Absenden</button>
</form>
{% endif %}
<div id="lock" style="font-size:90px; margin-top:30px; transition: transform 1.8s ease, opacity 1.2s ease;">
🔒
</div>
</div>
<div id="flash-overlay"></div>
<style>
#inputs input {
width: 44px;
height: 56px;
font-size: 26px;
text-align: center;
margin: 5px;
background: #020617;
color: #00ffcc;
border: 2px solid #00ffcc;
border-radius: 8px;
outline: none;
}
#inputs input:focus {
box-shadow: 0 0 12px #00ffcc;
}
button {
margin-top: 20px;
padding: 10px 20px;
background-color: #00ffcc;
border: none;
border-radius: 5px;
color: #020617;
cursor: pointer;
font-weight: bold;
}
button:hover {
background-color: #00ccaa;
}
#flash-overlay {
position: fixed;
left: 50%;
top: 50%;
width: 0;
height: 0;
background: white;
border-radius: 50%;
transform: translate(-50%, -50%);
z-index: 9999;
pointer-events: none;
opacity: 0;
}
body.animating {
overflow: hidden;
}
</style>
<script>
const codeLength = {{ code_length }};
const container = document.getElementById("inputs");
const hiddenInput = document.getElementById("hiddenCode");
// Eingabefelder erzeugen
if (container) {
for (let i = 0; i < codeLength; i++) {
let input = document.createElement("input");
input.type = "text";
input.maxLength = 1;
input.autocomplete = "off";
input.inputMode = "numeric";
input.pattern = "[0-9]*";
input.addEventListener("input", () => {
input.value = input.value.replace(/[^0-9]/g, "");
updateHidden();
if (input.value && input.nextElementSibling) {
input.nextElementSibling.focus();
}
});
input.addEventListener("keydown", (e) => {
if (e.key === "Backspace" && !input.value && input.previousElementSibling) {
input.previousElementSibling.focus();
}
});
container.appendChild(input);
}
}
// Code zusammensetzen
function updateHidden() {
let code = "";
container.querySelectorAll("input").forEach(i => code += i.value);
hiddenInput.value = code;
}
// Animation bei Erfolg
const success = "{{ success }}";
if (success === "True") {
const lock = document.getElementById("lock");
const overlay = document.getElementById("flash-overlay");
const main = document.getElementById("main");
document.body.classList.add("animating");
// 1. Kurz warten
setTimeout(() => {
// 2. Schloss geht auf
lock.textContent = "🔓";
lock.style.transform = "scale(1.08)";
}, 500);
// 3. Langsamer Zoom Richtung Schloss
setTimeout(() => {
main.style.transition = "transform 2.8s ease-in-out, opacity 1.4s ease";
main.style.transformOrigin = "center 65%";
main.style.transform = "scale(2.4)";
}, 1700);
// 4. Schloss verschwindet, während der Weiß-Effekt beginnt
setTimeout(() => {
lock.style.opacity = "0";
}, 3300);
// 5. Weißer Kreis wächst von der Mitte bis zum Rand
setTimeout(() => {
overlay.style.opacity = "1";
overlay.style.transition = "width 2.6s ease-out, height 2.6s ease-out, opacity 0.4s ease";
overlay.style.width = "250vmax";
overlay.style.height = "250vmax";
}, 3500);
// 6. Weiterleitung
setTimeout(() => {
window.location.href = "/success";
}, 6200);
}
</script>
{% endblock %}

View File

@@ -0,0 +1,47 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }} - My Flask Application</title>
<link rel="stylesheet" type="text/css" href="/static/content/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="/static/content/site.css" />
<script src="/static/scripts/modernizr-2.6.2.js"></script>
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="/" class="navbar-brand">Application name</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="{{ url_for('home') }}">Home</a></li>
<li><a href="{{ url_for('about') }}">About</a></li>
<li><a href="{{ url_for('contact') }}">Contact</a></li>
</ul>
</div>
</div>
</div>
<div class="container body-content">
{% block content %}{% endblock %}
<hr />
<footer>
<p>&copy; {{ year }} - My Flask Application</p>
</footer>
</div>
<script src="/static/scripts/jquery-1.10.2.js"></script>
<script src="/static/scripts/bootstrap.js"></script>
<script src="/static/scripts/respond.js"></script>
{% block scripts %}{% endblock %}
</body>
</html>

View File

@@ -0,0 +1,176 @@
{% extends "layout.html" %}
{% block content %}
<style>
body {
overflow: hidden;
}
.victory-page {
position: fixed;
inset: 0;
background: linear-gradient(180deg, rgba(120, 0, 40, 0.85) 0%, rgba(10, 20, 50, 0.95) 70%, rgba(5, 15, 35, 1) 100%);
display: flex;
align-items: center;
justify-content: center;
font-family: Arial, Helvetica, sans-serif;
color: white;
}
.victory-bg {
position: absolute;
inset: 0;
overflow: hidden;
}
.victory-bg::before,
.victory-bg::after {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
}
/* feine Linien */
.victory-bg::before {
background-image: linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px), linear-gradient(135deg, rgba(255,120,120,0.18) 1px, transparent 1px), linear-gradient(45deg, rgba(255,120,120,0.08) 1px, transparent 1px);
background-size: 180px 180px, 180px 180px, 320px 320px, 280px 280px;
opacity: 0.8;
}
/* rote Flächen / Tech-Glas */
.victory-bg::after {
background: linear-gradient(125deg, transparent 0%, transparent 60%, rgba(255,80,80,0.18) 60%, rgba(255,80,80,0.18) 68%, transparent 68%), linear-gradient(140deg, transparent 0%, transparent 72%, rgba(255,160,160,0.12) 72%, rgba(255,160,160,0.12) 76%, transparent 76%), linear-gradient(180deg, rgba(255,0,70,0.10) 0%, transparent 35%), linear-gradient(90deg, transparent 0%, transparent 15%, rgba(255,0,70,0.08) 15%, rgba(255,0,70,0.08) 16%, transparent 16%, transparent 70%, rgba(255,180,180,0.08) 70%, rgba(255,180,180,0.08) 71%, transparent 71%);
}
.panel {
position: relative;
z-index: 2;
text-align: center;
padding: 50px 40px;
width: min(900px, 90vw);
border-radius: 24px;
background: rgba(10, 20, 40, 0.35);
backdrop-filter: blur(6px);
box-shadow: 0 0 40px rgba(0,0,0,0.35);
animation: fadeInUp 1.1s ease;
}
.cancom-logo {
font-size: 88px;
font-weight: 900;
letter-spacing: 1px;
color: #e30613;
margin-bottom: 28px;
line-height: 1;
text-transform: uppercase;
}
.success-title {
font-size: 50px;
font-weight: 800;
color: white;
margin-bottom: 24px;
}
.success-text {
font-size: 30px;
line-height: 1.5;
color: #f4f6fb;
margin-bottom: 30px;
}
.mission-badge {
display: inline-block;
padding: 16px 28px;
border-radius: 14px;
background: #e30613;
color: white;
font-size: 24px;
font-weight: 700;
box-shadow: 0 0 20px rgba(227, 6, 19, 0.35);
}
.corner-line {
position: absolute;
border: 1px solid rgba(255, 180, 180, 0.25);
box-shadow: 0 0 18px rgba(255, 120, 120, 0.08);
}
.corner-line.one {
top: 8%;
left: 18%;
width: 280px;
height: 120px;
}
.corner-line.two {
top: 16%;
right: 10%;
width: 220px;
height: 220px;
transform: skewX(-18deg);
}
.corner-line.three {
bottom: 12%;
right: 7%;
width: 320px;
height: 160px;
transform: skewX(-25deg);
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px) scale(0.98);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
@media (max-width: 768px) {
.cancom-logo {
font-size: 56px;
}
.success-title {
font-size: 34px;
}
.success-text {
font-size: 22px;
}
.mission-badge {
font-size: 20px;
}
}
</style>
<div class="victory-page">
<div class="victory-bg"></div>
<div class="corner-line one"></div>
<div class="corner-line two"></div>
<div class="corner-line three"></div>
<div class="panel">
<div class="cancom-logo">CANCOM</div>
<div class="success-title">Herzlichen Glückwunsch!</div>
<div class="success-text">
Ihr habt die <strong>CANCOM</strong><br>
vor dem Hackerangriff gerettet.
</div>
<div class="mission-badge">Mission erfüllt</div>
</div>
</div>
{% endblock %}