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