diff --git a/README.md b/README.md index f7ea211..ad8c220 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,12 @@ An unofficial, fan-made web guide to **gamescom 2026** (Cologne, Aug 26–30, 2026). +**The show is over.** gamescom 2026 closed on Sunday, Aug 30. The site stays up +as it stood on the last day and says so at the top of every view — see *After the +show* below. There will be a guide for **gamescom 2027** (Aug 23–29); it gets +announced on [@inventivtalent](https://x.com/inventivtalent) and +[u/InventivetalentDev](https://www.reddit.com/user/InventivetalentDev/). + **Features** - Overview of exhibitors with their announced (or rumored) games and products @@ -402,6 +408,64 @@ someone coming back a week later needs. Corrections keep their own footer line a their own mail address — "hall 9.1 is wrong" wants a reply and a data push, not a survey row. +## After the show + +The last doors shut and the guide stops being advice. Everything in it — sold-out +ticket classes, which gate to use, *be there for the 09:00 doors* — was true on +the day it was written and is now read on a page somebody may open in November, +so the guide says at the top of every view that it is finished: + +> **The show is over.** gamescom 2026 closed on Sunday, Aug 30. Nothing here has +> changed since, and nothing will — this is the guide as it stood on the last day. +> Your saved list, your plan and the hall map still work; live queues closed with +> the show. + +None of that prose is rewritten into the past tense. A record edited after the +fact is a worse record than one that is honestly dated, and the notice is the +date stamp. `data/i18n/*.json`'s `meta.note` makes the same claim in the footer, +next to `lastUpdated`. + +The card appears when `showIsOver()` in `js/app.js` finds the last entry in +`days` behind us **in Cologne** — the same clock the Today tab and the countdown +read, so a phone still set to Los Angeles cannot see it an hour early, and +Sunday afternoon still reads as a show day. It survives `?now=`, which is how to +look at either side of it. It has no dismiss button: this is the state of the +whole guide, not a request, and a dismissed one would leave the site reading as +though the doors were open. + +The other half is the only thing left to act on. There will be a guide for +gamescom 2027 (Aug 23–29, announced on the floor at gamescom 2026 — sources are +in `data/event.json`), and this is where it will be said: + +```json +"next": { "name": "gamescom 2027" }, +"follow": [ + { "network": "X", "handle": "@inventivtalent", "url": "https://x.com/inventivtalent" }, + { "network": "Reddit", "handle": "u/InventivetalentDev", "url": "https://www.reddit.com/user/InventivetalentDev/" } +] +``` + +No mailing list, and that is a decision rather than an omission. Nothing here has +ever asked a visitor for an address; the queue API's own database is deleted +after the show precisely so that nothing is left holding anyone's data +(`docs/DEPLOYING.md`), and the last screen of the year is not the place to start +collecting some. Two accounts that already exist cost nothing to keep and nothing +to leave. The card does not argue any of that — it reads *Follow along here* and +points at them. Naming the absent thing put a reader in front of what the guide +does not do before showing what it does. `url` is validated as `http(s)` the same +way the feedback form's is — it is the other value in a data file that becomes a +navigation — and an entry without a usable one is dropped rather than rendered as +a dead link. + +Both fields ship dark: no `follow`, no links, on the card or in the footer. +`next` without a `name` drops only the line about next year. The date range is +prose and lives beside `event.dates` in `data/i18n/*.json` as `nextDates`, +written without a year because `name` already carries one. + +Two surfaces, the same split the feedback prompt uses. The card exists only once +the show is over; the footer line is there year-round, because *where do updates +get posted* is not a question that waits for Sunday night. + ## Architecture Editorial content lives in `data/` as JSON; the app (`index.html`, `js/app.js`, diff --git a/css/style.css b/css/style.css index 7b9ce3e..9b6a271 100644 --- a/css/style.css +++ b/css/style.css @@ -2165,6 +2165,88 @@ a.dir-stand:focus-visible b { color: var(--signal); } } .feedback-dismiss:hover { color: var(--ink-mid); border-color: var(--rule); } +/* ============================================================ + end of the show + ============================================================ */ +/* The sign-off, above the feedback card and above every view. It is the one + notice in the guide that is louder than the thing it sits on, because it + changes how everything below it should be read — so it takes the signal + colour on its left edge where the feedback card deliberately takes --rule, + and its overline is set in full ink rather than the dimmed grey every other + overline in the guide wears. + + Still a card in the content column rather than a full-bleed bar: the + preview bar bleeds because it is saying the page is lying about the date, + and this one is not. */ +.closed-card { + display: flex; + align-items: flex-start; + flex-wrap: wrap; + gap: 14px 24px; + margin-bottom: 22px; + padding: 16px 18px; + background: var(--ground-2); + border: 1px solid var(--rule); + border-left: 3px solid var(--signal); + border-radius: var(--radius); +} +.closed-card[hidden] { display: none; } +.closed-copy { flex: 1 1 320px; min-width: 0; } +.closed-copy .overline { color: var(--ink); } +.closed-copy p { margin-top: 6px; font-size: .84rem; color: var(--ink-mid); } +/* Next year is the one forward-looking line on a page about a finished + show, so it is the one line here set in full ink. */ +.closed-next:not(:empty) { color: var(--ink); font-weight: 600; } +.closed-follow { flex: 0 1 auto; } +.closed-follow-lede { font-size: .76rem; color: var(--ink-dim); margin-bottom: 8px; } +.follow-links { display: flex; flex-wrap: wrap; gap: 8px; } + +/* One account. A hall plate's shape and behaviour — a bordered block with the + quiet label above the name it stands for — because that is what the guide + already means by "here is a thing, here is what it is called". */ +.follow-link { + min-height: 44px; + display: inline-flex; + flex-direction: column; + justify-content: center; + padding: 6px 12px; + border: 1px solid var(--rule); + border-radius: var(--radius-sm); + background: var(--ground-3); + color: var(--ink); + text-decoration: none; +} +.follow-link:hover, .follow-link:focus-visible { + border-color: var(--signal); + color: var(--signal); +} +.follow-net { + font-family: var(--font-mono); + font-size: .62rem; + letter-spacing: .08em; + text-transform: uppercase; + color: var(--ink-dim); +} +.follow-link:hover .follow-net, .follow-link:focus-visible .follow-net { color: inherit; } +.follow-handle { font-size: .82rem; font-weight: 700; } + +/* The footer copy runs as prose, so the same links read as prose there: + handles inline in the sentence, no plate, no minimum tap height fighting + the line box around them. */ +#follow-footer .follow-link { + min-height: 0; + display: inline; + padding: 0; + border: 0; + background: none; + color: var(--ink-dim); + text-decoration: underline; + text-decoration-color: var(--rule); + text-underline-offset: 3px; +} +#follow-footer .follow-handle { font-size: inherit; font-weight: inherit; } +.follow-sep { color: var(--ink-dim); } + /* ============================================================ today ============================================================ */ @@ -3279,6 +3361,9 @@ html[data-standalone="true"] .site-footer { padding-bottom: calc(48px + env(safe .feedback-card { align-items: stretch; flex-direction: column; } .feedback-copy { flex-basis: auto; } .feedback-actions { justify-content: space-between; } + .closed-card { flex-direction: column; } + .closed-copy { flex-basis: auto; } + .follow-links { display: grid; grid-template-columns: 1fr 1fr; } .share-qr { grid-template-columns: 1fr; } .share-qr-image { max-width: 280px; margin: 0 auto; } .share-qr p { text-align: center; } diff --git a/data/changelog.json b/data/changelog.json index 044fef7..35dd1bc 100644 --- a/data/changelog.json +++ b/data/changelog.json @@ -1,4 +1,12 @@ [ + { + "date": "2026-09-01", + "revision": 68, + "changes": [ + { "kind": "content", "text": "That is gamescom 2026. The guide stays up exactly as it stood on the last day — saved lists, plans and the hall map all keep working — and now says so at the top rather than leaving five days of present tense to be read as current." }, + { "kind": "feature", "text": "There will be a guide for gamescom 2027, Aug 23–29. It gets announced on @inventivtalent and u/InventivetalentDev, both linked from the notice at the top and from the footer." } + ] + }, { "date": "2026-08-30", "revision": 67, diff --git a/data/event.json b/data/event.json index 19ba95d..2047767 100644 --- a/data/event.json +++ b/data/event.json @@ -13,6 +13,11 @@ ], "onl": { "time": "20:00 CEST" }, "feedback": { "url": "https://tally.so/r/5BPO5v?source=app", "urlDe": "https://tally.so/r/xX5o0d?source=app", "from": "2026-08-28" }, + "next": { "name": "gamescom 2027" }, + "follow": [ + { "network": "X", "handle": "@inventivtalent", "url": "https://x.com/inventivtalent" }, + { "network": "Reddit", "handle": "u/InventivetalentDev", "url": "https://www.reddit.com/user/InventivetalentDev/" } + ], "areas": [ { "name": "Entertainment area", "hall": "5–10" }, { "name": "Business area", "hall": "2–4" }, @@ -73,6 +78,8 @@ "https://www.play3.de/2026/08/28/gamescom-award-2026-cd-projekt-red-sega-raeumen-ab-alle-gewinner-der-messe/", "https://cosplaycontest.gamescom.global/en/faqs", "https://www.gamescom.global/en/program/cosplay-contest", - "https://www.gamescom.global/en/program" + "https://www.gamescom.global/en/program", + "https://insider-gaming.com/gamescom-2027-dates-revealed-for-august-23-29/", + "https://news.instant-gaming.com/en/articles/21525-gamescom-2027-will-take-place-from-august-23-to-29" ] } diff --git a/data/i18n/de.json b/data/i18n/de.json index 4a35b56..f0ee798 100644 --- a/data/i18n/de.json +++ b/data/i18n/de.json @@ -1,10 +1,11 @@ { "meta": { - "note": "Die gamescom 2026 endet am Sonntag, 30. August. Standnummern und Spieleangebote sind final; was sich geändert hat, steht im Updates-Tab." + "note": "Die gamescom 2026 ist am Sonntag, 30. August, zu Ende gegangen. Seitdem hat sich hier nichts mehr geändert: Das ist der Guide, wie er am letzten Messetag stand." }, "event": { "location": "Koelnmesse, Köln", "dates": "26.–30. Aug. 2026", + "nextDates": "23.–29. August", "tickets": "Nur online über den offiziellen gamescom-Shop — keine Tageskasse vor Ort. Der Sonntag als Abschlusstag ist der letzte, den es noch gibt, und zwar in allen Kategorien: Tagesticket 31,50 € (ermäßigt 22,50 €), Familienticket 69,50 €, Abendticket ab 16:00 Uhr 10,50 €. Mittwoch bis Samstag sind vorbei und waren alle bei Tages-, Ermäßigten- und Familientickets ausverkauft. Die Mittwochs-Wildcard (65,50 €), die Superfan-Bundles und Opening Night Live waren schon lange vor der Messe weg. Das gamescom-congress-Tagesticket für Donnerstag kostete 111,00 € (ermäßigt 40,00 €) und enthielt keinen Eintritt zur gamescom selbst. Tagestickets enthalten die kostenlose Fahrt mit Bus und Bahn im VRS-Gebiet.", "crowdTips": [ "Die Ausstellungsfläche selbst ist zum ersten Mal in den 18 Jahren der gamescom komplett ausgebucht — 233.000 m² und über 1.600 Aussteller. Rechne mit der bisher vollsten gamescom.", diff --git a/data/i18n/en.json b/data/i18n/en.json index aca85e1..4c4abc9 100644 --- a/data/i18n/en.json +++ b/data/i18n/en.json @@ -1,10 +1,11 @@ { "meta": { - "note": "gamescom 2026 closes Sunday, Aug 30. Booth numbers and lineups are final; see the Updates tab for what changed." + "note": "gamescom 2026 closed on Sunday, Aug 30. Nothing here has changed since: this is the guide as it stood on the last day." }, "event": { "location": "Koelnmesse, Cologne", "dates": "Aug 26–30, 2026", + "nextDates": "Aug 23–29", "tickets": "Online-only via the official gamescom shop — no on-site box office. Sunday, the closing day, is the last one on sale, and it is on sale in every class: day ticket €31.50 (discounted €22.50), family €69.50, evening ticket from 16:00 €10.50. Wednesday through Saturday have all been and gone, every one of them sold out on day, discounted and family tickets. The Wednesday Wildcard (€65.50), the Superfan bundles and Opening Night Live sold out long before the show. The gamescom congress day ticket for Thursday was €111.00 (€40.00 discounted) and did not include entry to gamescom itself. Day tickets include free VRS public transport in the Cologne region.", "crowdTips": [ "The show floor itself has sold out to exhibitors for the first time in gamescom's 18-edition history — 233,000 m² and 1,600+ exhibitors. Expect this to be the busiest gamescom yet.", diff --git a/data/meta.json b/data/meta.json index 8f18a00..17a9026 100644 --- a/data/meta.json +++ b/data/meta.json @@ -1,5 +1,5 @@ { - "lastUpdated": "2026-08-30", - "lastChecked": "2026-08-30", - "revision": 67 + "lastUpdated": "2026-09-01", + "lastChecked": "2026-09-01", + "revision": 68 } diff --git a/docs/UPDATING.md b/docs/UPDATING.md index 9f1ead8..bf454a8 100644 --- a/docs/UPDATING.md +++ b/docs/UPDATING.md @@ -498,6 +498,19 @@ keep different opening hours. } ], "onl": { "time": "20:00 CEST" }, + "next": { "name": "gamescom 2027" }, // next year's edition, named in the + // end-of-show notice. Its date range is + // prose (`event.nextDates` in the i18n + // files); drop the key and the notice + // drops the line about next year + "follow": [ // where the next guide gets announced. + // Empty or absent hides the card's links + // and the footer line entirely; `url` is + // validated as http(s) before it is + // rendered, and `network` is a brand name + // shown in every language + { "network": "X", "handle": "@inventivtalent", "url": "https://x.com/inventivtalent" } + ], "areas": [ { "name": "Indie Arena Booth", "hall": "10.2" } ], // name is the // official one and the key for its description "entrances": { // optional; the Info tab drops the section without it @@ -557,6 +570,9 @@ Same shape in both; `en.json` is the source you edit, `de.json` the translation. "meta": { "note": "shown in the footer" }, "event": { "dates": "Aug 26–30, 2026", + "nextDates": "Aug 23–29", // next year's, written + // without a year: `next.name` + // in event.json carries it "tickets": "summary incl. sold-out status", "onl": { "date": "Tue, Aug 25", "note": "..." }, "days": { "2026-08-26": { "access": "trade & media only", "hours": "...", "note": "..." } }, diff --git a/index.html b/index.html index 9dbaae3..5943c5a 100644 --- a/index.html +++ b/index.html @@ -432,6 +432,25 @@
+ + + +