diff --git a/back_image_new.jpg b/back_image_new.jpg new file mode 100644 index 0000000..c5638b1 Binary files /dev/null and b/back_image_new.jpg differ diff --git a/index.html b/index.html index cf4d9f2..5c485cb 100644 --- a/index.html +++ b/index.html @@ -1,43 +1,53 @@ - + - - - Indiana Jones Hinweis-Tester - - + + + Escape Lock + + -
-
-
-

🪙 Hinweis-Tester 🧭

- - -
-
-
-
-
-

Hinweis-Dictionary

-
- - -
+
+ + Escape Hintergrund -
- - -
+ +
+
+ + + + + - + +
1
+
2
+
3
+
4
-
-

Gespeicherte Hinweise:

-
-
+ + + + + + + +
+ + +
+ ✅ Geschafft! Das Geheimnis ist gelüftet. +
+
+ + diff --git a/key.png b/key.png new file mode 100644 index 0000000..e509bfa Binary files /dev/null and b/key.png differ diff --git a/script.js b/script.js index 73dc153..dbc401f 100644 --- a/script.js +++ b/script.js @@ -1,109 +1,48 @@ +// Startwerte +const digits = [1, 2, 3, 4]; -//MAIN -document.addEventListener("DOMContentLoaded", insertValueMainButton); +// Richtige Kombination +const code = [4, 2, 7, 9]; // <- anpassen! -function insertValueMainButton () { - const inputBox = document.getElementById("inputBox"); - const testButton = document.getElementById("testButton"); - const outputArea = document.getElementById("outputArea"); +const dEls = digits.map((_, i) => document.getElementById('d' + i)); +const pad = document.getElementById('pad'); +const openBtn = document.getElementById('openBtn'); +const success = document.getElementById('success'); - testButton.addEventListener("click", EnterWord); -} +const render = () => digits.forEach((v, i) => dEls[i].textContent = v); -function EnterWord() { - const userInput = inputBox.value.trim().toLowerCase(); // Ignoriere Groß-/Kleinschreibung +// Klicks auf Münzen +pad.addEventListener('click', (ev) => { + const btn = ev.target.closest('.coin'); + if (!btn) return; + const idx = +btn.dataset.idx; + const dir = btn.dataset.dir; - if (!userInput) { - outputArea.textContent = "🔎 Bitte gib einen Hinweis ein!"; - return; - } + if (dir === 'up') digits[idx] = (digits[idx] + 1) % 10; + if (dir === 'down') digits[idx] = (digits[idx] + 9) % 10; - // Lade das Dictionary aus dem LocalStorage - const storedData = JSON.parse(localStorage.getItem("hinweisDict")) || {}; - - // Finde passenden Key (case-insensitive Vergleich) - let matchedKey = null; - for (const key in storedData) { - if (key.toLowerCase() === userInput) { - matchedKey = key; - break; - } - } + render(); +}); - if (matchedKey) { - outputArea.textContent = `✅ "${matchedKey}" gefunden: ${storedData[matchedKey]}`; - } else { - outputArea.textContent = `❌ Kein Hinweis gefunden für "${userInput}".`; - } +// Öffnen-Button +openBtn.addEventListener('click', () => { + const ok = digits.every((v, i) => v === code[i]); + if (ok) { + // Inhalt des Pads ersetzen: alles raus, Nachricht rein + pad.classList.remove('pad--shake'); + pad.classList.add('pad--cleared'); + pad.innerHTML = ` +
+ GEHEIMNIS GEÖFFNET +
+ `; + // Optional: Wenn du den Key-Button danach nicht mehr fokussierbar willst: + // openBtn.blur(); + } else { + pad.classList.remove('pad--shake'); + void pad.offsetWidth; + pad.classList.add('pad--shake'); } +}); -//INDEX -document.addEventListener("keydown", function (event) { - if (event.ctrlKey && (event.key === "ä" || event.code === "Quote")) { - //event.preventDefault(); - //Name: mainView - //Name: inputView - const mv = document.getElementById("mainView"); - if (mv.style.visibility === "visible" || mv.style.visibility === "") { - mv.style.visibility = "hidden"; - } else { - mv.style.visibility = "visible"; - } - const el = document.getElementById("inputView"); - if (el.style.visibility === "visible" || el.style.visibility === "") { - el.style.visibility = "hidden"; - } else { - el.style.visibility = "visible"; - } - - } - else if (event.key === "Enter") { - event.preventDefault(); // Optional: verhindert z. B. Form-Submit - const mv = document.getElementById("mainView"); - if (mv.style.visibility === "visible" || mv.style.visibility === "") { - EnterWord(); - } else { - saveEntry(); - } - - } -}, false); - -//INPUT - // Daten laden und anzeigen - function loadDictionary() { - const entriesDiv = document.getElementById("entries"); - entriesDiv.innerHTML = ""; - - const data = JSON.parse(localStorage.getItem("hinweisDict")) || {}; - - for (const key in data) { - const div = document.createElement("div"); - div.className = "entry"; - div.innerHTML = `${key}: ${data[key]}`; - entriesDiv.appendChild(div); - } - } - - // Eintrag speichern - function saveEntry() { - const key = document.getElementById("inputKey").value.trim(); - const value = document.getElementById("inputValue").value.trim(); - - if (key === "" || value === "") { - alert("Beide Felder müssen ausgefüllt sein."); - return; - } - - const data = JSON.parse(localStorage.getItem("hinweisDict")) || {}; - data[key] = value; - localStorage.setItem("hinweisDict", JSON.stringify(data)); - - document.getElementById("inputKey").value = ""; - document.getElementById("inputValue").value = ""; - loadDictionary(); - } - - // Beim Laden anzeigen - window.onload = loadDictionary; - +render(); diff --git a/styles.css b/styles.css index a15a2ae..0cb6bc5 100644 --- a/styles.css +++ b/styles.css @@ -1,62 +1,212 @@ -body { +:root { + /* Pergament-Position */ + --pad-left: 16.3%; + --pad-top: 35.3%; + --pad-w: 33.4%; + --pad-h: 52.5%; + + /* Größe der Klickflächen */ + --coin: 98px; + --digit-size: clamp(24px, 6.2vw, 600px); + --key-size: 26%; /* Breite des Schlüssel-Bildes relativ zum Pergamentbereich */ +} + +* { box-sizing: border-box; } + +/* Seite füllt den Viewport, kein Scrollen */ +html, body { + height: 100%; margin: 0; - padding: 0; - background: url("back_image.png") no-repeat center center fixed; - background-size: cover; - font-family: 'Georgia', serif; - color: #f5deb3; + background: #000; + overflow: hidden; } -.container { +/* Vollbild-Stage */ +.escape { + position: fixed; /* oder: absolute + inset:0; */ + inset: 0; /* top/right/bottom/left = 0 */ + margin: 0; + line-height: 1; + user-select: none; +} + +/* Bild füllt Fläche, beschneidet proportional */ +.escape__img { position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - background: rgba(50, 30, 10, 0.8); - padding: 30px; - border-radius: 15px; - box-shadow: 0 0 15px rgba(0,0,0,0.7); + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + object-position: center; +} + +/* Overlay bleibt weiterhin über dem Bild */ +.overlay { + position: absolute; + inset: 0; + pointer-events: none; +} + +.pad { + position: absolute; + left: var(--pad-left); + top: var(--pad-top); + width: var(--pad-w); + height: var(--pad-h); + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-template-rows: auto 1fr auto; + align-items: center; + justify-items: center; +} +/* Wenn gelöst: Pad zu einer Zelle machen und Text zentrieren */ +.pad--cleared { + grid-template-columns: 1fr !important; + grid-template-rows: 1fr !important; + align-items: center; + justify-items: center; +} + +/* Nachricht nutzt das Ziffern-Styling, nur größer und ohne Y-Offset */ +.solvedText { + grid-column: 1 / -1; + grid-row: 1 / -1; text-align: center; - width: 90%; - max-width: 500px; + padding: 0 2vw; + animation: solved-in .35s ease both; +} +.solvedText.digit { + font-size: clamp(28px, 4vw, 96px); /* größer als die Ziffern */ + transform: none; /* .digit hebt sonst minimal an */ + letter-spacing: .06em; /* etwas „heroischer“ */ + margin-top: -160px; } -h1 { - font-size: 1.8em; - margin-bottom: 20px; - color: #ffd700; - text-shadow: 1px 1px 2px #000; +@keyframes solved-in { + from { opacity: 0; transform: scale(.98); } + to { opacity: 1; transform: scale(1); } } -input[type="text"] { - width: 80%; - padding: 10px; - border: 2px solid #c2b280; - border-radius: 8px; - background-color: #fff8dc; - font-size: 1em; - margin-bottom: 15px; -} - -button { - padding: 10px 20px; - font-size: 1em; - font-weight: bold; - border: none; - border-radius: 8px; - background-color: #8b4513; - color: #fffacd; +.coin { + pointer-events: auto; + appearance: none; + border: 0; + background: transparent; + width: var(--coin); + height: var(--coin); + border-radius: 50%; cursor: pointer; - transition: background-color 0.3s ease; + position: relative; } -button:hover { - background-color: #a0522d; +/* +.coin::after { + content: ""; + position: absolute; + inset: 0; + border-radius: 50%; + box-shadow: inset 0 0 0 0 rgba(255,255,255,0); + transition: box-shadow .15s ease; +} +.coin:hover::after, +.coin:focus-visible::after { + box-shadow: inset 0 0 0 2px rgba(255,255,255,.7); +} +*/ +.digit { + /* Größe kommt weiterhin aus --digit-size */ + font: 900 var(--digit-size)/1 "Cinzel", Georgia, "Times New Roman", serif; + letter-spacing: .06em; + + /* Farb- & Relieflook (eingraviert/antikes Braun) */ + color: #3a2616; /* dunkles, warmes Braun */ + -webkit-text-stroke: 1px rgba(0,0,0,.18); /* dezente Fase/Kante */ + text-shadow: + 0 1px 0 rgba(250, 228, 180, .65), /* obere Lichtkante (pergamentig) */ + 0 -1px 0 rgba(0, 0, 0, .20), /* untere Schattenkante */ + 0 2px 2px rgba(0, 0, 0, .30), /* weicher Drop-Shadow */ + 0 0 8px rgba(110, 80, 40, .20); /* warmer „Glow“ im Pergament */ + pointer-events: none; + transform: translateY(4%); + mix-blend-mode: multiply; /* fügt sich besser in Pergament ein */ } -#outputArea { - margin-top: 20px; - font-size: 1.1em; - min-height: 30px; - color: #fffacd; +/* Screenreader-Only Text (für Barrierefreiheit) */ +.visually-hidden { + position: absolute !important; + width: 1px; height: 1px; + padding: 0; margin: -1px; + overflow: hidden; clip: rect(0 0 0 0); + white-space: nowrap; border: 0; } + +/* Bild-Button */ +.open{ + grid-column: 1 / -1; + grid-row: 4; /* in die 4. Reihe */ + justify-self: center; + + /* Defaults neutralisieren (verhindert graues Rechteck) */ + -webkit-appearance: none; + appearance: none; + background: transparent !important; + border: 0 !important; + padding: 0; + cursor: pointer; + + display: grid; /* Bild sauber zentrieren */ + place-items: center; + pointer-events: auto; +} + +.open img{ + display: block; + width: var(--key-size); + height: auto; + transform: rotate(-18deg); /* leicht schräg */ + transform-origin: 50% 50%; + filter: drop-shadow(0 8px 10px rgba(0,0,0,.45)); + transition: transform .15s ease, filter .15s ease; +} +.open:hover img{ + transform: rotate(-18deg) translateY(-2px) scale(1.03); + filter: drop-shadow(0 12px 14px rgba(0,0,0,.55)); +} +.open:active img{ + transform: rotate(-18deg) translateY(0) scale(.98); + filter: drop-shadow(0 6px 6px rgba(0,0,0,.45)); +} +/* optional sichtbarer Fokusrahmen für Tastatur-Nutzer */ +.open:focus-visible img{ + outline: 3px solid rgba(255,255,255,.85); + outline-offset: 4px; +} + +.message { + position: absolute; + inset: 0; + display: grid; + place-items: center; + padding: 2rem; + text-align: center; + color: #fff; + font: 800 clamp(20px, 6vw, 44px)/1.15 system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, sans-serif; + opacity: 0; + pointer-events: none; + transform: scale(.98); + transition: opacity .3s ease, transform .3s ease; +} +.message--show { + opacity: 1; + pointer-events: auto; + transform: scale(1); +} + +@keyframes shake { + 0%,100% { transform: translateX(0); } + 20% { transform: translateX(-6px); } + 40% { transform: translateX(6px); } + 60% { transform: translateX(-4px); } + 80% { transform: translateX(4px); } +} +.pad--shake { animation: shake .35s ease; }