From 0ef0b106f65b1ec6ddf9b749efbfadf2fd64aae3 Mon Sep 17 00:00:00 2001 From: kisfenyo Date: Mon, 12 Oct 2026 08:58:42 +0200 Subject: [PATCH] website: the operator's seven notes - a services page, the hero, and 100 dead links Reported from his own screens. Five defects, two design. 1. THE CATEGORY ANCHORS WERE DEAD - all 100 of them. The sidebar's five app-category links pointed at #fajlkezeles-irodai and friends; the ids are #fajlkezeles and friends. The sidebar is copied into every page, so one wrong fragment was wrong twenty times, and a dead fragment raises no error anywhere: the browser stays put. New gate 23 resolves every in-site #fragment against the page it names (360 today). It convicted two more on its first run: the home page's four hero tiles pointed at /alkalmazasok#immich, which no page had ever carried, and the FAQ's contact button pointed at a home-page section that had moved out. Every app card now carries its slug as an id - taken from the card's own logo file, which gate 21 already ties to the catalog, so the ids cannot drift from it silently. Decoy site/dead-fragment puts the operator's own bug back and the gate convicts. 2. SZOLGALTATASOK IS A PAGE: /szolgaltatasok + /en/services, registered in TWINS, URL and SHELL. The ten capability items moved VERBATIM out of the home page; the home keeps the promise sentence, the three group names as links and a button, and is 345 Hungarian / 434 English words shorter. The .caps rules stopped being .page-index- scoped, because the block now lives on a page with a different body class. 3. THE HOME HEADLINE is back in the hero column beside the picture, two lines with the second in --blue-bright at clamp(2.1rem, 4.4vw, 3.2rem). M3 had moved it into .page-header - the INNER pages' heading - so it shrank to 2.1rem and the domain badge was stranded beside it. 4. THE HERO PICTURE is the real dashboard in a laptop. The frame is the operator's own supplied render; the screen is dashboard-start-{hu,en}.webp composited into it, so a visitor sees a real box's Launcher rather than a drawing of one - the supplied screens are AI-drawn and misspell app names. 57 KB, named dashboard-laptop- so gate 19 holds it to the page's language. 5. .page-lede HAD NO CSS AT ALL on 16 pages: a bare paragraph, full width of the content column, hard against the box beneath it. 760px measure, centred over the box, air beneath; left-aligned on /szolgaltatasok, which has no centred box. 6. THE SIDEBAR LOGO: the wordmark shipped at 0.67x the mark's width where the real lockup (assets/logo.png, measured: mark 492px wide, wordmark 631px) has it at 1.28x. Mark 112px, wordmark 25px tall, 28px less vertical padding. 7. SCROLLBARS are the page's own now. The first attempt missed the viewport's: it is painted from , and a `body.shell ::-webkit-...` rule only reaches scrollers inside the page. Also: the two Latin font subsets are preloaded. With font-display: swap the page reflowed after first paint - measured at 1339px on /alkalmazasok#media. Checked at 390px and 1440px on all 21 pages: no sideways scrolling, footer inside the content column everywhere, drawer opens with all 13 items. site.css?v=24. --- REPORT-site-tweaks-2026-10-12.md | 58 ++++++ STATUS.md | 19 ++ scripts/CHANGELOG.md | 13 ++ scripts/site_gates.py | 47 ++++- scripts/test_gate_decoys.py | 10 +- website/404.html | 18 +- website/CHANGELOG.md | 41 +++- website/adatkezeles.html | 18 +- website/alkalmazasok.html | 136 ++++++------- website/assets/dashboard-laptop-en.webp | Bin 0 -> 56556 bytes website/assets/dashboard-laptop-hu.webp | Bin 0 -> 57616 bytes website/assets/site.css | 132 +++++++++++-- website/biztonsagimentes.html | 18 +- website/en/apps.html | 136 ++++++------- website/en/backups.html | 18 +- website/en/contact.html | 18 +- website/en/download.html | 18 +- website/en/faq.html | 18 +- website/en/index.html | 119 +++-------- website/en/services.html | 252 ++++++++++++++++++++++++ website/en/technology.html | 18 +- website/en/testing.html | 18 +- website/feltetelek.html | 18 +- website/gyik.html | 20 +- website/index.html | 119 +++-------- website/kapcsolat.html | 18 +- website/letoltes.html | 18 +- website/szolgaltatasok-nonpublic.html | 18 +- website/szolgaltatasok.html | 252 ++++++++++++++++++++++++ website/technologiak.html | 18 +- website/teszteles.html | 18 +- 31 files changed, 1150 insertions(+), 474 deletions(-) create mode 100644 REPORT-site-tweaks-2026-10-12.md create mode 100644 website/assets/dashboard-laptop-en.webp create mode 100644 website/assets/dashboard-laptop-hu.webp create mode 100644 website/en/services.html create mode 100644 website/szolgaltatasok.html diff --git a/REPORT-site-tweaks-2026-10-12.md b/REPORT-site-tweaks-2026-10-12.md new file mode 100644 index 00000000..af395fc1 --- /dev/null +++ b/REPORT-site-tweaks-2026-10-12.md @@ -0,0 +1,58 @@ +# REPORT — the operator's seven notes (2026-10-12) + +> `REPORT-.md`, not `REPORT.md`: that file belongs to another session. + +## In plain words + +Seven things you listed after looking at the live site. All seven are done. Five of them were +defects, and one of those — the app category links — had been broken on every page since the switch. + +## Your list, item by item + +| # | what you said | what it was, and what changed | +|---|---|---| +| 1 | too much air round the sidebar logo, text too small | The wordmark was **0.67×** the mark's width; in your own `logo.png` it is **1.28×** — so it had shipped at less than half size. Mark 112px, wordmark 25px tall, 28px less padding. | +| 2 | the scrollbar is the default/ugly | Thin, in the palette, both the page's and the sidebar's. The first attempt missed the big one: the viewport scrollbar is painted from ``, not from anything inside ``. | +| 3 | the headline should look like on the webpage | It had been moved into the **inner pages'** heading style, so it shrank from 3.5rem to 2.1rem and the badge ended up beside it. It is back in the hero column, two lines, second line blue. | +| 4 | the box preview is not good, try a laptop | **Image 3** (the straight-on one) — and its screen is replaced by the **real** `dashboard-start-hu/en.webp`. See below. | +| 5 | „Szolgáltatások" should be its own page | `/szolgaltatasok` + `/en/services`. The ten items moved **verbatim**; the home keeps the promise, the three group names and a button, and is 345 words shorter. | +| 6 | the text above the boxes looks wrong | `.page-lede` had **no CSS at all** on 16 pages. Now it shares the box's 760px measure, centred over it, with air beneath. | +| 7 | the app category anchors are not working | **100 dead links.** The sidebar pointed at `#fajlkezeles-irodai`; the section is `#fajlkezeles`. Fixed, and now gated. | + +## About the laptop + +I used **image 3** — the straight-on one. The other two have a Hungarian misspelling on the screen +(„Alkalmaaások"), and image 2's blue glow fights the page. + +**But the screen in image 3 is also AI-drawn, and it misspells „Paperlerss-ngx".** So I kept only the +frame and composited the **real** Launcher screenshot into it — the same picture the site already +ships lower down the page. What a visitor sees is now a real box's screen in a designed frame: no +invented app names, no misspellings, and it stays true when the dashboard changes, because it is made +from the screenshot the gate already watches. 57 KB. + +If you would rather use image 3 exactly as generated, say so and it is a one-line change. + +## Found while working, not on your list + +- **The home page's four hero tiles** pointed at `/alkalmazasok#immich` and friends. Those ids had + never existed. Every app card now carries its slug as an id, so all 59 deep links work. +- **The FAQ's „Kapcsolatfelvétel" button** pointed at a home-page section that had moved out. +- **The font arrives after first paint** (`font-display: swap`), which reflowed the page by up to + 1339px. The two Latin subsets are now preloaded. + +## What now holds each one + +**Gate 23** resolves every in-site `#fragment` against the page it names — 360 today, all live. Its +decoy puts the operator's own bug back (`#media-szorakozas`) and the gate convicts. Gate 19 holds the +new laptop picture to its page's language, because it is named `dashboard-laptop-.webp`. + +Checked at 390px and 1440px on all 21 pages: no sideways scrolling, footer inside the content column +everywhere, drawer opens with all 13 items. + +## One honest correction + +I first reported the anchors as landing 1339px short even after the ids were fixed, and built a +script to re-land them. That reading was **my own measuring error**: a background Chrome tab freezes +`scroll-behavior: smooth`, so the scroll never finished while I measured it. With smooth disabled for +the measurement the browser lands exactly on the target. The script is gone; the font preload stayed, +because that one is a real improvement either way. diff --git a/STATUS.md b/STATUS.md index 6fdec422..48f87115 100644 --- a/STATUS.md +++ b/STATUS.md @@ -5,6 +5,25 @@ **Updated 2026-10-11 (M3 live): hub 0.146.0; demo-hp, demo-felhom and Tester 1 run agent 0.154.0 and controller 0.307.0. The open-items list is at 129 (was 127). Reports: `REPORT-m3-2026-10-11.md`, `REPORT-redesign-2026-10-10.md`, `REPORT-testers-2026-10-10.md`, `REPORT-register-shrink-2026-10-10.md`, `REPORT-new-apps-2026-10-10.md`, `REPORT-release-2026-10-10.md`, `REPORT-break-the-circle-2026-10-09.md`, `REPORT-dooplex-survival-2026-10-09.md`, `REPORT-day4-2026-10-09.md`.** +## Monday 2026-10-12: your seven notes are done, and one of them was broken on every page + +- **The app category links in the menu never worked.** All five pointed at names that do not exist on + the page — and the menu is copied into every page, so that was 100 dead links. Clicking one simply + did nothing, which is why nothing caught it. Fixed, and a check now follows every link with a `#` in + it and refuses the site if one has nowhere to land. That check found two more: the four app tiles on + the old home-page picture, and the „Kapcsolatfelvétel" button at the bottom of the GYIK. +- **„Szolgáltatások" is a page of its own now** (`/szolgaltatasok`, English `/en/services`). The ten + items moved across word for word; the home page keeps the promise, the three group names and a + button, and is a third shorter. +- **The headline is back to its old size and shape**, and **the picture beside it is a laptop with a + real screenshot of a real box on the screen** — I used your third image for the frame and put our + own screenshot in it, because the screens in all three images are drawn and two of them misspell + „Alkalmazások". +- **Also fixed:** the logo in the menu (the wordmark had shipped at less than half the size it has in + your own logo file), the scrollbars, and the intro line above the boxes on the application and + technology pages — that line had no styling at all on 16 pages. +- Nothing else changed: the words on every page are the ones that were there. + ## Sunday 2026-10-11 (evening): the whole website now looks like your dashboard - **It is live.** and all 19 other pages now wear the controller's frame: the left diff --git a/scripts/CHANGELOG.md b/scripts/CHANGELOG.md index 29c0e165..7336c1a2 100644 --- a/scripts/CHANGELOG.md +++ b/scripts/CHANGELOG.md @@ -1,3 +1,16 @@ +## 2026-10-12 — site gate 23: every in-site #fragment resolves + +- `site_gates.py` **gate 23** reads every page's ids, maps each in-site href with a `#fragment` to the + page it names (via `URL`), and fails when that id is not there. 360 fragments today, all resolving. + Links to another site, or to a URL this gate does not own, are not its business. +- **Why.** The sidebar's five app-category links pointed at ids nobody had written — 100 dead links + across 20 pages, live, found by the operator clicking one. A dead fragment raises no error: the + browser stays put, so nothing mechanical and nothing in a log ever noticed. The gate also convicted + two more on its first run (the home page's four hero tiles, the FAQ's contact button). +- **Decoy** `site/dead-fragment`: a sidebar link moved back to `#media-szorakozas`, seen to convict + with gate 23's own line. +- `szolgaltatasok.html` / `en/services.html` registered in `TWINS`, `URL` and `SHELL`. + ## 2026-10-11 (evening) — site gate 22: no CSS leak from site.css onto a shell page, MEDIA-AWARE - `site_gates.py` **gate 22** parses both stylesheets into (media context, selector, declarations) and diff --git a/scripts/site_gates.py b/scripts/site_gates.py index 8ad5f51a..6a2ebcdd 100644 --- a/scripts/site_gates.py +++ b/scripts/site_gates.py @@ -31,6 +31,10 @@ Gates (all must pass; non-zero exit on any failure): 19. dash-lang — a page shows dashboard pictures only in its own language (`dashboard-*-hu.webp` / `-en.webp`) 20. viewer — data-gallery openers are to existing assets; gallery.js (with ?v=) exactly where openers are; no inline viewer copy + 23. anchors — every in-site link carrying a #fragment finds that id on the page it names. + The sidebar's five category links pointed at #fajlkezeles-irodai and friends while + the page's ids are #fajlkezeles and friends: 100 dead links across 20 pages, live, + found by the operator clicking one 22. shell leak — MEDIA-AWARE: no declaration in site.css reaches a shell page on a selector that shell.css also styles. site.css loads FIRST, so a property shell.css never sets survives — „later wins” is per PROPERTY, not per rule. Earned live 2026-10-11: @@ -73,10 +77,12 @@ TWINS = { "kapcsolat.html": os.path.join("en", "contact.html"), "letoltes.html": os.path.join("en", "download.html"), # R-559 (2026-09-18) — the first twin "teszteles.html": os.path.join("en", "testing.html"), # 2026-10-10 — the tester recruitment page + "szolgaltatasok.html": os.path.join("en", "services.html"), # 2026-10-12 — was a section of the home page } URL = {"index.html": "/", "alkalmazasok.html": "/alkalmazasok", "technologiak.html": "/technologiak", "biztonsagimentes.html": "/biztonsagimentes", "gyik.html": "/gyik", "kapcsolat.html": "/kapcsolat", "letoltes.html": "/letoltes", "teszteles.html": "/teszteles", + "szolgaltatasok.html": "/szolgaltatasok", os.path.join("en", "services.html"): "/en/services", os.path.join("en", "testing.html"): "/en/testing", os.path.join("en", "index.html"): "/en/", os.path.join("en", "apps.html"): "/en/apps", os.path.join("en", "technology.html"): "/en/technology", os.path.join("en", "backups.html"): "/en/backups", os.path.join("en", "faq.html"): "/en/faq", os.path.join("en", "contact.html"): "/en/contact", @@ -105,6 +111,7 @@ MOCKUPS = set() # the design studies were deleted with website/preview/ at the # duplicated into each page, and this is what keeps the duplication honest. SHELL = { 'szolgaltatasok-nonpublic.html', + 'szolgaltatasok.html', 'index.html', 'alkalmazasok.html', 'technologiak.html', @@ -117,6 +124,7 @@ SHELL = { 'feltetelek.html', '404.html', os.path.join("en", 'index.html'), + os.path.join("en", 'services.html'), os.path.join("en", 'apps.html'), os.path.join("en", 'technology.html'), os.path.join("en", 'backups.html'), @@ -734,8 +742,45 @@ else: "declarations (media-aware)" % (len(_site_r), len(_shell_r), len(set(s for _, s, _ in _site_r) & _shell_sel))) +# gate 23 (2026-10-12): an in-site #fragment has to exist on the page it points at. +# +# The shell's sidebar is copied into every page, so ONE wrong fragment is wrong twenty times: the five +# app-category links shipped pointing at ids nobody had written (#fajlkezeles-irodai for a section +# whose id is #fajlkezeles). Nothing noticed, because a dead fragment is not an error anywhere - the +# browser simply stays put. Checked for every page the gate already walks; a link to a page outside +# PAGES, or to another site, is not this gate's business. +_ids = {} +for _p in PAGES: + _s = io.open(os.path.join(W, _p), encoding="utf-8-sig").read() + _ids[_p] = set(re.findall(r'\sid="([^"]+)"', _s)) +_url_to_page = {} +for _p, _u in URL.items(): + _url_to_page[_u] = _p + if _u.endswith("/"): # "/" and "/en/" are index pages + _url_to_page[_u + "index.html"] = _p +_anchor_n, _anchor_bad = 0, 0 +for _p in PAGES: + _s = io.open(os.path.join(W, _p), encoding="utf-8-sig").read() + for _href in re.findall(r'href="([^"]*#[^"]+)"', _s): + if _href.startswith(("http://", "https://", "mailto:")): + continue + _page_part, _frag = _href.split("#", 1) + if _page_part == "": + _target = _p # same page + elif _page_part in _url_to_page: + _target = _url_to_page[_page_part] + else: + continue # a URL this gate does not own + _anchor_n += 1 + if _frag not in _ids.get(_target, ()): + _anchor_bad += 1 + fail("%s: link to %s finds no id=\"%s\" on %s — the browser stays where it is and the link " + "reads as broken" % (_p, _href, _frag, _target)) +if not _anchor_bad: + print(" anchors: %d in-site #fragment(s), every one resolves" % _anchor_n) + 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