Files
felhom.eu/website/preview/index.html
T
admin 43b67283c3
gates / gates (push) Failing after 14m58s
website: the footer dash swept site-wide, and the primary CTA meets WCAG AA
Two operator decisions from STOP 3, both independent of the home-page switch,
which was NOT approved and has NOT happened. index.html still serves the old
design; only the footer line and the button change on it.

1. The footer em dash, on all 21 page files (12 HU + 8 EN + the preview).
   "(c) 2026 felhom.eu - Sajat felhod..." now uses the spaced en dash, which is
   the correct Hungarian gondolatjel. Done as one sweep because site_gates.py
   gate 3 requires every page in a language set to carry an IDENTICAL footer, so
   this could never have been a one-page edit. Gate green: all 14 still match.

   Scope, stated honestly: this clears the footer only. 300 em dashes remain in
   the BODIES of the other 19 pages (gyik 53, en/faq 53, adatkezeles 33,
   szolgaltatasok-nonpublic 27, testing 24, teszteles 23, index 17/19, ...). The
   preview page is the only page at zero. The rest is NEXT.md work, page by page.

2. R-930, the operator's choice of the three offered: white on --blue measures
   4.01:1, under WCAG AA's 4.5:1 for body text. .cta-button goes to 1.2rem/700,
   which is >=18.66px at >=700 weight, so WCAG counts it as LARGE text and the
   floor becomes 3:1 - which 4.01 clears without touching --blue. Darkening the
   token was rejected because --blue is shared with the hub and controller UIs.
   Horizontal padding trimmed 32->26px to protect the one-line rule for the
   longest label; verified in the browser at 390px, not assumed.
   .cta-button-secondary is unchanged: it already measures 7.17:1.

   This reaches the primary button on 16 pages, which is the point - the defect
   was never the home page's.

site.css?v= bumped to 12 on all 21 files. The pages sat at v=10 and the preview
at v=11; leaving them split would have served a returning visitor the old
stylesheet and the change would have looked like it did not deploy.

site_gates.py green.
2026-10-11 00:25:43 +02:00

445 lines
26 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="hu">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Otthoni szerver a saját otthonodban: fényképek, dokumentumok, médiatár. 58 telepíthető alkalmazás, háromszintű automatikus mentés, magyar vagy angol nyelvű vezérlőpult. Most zárt teszt indul.">
<title>Felhom.eu — Saját felhőd, saját szabályaid | Otthoni szerver szolgáltatás</title>
<!-- SEO meta -->
<meta name="keywords" content="otthoni szerver, saját felhő, self-hosting, Google Drive alternatíva, iCloud alternatíva, adatvédelem, nyílt forráskódú, szerver telepítés, szerver üzemeltetés, Nextcloud, Immich, Magyarország">
<meta name="author" content="Felhom.eu">
<meta name="robots" content="noindex, nofollow">
<!-- PREVIEW ONLY. This file becomes website/index.html at the switch; this noindex
line and robots.txt's Disallow: /preview/ are removed in that same commit. -->
<link rel="canonical" href="https://felhom.eu/">
<link rel="alternate" hreflang="hu" href="https://felhom.eu/">
<link rel="alternate" hreflang="en" href="https://felhom.eu/en/">
<link rel="alternate" hreflang="x-default" href="https://felhom.eu/">
<!-- Open Graph (Facebook, LinkedIn) -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://felhom.eu/">
<meta property="og:title" content="Felhom.eu — Saját felhőd, saját szabályaid">
<meta property="og:description" content="Otthoni szerver a te otthonodban: fényképek, dokumentumok, médiatár — automatikus mentéssel, és egy helyreállítási kóddal, amit csak te ismersz. Most zárt teszt indul.">
<meta property="og:image" content="https://felhom.eu/assets/og-image.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Felhom.eu — Saját felhőd, saját szabályaid. Zárt teszt indul.">
<meta property="og:locale" content="hu_HU">
<meta property="og:site_name" content="Felhom.eu">
<!-- Twitter/X Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Felhom.eu — Saját felhőd, saját szabályaid">
<meta name="twitter:description" content="Otthoni szerver a te otthonodban: fényképek, dokumentumok, médiatár — automatikus mentéssel, és egy helyreállítási kóddal, amit csak te ismersz.">
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
<!-- Structured Data (JSON-LD) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "LocalBusiness",
"name": "Felhom.eu",
"description": "Professzionális otthoni szerver telepítés és üzemeltetés Magyarországon.",
"url": "https://felhom.eu",
"logo": "https://felhom.eu/assets/logo.png",
"email": "info@felhom.eu",
"areaServed": {
"@type": "Country",
"name": "Magyarország"
},
"serviceType": ["Szerver telepítés", "Szerver üzemeltetés", "Self-hosting"],
"knowsLanguage": ["hu", "en"],
"sameAs": []
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=12">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="/assets/gallery.js?v=2"></script>
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
<body class="page-index">
<nav>
<div class="container">
<a href="/" class="logo">
<img class="logo-mark" src="/assets/logo-mark.svg" alt="" aria-hidden="true">
<img class="logo-word" src="/assets/logo-wordmark.png" alt="felhom.eu">
</a>
<ul class="nav-links">
<li><a href="/#szolgaltatasok">Szolgáltatások</a></li>
<li><a href="/alkalmazasok">Alkalmazások</a></li>
<li><a href="/technologiak">Technológiák</a></li>
<li><a href="/biztonsagimentes">Mentések</a></li>
<li><a href="/gyik">GYIK</a></li>
<li><a href="/kapcsolat">Kapcsolat</a></li>
<li class="lang-globe-li"><details class="lang-globe"><summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary><ul class="lang-globe-menu"><li><a href="/" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/en/" lang="en" hreflang="en" class="lang-globe-item">English</a></li></ul></details></li>
</ul>
<button class="hamburger" id="hamburger" aria-label="Menü megnyitása" aria-expanded="false">
<span class="hamburger-box">
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
</span>
</button>
</div>
</nav>
<div class="mobile-overlay" id="mobileOverlay"></div>
<section class="lede">
<div class="container">
<div class="lede-grid">
<div class="lede-text">
<h1>Saját felhőd,<br><span>saját szabályaid</span></h1>
<p>Egy kis gép az otthonodban: a fényképeid, a dokumentumaid, a filmjeid. Minden éjjel mentés készül. Mi figyeljük, te használod.</p>
<a href="/teszteles" class="cta-button">Jelentkezem tesztelőnek →</a>
</div>
<figure class="lede-shot">
<img src="/assets/dashboard-start-hu.webp" alt="A Felhom vezérlőpult indítópultja: az otthon telepített alkalmazások csempéi" width="1440" height="900" fetchpriority="high">
<figcaption>A vezérlőpult indítópultja egy éles Felhom dobozon.</figcaption>
</figure>
</div>
</div>
</section>
<section class="content-section" id="mit-tud">
<div class="container">
<div class="sec-head">
<h2>Mit tud <span>a doboz ma?</span></h2>
<p>Nem terv és nem ígéret: ezek ma működő funkciók egy éles Felhom dobozon.</p>
</div>
<div class="caps">
<div class="caps-group">
<h3>Amit nap mint nap használsz</h3>
<ul class="caps-list">
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-camera"/></svg> Fényképek, dokumentumok, média</h4>
<p>A telefonod fotói automatikusan feltöltődnek a saját gépedre. A beszkennelt papírjaidat a rendszer felismeri és kereshetővé teszi. A filmjeid, zenéid böngészőből és mobil appból is mennek.</p>
</li>
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-folder"/></svg> Hálózati megosztás</h4>
<p>A doboz mappái megjelennek a Windows Intézőben és a Mac Finderben: úgy húzod rájuk a fájlokat, mint bármelyik másik mappára. Megosztásonként beállítható, hogy csak olvasható legyen.</p>
</li>
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-package"/></svg> 58 telepíthető alkalmazás</h4>
<p>A vezérlőpultból telepíthetők, pár kattintással, parancssor nélkül. Szinte mind nyílt forráskódú (a kivételeket az alkalmazások oldalán jelöljük), és mind a te gépeden fut.</p>
</li>
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg> Magyarul vagy angolul</h4>
<p>A vezérlőpult magyarul és angolul is használható. A nyelvet a háztartás választja, és a dobozról érkező e-mailek is ezt a nyelvet követik.</p>
</li>
</ul>
</div>
<div class="caps-group">
<h3>Ami a háttérben véd</h3>
<ul class="caps-list">
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-shield-check"/></svg> Háromszintű automatikus mentés</h4>
<p>Minden éjjel készül egy mentés a dobozon, egy másodpéldány egy második meghajtóra (ha van), és egy titkosított másolat egy távoli tárhelyre. A megosztott mappáid a második meghajtón és a távoli másolatban is benne vannak.</p>
</li>
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-lock"/></svg> Helyreállítási kód, amit csak te ismersz</h4>
<p>A távoli mentésed titkosításának kulcsa egy helyreállítási kód, ami pontosan egyszer jelenik meg: a te képernyődön. Mi nem ismerjük, és nem tudjuk visszaállítani. Ez azt is jelenti, hogy a kód nélkül a távoli mentés nekünk sem olvasható: tedd el jól.</p>
</li>
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rotate-cw"/></svg> Visszaállítás, ha baj van</h4>
<p>Egy törölt fájl visszahozható a mentésből. Ha maga a doboz megy tönkre, az újratelepített rendszerre a titkosított távoli mentésből visszahozhatók az alkalmazásaid adatai, a helyreállítási kóddal.</p>
</li>
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-home"/></svg> Internetkimaradáskor is működik</h4>
<p>A doboz az otthonodban van. Ha elmegy a net, az otthoni hálózaton továbbra is eléred a fotóidat és a fájljaidat: nem egy távoli szolgáltató engedélyétől függenek.</p>
</li>
</ul>
</div>
<div class="caps-group">
<h3>Amiről mi gondoskodunk</h3>
<ul class="caps-list">
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-stethoscope"/></svg> Távoli felügyelet, automatikus frissítés</h4>
<p>Figyeljük a doboz állapotát. A vezérlőpult magától frissül a legutóbbi kiadásra, és a doboz rendszere is megkapja a biztonsági frissítéseket. Neked nem kell csinálnod semmit. Ha valami elromlik, mi látjuk.</p>
</li>
<li class="caps-item">
<h4><svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-rotate-cw"/></svg> Óvatos alkalmazásfrissítés</h4>
<p>Egy alkalmazás új verziója csak akkor jut el hozzád, ha előbb kipróbáltuk. Frissítés előtt friss mentés készül, és ha az új verzió nem indul el rendesen, a doboz magától visszaállítja az előzőt, az adataiddal együtt.</p>
</li>
</ul>
</div>
</div>
</div>
</section>
<section class="content-section alt-bg" id="vezerlopult">
<div class="container">
<div class="sec-head">
<h2>Így néz ki <span>a vezérlőpult</span></h2>
<p>Valódi képek egy Felhom dobozról. Kattints rájuk a teljes mérethez.</p>
</div>
<div class="dash-grid">
<figure class="dash-shot">
<a href="/assets/dashboard-start-hu.webp" data-gallery="dashboard"><img src="/assets/dashboard-start-hu.webp" alt="A vezérlőpult Indítópultja: az otthon telepített alkalmazások csempéi" width="1440" height="900" loading="lazy"></a>
<figcaption><strong>Indítópult</strong>: minden alkalmazásod egy kattintásra.</figcaption>
</figure>
<figure class="dash-shot">
<a href="/assets/dashboard-apps-hu.webp" data-gallery="dashboard"><img src="/assets/dashboard-apps-hu.webp" alt="Az Alkalmazások oldal: telepített és telepíthető alkalmazások kártyái, állapottal" width="1440" height="900" loading="lazy"></a>
<figcaption><strong>Alkalmazások</strong>: telepítés pár kattintással, és látod, mi fut és mi naprakész.</figcaption>
</figure>
<figure class="dash-shot">
<a href="/assets/dashboard-app-hu.webp" data-gallery="dashboard"><img src="/assets/dashboard-app-hu.webp" alt="Egy alkalmazás saját oldala: mire jó, képek, és az első lépések" width="1440" height="900" loading="lazy"></a>
<figcaption><strong>Egy alkalmazás oldala</strong>: mire jó, hova tedd a fájlokat, és hogyan kezdj hozzá.</figcaption>
</figure>
<figure class="dash-shot">
<a href="/assets/dashboard-backups-hu.webp" data-gallery="dashboard"><img src="/assets/dashboard-backups-hu.webp" alt="A mentések oldala: minden alkalmazás adatbázisának éjszakai mentése, ellenőrizve" width="1440" height="900" loading="lazy"></a>
<figcaption><strong>Mentések</strong>: minden éjjel minden alkalmazás adatbázisa mentésre kerül, és ellenőrizzük.</figcaption>
</figure>
</div>
</div>
</section>
<section class="content-section" id="ki-all-mogotte">
<div class="container">
<div class="who">
<figure class="who-photo">
<img src="/assets/operator-portrait.webp" alt="Nagyfenyvesi Viktor, a Felhom üzemeltetője" width="720" height="900" loading="lazy">
</figure>
<div class="who-text">
<h2>Ki áll <span>mögötte</span></h2>
<p><strong>Nagyfenyvesi Viktor vagyok.</strong> Tíz éve tervezek hálózatokat és infrastruktúrát, ma DevOps mérnökként dolgozom, otthon pedig évek óta megy a saját szerverem; a mostani nagyjából egy éve fut.</p>
<p>A Felhom onnan indult, hogy ilyen szolgáltatást itthon nem találtam. Saját szervert sokan meg tudnak építeni, de utána menteni, frissíteni és figyelni is kell valakinek. Ezt a részét vállalom át.</p>
<p>Ha írsz, én válaszolok, és nem ígérek olyat, amit a doboz ma nem tud.</p>
</div>
</div>
</div>
</section>
<section class="content-section alt-bg" id="hogyan-mukodik">
<div class="container">
<div class="sec-head">
<h2>Hogyan <span>működik?</span></h2>
<p>Az első beszélgetéstől a működő rendszerig.</p>
</div>
<div class="flow">
<div class="flow-step">
<h3>Egyeztetés</h3>
<p>Megbeszéljük az igényeidet: milyen alkalmazásokra van szükséged, és mekkora tárhelyet szeretnél.</p>
</div>
<div class="flow-step">
<h3>Hardver kiválasztás</h3>
<p>Segítünk megtalálni a legjobb ár-érték arányú gépet, ami az igényeidnek megfelel.</p>
</div>
<div class="flow-step">
<h3>Telepítés</h3>
<p>Feltelepítjük és bekonfiguráljuk az alkalmazásokat, a mentéseket, és a monitoringot.</p>
</div>
<div class="flow-step">
<h3>Átadás</h3>
<p>Bemutatjuk a rendszert, segítünk áthozni a meglévő adataidat, és válaszolunk minden kérdésedre.</p>
</div>
<div class="flow-step">
<h3>Üzemeltetés</h3>
<p>Figyeljük a rendszert, frissítünk, mentéseket ellenőrzünk. Te csak használod.</p>
</div>
</div>
</div>
</section>
<section class="content-section" id="mentesek">
<div class="container">
<div class="backup-content">
<div class="backup-text">
<h2>Adataid <span>biztonságban</span></h2>
<p>A nagy felhőszolgáltatók milliókat költenek arra, hogy az adataid ne vesszenek el. De tudtad, hogy ugyanezt az otthoni szerveredről is elérheted?</p>
<p>A 3-2-1 mentési szabályt követve professzionális szintű adatbiztonságot építünk fel – egy katasztrófa után is marad egy titkosított másolat, távol az otthonodtól.</p>
<a href="/biztonsagimentes" class="cta-button-secondary">
Mentési stratégia részletei →
</a>
</div>
<div class="backup-visual">
<div class="backup-rule-mini">
<span class="rule-num">3</span>
<div class="rule-text">
<h4>Három másolat</h4>
<p>Eredeti + két biztonsági mentés</p>
</div>
</div>
<div class="backup-rule-mini">
<span class="rule-num">2</span>
<div class="rule-text">
<h4>Két tárolótípus</h4>
<p>Különböző eszközökön tárolva</p>
</div>
</div>
<div class="backup-rule-mini">
<span class="rule-num">1</span>
<div class="rule-text">
<h4>Egy távoli helyen</h4>
<p>Offsite backup a biztonság érdekében</p>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="content-section alt-bg" id="miert">
<div class="container">
<div class="sec-head">
<h2>Miért a <span>sajátod?</span></h2>
<p>Ugyanaz a kényelem, más feltételekkel.</p>
</div>
<div class="vs">
<div class="vs-head">
<div>Felhőszolgáltatónál</div>
<div>Saját dobozon</div>
</div>
<div class="vs-row">
<div>Havonta fizetsz a tárhelyért és a prémium funkciókért, és az árak csak nőnek idővel.</div>
<div><strong>A gép a tiéd, örökre.</strong> Nincs tárhely-előfizetés, ami évről évre drágul: az áramot fizeted, és ha kéred, az üzemeltetést.</div>
</div>
<div class="vs-row">
<div>A fotóid, dokumentumaid, személyes adataid idegen szervereken vannak, idegen kezekben.</div>
<div><strong>Az adataid az otthonodban maradnak</strong>, nem a Google vagy a Microsoft szerverein. A távoli mentésbe csak titkosítva kerülnek.</div>
</div>
<div class="vs-row">
<div>A tárhely fogy, és ha betelt, megint fizetsz.</div>
<div><strong>Nincs 15GB-os limit.</strong> Bővítheted ahogy nőnek az igényeid, TB-okkal, ha kell.</div>
</div>
<div class="vs-row">
<div>Nem te döntöd el, milyen szolgáltatásokat használsz, és mikor szűnnek meg.</div>
<div><strong>Te döntöd el, milyen szolgáltatásokat futtatsz.</strong> Te vagy a főnök, nem a szolgáltató.</div>
</div>
</div>
</div>
</section>
<section class="content-section" id="szolgaltatasok">
<div class="container">
<div class="band">
<div class="band-item" id="alkalmazasok">
<h3>Amit telepíthetsz</h3>
<p>Fájlkezelés, fotók és média, dokumentumok, jelszókezelés, okosotthon, fejlesztői eszközök. Nextcloud, Immich, Jellyfin, Paperless-ngx, Vaultwarden, Home Assistant és még 52 másik: <strong>58 alkalmazás</strong>, szinte mind nyílt forráskódú.</p>
<a href="/alkalmazasok" class="cta-button-secondary">Összes alkalmazás megtekintése →</a>
</div>
<div class="band-item" id="technologiak">
<h3>Ami alatta fut</h3>
<p>Docker konténerek egy Proxmox alapon, háromszintű mentés, titkosított alagút nyitott port nélkül, magyar vagy angol vezérlőpult. Az igényeidhez igazítjuk, a <strong>legegyszerűbbtől a legkomolyabbig</strong>.</p>
<a href="/technologiak" class="cta-button-secondary">Technológiákról bővebben →</a>
</div>
</div>
</div>
</section>
<section class="content-section alt-bg" id="zart-teszt">
<div class="container">
<div class="sec-head">
<h2>Zárt <span>teszt</span></h2>
<p>Néhány magyar háztartással most kezdjük el élesben használni a rendszert.</p>
</div>
<div class="test-grid">
<div class="test-note">
<h3>Valódi használat</h3>
<p>Nem demó: a doboz nálad marad, és az igazi fényképeidet, dokumentumaidat teszed rá. Segítünk a telepítésben és az átállásban, utána te használod a mindennapokban.</p>
</div>
<div class="test-note">
<h3>Visszajelzés</h3>
<p>Cserébe azt kérjük, hogy mondd el, mi zavaró, mi érthetetlen, mi nem működik. Egy „ezt a gombot nem találtam" ér nekünk a legtöbbet: abból tudjuk, mit kell kijavítani.</p>
</div>
</div>
<div class="limits">
<h3>Ismert korlátok, őszintén</h3>
<p>A vezérlőpulthoz jelenleg <strong>egy közös háztartási jelszó</strong> tartozik, külön családtagi fiókok még nincsenek (az egyes alkalmazásoknak viszont saját felhasználóik lehetnek). A <strong>TV-re streamelés (DLNA)</strong> még nincs: egyelőre böngészőből és mobil appból megy a médiatár. És mivel ez teszt, számíts arra, hogy találsz hibát: ez a lényege.</p>
</div>
<div class="close-cta">
<p>Ha ez érdekel, írj. <strong>Nem kötelez semmire</strong>, először csak beszélgetünk.</p>
<a href="/teszteles" class="cta-button">Jelentkezem tesztelőnek →</a>
</div>
</div>
</section>
<section class="contact" id="kapcsolat">
<div class="container">
<div class="contact-box">
<h2>Érdekel? <span>Beszéljünk!</span></h2>
<div class="contact-methods">
<a href="/kapcsolat" class="contact-link"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-message-square"/></svg> Kapcsolatfelvételi űrlap</a>
<a href="mailto:info@felhom.eu" class="contact-link"><svg class="ico" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-mail"/></svg> info@felhom.eu</a>
</div>
</div>
</div>
</section>
<footer>
<div class="container">
<p>© 2026 felhom.eu – Saját felhőd, saját szabályaid</p>
<p class="footer-legal">Üzemeltető: Nagyfenyvesi Viktor · <a href="mailto:info@felhom.eu">info@felhom.eu</a> · <a href="/adatkezeles">Adatkezelési tájékoztató</a> · <a href="/feltetelek">Feltételek</a></p>
</div>
</footer>
<script>
(function() {
const hamburger = document.getElementById('hamburger');
const navLinks = document.querySelector('.nav-links');
const overlay = document.getElementById('mobileOverlay');
const body = document.body;
if (!hamburger || !navLinks || !overlay) {
console.warn('[mobile-menu] Missing elements:', {
hamburger: !!hamburger,
navLinks: !!navLinks,
overlay: !!overlay
});
return;
}
function openMenu() {
hamburger.classList.add('is-active');
navLinks.classList.add('is-open');
overlay.classList.add('is-visible');
body.classList.add('menu-open');
hamburger.setAttribute('aria-expanded', 'true');
hamburger.setAttribute('aria-label', 'Menü bezárása');
}
function closeMenu() {
hamburger.classList.remove('is-active');
navLinks.classList.remove('is-open');
overlay.classList.remove('is-visible');
body.classList.remove('menu-open');
hamburger.setAttribute('aria-expanded', 'false');
hamburger.setAttribute('aria-label', 'Menü megnyitása');
}
hamburger.addEventListener('click', function() {
if (navLinks.classList.contains('is-open')) {
closeMenu();
} else {
openMenu();
}
});
// Close on overlay click
overlay.addEventListener('click', closeMenu);
// Close on nav link click
navLinks.querySelectorAll('a').forEach(function(link) {
link.addEventListener('click', closeMenu);
});
// Close on Escape key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && navLinks.classList.contains('is-open')) {
closeMenu();
}
});
// Close on resize if open (e.g., rotating device)
window.addEventListener('resize', function() {
if (window.innerWidth > 900 && navLinks.classList.contains('is-open')) {
closeMenu();
}
});
})();
</script>
</body>
</html>