make Revival Inc. PRESS START a real link to the game

This commit is contained in:
dvorakmortonxd 2026-10-05 14:10:07 +02:00
commit 5b93f59750
7 changed files with 44 additions and 23 deletions

View file

@ -33,9 +33,9 @@ more.
frosted-glass panels (subtle gradients + `backdrop-filter` blur), reorganised into frosted-glass panels (subtle gradients + `backdrop-filter` blur), reorganised into
hero / quick-tile / section cards. hero / quick-tile / section cards.
- **Asset-free feature windows** — the two feature panels (Revival Inc. / RustyWolf) are - **Asset-free feature windows** — the two feature panels (Revival Inc. / RustyWolf) are
hand-built CSS mock windows instead of screenshots: a little necromancy game scene with a hand-built CSS mock windows instead of screenshots: a little necromancy game scene whose
blinking "PRESS START", and a little browser window with tabs in the title bar, a toolbar blinking "PRESS START" launches the game, and a little browser window with tabs in the
and a start page. title bar, a toolbar and a start page.
- **Draggable desktop icons** — free placement that snaps to a measured grid, one icon per - **Draggable desktop icons** — free placement that snaps to a measured grid, one icon per
cell, with a follow-the-cursor drag ghost. Icons shrink on cramped viewports so they never cell, with a follow-the-cursor drag ghost. Icons shrink on cramped viewports so they never
collide. collide.
@ -77,7 +77,7 @@ more.
- **Fonts:** the web theme uses the system sans stack; Monocraft (self-hosted in `public/`) is - **Fonts:** the web theme uses the system sans stack; Monocraft (self-hosted in `public/`) is
used by the desktop theme's SMP menu and the in-desktop terminal. used by the desktop theme's SMP menu and the in-desktop terminal.
- **Images:** `next/image` - **Images:** `next/image`
- **Version:** `2.2.12` (see `package.json`) - **Version:** `2.2.13` (see `package.json`)
- **Dependencies:** `npm audit` reports **0 vulnerabilities**. `next` is kept at a patched - **Dependencies:** `npm audit` reports **0 vulnerabilities**. `next` is kept at a patched
release (`>=16.3.6`) for the `next/og` RCE, and `brace-expansion` is force-upgraded via release (`>=16.3.6`) for the `next/og` RCE, and `brace-expansion` is force-upgraded via
`overrides`. `braces` (a transitive ESLint/`fast-glob` dependency) has **no upstream fix**, `overrides`. `braces` (a transitive ESLint/`fast-glob` dependency) has **no upstream fix**,

View file

@ -34,7 +34,7 @@ When in doubt, prefer updating. A stale README **or** agents.md is treated as a
## Bump the version on EVERY prompt — also do this every time ## Bump the version on EVERY prompt — also do this every time
Another standing requirement: increment the **patch** version (`x.x.+1`, so Another standing requirement: increment the **patch** version (`x.x.+1`, so
`2.2.11` → `2.2.12` → …) as part of every task, even the small ones. Keep all of `2.2.12` → `2.2.13` → …) as part of every task, even the small ones. Keep all of
these in sync: these in sync:
- `package.json` → `"version"` - `package.json` → `"version"`
@ -56,7 +56,7 @@ frosted-glass **web** site, and an alternate KDE/Plasma **desktop simulation**
utilities in the components (Tailwind is present via PostCSS but the look is utilities in the components (Tailwind is present via PostCSS but the look is
hand-written CSS). hand-written CSS).
- Path alias: `@/*` → `src/*`. - Path alias: `@/*` → `src/*`.
- Version: `2.2.12` (see `package.json`). - Version: `2.2.13` (see `package.json`).
### Scripts ### Scripts
```bash ```bash
@ -163,8 +163,11 @@ Themes: `web` = default frosted-glass website (sidebar + content, light/dark),
component) — a decorative, **asset-free CSS mock-up** rather than a screenshot: component) — a decorative, **asset-free CSS mock-up** rather than a screenshot:
Revival Inc. is a little necromancy game scene (night sky, moon, tombstones, Revival Inc. is a little necromancy game scene (night sky, moon, tombstones,
blinking "PRESS START") and RustyWolf is a little browser window (tabs in the blinking "PRESS START") and RustyWolf is a little browser window (tabs in the
title bar, toolbar, address bar, start page). Both are `aria-hidden` and purely title bar, toolbar, address bar, start page). The browser window is `aria-hidden`
presentational; the real copy stays in the `.web-feature-text` paragraph below. and purely presentational; in the game window the decorative scene is
`aria-hidden` but "PRESS START" is a **real link** to the game
(`https://dvorakmortonxd.dev/revival-inc`). The real copy stays in the
`.web-feature-text` paragraph below.
The old raster feature shots (`.web-shot` + `next/image`) were removed from the The old raster feature shots (`.web-shot` + `next/image`) were removed from the
web theme only — `revivalinc.webp` / `RustyWolfPreview.webp` are still used by web theme only — `revivalinc.webp` / `RustyWolfPreview.webp` are still used by
the desktop theme and the projects gallery, so the files stay. The old stacked the desktop theme and the projects gallery, so the files stay. The old stacked

4
package-lock.json generated
View file

@ -1,12 +1,12 @@
{ {
"name": "dvorakmortonxd", "name": "dvorakmortonxd",
"version": "2.2.12", "version": "2.2.13",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "dvorakmortonxd", "name": "dvorakmortonxd",
"version": "2.2.12", "version": "2.2.13",
"dependencies": { "dependencies": {
"next": "^16.3.8", "next": "^16.3.8",
"react": "^19.3.0", "react": "^19.3.0",

View file

@ -1,6 +1,6 @@
{ {
"name": "dvorakmortonxd", "name": "dvorakmortonxd",
"version": "2.2.12", "version": "2.2.13",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "node scripts/dev-server.mjs", "dev": "node scripts/dev-server.mjs",

View file

@ -5,21 +5,24 @@ import type { ReactNode } from "react";
/** /**
* Decorative, asset-free mock windows for the two feature panels (Revival Inc. * Decorative, asset-free mock windows for the two feature panels (Revival Inc.
* and RustyWolf). They replace the old raster screenshots so the panels read as * and RustyWolf). They replace the old raster screenshots so the panels read as
* a little OS window instead of a flat image. Purely presentational — the real * a little OS window instead of a flat image. Mostly presentational — the real
* copy lives in the `.web-feature-text` paragraph below each window. * copy lives in the `.web-feature-text` paragraph below each window. The one
* interactive bit is the game's "PRESS START", which is a real link to the game.
*/ */
function Chrome({ function Chrome({
title, title,
tabs, tabs,
decorative = true,
children, children,
}: { }: {
title?: string; title?: string;
tabs?: ReactNode; tabs?: ReactNode;
decorative?: boolean;
children: ReactNode; children: ReactNode;
}) { }) {
return ( return (
<div className="fw" aria-hidden="true"> <div className="fw" aria-hidden={decorative || undefined}>
<div className={"fw-bar" + (tabs ? " fw-bar-browser" : "")}> <div className={"fw-bar" + (tabs ? " fw-bar-browser" : "")}>
<span className="fw-dots"> <span className="fw-dots">
<span className="fw-dot" /> <span className="fw-dot" />
@ -36,21 +39,23 @@ function Chrome({
function GameBody() { function GameBody() {
return ( return (
<div className="fw-scene"> <div className="fw-scene">
<span className="fw-stars" /> <span className="fw-stars" aria-hidden="true" />
<span className="fw-moon" /> <span className="fw-moon" aria-hidden="true" />
<span className="fw-hills" /> <span className="fw-hills" aria-hidden="true" />
<div className="fw-graves"> <div className="fw-graves" aria-hidden="true">
<span className="fw-grave" /> <span className="fw-grave" />
<span className="fw-grave" /> <span className="fw-grave" />
<span className="fw-grave" /> <span className="fw-grave" />
<span className="fw-grave" /> <span className="fw-grave" />
</div> </div>
<span className="fw-scan" /> <span className="fw-scan" aria-hidden="true" />
<div className="fw-hud"> <div className="fw-hud" aria-hidden="true">
<span className="fw-hearts">♥ ♥ ♥</span> <span className="fw-hearts">♥ ♥ ♥</span>
<span className="fw-score">SCORE 0000</span> <span className="fw-score">SCORE 0000</span>
</div> </div>
<span className="fw-start">PRESS START</span> <a className="fw-start" href="https://dvorakmortonxd.dev/revival-inc">
PRESS START
</a>
</div> </div>
); );
} }
@ -91,7 +96,7 @@ function BrowserBody() {
export default function FeatureWindow({ variant }: { variant: "game" | "browser" }) { export default function FeatureWindow({ variant }: { variant: "game" | "browser" }) {
if (variant === "game") { if (variant === "game") {
return ( return (
<Chrome title="revival-inc — mini jame gam #55"> <Chrome title="revival-inc — mini jame gam #55" decorative={false}>
<GameBody /> <GameBody />
</Chrome> </Chrome>
); );

View file

@ -318,7 +318,7 @@ export default function WebLayout() {
</Section> </Section>
<footer className="web-footer glass"> <footer className="web-footer glass">
<span className="web-footer-label">v2.2.12</span> <span className="web-footer-label">v2.2.13</span>
© 2025-2026 Martin Dvořák. All rights reserved (not really I dont care, just © 2025-2026 Martin Dvořák. All rights reserved (not really I dont care, just
follow the GPL3.0 License) follow the GPL3.0 License)
</footer> </footer>

View file

@ -632,12 +632,25 @@ html[data-theme="web"] body {
border: 1px solid rgba(255, 255, 255, 0.55); border: 1px solid rgba(255, 255, 255, 0.55);
background: rgba(124, 58, 237, 0.4); background: rgba(124, 58, 237, 0.4);
color: #fff; color: #fff;
text-decoration: none;
cursor: pointer;
font-family: var(--font-custom-mono); font-family: var(--font-custom-mono);
font-size: 0.6rem; font-size: 0.6rem;
letter-spacing: 0.16em; letter-spacing: 0.16em;
white-space: nowrap; white-space: nowrap;
animation: fw-blink 1.1s steps(2, start) infinite; animation: fw-blink 1.1s steps(2, start) infinite;
} }
.fw-start:hover {
background: rgba(124, 58, 237, 0.72);
border-color: #fff;
animation: none;
opacity: 1;
}
.fw-start:focus-visible {
outline: 2px solid #fff;
outline-offset: 2px;
animation: none;
}
@keyframes fw-blink { @keyframes fw-blink {
50% { 50% {
opacity: 0.35; opacity: 0.35;