From 86e8762c9354d8df308b97821dba8e6c5f44bb85 Mon Sep 17 00:00:00 2001 From: Kyler Ramsey Date: Wed, 23 Sep 2026 21:47:09 -0700 Subject: [PATCH] Website in docs/ on main, like the other timbermods sites; real version text in place of placeholders The site moves from site/ to docs/ and GitHub Pages will serve main:/docs, so merging publishes it; deploy-site.ps1 and the gh-pages workflow are retired. DEVELOPMENT.md moves to the repo root. The release.js fallbacks now show the real version (v1.2.0, MixedStorage-v1.2.0.zip) instead of "the mod" and MixedStorage-vX.Y.Z.zip, and the site test checks that the install guide keeps the zip name it was written with. CLAUDE.md, PRODUCT.md, DESIGN.md, README, DEVELOPMENT.md and the Impeccable records follow. The look is unchanged. Co-Authored-By: Claude Opus 5.5 --- .impeccable/config.json | 10 ++-- .impeccable/design.json | 20 ++++---- ...{site-index-html.md => docs-index-html.md} | 8 +-- CLAUDE.md | 46 +++++++++--------- DESIGN.md | 4 +- docs/DEVELOPMENT.md => DEVELOPMENT.md | 4 +- PRODUCT.md | 8 +-- README.md | 4 +- deploy-site.ps1 | 45 ----------------- {site => docs}/.nojekyll | 0 {site => docs}/404.html | 0 {site => docs}/assets/cabinet.js | 0 {site => docs}/assets/demo.js | 0 {site => docs}/assets/favicon.svg | 0 {site => docs}/assets/fonts/OFL-Alegreya.txt | 0 {site => docs}/assets/fonts/OFL.txt | 0 .../assets/fonts/alegreya-sc-latin-500.woff2 | Bin .../assets/fonts/alegreya-sc-latin-700.woff2 | Bin .../assets/fonts/noto-sans-latin-400.woff2 | Bin .../assets/fonts/noto-sans-latin-700.woff2 | Bin {site => docs}/assets/game-panel.css | 0 {site => docs}/assets/goods.js | 0 {site => docs}/assets/goods/berries-40.png | Bin {site => docs}/assets/goods/berries-60.png | Bin {site => docs}/assets/goods/book-40.png | Bin {site => docs}/assets/goods/book-60.png | Bin .../assets/goods/bot-chassis-40.png | Bin .../assets/goods/bot-chassis-60.png | Bin {site => docs}/assets/goods/bot-head-40.png | Bin {site => docs}/assets/goods/bot-head-60.png | Bin {site => docs}/assets/goods/bot-limb-40.png | Bin {site => docs}/assets/goods/bot-limb-60.png | Bin {site => docs}/assets/goods/bread-40.png | Bin {site => docs}/assets/goods/bread-60.png | Bin {site => docs}/assets/goods/carrot-40.png | Bin {site => docs}/assets/goods/carrot-60.png | Bin .../assets/goods/cattail-cracker-40.png | Bin .../assets/goods/cattail-cracker-60.png | Bin .../assets/goods/cattail-flour-40.png | Bin .../assets/goods/cattail-flour-60.png | Bin .../assets/goods/cattail-root-40.png | Bin .../assets/goods/cattail-root-60.png | Bin {site => docs}/assets/goods/chestnut-40.png | Bin {site => docs}/assets/goods/chestnut-60.png | Bin {site => docs}/assets/goods/dandelion-40.png | Bin {site => docs}/assets/goods/dandelion-60.png | Bin {site => docs}/assets/goods/explosives-40.png | Bin {site => docs}/assets/goods/explosives-60.png | Bin {site => docs}/assets/goods/fireworks-40.png | Bin {site => docs}/assets/goods/fireworks-60.png | Bin {site => docs}/assets/goods/gear-40.png | Bin {site => docs}/assets/goods/gear-60.png | Bin .../assets/goods/grilled-chestnut-40.png | Bin .../assets/goods/grilled-chestnut-60.png | Bin .../assets/goods/grilled-potato-40.png | Bin .../assets/goods/grilled-potato-60.png | Bin .../assets/goods/grilled-spadderdock-40.png | Bin .../assets/goods/grilled-spadderdock-60.png | Bin .../assets/goods/maple-pastry-40.png | Bin .../assets/goods/maple-pastry-60.png | Bin {site => docs}/assets/goods/paper-40.png | Bin {site => docs}/assets/goods/paper-60.png | Bin {site => docs}/assets/goods/pine-resin-40.png | Bin {site => docs}/assets/goods/pine-resin-60.png | Bin {site => docs}/assets/goods/potato-40.png | Bin {site => docs}/assets/goods/potato-60.png | Bin {site => docs}/assets/goods/punch-card-40.png | Bin {site => docs}/assets/goods/punch-card-60.png | Bin .../assets/goods/spadderdock-40.png | Bin .../assets/goods/spadderdock-60.png | Bin .../assets/goods/sunflower-seeds-40.png | Bin .../assets/goods/sunflower-seeds-60.png | Bin {site => docs}/assets/goods/wheat-40.png | Bin {site => docs}/assets/goods/wheat-60.png | Bin .../assets/goods/wheat-flour-40.png | Bin .../assets/goods/wheat-flour-60.png | Bin {site => docs}/assets/og.png | Bin {site => docs}/assets/panel.webp | Bin {site => docs}/assets/panel.webp.json | 0 {site => docs}/assets/release.js | 0 {site => docs}/assets/site.js | 0 {site => docs}/assets/split.js | 0 {site => docs}/assets/style.css | 0 {site => docs}/assets/textures/brass.webp | Bin .../assets/textures/brass.webp.json | 0 {site => docs}/assets/textures/holder.png | Bin {site => docs}/assets/textures/kraft.webp | Bin .../assets/textures/kraft.webp.json | 0 .../assets/textures/make_textures.py | 0 {site => docs}/assets/textures/pull.png | Bin {site => docs}/assets/textures/walnut.webp | Bin .../assets/textures/walnut.webp.json | 0 {site => docs}/assets/world.webp | Bin {site => docs}/assets/world.webp.json | 0 {site => docs}/faq.html | 0 {site => docs}/index.html | 4 +- {site => docs}/install.html | 4 +- {site => docs}/robots.txt | 0 {site => docs}/sitemap.xml | 0 {site => docs}/troubleshooting.html | 0 tests/test-site.mjs | 10 ++-- 101 files changed, 62 insertions(+), 105 deletions(-) rename .impeccable/surfaces/{site-index-html.md => docs-index-html.md} (91%) rename docs/DEVELOPMENT.md => DEVELOPMENT.md (91%) delete mode 100644 deploy-site.ps1 rename {site => docs}/.nojekyll (100%) rename {site => docs}/404.html (100%) rename {site => docs}/assets/cabinet.js (100%) rename {site => docs}/assets/demo.js (100%) rename {site => docs}/assets/favicon.svg (100%) rename {site => docs}/assets/fonts/OFL-Alegreya.txt (100%) rename {site => docs}/assets/fonts/OFL.txt (100%) rename {site => docs}/assets/fonts/alegreya-sc-latin-500.woff2 (100%) rename {site => docs}/assets/fonts/alegreya-sc-latin-700.woff2 (100%) rename {site => docs}/assets/fonts/noto-sans-latin-400.woff2 (100%) rename {site => docs}/assets/fonts/noto-sans-latin-700.woff2 (100%) rename {site => docs}/assets/game-panel.css (100%) rename {site => docs}/assets/goods.js (100%) rename {site => docs}/assets/goods/berries-40.png (100%) rename {site => docs}/assets/goods/berries-60.png (100%) rename {site => docs}/assets/goods/book-40.png (100%) rename {site => docs}/assets/goods/book-60.png (100%) rename {site => docs}/assets/goods/bot-chassis-40.png (100%) rename {site => docs}/assets/goods/bot-chassis-60.png (100%) rename {site => docs}/assets/goods/bot-head-40.png (100%) rename {site => docs}/assets/goods/bot-head-60.png (100%) rename {site => docs}/assets/goods/bot-limb-40.png (100%) rename {site => docs}/assets/goods/bot-limb-60.png (100%) rename {site => docs}/assets/goods/bread-40.png (100%) rename {site => docs}/assets/goods/bread-60.png (100%) rename {site => docs}/assets/goods/carrot-40.png (100%) rename {site => docs}/assets/goods/carrot-60.png (100%) rename {site => docs}/assets/goods/cattail-cracker-40.png (100%) rename {site => docs}/assets/goods/cattail-cracker-60.png (100%) rename {site => docs}/assets/goods/cattail-flour-40.png (100%) rename {site => docs}/assets/goods/cattail-flour-60.png (100%) rename {site => docs}/assets/goods/cattail-root-40.png (100%) rename {site => docs}/assets/goods/cattail-root-60.png (100%) rename {site => docs}/assets/goods/chestnut-40.png (100%) rename {site => docs}/assets/goods/chestnut-60.png (100%) rename {site => docs}/assets/goods/dandelion-40.png (100%) rename {site => docs}/assets/goods/dandelion-60.png (100%) rename {site => docs}/assets/goods/explosives-40.png (100%) rename {site => docs}/assets/goods/explosives-60.png (100%) rename {site => docs}/assets/goods/fireworks-40.png (100%) rename {site => docs}/assets/goods/fireworks-60.png (100%) rename {site => docs}/assets/goods/gear-40.png (100%) rename {site => docs}/assets/goods/gear-60.png (100%) rename {site => docs}/assets/goods/grilled-chestnut-40.png (100%) rename {site => docs}/assets/goods/grilled-chestnut-60.png (100%) rename {site => docs}/assets/goods/grilled-potato-40.png (100%) rename {site => docs}/assets/goods/grilled-potato-60.png (100%) rename {site => docs}/assets/goods/grilled-spadderdock-40.png (100%) rename {site => docs}/assets/goods/grilled-spadderdock-60.png (100%) rename {site => docs}/assets/goods/maple-pastry-40.png (100%) rename {site => docs}/assets/goods/maple-pastry-60.png (100%) rename {site => docs}/assets/goods/paper-40.png (100%) rename {site => docs}/assets/goods/paper-60.png (100%) rename {site => docs}/assets/goods/pine-resin-40.png (100%) rename {site => docs}/assets/goods/pine-resin-60.png (100%) rename {site => docs}/assets/goods/potato-40.png (100%) rename {site => docs}/assets/goods/potato-60.png (100%) rename {site => docs}/assets/goods/punch-card-40.png (100%) rename {site => docs}/assets/goods/punch-card-60.png (100%) rename {site => docs}/assets/goods/spadderdock-40.png (100%) rename {site => docs}/assets/goods/spadderdock-60.png (100%) rename {site => docs}/assets/goods/sunflower-seeds-40.png (100%) rename {site => docs}/assets/goods/sunflower-seeds-60.png (100%) rename {site => docs}/assets/goods/wheat-40.png (100%) rename {site => docs}/assets/goods/wheat-60.png (100%) rename {site => docs}/assets/goods/wheat-flour-40.png (100%) rename {site => docs}/assets/goods/wheat-flour-60.png (100%) rename {site => docs}/assets/og.png (100%) rename {site => docs}/assets/panel.webp (100%) rename {site => docs}/assets/panel.webp.json (100%) rename {site => docs}/assets/release.js (100%) rename {site => docs}/assets/site.js (100%) rename {site => docs}/assets/split.js (100%) rename {site => docs}/assets/style.css (100%) rename {site => docs}/assets/textures/brass.webp (100%) rename {site => docs}/assets/textures/brass.webp.json (100%) rename {site => docs}/assets/textures/holder.png (100%) rename {site => docs}/assets/textures/kraft.webp (100%) rename {site => docs}/assets/textures/kraft.webp.json (100%) rename {site => docs}/assets/textures/make_textures.py (100%) rename {site => docs}/assets/textures/pull.png (100%) rename {site => docs}/assets/textures/walnut.webp (100%) rename {site => docs}/assets/textures/walnut.webp.json (100%) rename {site => docs}/assets/world.webp (100%) rename {site => docs}/assets/world.webp.json (100%) rename {site => docs}/faq.html (100%) rename {site => docs}/index.html (99%) rename {site => docs}/install.html (98%) rename {site => docs}/robots.txt (100%) rename {site => docs}/sitemap.xml (100%) rename {site => docs}/troubleshooting.html (100%) diff --git a/.impeccable/config.json b/.impeccable/config.json index e455148..b53e6c5 100644 --- a/.impeccable/config.json +++ b/.impeccable/config.json @@ -7,7 +7,7 @@ "rule": "cramped-padding", "value": "*", "files": [ - "site/index.html" + "docs/index.html" ], "createdAt": "2026-09-23T18:40:39.129Z", "reason": "agent: sections, table cells and plates pad with clamp()/nested padding the static scan can't resolve; checked in screenshots" @@ -16,7 +16,7 @@ "rule": "cramped-padding", "value": "*", "files": [ - "site/install.html" + "docs/install.html" ], "createdAt": "2026-09-23T18:40:39.262Z", "reason": "agent: sections, table cells and plates pad with clamp()/nested padding the static scan can't resolve; checked in screenshots" @@ -25,7 +25,7 @@ "rule": "cramped-padding", "value": "*", "files": [ - "site/faq.html" + "docs/faq.html" ], "createdAt": "2026-09-23T18:40:39.393Z", "reason": "agent: sections, table cells and plates pad with clamp()/nested padding the static scan can't resolve; checked in screenshots" @@ -34,7 +34,7 @@ "rule": "cramped-padding", "value": "*", "files": [ - "site/troubleshooting.html" + "docs/troubleshooting.html" ], "createdAt": "2026-09-23T18:40:39.530Z", "reason": "agent: sections, table cells and plates pad with clamp()/nested padding the static scan can't resolve; checked in screenshots" @@ -43,7 +43,7 @@ "rule": "flat-type-hierarchy", "value": "*", "files": [ - "site/404.html" + "docs/404.html" ], "createdAt": "2026-09-23T18:40:39.661Z", "reason": "agent: 404 loads /MixedStorage/assets/style.css by absolute path (a site-test contract), which the static scan can't read" diff --git a/.impeccable/design.json b/.impeccable/design.json index 97f2547..ced26f8 100644 --- a/.impeccable/design.json +++ b/.impeccable/design.json @@ -474,37 +474,37 @@ "materials": [ { "name": "walnut", - "file": "site/assets/textures/walnut.webp", + "file": "docs/assets/textures/walnut.webp", "size": "720x180", "use": "background-size 720px auto; tiles both ways; per-drawer background-position offsets so neighbours don't repeat grain; fallback #3a2416 (carcass) / #5d3c28 (drawer)." }, { "name": "kraft", - "file": "site/assets/textures/kraft.webp", + "file": "docs/assets/textures/kraft.webp", "size": "200x200", "use": "background-size 200px; tiles both ways; label cards, step numbers, toc cards, pressed split." }, { "name": "brass", - "file": "site/assets/textures/brass.webp", + "file": "docs/assets/textures/brass.webp", "size": "512x64", "use": "background-size auto 100%, centred; Download plate and note tabs." }, { "name": "holder", - "file": "site/assets/textures/holder.png", + "file": "docs/assets/textures/holder.png", "size": "112x56", "use": "nine-slice: border-image-slice 16, stretch; border-width 11px 14px (holder), 8px 9px (steps), 7px 9px (toc); background-clip padding-box over kraft." }, { "name": "pull", - "file": "site/assets/textures/pull.png", + "file": "docs/assets/textures/pull.png", "size": "96x40", "use": "single image, contain; 60x25 on drawers, 38x16 on accordions." }, { "name": "generator", - "file": "site/assets/textures/make_textures.py", + "file": "docs/assets/textures/make_textures.py", "use": "numpy + Pillow, fixed seed 1200, no source images, no generative model." } ], @@ -585,8 +585,8 @@ { "name": "In-game panel replica", "files": [ - "site/assets/game-panel.css", - "site/assets/demo.js" + "docs/assets/game-panel.css", + "docs/assets/demo.js" ], "note": "Reproduces the mod's panel in the game's colours, frames and Noto Sans; reads only --ink, --muted, --edge and --orange from the site. Not site style: don't reuse it or restyle it." } @@ -676,7 +676,7 @@ ], "narrative": { "northStar": "The Apothecary Drawer Cabinet", - "overview": "The site is one walnut cabinet standing against a painted wall. Every drawer is a good, and each drawer's height is that good's share of the building. Brass label holders carry kraft cards, brass cup pulls sit under them, and the goods keep the game's own icons. The idea is literal: the hero cabinet redraws its drawers with the mod's own rounding, and the rules section draws the same share at three capacities at true scale, with a leader line and a dimension bracket, like a measured folio drawing.\n\nMaterials are real and made, not faked. Walnut, brass and kraft are procedural textures (`site/assets/textures/make_textures.py`, fixed seed, no source images, no generative model). Walnut tiles so a drawer of any height keeps its grain, the brass label holder is a nine-slice border image, and the pull is one image used on every drawer face and every accordion. CSS supplies only edge lines, recesses and cast shadows over those textures. The wall behind the cabinet is plain paint: sage limewash by day, deep verdigris by lamplight. Walnut, brass and kraft keep their values in both modes, because they are materials, not themes.\n\nDensity is calm and reading-first. Type is split by job. Alegreya SC, engraved brass-label small caps, names things: the wordmark, headings, labels, buttons, counts. The system face carries every sentence. The in-game panel replica (`game-panel.css`, `demo.js`) is a contained exception. It reproduces the mod's panel in the game's own look and is not part of this system.", + "overview": "The site is one walnut cabinet standing against a painted wall. Every drawer is a good, and each drawer's height is that good's share of the building. Brass label holders carry kraft cards, brass cup pulls sit under them, and the goods keep the game's own icons. The idea is literal: the hero cabinet redraws its drawers with the mod's own rounding, and the rules section draws the same share at three capacities at true scale, with a leader line and a dimension bracket, like a measured folio drawing.\n\nMaterials are real and made, not faked. Walnut, brass and kraft are procedural textures (`docs/assets/textures/make_textures.py`, fixed seed, no source images, no generative model). Walnut tiles so a drawer of any height keeps its grain, the brass label holder is a nine-slice border image, and the pull is one image used on every drawer face and every accordion. CSS supplies only edge lines, recesses and cast shadows over those textures. The wall behind the cabinet is plain paint: sage limewash by day, deep verdigris by lamplight. Walnut, brass and kraft keep their values in both modes, because they are materials, not themes.\n\nDensity is calm and reading-first. Type is split by job. Alegreya SC, engraved brass-label small caps, names things: the wordmark, headings, labels, buttons, counts. The system face carries every sentence. The in-game panel replica (`game-panel.css`, `demo.js`) is a contained exception. It reproduces the mod's panel in the game's own look and is not part of this system.", "keyCharacteristics": [ "One metaphor, used to the letter: capacity is a cabinet, a share is a drawer's height.", "Produced material textures (walnut, brass, kraft), tiled or nine-sliced, never imitated with gradients.", @@ -722,7 +722,7 @@ } ], "dos": [ - "Do take walnut, brass and kraft from the produced textures in `site/assets/textures/` (regenerate with `make_textures.py`). Tile walnut at 720px, kraft at 200px, and fit brass to the element's height.", + "Do take walnut, brass and kraft from the produced textures in `docs/assets/textures/` (regenerate with `make_textures.py`). Tile walnut at 720px, kraft at 200px, and fit brass to the element's height.", "Do frame kraft cards with the brass holder nine-slice (`border-image: url(textures/holder.png) 16`) and `background-clip: padding-box`. Scale the border width to the element (7–11px vertical).", "Do use the brass cup pull as the one \"this opens\" sign, on drawers and accordions alike.", "Do set every count, capacity and percentage in tabular figures, and draw proportions at true share.", diff --git a/.impeccable/surfaces/site-index-html.md b/.impeccable/surfaces/docs-index-html.md similarity index 91% rename from .impeccable/surfaces/site-index-html.md rename to .impeccable/surfaces/docs-index-html.md index be4c9ad..f04ccc2 100644 --- a/.impeccable/surfaces/site-index-html.md +++ b/.impeccable/surfaces/docs-index-html.md @@ -1,13 +1,13 @@ --- version: 1 slug: "site-index-html" -primary_target: "site/index.html" -related_targets: ["site/install.html","site/troubleshooting.html","site/faq.html","site/404.html"] +primary_target: "docs/index.html" +related_targets: ["docs/install.html","docs/troubleshooting.html","docs/faq.html","docs/404.html"] --- -# Surface brief: MixedStorage site (site/index.html with install, troubleshooting, faq, 404) +# Surface brief: MixedStorage site (docs/index.html with install, troubleshooting, faq, 404) -Scope: site/. Home: Persuade. Guides: Read. Audience: Timberborn players short on storage; mostly single player, some Stability Fork co-op. Action: understand the percentage mechanism, download the right zip, install right, set up a first mixed building. Proof: the working panel replica, real in-game screenshots (panel.webp, world.webp), exact rounding. Constraints: tests/test-site.mjs contracts (download buttons, /releases/latest fallbacks, hidden stays hidden, 404 absolute paths, same release.js config); release.js byte-identical; describe the mod as it is now; decided by the agent under the maintainer's delegation (no question rounds). +Scope: docs/. Home: Persuade. Guides: Read. Audience: Timberborn players short on storage; mostly single player, some Stability Fork co-op. Action: understand the percentage mechanism, download the right zip, install right, set up a first mixed building. Proof: the working panel replica, real in-game screenshots (panel.webp, world.webp), exact rounding. Constraints: tests/test-site.mjs contracts (download buttons, /releases/latest fallbacks, hidden stays hidden, 404 absolute paths, same release.js config); release.js byte-identical; describe the mod as it is now; decided by the agent under the maintainer's delegation (no question rounds). ## Direction contract diff --git a/CLAUDE.md b/CLAUDE.md index 1725299..2a40e21 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,31 +2,30 @@ MixedStorage (timbermods/MixedStorage) is a Timberborn mod: one warehouse or pile holds several goods, each with a share of capacity set by percentage. C# in `source/` (mod), `multiplayer/` (bundled BeaverBuddies Stability Fork bridge), -`tests/` (allocation tests, site test, version check), `loading-tests/`; the website is `site/`. Changes land on `main` +`tests/` (allocation tests, site test, version check), `loading-tests/`; the website is `docs/`. Changes land on `main` through a PR → merge. - CI (`.github/workflows/tests.yml`, every PR) runs, and you can run locally without the game: `dotnet run --project tests/AllocationTests.csproj -c Release` (prints `PASS: 19,138 assertions…`), `node tests/test-site.mjs` (76/76), and `powershell -NoProfile -Command ".\tests\check-version.ps1"` (prints `1.2.0`). - The full mod build needs the game and DLLs: `.\build.ps1 -HarmonyPath <0Harmony.dll> -BeaverBuddiesPath ` - (see `docs/DEVELOPMENT.md`). The version lives only in `Directory.Build.props` plus + (see `DEVELOPMENT.md`). The version lives only in `Directory.Build.props` plus `packaging/MixedStorage/version-1.1/manifest.json`; a release bump also touches README, CHANGELOG.md and the site's - status note (`site/index.html#status`). + status note (`docs/index.html#status`). ## Standing rules - Never launch or drive Timberborn, and never touch installed mods or saves. The maintainer (Kyler) playtests himself. -- Commit on a branch and open a PR. Merge only when Kyler says so in the chat. +- Commit on a branch and open a PR. Kyler has said to merge PRs automatically: merge, then check the page live. - Upgrade facts players need stay (replace files with the game closed; allocations are kept; remove the old MixedStorage-BeaverBuddies add-on). Other version history goes only in CHANGELOG.md and release notes. ## Website -- **Where:** `site/`: `index.html` (features, cabinet, demo), `install.html`, `troubleshooting.html`, `faq.html`, +- **Where:** `docs/`: `index.html` (features, cabinet, demo), `install.html`, `troubleshooting.html`, `faq.html`, `404.html`, plus `robots.txt`, `sitemap.xml`, `.nojekyll`. Live at https://timbermods.github.io/MixedStorage/. -- **Published:** GitHub Pages serves the **`gh-pages`** branch, not main. After the PR is merged, run - `.\deploy-site.ps1` from a clean checkout of `origin/main` (it publishes that working tree's `site/`; `-DryRun` - lists the changes without pushing). Pages updates in about a minute. +- **Published:** GitHub Pages serves `main:/docs`, like every other timbermods site, so merging to main publishes; + a build takes about a minute. (The old `gh-pages` branch and `deploy-site.ps1` are retired.) - **Look:** "The Apothecary Drawer Cabinet". The site is one walnut cabinet on a painted wall: every drawer is a good, and its height is that good's share, with brass label holders, kraft cards and brass cup pulls. The look is fixed: updates extend it and never restyle it. @@ -51,19 +50,19 @@ through a PR → merge. - **Mounted-or-Set-In**: paper panels are set in (1.5px rule border, no shadow); the cabinet, frames, plates and hardware are mounted (one soft shadow downward). Nothing floats or glows. - **Rail**: header and footer meet the page with a 3px tarnished-brass (`#8a6a2c`) rail. -- Tokens live in `site/assets/style.css` `:root`; night values in `@media (prefers-color-scheme: dark)`. Day / night: +- Tokens live in `docs/assets/style.css` `:root`; night values in `@media (prefers-color-scheme: dark)`. Day / night: ground `--bg` #dfe4da / #18221f, tint `--bg-deep` #d0d8cc / #111916, `--paper` #eef1ea / #1f2b27, `--ink` #1d2320 / #ece6d8, `--muted` #4c5751 / #b8b09d, `--line` #aab5ab / #34423c, `--link` #1f5a50 / #8fd0c2, `--orange` #b35c10 / #ffa60f. Fixed: walnut #4a2f1f, #5d3c28, #6e4a32, edge #2e1c12, carcass fill #3a2416; brass #c19a4b, hi #e0c27e, deep #8a6a2c; kraft #d8c29b. Two literals with no custom property: pale kraft `#d9ccb3` (footer text) and every page's `` (one value for both modes). The legacy classes `panel--blue` / `panel--maroon` in install and troubleshooting just map to paper; leave them. -- Fonts: Alegreya SC 500 and 700, self-hosted in `site/assets/fonts/` (`OFL-Alegreya.txt`); body is the system-ui +- Fonts: Alegreya SC 500 and 700, self-hosted in `docs/assets/fonts/` (`OFL-Alegreya.txt`); body is the system-ui stack; mono is ui-monospace. Noto Sans 400/700 (`OFL.txt`) belongs to the panel replica only. No other webfonts, nothing from a CDN at runtime. - Textures: `walnut.webp` (tile 720px), `kraft.webp` (tile 200px), `brass.webp` (fit to height), `holder.png` (nine-slice, `border-image: url(textures/holder.png) 16`), `pull.png` (the one "this opens" sign, on drawers and - accordions), made by `site/assets/textures/make_textures.py` (numpy + Pillow, seed 1200; run it from that folder). + accordions), made by `docs/assets/textures/make_textures.py` (numpy + Pillow, seed 1200; run it from that folder). Change the script and re-run it rather than editing images. Every shipping raster carries provenance (a `.json` sidecar): run the Impeccable `embed-prompt` command on each new or changed image. - Themes: light and dark follow the OS (`prefers-color-scheme`) only. There is no toggle and no storage key. Check both. @@ -73,12 +72,12 @@ through a PR → merge. button redraws them (`cabinet.js` with `split.js`, the mod's rounding); plates lift 1px; an accordion's pull drops 3px. Everything is off under `prefers-reduced-motion`. - The in-game panel replica (`game-panel.css`, `demo.js`, `goods.js`, `split.js`) must keep matching the mod's real - Storage Allocation panel (the 0.5.7-era native look; `site/assets/panel.webp` is the in-game screenshot). It reads only + Storage Allocation panel (the 0.5.7-era native look; `docs/assets/panel.webp` is the in-game screenshot). It reads only `--ink`, `--muted`, `--edge`, `--orange`. Don't restyle it toward the cabinet or reuse its parts elsewhere. Update `split.js` / `demo.js` when the mod's rounding (`AllocationPlan.Capacities`) or messages (`StorageView`) change. - Don't: imitate wood, brass or paper with CSS gradients or bevels; put kickers or small labels above headings; build stat rows or icon-tile grids; use hard zero-blur offset shadows; set sentences in Alegreya SC; add a second accent - fill; use official Timberborn logos or key art (the goods icons in `site/assets/goods/` are allowed and credited). + fill; use official Timberborn logos or key art (the goods icons in `docs/assets/goods/` are allowed and credited). - New components: build them from the tokens and components above, match the neighbouring sections, and add them to DESIGN.md. @@ -93,23 +92,24 @@ through a PR → merge. - Terminology as in game and README: Storage Allocation, Apply 100%, Apply: store nothing, Copy allocations, Paste allocations, Clear all, Revert, Max, Allocated goods only, excess, Accept / Obtain / Supply / Empty, Copy settings (the game's tool), BeaverBuddies Stability Fork. -- `site/assets/release.js` is shared across timbermods sites and byte-identical: replace it, never edit it. +- `docs/assets/release.js` is shared across timbermods sites and byte-identical: replace it, never edit it. ### Update the website for a new release When asked to "update the website for the latest release, consistent with the design": 1. Read the release and the docs: `gh release list -R timbermods/MixedStorage -L 5`, - `gh release view -R timbermods/MixedStorage`, README, CHANGELOG.md, `docs/DEVELOPMENT.md`. List every + `gh release view -R timbermods/MixedStorage`, README, CHANGELOG.md, `DEVELOPMENT.md`. List every player-facing change. 2. Update every place the site states a changed fact: - - The release version is **never** written statically: `release.js` fills `data-release="tag"` (fallback text - "the mod"), `data-release="asset-name"` (fallback `MixedStorage-vX.Y.Z.zip`, which the test requires), - `data-release-href="download"|"notes"` (fallback `…/releases/latest` or `…/releases`) and the - `data-release-show` pills. Leave those fallbacks alone. `grep -rn "" site` should find nothing. - - Game version (`grep -rn "1\.1\.2\.4" site`): install meta/og description, hero meta row and `#buildings` ledger + - `release.js` fills `data-release="tag"` (fallback text `v1.2.0`), `data-release="asset-name"` (fallback + `MixedStorage-v1.2.0.zip`), `data-release-href="download"|"notes"` (fallback `…/releases/latest` or + `…/releases`) and the `data-release-show` pills. The tag and zip-name fallbacks are updated automatically when a + release is marked Latest (`.github/workflows/latest-release.yml`); the site test checks that the install guide + keeps the zip name it was written with. Pre-releases change nothing. + - Game version (`grep -rn "1\.1\.2\.4" docs`): install meta/og description, hero meta row and `#buildings` ledger (index), `#requirements` ledger and the `#verify` log line (install), `#faq-version`, and `footer__fine` on all five pages including 404. The `version-1.1` folder appears in install `#steps` and troubleshooting `#t-not-listed`. - - Harmony version (`grep -rn "2\.4\.1" site`): hero meta, `#buildings` ledger, install requirements and step 4, + - Harmony version (`grep -rn "2\.4\.1" docs`): hero meta, `#buildings` ledger, install requirements and step 4, troubleshooting `#t-harmony`. - Status: the `#status` note ("What's been played") in index.html, plus PRODUCT.md's Operating Context and Honest status. @@ -142,8 +142,8 @@ When asked to "update the website for the latest release, consistent with the de `gpt-thin-border-wide-shadow` on mounted frames and plates; the "could not read /MixedStorage/assets/style.css" note. 7. If the look changed (a new component or layout), update DESIGN.md and `.impeccable/design.json`. 8. Update the README if it repeats the facts. -9. Ship: branch → commit → push → `gh pr create`. After Kyler says merge: `gh pr merge --merge`, then from a - checkout of `origin/main` run `.\deploy-site.ps1` (try `-DryRun` first), then verify: +9. Ship: branch → commit → push → `gh pr create`. Kyler has said to merge PRs automatically: `gh pr merge --merge` + (that publishes), then verify: - `gh api repos/timbermods/MixedStorage/pages/builds/latest -q .status` is `built`; - `curl -s https://timbermods.github.io/MixedStorage/ | grep -c ""` finds the change. diff --git a/DESIGN.md b/DESIGN.md index 79c8eef..fb0e7ec 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -176,7 +176,7 @@ components: The site is one walnut cabinet standing against a painted wall. Every drawer is a good, and each drawer's height is that good's share of the building. Brass label holders carry kraft cards, brass cup pulls sit under them, and the goods keep the game's own icons. The idea is literal: the hero cabinet redraws its drawers with the mod's own rounding, and the rules section draws the same share at three capacities at true scale, with a leader line and a dimension bracket, like a measured folio drawing. -Materials are real and made, not faked. Walnut, brass and kraft are procedural textures (`site/assets/textures/make_textures.py`, fixed seed, no source images, no generative model). Walnut tiles so a drawer of any height keeps its grain, the brass label holder is a nine-slice border image, and the pull is one image used on every drawer face and every accordion. CSS supplies only edge lines, recesses and cast shadows over those textures. The wall behind the cabinet is plain paint: sage limewash by day, deep verdigris by lamplight. Walnut, brass and kraft keep their values in both modes, because they are materials, not themes. +Materials are real and made, not faked. Walnut, brass and kraft are procedural textures (`docs/assets/textures/make_textures.py`, fixed seed, no source images, no generative model). Walnut tiles so a drawer of any height keeps its grain, the brass label holder is a nine-slice border image, and the pull is one image used on every drawer face and every accordion. CSS supplies only edge lines, recesses and cast shadows over those textures. The wall behind the cabinet is plain paint: sage limewash by day, deep verdigris by lamplight. Walnut, brass and kraft keep their values in both modes, because they are materials, not themes. Density is calm and reading-first. Type is split by job. Alegreya SC, engraved brass-label small caps, names things: the wordmark, headings, labels, buttons, counts. The system face carries every sentence. The in-game panel replica (`game-panel.css`, `demo.js`) is a contained exception. It reproduces the mod's panel in the game's own look and is not part of this system. @@ -319,7 +319,7 @@ The same small share drawn at three capacities, at true share. Each is a mini ca ## Do's and Don'ts ### Do: -- **Do** take walnut, brass and kraft from the produced textures in `site/assets/textures/` (regenerate with `make_textures.py`). Tile walnut at 720px, kraft at 200px, and fit brass to the element's height. +- **Do** take walnut, brass and kraft from the produced textures in `docs/assets/textures/` (regenerate with `make_textures.py`). Tile walnut at 720px, kraft at 200px, and fit brass to the element's height. - **Do** frame kraft cards with the brass holder nine-slice (`border-image: url(textures/holder.png) 16`) and `background-clip: padding-box`. Scale the border width to the element (7–11px vertical). - **Do** use the brass cup pull as the one "this opens" sign, on drawers and accordions alike. - **Do** set every count, capacity and percentage in tabular figures, and draw proportions at true share. diff --git a/docs/DEVELOPMENT.md b/DEVELOPMENT.md similarity index 91% rename from docs/DEVELOPMENT.md rename to DEVELOPMENT.md index f7061eb..5512db8 100644 --- a/docs/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -62,8 +62,8 @@ The mod reuses the installed game's styles and assets: `NineSliceVisualElement` - Isolated loading processes with and without BeaverBuddies check eager main-type enumeration, bridge event discovery, delegate installation, repeated initialization, and obsolete-addon rejection. A stub BeaverBuddies with one member missing (`loading-tests/StubBeaverBuddies`) checks that an incompatible build is skipped without stopping startup, that the reason names exactly that member, that a failed bridge is not loaded twice, and that Apply without the bridge only counts as single-player when BeaverBuddies reports no connection. They also check that every prefix that can replace the game's method (every prefix returning `bool`, in every class Harmony's `PatchAll` would patch) carries `[HarmonyPriority(Priority.Last)]`, on the method or on its class. - BeaverBuddies replays the Duplicate settings tool on every player. A loading check walks the IL of the patches that run inside that replay, and of every mod method they call, and fails if any of them reads the panel's message or pending state, the panel or renderer, submits a command, or reads a clock, input or random numbers (`loading-tests/ReplayChecks.cs`). Two control scans check that it finds such state where the mod does use it. -Loading checks run under .NET, not inside Unity/Mono. They do not establish live multiplayer compatibility. Builds pass without compiler warnings; v0.5.8's layout has been visually verified in game, and v1.0.0 through v1.2.0 leave it unchanged apart from v1.2.0's ring around Apply. The v1.0.0 to v1.2.0 Duplicate settings, startup, loading, Supply order, editor status, patch priority, announcement, store-nothing and Apply ring changes have not been exercised in game yet. The mod's startup log line reads its version from the assembly, and both DLLs take theirs from `Directory.Build.props`, so a release bump touches only that file, the manifest, the README and changelog, and the website's Project status note in `site/index.html`. `tests/check-version.ps1`, which `build.ps1` runs before building and CI runs on every pull request, fails when the manifest's version differs from `Directory.Build.props` or a mod `.csproj` sets its own ``, and `build.ps1` stops before packaging when a built DLL carries another version. +Loading checks run under .NET, not inside Unity/Mono. They do not establish live multiplayer compatibility. Builds pass without compiler warnings; v0.5.8's layout has been visually verified in game, and v1.0.0 through v1.2.0 leave it unchanged apart from v1.2.0's ring around Apply. The v1.0.0 to v1.2.0 Duplicate settings, startup, loading, Supply order, editor status, patch priority, announcement, store-nothing and Apply ring changes have not been exercised in game yet. The mod's startup log line reads its version from the assembly, and both DLLs take theirs from `Directory.Build.props`, so a release bump touches only that file, the manifest, the README and changelog, and the website's Project status note in `docs/index.html`. `tests/check-version.ps1`, which `build.ps1` runs before building and CI runs on every pull request, fails when the manifest's version differs from `Directory.Build.props` or a mod `.csproj` sets its own ``, and `build.ps1` stops before packaging when a built DLL carries another version. ## Website -The project website (features, install guide, troubleshooting, FAQ) is plain static HTML, CSS and JavaScript in `site/`. There is no build step; edit the files directly. GitHub Pages serves the `gh-pages` branch, so after committing changes to `site/`, publish them with `.\deploy-site.ps1` (add `-DryRun` to preview what would change). The download buttons and release labels are filled in by `site/assets/release.js`, a byte-for-byte copy of the release script the other timbermods sites share, so replace it rather than edit it. It offers GitHub's Latest release, or the newest pre-release while there is none, and that release's zip matching the `data-asset` pattern on its script tags (`MixedStorage-v.zip` with a numeric version, the name `build.ps1` gives it); with no usable answer the pages keep their links to the Latest release page. `node tests/test-site.mjs` checks this offline against a fake GitHub, and CI runs it. `site/assets/split.js` mirrors `AllocationPlan.Capacities`, and `site/assets/demo.js` mirrors the panel behavior and messages in `StorageView`, for the interactive demo, so update them if the rounding rules or messages ever change. The demo's styling is in `site/assets/game-panel.css`. It uses self-hosted Noto Sans (SIL Open Font License, included in `site/assets/fonts/`). `site/assets/goods.js` lists every good a Folktails warehouse accepts: the `Box`-type goods in the game's Common and Folktails good collections (27, matching the in-game list), with ids and names from the game's `Blueprints.zip` and English localization. The warehouse capacities (30, 200, 1,200) and descriptions come from the same blueprints. The icons in `site/assets/goods/` are the game's own goods textures, color-adjusted to match how the game draws them and exported at 40 and 60 px. Regenerate them if the game adds or changes goods. +The project website (features, install guide, troubleshooting, FAQ) is plain static HTML, CSS and JavaScript in `docs/`. There is no build step; edit the files directly. GitHub Pages serves `main:/docs`, so merging a change to `main` publishes it. The download buttons and release labels are filled in by `docs/assets/release.js`, a byte-for-byte copy of the release script the other timbermods sites share, so replace it rather than edit it. It offers GitHub's Latest release, or the newest pre-release while there is none, and that release's zip matching the `data-asset` pattern on its script tags (`MixedStorage-v.zip` with a numeric version, the name `build.ps1` gives it); with no usable answer the pages keep their links to the Latest release page. `node tests/test-site.mjs` checks this offline against a fake GitHub, and CI runs it. `docs/assets/split.js` mirrors `AllocationPlan.Capacities`, and `docs/assets/demo.js` mirrors the panel behavior and messages in `StorageView`, for the interactive demo, so update them if the rounding rules or messages ever change. The demo's styling is in `docs/assets/game-panel.css`. It uses self-hosted Noto Sans (SIL Open Font License, included in `docs/assets/fonts/`). `docs/assets/goods.js` lists every good a Folktails warehouse accepts: the `Box`-type goods in the game's Common and Folktails good collections (27, matching the in-game list), with ids and names from the game's `Blueprints.zip` and English localization. The warehouse capacities (30, 200, 1,200) and descriptions come from the same blueprints. The icons in `docs/assets/goods/` are the game's own goods textures, color-adjusted to match how the game draws them and exported at 40 and 60 px. Regenerate them if the game adds or changes goods. diff --git a/PRODUCT.md b/PRODUCT.md index 18f80b0..b04f8f6 100644 --- a/PRODUCT.md +++ b/PRODUCT.md @@ -47,8 +47,8 @@ models. One download covers single player and co-op. ## Capabilities and Constraints -- **Stack and hosting:** plain static HTML/CSS/JS in `site/` on `main`, no build step. GitHub Pages serves the - `gh-pages` branch; publish with `.\deploy-site.ps1` after the change is merged to `main`. +- **Stack and hosting:** plain static HTML/CSS/JS in `docs/` on `main`, no build step. GitHub Pages serves `main:/docs`, + so merging to `main` publishes. - **Contracts the site test enforces** (`node tests/test-site.mjs`, run in CI): the home and install pages keep a download button (`a.btn` whose text says Download) with `data-release-href="download"` and a fallback link to `/releases/latest`; elements marked `hidden` stay hidden under the stylesheets; `404.html` loads assets by absolute @@ -77,8 +77,8 @@ models. One download covers single player and co-op. ## Evidence on Hand -- Real in-game screenshots: `site/assets/panel.webp` (the Storage Allocation panel on a large warehouse), - `site/assets/world.webp` (a warehouse showing several goods), `site/assets/og.png`. +- Real in-game screenshots: `docs/assets/panel.webp` (the Storage Allocation panel on a large warehouse), + `docs/assets/world.webp` (a warehouse showing several goods), `docs/assets/og.png`. - The interactive replica of the panel (`demo.js`, `game-panel.css`) with all 27 goods a Folktails warehouse accepts. - Player reports of successful use of earlier builds (no quotes on hand; don't invent any). diff --git a/README.md b/README.md index ad24bed..fdf0250 100644 --- a/README.md +++ b/README.md @@ -114,10 +114,10 @@ The bundled multiplayer integration is built against the **[BeaverBuddies Stabil Players have reported successful use of earlier builds, and the **v0.5.8 layout, including the dev-mode panel, and the v0.5.7 storage visuals have been verified in game**; v1.0.0 through v1.2.0 leave both unchanged apart from v1.2.0's orange ring around Apply. The v1.0.0 to v1.2.0 changes (Copy settings, error messages, loading damaged saves, the Supply mode order, the panel's reason for an unavailable Apply, patch order, leaving mixed storage with a removed good or through the map editor's undo, and in v1.2.0 storing nothing and the Apply ring) have not been played in game yet. Automated allocation, geometry, native API, and optional multiplayer loading checks also pass, but these do not replace live gameplay testing. -See the [changelog](CHANGELOG.md) for version history and [developer notes](docs/DEVELOPMENT.md) for build instructions and technical details. +See the [changelog](CHANGELOG.md) for version history and [developer notes](DEVELOPMENT.md) for build instructions and technical details. ## License MIT. See [LICENSE](LICENSE). -The license covers this project's own source code, documentation and website. It does not cover Timberborn, its name or its artwork, which belong to Mechanistry, including the goods icons in `site/assets/goods/` (the game's own textures). The Noto Sans fonts in `site/assets/fonts/` keep their own SIL Open Font License (see `OFL.txt` there). +The license covers this project's own source code, documentation and website. It does not cover Timberborn, its name or its artwork, which belong to Mechanistry, including the goods icons in `docs/assets/goods/` (the game's own textures). The Noto Sans fonts in `docs/assets/fonts/` keep their own SIL Open Font License (see `OFL.txt` there). diff --git a/deploy-site.ps1 b/deploy-site.ps1 deleted file mode 100644 index 771e5ef..0000000 --- a/deploy-site.ps1 +++ /dev/null @@ -1,45 +0,0 @@ -param( - [string]$Remote = 'origin', - [switch]$DryRun -) -# Publishes the site/ folder to the gh-pages branch, which GitHub Pages serves. -# Run it after committing your site/ changes. Add -DryRun to preview without pushing. - -# Windows PowerShell 5.1 turns git's normal stderr progress text into errors under 'Stop', -# so git is run through a helper that checks its exit code instead. -function Invoke-Git { - $output = & git.exe @args 2>&1 | ForEach-Object { "$_" } - if ($LASTEXITCODE -ne 0) { throw ("git $($args -join ' ') failed:`n" + ($output -join "`n")) } - $output -} - -$site = Join-Path $PSScriptRoot 'site' -if (!(Test-Path -LiteralPath (Join-Path $site 'index.html'))) { throw "site\index.html not found in $PSScriptRoot" } - -$work = Join-Path ([IO.Path]::GetTempPath()) ('mixedstorage-pages-' + [guid]::NewGuid().ToString('N')) -$null = Invoke-Git -C $PSScriptRoot fetch $Remote gh-pages -$source = (Invoke-Git -C $PSScriptRoot rev-parse --short HEAD | Select-Object -First 1) -if (Invoke-Git -C $PSScriptRoot status --porcelain -- site) { Write-Warning 'site/ has uncommitted changes; they will be published anyway.' } - -$null = Invoke-Git -C $PSScriptRoot worktree add --detach $work "$Remote/gh-pages" -try { - # Replace the published files with the current contents of site/ (the worktree's .git file stays). - Get-ChildItem -LiteralPath $work -Force | Where-Object { $_.Name -ne '.git' } | Remove-Item -Recurse -Force -ErrorAction Stop - Copy-Item -Path (Join-Path $site '*') -Destination $work -Recurse -Force -ErrorAction Stop - Copy-Item -LiteralPath (Join-Path $site '.nojekyll') -Destination $work -Force -ErrorAction Stop - - $null = Invoke-Git -C $work add -A - $changes = @(Invoke-Git -C $work status --porcelain) - if ($changes.Count -eq 0) { Write-Output 'The website is already up to date; nothing to publish.'; return } - Write-Output 'Changes to publish:' - $changes | ForEach-Object { Write-Output " $_" } - if ($DryRun) { Write-Output 'Dry run: nothing was pushed.'; return } - - $null = Invoke-Git -C $work commit -q -m "Deploy website from main@$source" - Invoke-Git -C $work push $Remote HEAD:gh-pages | ForEach-Object { Write-Output $_ } - Write-Output 'Published. GitHub Pages usually updates within a minute: https://timbermods.github.io/MixedStorage/' -} -finally { - try { $null = Invoke-Git -C $PSScriptRoot worktree remove --force $work } catch { } - if (Test-Path -LiteralPath $work) { Remove-Item -LiteralPath $work -Recurse -Force -ErrorAction SilentlyContinue } -} diff --git a/site/.nojekyll b/docs/.nojekyll similarity index 100% rename from site/.nojekyll rename to docs/.nojekyll diff --git a/site/404.html b/docs/404.html similarity index 100% rename from site/404.html rename to docs/404.html diff --git a/site/assets/cabinet.js b/docs/assets/cabinet.js similarity index 100% rename from site/assets/cabinet.js rename to docs/assets/cabinet.js diff --git a/site/assets/demo.js b/docs/assets/demo.js similarity index 100% rename from site/assets/demo.js rename to docs/assets/demo.js diff --git a/site/assets/favicon.svg b/docs/assets/favicon.svg similarity index 100% rename from site/assets/favicon.svg rename to docs/assets/favicon.svg diff --git a/site/assets/fonts/OFL-Alegreya.txt b/docs/assets/fonts/OFL-Alegreya.txt similarity index 100% rename from site/assets/fonts/OFL-Alegreya.txt rename to docs/assets/fonts/OFL-Alegreya.txt diff --git a/site/assets/fonts/OFL.txt b/docs/assets/fonts/OFL.txt similarity index 100% rename from site/assets/fonts/OFL.txt rename to docs/assets/fonts/OFL.txt diff --git a/site/assets/fonts/alegreya-sc-latin-500.woff2 b/docs/assets/fonts/alegreya-sc-latin-500.woff2 similarity index 100% rename from site/assets/fonts/alegreya-sc-latin-500.woff2 rename to docs/assets/fonts/alegreya-sc-latin-500.woff2 diff --git a/site/assets/fonts/alegreya-sc-latin-700.woff2 b/docs/assets/fonts/alegreya-sc-latin-700.woff2 similarity index 100% rename from site/assets/fonts/alegreya-sc-latin-700.woff2 rename to docs/assets/fonts/alegreya-sc-latin-700.woff2 diff --git a/site/assets/fonts/noto-sans-latin-400.woff2 b/docs/assets/fonts/noto-sans-latin-400.woff2 similarity index 100% rename from site/assets/fonts/noto-sans-latin-400.woff2 rename to docs/assets/fonts/noto-sans-latin-400.woff2 diff --git a/site/assets/fonts/noto-sans-latin-700.woff2 b/docs/assets/fonts/noto-sans-latin-700.woff2 similarity index 100% rename from site/assets/fonts/noto-sans-latin-700.woff2 rename to docs/assets/fonts/noto-sans-latin-700.woff2 diff --git a/site/assets/game-panel.css b/docs/assets/game-panel.css similarity index 100% rename from site/assets/game-panel.css rename to docs/assets/game-panel.css diff --git a/site/assets/goods.js b/docs/assets/goods.js similarity index 100% rename from site/assets/goods.js rename to docs/assets/goods.js diff --git a/site/assets/goods/berries-40.png b/docs/assets/goods/berries-40.png similarity index 100% rename from site/assets/goods/berries-40.png rename to docs/assets/goods/berries-40.png diff --git a/site/assets/goods/berries-60.png b/docs/assets/goods/berries-60.png similarity index 100% rename from site/assets/goods/berries-60.png rename to docs/assets/goods/berries-60.png diff --git a/site/assets/goods/book-40.png b/docs/assets/goods/book-40.png similarity index 100% rename from site/assets/goods/book-40.png rename to docs/assets/goods/book-40.png diff --git a/site/assets/goods/book-60.png b/docs/assets/goods/book-60.png similarity index 100% rename from site/assets/goods/book-60.png rename to docs/assets/goods/book-60.png diff --git a/site/assets/goods/bot-chassis-40.png b/docs/assets/goods/bot-chassis-40.png similarity index 100% rename from site/assets/goods/bot-chassis-40.png rename to docs/assets/goods/bot-chassis-40.png diff --git a/site/assets/goods/bot-chassis-60.png b/docs/assets/goods/bot-chassis-60.png similarity index 100% rename from site/assets/goods/bot-chassis-60.png rename to docs/assets/goods/bot-chassis-60.png diff --git a/site/assets/goods/bot-head-40.png b/docs/assets/goods/bot-head-40.png similarity index 100% rename from site/assets/goods/bot-head-40.png rename to docs/assets/goods/bot-head-40.png diff --git a/site/assets/goods/bot-head-60.png b/docs/assets/goods/bot-head-60.png similarity index 100% rename from site/assets/goods/bot-head-60.png rename to docs/assets/goods/bot-head-60.png diff --git a/site/assets/goods/bot-limb-40.png b/docs/assets/goods/bot-limb-40.png similarity index 100% rename from site/assets/goods/bot-limb-40.png rename to docs/assets/goods/bot-limb-40.png diff --git a/site/assets/goods/bot-limb-60.png b/docs/assets/goods/bot-limb-60.png similarity index 100% rename from site/assets/goods/bot-limb-60.png rename to docs/assets/goods/bot-limb-60.png diff --git a/site/assets/goods/bread-40.png b/docs/assets/goods/bread-40.png similarity index 100% rename from site/assets/goods/bread-40.png rename to docs/assets/goods/bread-40.png diff --git a/site/assets/goods/bread-60.png b/docs/assets/goods/bread-60.png similarity index 100% rename from site/assets/goods/bread-60.png rename to docs/assets/goods/bread-60.png diff --git a/site/assets/goods/carrot-40.png b/docs/assets/goods/carrot-40.png similarity index 100% rename from site/assets/goods/carrot-40.png rename to docs/assets/goods/carrot-40.png diff --git a/site/assets/goods/carrot-60.png b/docs/assets/goods/carrot-60.png similarity index 100% rename from site/assets/goods/carrot-60.png rename to docs/assets/goods/carrot-60.png diff --git a/site/assets/goods/cattail-cracker-40.png b/docs/assets/goods/cattail-cracker-40.png similarity index 100% rename from site/assets/goods/cattail-cracker-40.png rename to docs/assets/goods/cattail-cracker-40.png diff --git a/site/assets/goods/cattail-cracker-60.png b/docs/assets/goods/cattail-cracker-60.png similarity index 100% rename from site/assets/goods/cattail-cracker-60.png rename to docs/assets/goods/cattail-cracker-60.png diff --git a/site/assets/goods/cattail-flour-40.png b/docs/assets/goods/cattail-flour-40.png similarity index 100% rename from site/assets/goods/cattail-flour-40.png rename to docs/assets/goods/cattail-flour-40.png diff --git a/site/assets/goods/cattail-flour-60.png b/docs/assets/goods/cattail-flour-60.png similarity index 100% rename from site/assets/goods/cattail-flour-60.png rename to docs/assets/goods/cattail-flour-60.png diff --git a/site/assets/goods/cattail-root-40.png b/docs/assets/goods/cattail-root-40.png similarity index 100% rename from site/assets/goods/cattail-root-40.png rename to docs/assets/goods/cattail-root-40.png diff --git a/site/assets/goods/cattail-root-60.png b/docs/assets/goods/cattail-root-60.png similarity index 100% rename from site/assets/goods/cattail-root-60.png rename to docs/assets/goods/cattail-root-60.png diff --git a/site/assets/goods/chestnut-40.png b/docs/assets/goods/chestnut-40.png similarity index 100% rename from site/assets/goods/chestnut-40.png rename to docs/assets/goods/chestnut-40.png diff --git a/site/assets/goods/chestnut-60.png b/docs/assets/goods/chestnut-60.png similarity index 100% rename from site/assets/goods/chestnut-60.png rename to docs/assets/goods/chestnut-60.png diff --git a/site/assets/goods/dandelion-40.png b/docs/assets/goods/dandelion-40.png similarity index 100% rename from site/assets/goods/dandelion-40.png rename to docs/assets/goods/dandelion-40.png diff --git a/site/assets/goods/dandelion-60.png b/docs/assets/goods/dandelion-60.png similarity index 100% rename from site/assets/goods/dandelion-60.png rename to docs/assets/goods/dandelion-60.png diff --git a/site/assets/goods/explosives-40.png b/docs/assets/goods/explosives-40.png similarity index 100% rename from site/assets/goods/explosives-40.png rename to docs/assets/goods/explosives-40.png diff --git a/site/assets/goods/explosives-60.png b/docs/assets/goods/explosives-60.png similarity index 100% rename from site/assets/goods/explosives-60.png rename to docs/assets/goods/explosives-60.png diff --git a/site/assets/goods/fireworks-40.png b/docs/assets/goods/fireworks-40.png similarity index 100% rename from site/assets/goods/fireworks-40.png rename to docs/assets/goods/fireworks-40.png diff --git a/site/assets/goods/fireworks-60.png b/docs/assets/goods/fireworks-60.png similarity index 100% rename from site/assets/goods/fireworks-60.png rename to docs/assets/goods/fireworks-60.png diff --git a/site/assets/goods/gear-40.png b/docs/assets/goods/gear-40.png similarity index 100% rename from site/assets/goods/gear-40.png rename to docs/assets/goods/gear-40.png diff --git a/site/assets/goods/gear-60.png b/docs/assets/goods/gear-60.png similarity index 100% rename from site/assets/goods/gear-60.png rename to docs/assets/goods/gear-60.png diff --git a/site/assets/goods/grilled-chestnut-40.png b/docs/assets/goods/grilled-chestnut-40.png similarity index 100% rename from site/assets/goods/grilled-chestnut-40.png rename to docs/assets/goods/grilled-chestnut-40.png diff --git a/site/assets/goods/grilled-chestnut-60.png b/docs/assets/goods/grilled-chestnut-60.png similarity index 100% rename from site/assets/goods/grilled-chestnut-60.png rename to docs/assets/goods/grilled-chestnut-60.png diff --git a/site/assets/goods/grilled-potato-40.png b/docs/assets/goods/grilled-potato-40.png similarity index 100% rename from site/assets/goods/grilled-potato-40.png rename to docs/assets/goods/grilled-potato-40.png diff --git a/site/assets/goods/grilled-potato-60.png b/docs/assets/goods/grilled-potato-60.png similarity index 100% rename from site/assets/goods/grilled-potato-60.png rename to docs/assets/goods/grilled-potato-60.png diff --git a/site/assets/goods/grilled-spadderdock-40.png b/docs/assets/goods/grilled-spadderdock-40.png similarity index 100% rename from site/assets/goods/grilled-spadderdock-40.png rename to docs/assets/goods/grilled-spadderdock-40.png diff --git a/site/assets/goods/grilled-spadderdock-60.png b/docs/assets/goods/grilled-spadderdock-60.png similarity index 100% rename from site/assets/goods/grilled-spadderdock-60.png rename to docs/assets/goods/grilled-spadderdock-60.png diff --git a/site/assets/goods/maple-pastry-40.png b/docs/assets/goods/maple-pastry-40.png similarity index 100% rename from site/assets/goods/maple-pastry-40.png rename to docs/assets/goods/maple-pastry-40.png diff --git a/site/assets/goods/maple-pastry-60.png b/docs/assets/goods/maple-pastry-60.png similarity index 100% rename from site/assets/goods/maple-pastry-60.png rename to docs/assets/goods/maple-pastry-60.png diff --git a/site/assets/goods/paper-40.png b/docs/assets/goods/paper-40.png similarity index 100% rename from site/assets/goods/paper-40.png rename to docs/assets/goods/paper-40.png diff --git a/site/assets/goods/paper-60.png b/docs/assets/goods/paper-60.png similarity index 100% rename from site/assets/goods/paper-60.png rename to docs/assets/goods/paper-60.png diff --git a/site/assets/goods/pine-resin-40.png b/docs/assets/goods/pine-resin-40.png similarity index 100% rename from site/assets/goods/pine-resin-40.png rename to docs/assets/goods/pine-resin-40.png diff --git a/site/assets/goods/pine-resin-60.png b/docs/assets/goods/pine-resin-60.png similarity index 100% rename from site/assets/goods/pine-resin-60.png rename to docs/assets/goods/pine-resin-60.png diff --git a/site/assets/goods/potato-40.png b/docs/assets/goods/potato-40.png similarity index 100% rename from site/assets/goods/potato-40.png rename to docs/assets/goods/potato-40.png diff --git a/site/assets/goods/potato-60.png b/docs/assets/goods/potato-60.png similarity index 100% rename from site/assets/goods/potato-60.png rename to docs/assets/goods/potato-60.png diff --git a/site/assets/goods/punch-card-40.png b/docs/assets/goods/punch-card-40.png similarity index 100% rename from site/assets/goods/punch-card-40.png rename to docs/assets/goods/punch-card-40.png diff --git a/site/assets/goods/punch-card-60.png b/docs/assets/goods/punch-card-60.png similarity index 100% rename from site/assets/goods/punch-card-60.png rename to docs/assets/goods/punch-card-60.png diff --git a/site/assets/goods/spadderdock-40.png b/docs/assets/goods/spadderdock-40.png similarity index 100% rename from site/assets/goods/spadderdock-40.png rename to docs/assets/goods/spadderdock-40.png diff --git a/site/assets/goods/spadderdock-60.png b/docs/assets/goods/spadderdock-60.png similarity index 100% rename from site/assets/goods/spadderdock-60.png rename to docs/assets/goods/spadderdock-60.png diff --git a/site/assets/goods/sunflower-seeds-40.png b/docs/assets/goods/sunflower-seeds-40.png similarity index 100% rename from site/assets/goods/sunflower-seeds-40.png rename to docs/assets/goods/sunflower-seeds-40.png diff --git a/site/assets/goods/sunflower-seeds-60.png b/docs/assets/goods/sunflower-seeds-60.png similarity index 100% rename from site/assets/goods/sunflower-seeds-60.png rename to docs/assets/goods/sunflower-seeds-60.png diff --git a/site/assets/goods/wheat-40.png b/docs/assets/goods/wheat-40.png similarity index 100% rename from site/assets/goods/wheat-40.png rename to docs/assets/goods/wheat-40.png diff --git a/site/assets/goods/wheat-60.png b/docs/assets/goods/wheat-60.png similarity index 100% rename from site/assets/goods/wheat-60.png rename to docs/assets/goods/wheat-60.png diff --git a/site/assets/goods/wheat-flour-40.png b/docs/assets/goods/wheat-flour-40.png similarity index 100% rename from site/assets/goods/wheat-flour-40.png rename to docs/assets/goods/wheat-flour-40.png diff --git a/site/assets/goods/wheat-flour-60.png b/docs/assets/goods/wheat-flour-60.png similarity index 100% rename from site/assets/goods/wheat-flour-60.png rename to docs/assets/goods/wheat-flour-60.png diff --git a/site/assets/og.png b/docs/assets/og.png similarity index 100% rename from site/assets/og.png rename to docs/assets/og.png diff --git a/site/assets/panel.webp b/docs/assets/panel.webp similarity index 100% rename from site/assets/panel.webp rename to docs/assets/panel.webp diff --git a/site/assets/panel.webp.json b/docs/assets/panel.webp.json similarity index 100% rename from site/assets/panel.webp.json rename to docs/assets/panel.webp.json diff --git a/site/assets/release.js b/docs/assets/release.js similarity index 100% rename from site/assets/release.js rename to docs/assets/release.js diff --git a/site/assets/site.js b/docs/assets/site.js similarity index 100% rename from site/assets/site.js rename to docs/assets/site.js diff --git a/site/assets/split.js b/docs/assets/split.js similarity index 100% rename from site/assets/split.js rename to docs/assets/split.js diff --git a/site/assets/style.css b/docs/assets/style.css similarity index 100% rename from site/assets/style.css rename to docs/assets/style.css diff --git a/site/assets/textures/brass.webp b/docs/assets/textures/brass.webp similarity index 100% rename from site/assets/textures/brass.webp rename to docs/assets/textures/brass.webp diff --git a/site/assets/textures/brass.webp.json b/docs/assets/textures/brass.webp.json similarity index 100% rename from site/assets/textures/brass.webp.json rename to docs/assets/textures/brass.webp.json diff --git a/site/assets/textures/holder.png b/docs/assets/textures/holder.png similarity index 100% rename from site/assets/textures/holder.png rename to docs/assets/textures/holder.png diff --git a/site/assets/textures/kraft.webp b/docs/assets/textures/kraft.webp similarity index 100% rename from site/assets/textures/kraft.webp rename to docs/assets/textures/kraft.webp diff --git a/site/assets/textures/kraft.webp.json b/docs/assets/textures/kraft.webp.json similarity index 100% rename from site/assets/textures/kraft.webp.json rename to docs/assets/textures/kraft.webp.json diff --git a/site/assets/textures/make_textures.py b/docs/assets/textures/make_textures.py similarity index 100% rename from site/assets/textures/make_textures.py rename to docs/assets/textures/make_textures.py diff --git a/site/assets/textures/pull.png b/docs/assets/textures/pull.png similarity index 100% rename from site/assets/textures/pull.png rename to docs/assets/textures/pull.png diff --git a/site/assets/textures/walnut.webp b/docs/assets/textures/walnut.webp similarity index 100% rename from site/assets/textures/walnut.webp rename to docs/assets/textures/walnut.webp diff --git a/site/assets/textures/walnut.webp.json b/docs/assets/textures/walnut.webp.json similarity index 100% rename from site/assets/textures/walnut.webp.json rename to docs/assets/textures/walnut.webp.json diff --git a/site/assets/world.webp b/docs/assets/world.webp similarity index 100% rename from site/assets/world.webp rename to docs/assets/world.webp diff --git a/site/assets/world.webp.json b/docs/assets/world.webp.json similarity index 100% rename from site/assets/world.webp.json rename to docs/assets/world.webp.json diff --git a/site/faq.html b/docs/faq.html similarity index 100% rename from site/faq.html rename to docs/faq.html diff --git a/site/index.html b/docs/index.html similarity index 99% rename from site/index.html rename to docs/index.html index 7215cbf..9e9b7bd 100644 --- a/site/index.html +++ b/docs/index.html @@ -63,7 +63,7 @@

MixedStorage

One warehouse or pile, several kinds of goods: you give each one a share of the space, by percentage.

Percentages reserve space. They don't create goods or fill the building; your haulers bring stock by the game's usual rules.

    @@ -284,7 +284,7 @@

    What's been played

    Ready to mix things up?

    One download covers single player and co-op.

    diff --git a/site/install.html b/docs/install.html similarity index 98% rename from site/install.html rename to docs/install.html index e218830..192eecd 100644 --- a/site/install.html +++ b/docs/install.html @@ -65,8 +65,8 @@

    Step by step

    1. Download the ZIP

      -

      Open the latest release and, under Assets, choose MixedStorage-vX.Y.Z.zip (X.Y.Z is the version number). Don't pick Source code.

      -

      Download the mod

      +

      Open the latest release and, under Assets, choose MixedStorage-v1.2.0.zip. Don't pick Source code.

      +

      Download v1.2.0

    2. Close Timberborn and extract

      diff --git a/site/robots.txt b/docs/robots.txt similarity index 100% rename from site/robots.txt rename to docs/robots.txt diff --git a/site/sitemap.xml b/docs/sitemap.xml similarity index 100% rename from site/sitemap.xml rename to docs/sitemap.xml diff --git a/site/troubleshooting.html b/docs/troubleshooting.html similarity index 100% rename from site/troubleshooting.html rename to docs/troubleshooting.html diff --git a/tests/test-site.mjs b/tests/test-site.mjs index dec4b8c..3d9a9bc 100644 --- a/tests/test-site.mjs +++ b/tests/test-site.mjs @@ -1,12 +1,12 @@ #!/usr/bin/env node /* - * Offline checks for the website's download buttons (site/). No network and no packages: each page in site/ is + * Offline checks for the website's download buttons (docs/). No network and no packages: each page in docs/ is * parsed into a small stub DOM, the page's release scripts (assets/site.js and assets/release.js; the interactive * demo's scripts are not run) run in a vm against it, and fetch answers like GitHub's API from a fixed list of releases. * * The rule every timbermods site follows: offer GitHub's Latest release (the newest one that is not a draft or a * pre-release), and only when there is none, the newest pre-release, and download that release's - * MixedStorage-vX.Y.Z.zip, never another .zip attached to it. With no usable answer a page keeps the links and text it + * MixedStorage-v.zip, never another .zip attached to it. With no usable answer a page keeps the links and text it * was written with, and its download buttons lead to the Latest release page. What is on screen follows the page's * own stylesheets where they set `display` with a simple selector, because a class rule that sets `display` also * shows an element marked `hidden`. @@ -21,7 +21,7 @@ import { fileURLToPath } from 'node:url'; import vm from 'node:vm'; const root = path.resolve(process.argv[2] || path.join(path.dirname(fileURLToPath(import.meta.url)), '..')); -const site = path.join(root, 'site'); +const site = path.join(root, 'docs'); const REPO = 'timbermods/MixedStorage'; const RELEASES = `https://github.com/${REPO}/releases`; const RELEASE_SCRIPTS = ['assets/site.js', 'assets/release.js']; @@ -318,6 +318,8 @@ function check(ok, what, detail) { const written = new Map(pages.map((page) => [page, new Document(page)])); const buttonsOf = (docs) => [...docs.values()].flatMap((d) => downloadButtons(d).map((a) => ({ href: a.href, text: buttonText(d, a) }))); const writtenButtons = buttonsOf(written); +// The zip name the install guide was written with (its release.js fallback; the Latest-release workflow keeps it current). +const writtenZip = (readFileSync(path.join(site, 'install.html'), 'utf8').match(/data-release="asset-name"[^>]*>([^<]+) href); const buttonCount = writtenButtons.length; check(['index.html', 'install.html'].every((page) => written.has(page) && downloadButtons(written.get(page)).length > 0), @@ -408,7 +410,7 @@ for (const scenario of scenarios) { const changed = buttons.filter((b, i) => b.text !== writtenButtons[i].text).map((b) => `"${b.text}"`); check(changed.length === 0, `${scenario.name}: the download buttons keep the text they were written with`, [...new Set(changed)].join(', ')); check(labels.length === 0, `${scenario.name}: no release label is shown`, `got ${JSON.stringify(labels)}`); - check(install.includes('MixedStorage-vX.Y.Z.zip') && otherZips.length === 0, `${scenario.name}: the install guide keeps its placeholder file name`, + check(install.includes(writtenZip) && otherZips.filter((name) => name !== writtenZip).length === 0, `${scenario.name}: the install guide keeps the file name it was written with (${writtenZip})`, otherZips.join(', ')); const hrefs = links.map(([, href]) => href); check(hrefs.join('|') === writtenLinks.join('|'), `${scenario.name}: no page links to a release it was not written with`,