website: the language switch becomes a globe like the dashboard's (Magyar / English list, current marked, no JS); site.css v3; gate 13 checks the globe from one LANGS list; 5 decoys
gates / gates (push) Successful in 3m54s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
This commit is contained in:
2026-10-08 09:13:23 +02:00
parent c7aade4079
commit 803af4798d
26 changed files with 227 additions and 53 deletions
+3
View File
@@ -37,6 +37,9 @@ to the visible answers, and nothing after `</html>`.
- English words: the dashboard's (`en.json`: Dashboard, Launcher, Backup); app names and „Felhom" stay;
no „please"/„kindly"; prices stay in Ft. The English footer says Felhom serves households in Hungary.
- No Accept-Language redirect and no language cookie — a visitor lands on the page they asked for.
- **The switch is a globe** (operator ruling 2026-10-08, like the dashboard's): a `<details class="lang-globe">` in
the nav listing every language in its own name, the current one marked. **A new language = one entry in
`LANGS` in `scripts/site_gates.py` (and the globe's list) + its twin pages** — nothing else in the switch changes.
## The encoding fences
+1
View File
@@ -30,6 +30,7 @@
- **Every page has an English twin at felhom.eu/en/**, public now (your choice B). A small "English" / "Magyar" link
in the menu goes to the same page in the other language.
- **A missing-page (404) page exists now.**
- **The language link is now a globe icon**, like the dashboard's: a click shows „Magyar" and „English".
**Needs you:** two choices in `REPORT-website-refresh.md`. If nothing: SparkyFitness stays listed; the contact
mailer's source stays lost.
@@ -829,8 +829,11 @@ that**, and it is the same walk R-516 is waiting for in the other language.
`/en/download`. No twin, by name: the hidden prices page and `404.html` (Hungarian first, one English line).
Section anchors are English on the English page (`#apps`, not `#alkalmazasok`).
**[DESIGN] The switch is a link, not a redirect.** Each page carries one nav item naming the other language in
that language („English" / „Magyar"), pointing at its own twin, with `lang` and `hreflang`. No Accept-Language
**[DESIGN] The switch is a globe, not a redirect** (ruling 11, 2026-10-08 — it replaced the first day's text link).
Each page's nav carries one `<details>` globe like the dashboard's (§10.3): a list naming every language in its own
language (Magyar, English — the same order everywhere), the page's own language marked and pointing at the page
itself, every other item at that language's twin, with `lang` and `hreflang`. A third language is one list entry
plus its pages. It works without JavaScript. No Accept-Language
redirect, no cookie: a visitor lands on the page they asked for — the same reasoning as §3, where a household's
choice lives in its own setting and a stranger's in their own browser.
@@ -870,3 +873,5 @@ These are rulings, not proposals. Anything specced against a different assumptio
live immediately"): indexed, in `sitemap.xml` with `xhtml:link` alternates, and a language switch in the nav of
every page in both languages. No Accept-Language redirect and no cookie: a visitor always lands on the page they
asked for.
11. **The website's language switch is a globe with a list of languages, matching the controller; text links are
retired** (operator ruling 2026-10-08, the globe brief). §10.7.
@@ -0,0 +1,21 @@
### site/globe-wrong-page rc=1
mutation (website/en/apps.html): '<a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a>' -> '<a href="/" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a>'
FAIL: en/apps.html: the globe's hu item points at '/' — its twin is '/alkalmazasok'
### site/globe-two-current rc=1
mutation (website/en/apps.html): '<a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a>' -> '<a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-globe-item current" aria-curre'
FAIL: en/apps.html: the globe marks 'hu' as current (class current=True, aria-current=True) — only the page's own language 'en' is
### site/globe-missing-language rc=1
mutation (website/en/apps.html): '<li><a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li' -> ''
FAIL: en/apps.html: the globe lists [('en', 'English')] — every page lists exactly [('hu', 'Magyar'), ('en', 'English')], in that order
### site/globe-wrong-order rc=1
mutation (website/en/apps.html): '<li><a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li' -> '<li><a href="/en/apps" lang="en" hreflang="en" class="lang-globe-item current" aria-curren'
FAIL: en/apps.html: the globe lists [('en', 'English'), ('hu', 'Magyar')] — every page lists exactly [('hu', 'Magyar'), ('en', 'English')], in that order
### site/leftover-text-switch rc=1
mutation (website/en/apps.html): '<li class="lang-globe-li">' -> '<li><a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-switch">Magyar</a></li><li'
FAIL: en/apps.html: <nav> differs from en/index.html (after active-marker normalization)
FAIL: en/apps.html: a leftover text language switch (class="lang-switch") — the globe replaced it
@@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
"""Replace the nav's text language switch with the globe on every page (2026-10-08 ruling: a globe with a list of
languages, matching the controller). One language list; each page's own URL and its twins' URLs."""
import io, os, re, sys
W = "/mnt/5_hdd/felhom.eu/git/felhom.eu/website"
LANGS = [("hu", "Magyar"), ("en", "English")] # order on every page
LABEL = {"hu": "Nyelv", "en": "Language"}
# page -> {lang: url}; NO_TWIN pages point their foreign item at the other language's home
SETS = [("index.html", "/", "en/index.html", "/en/"), ("alkalmazasok.html", "/alkalmazasok", "en/apps.html", "/en/apps"),
("technologiak.html", "/technologiak", "en/technology.html", "/en/technology"),
("biztonsagimentes.html", "/biztonsagimentes", "en/backups.html", "/en/backups"),
("gyik.html", "/gyik", "en/faq.html", "/en/faq"), ("kapcsolat.html", "/kapcsolat", "en/contact.html", "/en/contact"),
("letoltes.html", "/letoltes", "en/download.html", "/en/download")]
PAGES = {}
for hu, hu_u, en, en_u in SETS:
PAGES[hu] = ("hu", {"hu": hu_u, "en": en_u})
PAGES[en] = ("en", {"hu": hu_u, "en": en_u})
PAGES["404.html"] = ("hu", {"hu": "/", "en": "/en/"})
PAGES["szolgaltatasok-nonpublic.html"] = ("hu", {"hu": "/szolgaltatasok-nonpublic", "en": "/en/"})
def globe(lang, urls):
items = []
for code, name in LANGS:
cur = code == lang
items.append('<li><a href="%s" lang="%s" hreflang="%s" class="lang-globe-item%s"%s>%s</a></li>'
% (urls[code], code, code, " current" if cur else "", ' aria-current="true"' if cur else "", name))
return ('<li class="lang-globe-li"><details class="lang-globe"><summary class="lang-globe-btn" aria-label="%s" title="%s">'
'<svg class="ico-lg" aria-hidden="true"><use href="/assets/icons.svg?v=1#i-globe"/></svg></summary>'
'<ul class="lang-globe-menu">%s</ul></details></li>') % (LABEL[lang], LABEL[lang], "".join(items))
SW = re.compile(r'<li><a href="[^"]*" lang="(?:hu|en)" hreflang="(?:hu|en)" class="lang-switch">[^<]*</a></li>')
for p, (lang, urls) in PAGES.items():
path = os.path.join(W, p)
s = io.open(path, encoding="utf-8-sig").read()
s, n = SW.subn(lambda m: globe(lang, urls), s)
assert n == 1, (p, n)
s, k = re.subn(r"/assets/site\.css\?v=2\b", "/assets/site.css?v=3", s)
assert k == 1, (p, k)
with io.open(path, "w", encoding="utf-8-sig", newline="\n") as f:
f.write(s)
print(p, "globe + css v3")
+10
View File
@@ -1,3 +1,13 @@
## gates — the language globe (site_gates.py gates 3 and 13; 2026-10-08)
- One language list, `LANGS = [("hu", "Magyar"), ("en", "English")]`, with `GLOBE_LABEL`. Gate 3 normalises the
whole `<details class="lang-globe">` (its targets and current mark differ per page). Gate 13 `check_globe`: exactly
one globe; the label in the page's language; one `<a>` per `LANGS` entry in order with `lang`/`hreflang` equal to it;
only the page's own language is `current`/`aria-current`; on twin pages each item points at that language's page
(the page itself or its twin). NO_TWIN pages get the structure checks. Any leftover `class="lang-switch"` fails.
- Decoys (each with its own failure line): `site/globe-wrong-page`, `globe-two-current`, `globe-missing-language`,
`globe-wrong-order`, `leftover-text-switch`; `site/switch-wrong-twin` retired with the switch.
## gates — the website's two languages (site_gates.py gates 3, 13–18; 2026-10-08)
- `site_gates.py`: pages are registered as `TWINS` (Hungarian page → English twin) or by name in `NO_TWIN`
+60 -15
View File
@@ -8,7 +8,7 @@ Gates (all must pass; non-zero exit on any failure):
Windows grep false-negatives multibyte emoji, proven in D0)
3. nav — the <nav>…</nav> and <footer>…</footer> blocks are identical PER LANGUAGE SET
(Hungarian pages against index.html, English pages against en/index.html) after
stripping the active-link marker and the language switch's target
stripping the active-link marker and the language globe (gate 13 checks it)
4. analytics — the umami snippet is present on every public page (nonpublic draft exempt)
5. no-CDN — zero fonts.googleapis.com / fonts.gstatic.com references
6. banned — zero legacy hexes / 999px radius / box-shadow in pages + site.css
@@ -16,7 +16,9 @@ Gates (all must pass; non-zero exit on any failure):
8. cachebust — every site.css / icons.svg reference carries ?v=<N>
12. download — the two download pages name the same installer file and checksum (R-559)
13. twins — every public Hungarian page has its English twin and back; each pair carries the same
hu/en/x-default alternates; each page's language switch points at its own twin
hu/en/x-default alternates; each page's language GLOBE (one per page, every page) lists LANGS in
order, marks only the page's own language current, and points the other items at the twins;
no leftover text switch
14. lang — <html lang="hu"> on the Hungarian set, lang="en" on the English set
15. same apps — the app logos on /alkalmazasok and /en/apps are the same set
16. no HU — no Hungarian in the English pages: accent scan PLUS an ASCII-folded, word-bounded stem
@@ -87,15 +89,21 @@ def is_emoji(ch):
])
SWITCH_RE = re.compile(r'<a href="([^"]*)" lang="(hu|en)" hreflang="(hu|en)" class="lang-switch">([^<]*)</a>')
# The language globe (2026-10-08 ruling, 10-localisation.md §10.7): one <details> per page, its list built from THIS
# list — a third language is one more entry here plus its pages, and nothing else in the switch.
LANGS = [("hu", "Magyar"), ("en", "English")]
GLOBE_LABEL = {"hu": "Nyelv", "en": "Language"}
GLOBE_RE = re.compile(r'<details class="lang-globe">.*?</details>', re.S)
GLOBE_ITEM_RE = re.compile(r'<a href="([^"]*)" lang="([^"]*)" hreflang="([^"]*)" class="lang-globe-item( current)?"'
r'( aria-current="true")?>([^<]*)</a>')
def norm_block(b):
b = b.replace(' class="active"', "")
b = re.sub(r'\s*aria-current="[^"]*"', "", b)
# the language switch is the one nav item whose target differs per page (it points at the page's own
# twin) — gate 13 checks that target; here only its presence and wording must match
b = SWITCH_RE.sub(lambda m: '<a lang-switch="%s">%s</a>' % (m.group(2), m.group(4)), b)
# the globe is the one nav item whose content differs per page (its targets, its current mark, its label) —
# gate 13 checks all of that; here only its presence must match
b = GLOBE_RE.sub('<details class="lang-globe"/>', b)
return b
@@ -225,7 +233,43 @@ for p, s in pages.items():
if not m.group(2).startswith("?v="):
fail("%s: %s referenced without ?v= (got %r)" % (p, m.group(1), m.group(0)))
# gate 13: twins — both ways, matching alternates, the switch at the twin
# gate 13: twins — both ways, matching alternates, the globe pointing at the twins
def lang_of(p):
return "en" if p in EN_PAGES else "hu"
def check_globe(p, lang, urls=None):
"""Exactly one globe; its label in the page's language; one item per LANGS entry, in order, lang/hreflang equal to
the entry; the page's own language is the only current/aria-current item; with `urls`, each item's target."""
s = pages[p]
g = GLOBE_RE.findall(s)
if len(g) != 1:
fail("%s: %d language globes in the page — exactly one, in the nav" % (p, len(g)))
return
lab = re.search(r'<summary class="lang-globe-btn" aria-label="([^"]*)" title="([^"]*)">', g[0])
if not lab or lab.group(1) != GLOBE_LABEL[lang] or lab.group(2) != GLOBE_LABEL[lang]:
fail("%s: the globe's label is %r — on a %s page it is %r" % (p, lab and lab.groups(), lang, GLOBE_LABEL[lang]))
items = GLOBE_ITEM_RE.findall(g[0])
if len(re.findall(r"<a ", g[0])) != len(items):
fail("%s: the globe holds a link the gate cannot read — every item is <a href lang hreflang class=lang-globe-item>" % p)
got = [(it[1], it[5]) for it in items]
if got != LANGS:
fail("%s: the globe lists %r — every page lists exactly %r, in that order" % (p, got, LANGS))
return
for href, code, hreflang, cur, aria, name in items:
if hreflang != code:
fail("%s: the globe's %s item has hreflang=%r" % (p, code, hreflang))
is_cur = code == lang
if bool(cur) != is_cur or bool(aria) != is_cur:
fail("%s: the globe marks %r as current (class current=%s, aria-current=%s) — only the page's own language %r is"
% (p, code, bool(cur), bool(aria), lang))
if urls is not None and href != urls[code]:
fail("%s: the globe's %s item points at %r — %s" % (p, code, href,
"the page itself is %r" % urls[code] if is_cur else "its twin is %r" % urls[code]))
ALT_RE = re.compile(r'<link rel="alternate" hreflang="([^"]+)" href="([^"]+)">')
for hu, en in TWINS.items():
if hu not in pages or en not in pages:
@@ -236,16 +280,17 @@ for hu, en in TWINS.items():
got = dict(ALT_RE.findall(pages[p]))
if got != want:
fail("%s: hreflang alternates %s — the pair %s <-> %s needs exactly %s" % (p, got, hu, en, want))
sw = SWITCH_RE.findall(pages[p])
if len(sw) != 1:
fail("%s: %d language switch links in the page — exactly one, in the nav" % (p, len(sw)))
elif sw[0][0] != URL[other] or sw[0][1] != lang or sw[0][2] != lang:
fail("%s: the language switch points at %r (lang=%s) — its twin is %r (lang=%s)"
% (p, sw[0][0], sw[0][1], URL[other], lang))
check_globe(p, lang_of(p), {"hu": URL[hu], "en": URL[en]})
canon = re.search(r'<link rel="canonical" href="([^"]+)">', pages[p])
if not canon or canon.group(1) != SITE + URL[p]:
fail("%s: canonical %r — it must point at the page itself (%s)" % (p, canon and canon.group(1), SITE + URL[p]))
print(" twins: %d pairs checked both ways (hreflang, switch, canonical)" % len(TWINS))
print(" twins: %d pairs checked both ways (hreflang, globe, canonical)" % len(TWINS))
for p in sorted(NO_TWIN): # no twin: the globe's structure, current mark and label still hold
if p in pages:
check_globe(p, lang_of(p))
for p, s in pages.items():
if 'class="lang-switch"' in s:
fail("%s: a leftover text language switch (class=\"lang-switch\") — the globe replaced it" % p)
# gate 14: the lang attribute
for p, s in pages.items():
@@ -398,4 +443,4 @@ if fails:
print("\nSITE GATES FAILED: %d problem(s)" % len(fails))
sys.exit(1)
print("site gates OK — BOM, emoji=0, nav/footer per language, analytics, no CDN, no legacy tokens, no <style>, "
"cache-busted assets, twins + hreflang + switch, lang, same apps, no Hungarian in English, FAQ JSON-LD, clean tail")
"cache-busted assets, twins + hreflang + globe, lang, same apps, no Hungarian in English, FAQ JSON-LD, clean tail")
+18 -4
View File
@@ -514,10 +514,24 @@ decoy("site/hreflang-wrong", "site_gates.py",
replace_in(_EN("faq.html"), '<link rel="alternate" hreflang="en" href="https://felhom.eu/en/faq">',
'<link rel="alternate" hreflang="en" href="https://felhom.eu/en/apps">'),
must="en/faq.html: hreflang alternates")
decoy("site/switch-wrong-twin", "site_gates.py",
replace_in(_EN("apps.html"), '<a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-switch">',
'<a href="/" lang="hu" hreflang="hu" class="lang-switch">'),
must="en/apps.html: the language switch points at")
# the language globe (2026-10-08): a wrong target, two current items, a missing language, the wrong order, a leftover text switch
_GHU = '<a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a>'
_GEN = '<a href="/en/apps" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a>'
decoy("site/globe-wrong-page", "site_gates.py",
replace_in(_EN("apps.html"), _GHU, _GHU.replace('href="/alkalmazasok"', 'href="/"')),
must="en/apps.html: the globe's hu item points at '/' — its twin is '/alkalmazasok'")
decoy("site/globe-two-current", "site_gates.py",
replace_in(_EN("apps.html"), _GHU, _GHU.replace('class="lang-globe-item">', 'class="lang-globe-item current" aria-current="true">')),
must="en/apps.html: the globe marks 'hu' as current")
decoy("site/globe-missing-language", "site_gates.py",
replace_in(_EN("apps.html"), "<li>" + _GHU + "</li>", ""),
must="en/apps.html: the globe lists [('en', 'English')]")
decoy("site/globe-wrong-order", "site_gates.py",
replace_in(_EN("apps.html"), "<li>" + _GHU + "</li><li>" + _GEN + "</li>", "<li>" + _GEN + "</li><li>" + _GHU + "</li>"),
must="en/apps.html: the globe lists [('en', 'English'), ('hu', 'Magyar')]")
decoy("site/leftover-text-switch", "site_gates.py",
replace_in(_EN("apps.html"), '<li class="lang-globe-li">', '<li><a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-switch">Magyar</a></li><li class="lang-globe-li">'),
must='en/apps.html: a leftover text language switch')
decoy("site/lang-attr", "site_gates.py",
replace_in(_EN("backups.html"), '<html lang="en">', '<html lang="hu">'),
must="the English set needs lang='en'")
+2 -2
View File
@@ -6,7 +6,7 @@
<title>Az oldal nem található | Felhom.eu</title>
<meta name="robots" content="noindex, follow">
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -24,7 +24,7 @@
<li><a href="/biztonsagimentes">Mentések</a></li>
<li><a href="/gyik">GYIK</a></li>
<li><a href="/kapcsolat">Kapcsolat</a></li>
<li><a href="/en/" lang="en" hreflang="en" class="lang-switch">English</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">
+13
View File
@@ -1,3 +1,16 @@
## 2026-10-08 (later) — the language switch becomes a globe, like the dashboard's
- The text link in every page's nav („English" / „Magyar") is replaced by a **globe** (`i-globe` from the sprite): a
`<details>` whose list names each language in its own language — Magyar, English, in that order on every page. The
page's own language is marked (bold, a blue rule, `aria-current="true"`); the other item goes to the twin page.
`aria-label`/`title` „Nyelv" / „Language". Works with JavaScript off; no script added (the controller adds none).
- Phone: inside the opened menu the globe is the last item and its list opens in place.
- `site.css`: the globe's rules (desktop and the ≤900 px menu); `?v=2` → `?v=3` on all sixteen pages. There was no
`.lang-switch` rule to retire — the text switch was unstyled.
- `404.html` and the hidden prices page carry the globe too (their foreign item points at `/en/`): the shared nav
must compare equal across the Hungarian set, so they keep what every page carries.
- Gates: the globe replaces `SWITCH_RE` in gates 3 and 13 (`scripts/CHANGELOG.md`).
## 2026-10-08 — the website catches up with the product: true numbers, the missing apps, an English twin of every page
The last content refresh was 2026-07-18. Every claim on the eight public Hungarian pages was checked again against
+2 -2
View File
@@ -43,7 +43,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -61,7 +61,7 @@
<li><a href="/biztonsagimentes">Mentések</a></li>
<li><a href="/gyik">GYIK</a></li>
<li><a href="/kapcsolat">Kapcsolat</a></li>
<li><a href="/en/apps" lang="en" hreflang="en" class="lang-switch">English</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="/alkalmazasok" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/en/apps" 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">
+19
View File
@@ -132,6 +132,19 @@ nav .container { display: flex; justify-content: space-between; align-items: cen
.nav-links a:hover,
.nav-links a.active { color: var(--blue-bright); }
/* --- Language globe (2026-10-08, matching the controller's lang_globe): a <details> list, no JavaScript.
The current language is marked by weight and a blue rule, not a check glyph (the emoji gate's range). --- */
.lang-globe-li { display: flex; align-items: center; }
.lang-globe { position: relative; margin: 0; }
.lang-globe-btn { list-style: none; display: inline-flex; align-items: center; color: var(--text-2); cursor: pointer; padding: 2px; border-radius: var(--radius); }
.lang-globe-btn::-webkit-details-marker { display: none; }
.lang-globe-btn::marker { content: ""; }
.lang-globe-btn:hover, .lang-globe[open] .lang-globe-btn { color: var(--blue-bright); }
.lang-globe-menu { position: absolute; top: calc(100% + 12px); right: 0; margin: 0; padding: 4px; list-style: none; min-width: 8rem; background: var(--bg-2); border: 1px solid var(--line); border-radius: var(--radius); z-index: 210; }
.nav-links .lang-globe-item { display: block; padding: 6px 10px; font-size: 0.9rem; white-space: nowrap; color: var(--text-2); border-left: 2px solid transparent; }
.nav-links .lang-globe-item:hover { color: var(--blue-bright); }
.nav-links .lang-globe-item.current { color: var(--text-1); font-weight: 700; border-left-color: var(--blue); }
/* --- Two-tone heading (brand signature): accent span is solid blue-bright --- */
h1 span, h2 span, h3 span, h4 span { color: var(--blue-bright); }
@@ -264,6 +277,12 @@ footer p { color: var(--text-2); font-size: 0.9rem; }
.nav-links.is-open { right: 0; }
.nav-links li { border-bottom: 1px solid var(--line-soft); }
.nav-links a { display: block; padding: 16px 0; font-size: 1.05rem; }
/* the globe in the phone menu: last item, its list opens in place (not a floating box the menu would cut off) */
.lang-globe-li { display: block; }
.lang-globe-btn { padding: 16px 0; }
.lang-globe-menu { position: static; min-width: 0; padding: 0 0 8px; background: none; border: none; }
.nav-links .lang-globe-menu li { border-bottom: none; }
.nav-links .lang-globe-item { padding: 10px 0 10px 12px; font-size: 1.05rem; }
.mobile-overlay { display: block; pointer-events: none; }
.mobile-overlay.is-visible { pointer-events: auto; }
body.menu-open { overflow: hidden; }
+2 -2
View File
@@ -37,7 +37,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -55,7 +55,7 @@
<li><a href="/biztonsagimentes" class="active">Mentések</a></li>
<li><a href="/gyik">GYIK</a></li>
<li><a href="/kapcsolat">Kapcsolat</a></li>
<li><a href="/en/backups" lang="en" hreflang="en" class="lang-switch">English</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="/biztonsagimentes" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/en/backups" 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">
+2 -2
View File
@@ -43,7 +43,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -61,7 +61,7 @@
<li><a href="/en/backups">Backups</a></li>
<li><a href="/en/faq">FAQ</a></li>
<li><a href="/en/contact">Contact</a></li>
<li><a href="/alkalmazasok" lang="hu" hreflang="hu" class="lang-switch">Magyar</a></li>
<li class="lang-globe-li"><details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><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="/alkalmazasok" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/en/apps" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details></li>
</ul>
<button class="hamburger" id="hamburger" aria-label="Open menu" aria-expanded="false">
<span class="hamburger-box">
+2 -2
View File
@@ -37,7 +37,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -55,7 +55,7 @@
<li><a href="/en/backups" class="active">Backups</a></li>
<li><a href="/en/faq">FAQ</a></li>
<li><a href="/en/contact">Contact</a></li>
<li><a href="/biztonsagimentes" lang="hu" hreflang="hu" class="lang-switch">Magyar</a></li>
<li class="lang-globe-li"><details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><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="/biztonsagimentes" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/en/backups" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details></li>
</ul>
<button class="hamburger" id="hamburger" aria-label="Open menu" aria-expanded="false">
<span class="hamburger-box">
+2 -2
View File
@@ -26,7 +26,7 @@
<meta name="twitter:description" content="A question? Write to us: info@felhom.eu">
<meta name="twitter:image" content="https://felhom.eu/assets/og-image-en.png">
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -44,7 +44,7 @@
<li><a href="/en/backups">Backups</a></li>
<li><a href="/en/faq">FAQ</a></li>
<li><a href="/en/contact" class="active">Contact</a></li>
<li><a href="/kapcsolat" lang="hu" hreflang="hu" class="lang-switch">Magyar</a></li>
<li class="lang-globe-li"><details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><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="/kapcsolat" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/en/contact" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details></li>
</ul>
<button class="hamburger" id="hamburger" aria-label="Open menu" aria-expanded="false">
<span class="hamburger-box">
+2 -2
View File
@@ -24,7 +24,7 @@
<meta name="twitter:description" content="Download, checksum, and what to check before you install.">
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -42,7 +42,7 @@
<li><a href="/en/backups">Backups</a></li>
<li><a href="/en/faq">FAQ</a></li>
<li><a href="/en/contact">Contact</a></li>
<li><a href="/letoltes" lang="hu" hreflang="hu" class="lang-switch">Magyar</a></li>
<li class="lang-globe-li"><details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><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="/letoltes" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/en/download" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details></li>
</ul>
<button class="hamburger" id="hamburger" aria-label="Open menu" aria-expanded="false">
<span class="hamburger-box">
+2 -2
View File
@@ -363,7 +363,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -381,7 +381,7 @@
<li><a href="/en/backups">Backups</a></li>
<li><a href="/en/faq" class="active">FAQ</a></li>
<li><a href="/en/contact">Contact</a></li>
<li><a href="/gyik" lang="hu" hreflang="hu" class="lang-switch">Magyar</a></li>
<li class="lang-globe-li"><details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><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="/gyik" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/en/faq" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details></li>
</ul>
<button class="hamburger" id="hamburger" aria-label="Open menu" aria-expanded="false">
<span class="hamburger-box">
+2 -2
View File
@@ -54,7 +54,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -72,7 +72,7 @@
<li><a href="/en/backups">Backups</a></li>
<li><a href="/en/faq">FAQ</a></li>
<li><a href="/en/contact">Contact</a></li>
<li><a href="/" lang="hu" hreflang="hu" class="lang-switch">Magyar</a></li>
<li class="lang-globe-li"><details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><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">Magyar</a></li><li><a href="/en/" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details></li>
</ul>
<button class="hamburger" id="hamburger" aria-label="Open menu" aria-expanded="false">
<span class="hamburger-box">
+2 -2
View File
@@ -38,7 +38,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -56,7 +56,7 @@
<li><a href="/en/backups">Backups</a></li>
<li><a href="/en/faq">FAQ</a></li>
<li><a href="/en/contact">Contact</a></li>
<li><a href="/technologiak" lang="hu" hreflang="hu" class="lang-switch">Magyar</a></li>
<li class="lang-globe-li"><details class="lang-globe"><summary class="lang-globe-btn" aria-label="Language" title="Language"><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="/technologiak" lang="hu" hreflang="hu" class="lang-globe-item">Magyar</a></li><li><a href="/en/technology" lang="en" hreflang="en" class="lang-globe-item current" aria-current="true">English</a></li></ul></details></li>
</ul>
<button class="hamburger" id="hamburger" aria-label="Open menu" aria-expanded="false">
<span class="hamburger-box">
+2 -2
View File
@@ -363,7 +363,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -381,7 +381,7 @@
<li><a href="/biztonsagimentes">Mentések</a></li>
<li><a href="/gyik" class="active">GYIK</a></li>
<li><a href="/kapcsolat">Kapcsolat</a></li>
<li><a href="/en/faq" lang="en" hreflang="en" class="lang-switch">English</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="/gyik" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/en/faq" 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">
+2 -2
View File
@@ -54,7 +54,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -72,7 +72,7 @@
<li><a href="/biztonsagimentes">Mentések</a></li>
<li><a href="/gyik">GYIK</a></li>
<li><a href="/kapcsolat">Kapcsolat</a></li>
<li><a href="/en/" lang="en" hreflang="en" class="lang-switch">English</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">
+2 -2
View File
@@ -26,7 +26,7 @@
<meta name="twitter:description" content="Kérdésed van? Írj nekünk: info@felhom.eu">
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -44,7 +44,7 @@
<li><a href="/biztonsagimentes">Mentések</a></li>
<li><a href="/gyik">GYIK</a></li>
<li><a href="/kapcsolat" class="active">Kapcsolat</a></li>
<li><a href="/en/contact" lang="en" hreflang="en" class="lang-switch">English</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="/kapcsolat" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/en/contact" 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">
+2 -2
View File
@@ -24,7 +24,7 @@
<meta name="twitter:description" content="Letöltés, ellenőrző összeg, és mire figyelj a telepítés előtt.">
<meta name="twitter:image" content="https://felhom.eu/assets/og-image.png">
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -42,7 +42,7 @@
<li><a href="/biztonsagimentes">Mentések</a></li>
<li><a href="/gyik">GYIK</a></li>
<li><a href="/kapcsolat">Kapcsolat</a></li>
<li><a href="/en/download" lang="en" hreflang="en" class="lang-switch">English</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="/letoltes" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/en/download" 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">
+2 -2
View File
@@ -6,7 +6,7 @@
<meta name="description" content="Felhom.eu - Szolgáltatások és árak. Otthoni szerver telepítés, üzemeltetés, monitoring és támogatás.">
<title>Szolgáltatások - Felhom.eu</title>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<!-- analytics intentionally omitted for draft page -->
</head>
@@ -24,7 +24,7 @@
<li><a href="/biztonsagimentes">Mentések</a></li>
<li><a href="/gyik">GYIK</a></li>
<li><a href="/kapcsolat">Kapcsolat</a></li>
<li><a href="/en/" lang="en" hreflang="en" class="lang-switch">English</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="/szolgaltatasok-nonpublic" 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">
+2 -2
View File
@@ -38,7 +38,7 @@
}
</script>
<!-- shared assets: bump ?v= together on any site.css/icons.svg change -->
<link rel="stylesheet" href="/assets/site.css?v=2">
<link rel="stylesheet" href="/assets/site.css?v=3">
<link rel="icon" type="image/png" href="/assets/logo_favicon_2.svg">
<script defer src="https://stats.felhom.eu/script.js" data-website-id="d419db57-5e1c-48df-bdb3-c29f25fb1661"></script>
</head>
@@ -56,7 +56,7 @@
<li><a href="/biztonsagimentes">Mentések</a></li>
<li><a href="/gyik">GYIK</a></li>
<li><a href="/kapcsolat">Kapcsolat</a></li>
<li><a href="/en/technology" lang="en" hreflang="en" class="lang-switch">English</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="/technologiak" lang="hu" hreflang="hu" class="lang-globe-item current" aria-current="true">Magyar</a></li><li><a href="/en/technology" 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">