diff --git a/content/community-poi/de/hafengebaeude.md b/content/community-poi/de/hafengebaeude.md index 0e4286de..ae13734d 100644 --- a/content/community-poi/de/hafengebaeude.md +++ b/content/community-poi/de/hafengebaeude.md @@ -8,30 +8,45 @@ progress: 0 category: 'community' forumUrl: 'https://discord.com/channels/752527676903784518/1192098359452909678' goal: 'Großes Hafengebäude mit Anlegestellen, Lagerhallen und Steg – als belebter Knotenpunkt für Schiffsverkehr und Handel.' -currentState: 'Konzept steht, der Bau wurde noch nicht gestartet. Die Schematic ist als verbindliche Vorlage gedacht.' +currentState: 'Konzept und Schematic stehen, der Standort ist abgesteckt – gebaut wurde noch nichts. Die Litematica-Vorschau zeigt, wie das Gebäude in der Bucht sitzen wird.' location: 'Welt – siehe Koordinaten' coordinates: - x: -660 - y: 44 - z: -320 + x: -574 + y: 9 + z: -239 dimension: 'overworld' builders: - name: 'B3nNy' mcName: 'B3nNy' +thumbnail: '/images/community-poi/hafengebaeude/litematica_day.png' +thumbnailAlt: 'Litematica-Vorschau des Hafengebäudes als blaues Hologramm über dem noch leeren Bauplatz' +gallery: + - src: '/images/community-poi/hafengebaeude/litematica_day.png' + alt: 'Blaues Litematica-Hologramm des Hafengebäudes über der Bucht, daneben das planierte Baufeld' + caption: 'Die Schematic als Hologramm über dem Bauplatz – so soll der Dockhafen stehen' + - src: '/images/community-poi/hafengebaeude/litematica_sunset.png' + alt: 'Dasselbe Hologramm im Abendlicht, die Umrisse des geplanten Dachs zeichnen sich gegen den Sonnenuntergang ab' + caption: 'Abendstimmung am künftigen Hafenbecken' + - src: '/images/community-poi/hafengebaeude/reference_exterior.png' + alt: 'Fünf gerenderte Außenansichten eines hölzernen Dockgebäudes auf Stelzen im Wasser – fremde Bauvorlage, nicht auf unserem Server' + caption: 'Vorbild (fremder Bau): Außenansichten der Dockhalle, an denen sich die Schematic orientiert' + - src: '/images/community-poi/hafengebaeude/reference_details.png' + alt: 'Acht gerenderte Detailansichten desselben Dockgebäudes mit Ranken und Innenräumen – fremde Bauvorlage, nicht auf unserem Server' + caption: 'Vorbild (fremder Bau): Detail- und Innenansichten als Referenz für die Ausgestaltung' schematics: - url: '/community-poi/hafengebaeude/dockhafen.litematic' name: 'Dockhafen' format: 'litematic' version: '1.20.4' litematicaVersion: '0.16.0' - sizeLabel: 'ca. 190 KB' + sizeLabel: 'ca. 359 KB' origin: - x: -660 - y: 44 - z: -320 + x: -574 + y: 9 + z: -239 rotation: 'none' - setupNotes: 'Origin laut Builder: -660 / 44 / -320, keine Rotation.' -updatedAt: '2026-05-20' + setupNotes: 'Aktualisierte Schematic (Stand 09/2026). Origin auf den neuen Standort -574 / 9 / -239 gesetzt, keine Rotation – vor dem Setzen bitte gegen die Markierung vor Ort prüfen.' +updatedAt: '2026-09-07' alternates: - hreflang: 'de' href: 'https://onelitefeather.net/de/community-poi/hafengebaeude' @@ -43,8 +58,18 @@ alternates: ## Worum geht's? -Das Hafengebäude ist B3nNys nächstes geplantes Projekt – aktuell nur Konzept und Schematic, der Spatenstich folgt. Vorlagen-Größe und Position stehen, jetzt geht's an die Bauplanung. +Das Hafengebäude ist B3nNys nächstes Projekt: eine überdachte Dockhalle auf Stelzen, die weit ins Wasser hinausreicht. Gebaut ist noch nichts – was es gibt, ist die fertige Schematic und ein abgesteckter Platz in der Bucht. + +Die ersten beiden Bilder zeigen genau diesen Zwischenstand: Das blaue Hologramm ist die Litematica-Vorschau der Schematic, eingeblendet über dem noch leeren Bauplatz. So lässt sich schon vor dem ersten Block beurteilen, wie das Gebäude in der Landschaft sitzt und wie weit es über das Ufer hinausragt. + +## Woran sich der Bau orientiert + +Die beiden Referenzbilder in der Galerie stammen **nicht** von unserem Server – es sind Renders des Baus, an dem sich die Schematic orientiert. Sie zeigen, worauf es beim Ausbau ankommt: das geschwungene Dach, die Stelzenkonstruktion im flachen Wasser und die Innenräume mit Stegen und Lagerflächen. ## Wie kannst du mithelfen? -Materialfarming, Detail-Vorschläge für Lagerhallen und Anlegestellen oder einfach Feedback zum Konzept – melde dich bei B3nNy auf Discord. +- Materialfarming für Holz, Stützen und Dachdeckung +- Vorschläge für Lagerhallen und Anlegestellen im Inneren +- Feedback zur Platzierung, bevor der erste Block gesetzt wird + +Melde dich dafür bei B3nNy auf Discord. diff --git a/content/community-poi/de/labyrinth.md b/content/community-poi/de/labyrinth.md index d0e359b0..4261b0d2 100644 --- a/content/community-poi/de/labyrinth.md +++ b/content/community-poi/de/labyrinth.md @@ -11,9 +11,9 @@ goal: 'Fertiges, begehbares Labyrinth mit klarem Eingang, mehreren Sackgassen un currentState: 'Etwa 40 % des Baus stehen. Außenmauern und das innere Wegenetz sind vorhanden, mehrere Gänge fehlen noch.' location: 'Welt – siehe Koordinaten' coordinates: - x: -2209 - y: 61 - z: 35 + x: -2234 + y: 85 + z: 33 dimension: 'overworld' builders: - name: 'B3nNy' @@ -48,6 +48,15 @@ gallery: - src: '/community-poi/labyrinth/result.webp' alt: 'Render der angedachten finalen Form des Labyrinths' caption: 'Zielzustand – fertiges Labyrinth' + - src: '/images/community-poi/labyrinth/progress_inner_walls.png' + alt: 'Blick aus der Tiefe zwischen zwei massiven Steinmauern des Labyrinths, eine rote Markierungslinie zieht sich am Rand entlang' + caption: 'Von unten zwischen den Wänden: die Markierung zeigt den nächsten Bauabschnitt' + - src: '/images/community-poi/labyrinth/progress_night_overview.png' + alt: 'Nächtliche Gesamtansicht der runden Labyrinth-Anlage, umschlossen von der cyanfarbenen Litematica-Box' + caption: 'Nachtansicht mit Litematica-Rahmen um die gesamte Anlage' + - src: '/images/community-poi/labyrinth/progress_aerial.png' + alt: 'Luftbild der kreisrunden Anlage mit rot-grauem Bodenmuster, den Speichenwegen und dem Labyrinthkern in der Mitte' + caption: 'Aus der Luft: Bodenmuster, Zugangswege und der Kern in der Mitte' schematics: - url: '/community-poi/labyrinth/labyrinth.schem' name: 'Labyrinth (WorldEdit-Schematic)' @@ -62,7 +71,7 @@ schematics: setupNotes: | Origin laut Builder: -1465 / 61 / 792, Rotation CW_180. Die Datei ist eine WorldEdit .schem – per //schem load labyrinth in WorldEdit laden oder in Litematica über 'Schematic placement' importieren. -updatedAt: '2026-04-26' +updatedAt: '2026-09-07' alternates: - hreflang: 'de' href: 'https://onelitefeather.net/de/community-poi/labyrinth' diff --git a/content/community-poi/de/megabase.md b/content/community-poi/de/megabase.md new file mode 100644 index 00000000..90752f55 --- /dev/null +++ b/content/community-poi/de/megabase.md @@ -0,0 +1,70 @@ +--- +slug: 'megabase' +translationKey: 'megabase' +title: 'Megabase' +summary: 'B3nNys größtes Bauvorhaben: Ein Areal von mehreren hundert Blöcken Kantenlänge ist ausgehoben und abgesteckt, die Schematic für den Aufbau liegt bereit.' +status: 'in-progress' +progress: 5 +category: 'community' +goal: 'Ein Bauwerk in einer Größenordnung, für die das vorbereitete Fundament die Grundfläche vorgibt – geplant als Landmarke, die man schon aus der Ferne sieht.' +currentState: 'Die Erdarbeiten sind durch: Das Gelände ist auf Höhe gebracht, die Grundfläche als V-förmiges Fundament aus dunklem Stein angelegt. Oberirdisch steht noch nichts.' +location: 'Welt – siehe Koordinaten' +coordinates: + x: 2563 + y: 56 + z: 20850 + dimension: 'overworld' +builders: + - name: 'B3nNy' + mcName: 'B3nNy' +thumbnail: '/images/community-poi/megabase/site_overview.png' +thumbnailAlt: 'Luftbild des ausgehobenen Megabase-Areals, ein riesiges V-förmiges Fundament im Gelände' +gallery: + - src: '/images/community-poi/megabase/site_overview.png' + alt: 'Weites Luftbild des Baufelds: ein enormes V-förmiges Fundament aus dunklem Stein, daneben der cyanfarbene Litematica-Umriss' + caption: 'Das abgesteckte Areal aus großer Höhe – rechts der Litematica-Umriss des geplanten Baus' + - src: '/images/community-poi/megabase/reference_uncensored_library.jpg' + alt: 'Luftansicht der Uncensored Library, eines weißen Bibliothekskomplexes mit Kuppel und Gartenanlagen – fremder Bau, nicht auf unserem Server' + caption: 'Vorbild (fremder Bau): „The Uncensored Library“ von BlockWorks für Reporter ohne Grenzen – dient hier nur als Maßstab und Stilreferenz' +schematics: + - url: '/community-poi/megabase/megabase.litematic' + name: 'Megabase' + format: 'litematic' + version: '1.20.4' + sizeLabel: 'ca. 4,1 MB' + origin: + x: 2563 + y: 56 + z: 20850 + rotation: 'none' + setupNotes: 'Origin und Rotation vom BlueMap-Standort übernommen und noch nicht vor Ort gegengeprüft – vor dem Setzen bitte gegen die Markierung im Gelände abgleichen.' +updatedAt: '2026-09-07' +acceptsContributions: true +alternates: + - hreflang: 'de' + href: 'https://onelitefeather.net/de/community-poi/megabase' + - hreflang: 'en' + href: 'https://onelitefeather.net/en/community-poi/megabase' + - hreflang: 'x-default' + href: 'https://onelitefeather.net/en/community-poi/megabase' +--- + +## Worum geht's? + +Die Megabase ist B3nNys größtes Vorhaben und unterscheidet sich von den anderen Projekten vor allem durch den Maßstab. Wo Labyrinth und Hafen jeweils ein Bauwerk sind, geht es hier um eine Fläche, die man aus normaler Spielhöhe gar nicht mehr überblickt – das Übersichtsbild ist weit außerhalb der Renderdistanz aufgenommen. + +Der Aushub ist abgeschlossen. Das Gelände wurde auf eine einheitliche Höhe gebracht und die Grundfläche als V-förmiges Fundament aus dunklem Stein angelegt; daneben steht der Litematica-Umriss dessen, was darauf entstehen soll. Oberirdisch ist noch kein Block gesetzt. + +Zur Einordnung liegt in der Galerie ein Bild der „Uncensored Library“ – nicht als Vorlage, sondern als Größenvergleich: ein bekanntes Bauwerk, an dem sich abschätzen lässt, in welcher Liga das hier spielt. + +## Was dort schon zu sehen ist + +- Das ausgehobene Areal mit dem V-förmigen Fundament +- Die abgesteckte Grundfläche, an der die Ausrichtung des Baus ablesbar ist +- Der Litematica-Umriss neben dem Fundament, der den geplanten Aufbau zeigt + +## Wie kannst du mithelfen? + +Bei einem Bau dieser Größe ist Material der Engpass, nicht die Idee. Wer mitmachen will, meldet sich am besten direkt bei B3nNy auf Discord – dort wird auch abgestimmt, welche Abschnitte als Nächstes drankommen. + +Zum Mitverfolgen: Lade dir die Schematic und lege sie im Spiel als Hologramm über das Fundament. Litematica bitte ausschließlich zur Ansicht verwenden, **kein Auto-Place** (siehe Serverregel unten). diff --git a/content/community-poi/en/harbour-building.md b/content/community-poi/en/harbour-building.md index 25133cd8..07567c9e 100644 --- a/content/community-poi/en/harbour-building.md +++ b/content/community-poi/en/harbour-building.md @@ -11,27 +11,42 @@ goal: 'A large harbour building with piers, warehouses and a jetty — a lively currentState: 'Concept is set, construction has not started yet. The schematic acts as the binding blueprint.' location: 'Overworld — see coordinates' coordinates: - x: -660 - y: 44 - z: -320 + x: -574 + y: 9 + z: -239 dimension: 'overworld' builders: - name: 'B3nNy' mcName: 'B3nNy' +thumbnail: '/images/community-poi/hafengebaeude/litematica_day.png' +thumbnailAlt: 'Litematica preview of the harbour building as a blue hologram above the still-empty site' +gallery: + - src: '/images/community-poi/hafengebaeude/litematica_day.png' + alt: 'Blue Litematica hologram of the harbour building over the bay, with the levelled build site beside it' + caption: 'The schematic as a hologram above the site — this is where the dock will stand' + - src: '/images/community-poi/hafengebaeude/litematica_sunset.png' + alt: 'The same hologram at dusk, the outline of the planned roof against the sunset' + caption: 'Evening light over the future harbour basin' + - src: '/images/community-poi/hafengebaeude/reference_exterior.png' + alt: 'Five rendered exterior views of a wooden dock building on stilts — an external reference build, not on our server' + caption: 'Reference — not our build: exterior views the schematic is modelled on' + - src: '/images/community-poi/hafengebaeude/reference_details.png' + alt: 'Eight rendered detail views of the same dock building with vines and interiors — an external reference build, not on our server' + caption: 'Reference — not our build: detail and interior shots guiding the finish' schematics: - url: '/community-poi/hafengebaeude/dockhafen.litematic' name: 'Dockhafen' format: 'litematic' version: '1.20.4' litematicaVersion: '0.16.0' - sizeLabel: 'approx. 190 KB' + sizeLabel: 'approx. 359 KB' origin: - x: -660 - y: 44 - z: -320 + x: -574 + y: 9 + z: -239 rotation: 'none' - setupNotes: 'Origin as provided by the builder: -660 / 44 / -320, no rotation.' -updatedAt: '2026-05-20' + setupNotes: 'Updated schematic (as of 09/2026). Origin set to the new location -574 / 9 / -239, no rotation — check against the marker on site before pasting.' +updatedAt: '2026-09-07' alternates: - hreflang: 'de' href: 'https://onelitefeather.net/de/community-poi/hafengebaeude' @@ -41,10 +56,20 @@ alternates: href: 'https://onelitefeather.net/en/community-poi/harbour-building' --- -## What is this? +## What is it? -The harbour is B3nNy's next planned build — concept and schematic only, the first block is yet to be placed. Footprint and position are locked in, planning continues. +The harbour building is B3nNy's next project: a covered dock hall on stilts reaching well out over the water. Nothing has been built yet — what exists is a finished schematic and a marked-out spot in the bay. + +The first two images show exactly that stage: the blue hologram is the Litematica preview of the schematic, projected over the still-empty site. It lets you judge how the building will sit in the landscape, and how far it will reach past the shoreline, before a single block goes down. + +## What the build is modelled on + +The two reference images in the gallery are **not** from our server — they are renders of the build the schematic follows. They show what matters for the finish: the curved roof, the stilt construction in shallow water, and the interior with its walkways and storage areas. ## How can you help? -Material farming, detail ideas for warehouses and piers, or feedback on the concept — reach out to B3nNy on Discord. +- Farming materials for timber, supports and roofing +- Ideas for the warehouses and berths inside +- Feedback on the placement before the first block goes down + +Get in touch with B3nNy on Discord. diff --git a/content/community-poi/en/maze.md b/content/community-poi/en/maze.md index ada01850..3fb40685 100644 --- a/content/community-poi/en/maze.md +++ b/content/community-poi/en/maze.md @@ -11,9 +11,9 @@ goal: 'A finished, walkable maze with a clear entrance, several dead ends and a currentState: 'Around 40 % of the build is done. The outer walls and the inner path network exist; several corridors are still missing.' location: 'Overworld — see coordinates' coordinates: - x: -2209 - y: 61 - z: 35 + x: -2234 + y: 85 + z: 33 dimension: 'overworld' builders: - name: 'B3nNy' @@ -48,6 +48,15 @@ gallery: - src: '/community-poi/labyrinth/result.webp' alt: 'Render of the planned final shape of the maze' caption: 'Target state — finished maze' + - src: '/images/community-poi/labyrinth/progress_inner_walls.png' + alt: 'View from below between two massive stone walls of the maze, a red marker line running along the edge' + caption: 'Down between the walls — the marker shows the next section to build' + - src: '/images/community-poi/labyrinth/progress_night_overview.png' + alt: 'Night-time overview of the circular maze, enclosed by the cyan Litematica bounding box' + caption: 'Night view with the Litematica frame around the whole structure' + - src: '/images/community-poi/labyrinth/progress_aerial.png' + alt: 'Aerial view of the circular structure with its red and grey floor pattern, spoke paths and the maze core at the centre' + caption: 'From above: floor pattern, access paths and the core at the centre' schematics: - url: '/community-poi/labyrinth/labyrinth.schem' name: 'Maze (WorldEdit schematic)' @@ -62,7 +71,7 @@ schematics: setupNotes: | Origin as provided by the builder: -1465 / 61 / 792, rotation CW_180. The file is a WorldEdit .schem — load via //schem load labyrinth in WorldEdit, or import it into Litematica via 'Schematic placement'. -updatedAt: '2026-04-26' +updatedAt: '2026-09-07' alternates: - hreflang: 'de' href: 'https://onelitefeather.net/de/community-poi/labyrinth' diff --git a/content/community-poi/en/megabase.md b/content/community-poi/en/megabase.md new file mode 100644 index 00000000..0ea1e3ce --- /dev/null +++ b/content/community-poi/en/megabase.md @@ -0,0 +1,70 @@ +--- +slug: 'megabase' +translationKey: 'megabase' +title: 'Megabase' +summary: 'The largest undertaking by B3nNy: a site several hundred blocks across has been excavated and marked out, and the schematic for the build is ready.' +status: 'in-progress' +progress: 5 +category: 'community' +goal: 'A structure on the scale the prepared foundation sets out — planned as a landmark visible from a long way off.' +currentState: 'Groundwork is done: the terrain has been levelled and the footprint laid out as a V-shaped foundation of dark stone. Nothing stands above ground yet.' +location: 'Overworld — see coordinates' +coordinates: + x: 2563 + y: 56 + z: 20850 + dimension: 'overworld' +builders: + - name: 'B3nNy' + mcName: 'B3nNy' +thumbnail: '/images/community-poi/megabase/site_overview.png' +thumbnailAlt: 'Aerial view of the excavated megabase site, an enormous V-shaped foundation cut into the terrain' +gallery: + - src: '/images/community-poi/megabase/site_overview.png' + alt: 'Wide aerial shot of the build site: an enormous V-shaped foundation of dark stone, with the cyan Litematica outline beside it' + caption: 'The marked-out site from high above — the Litematica outline of the planned build sits to the right' + - src: '/images/community-poi/megabase/reference_uncensored_library.jpg' + alt: 'Aerial view of the Uncensored Library, a white library complex with a dome and formal gardens — an external build, not on our server' + caption: 'Reference — not our build: The Uncensored Library by BlockWorks for Reporters Without Borders, shown purely as a sense of scale and style' +schematics: + - url: '/community-poi/megabase/megabase.litematic' + name: 'Megabase' + format: 'litematic' + version: '1.20.4' + sizeLabel: 'approx. 4.1 MB' + origin: + x: 2563 + y: 56 + z: 20850 + rotation: 'none' + setupNotes: 'Origin and rotation taken from the BlueMap location and not yet checked on site — please compare against the marker in the world before pasting.' +updatedAt: '2026-09-07' +acceptsContributions: true +alternates: + - hreflang: 'de' + href: 'https://onelitefeather.net/de/community-poi/megabase' + - hreflang: 'en' + href: 'https://onelitefeather.net/en/community-poi/megabase' + - hreflang: 'x-default' + href: 'https://onelitefeather.net/en/community-poi/megabase' +--- + +## What is it? + +The megabase is B3nNy's largest project, and what sets it apart from the others is sheer scale. Where the maze and the harbour are each a single structure, this one covers ground you cannot take in from normal play height — the overview shot was taken well beyond render distance. + +The excavation is finished. The terrain has been levelled to a single height and the footprint laid out as a V-shaped foundation of dark stone, with the Litematica outline of the planned build standing beside it. Not a block has gone up yet. + +For a sense of scale the gallery includes a picture of "The Uncensored Library" — not as a blueprint, but as a yardstick: a well-known build you can measure this one against. + +## What is there to see already + +- The excavated site with its V-shaped foundation +- The marked-out footprint, which shows how the build will be oriented +- The Litematica outline beside it, showing what is meant to go up + +## How can you help? + +On a build this size, materials are the bottleneck, not ideas. If you want to pitch in, the best route is a message to B3nNy on Discord — that is also where the next sections get agreed. + +To follow along: download the schematic and lay it over the foundation in-game as a hologram. Use Litematica for viewing only, **no auto-place** (see the server rule below). diff --git a/package.json b/package.json index 0187e4d4..5807ea34 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "vue-router": "^5.0.0", "vue-tsc": "^3.3.9", "wait-on": "^9.0.0", + "yaml": "^2.9.0", "zod": "^4.1.13" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8eccb51d..3a01f035 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -189,6 +189,9 @@ importers: wait-on: specifier: ^9.0.0 version: 9.1.0(debug@4.4.3) + yaml: + specifier: ^2.9.0 + version: 2.9.0 zod: specifier: ^4.1.13 version: 4.5.4 @@ -8251,6 +8254,9 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.5.4: resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} @@ -8466,22 +8472,22 @@ snapshots: '@devframes/hub@0.7.16(devframe@0.7.16(cac@7.0.0)(srvx@0.11.21)(typescript@5.9.3))': dependencies: - birpc: 4.2.0 + birpc: 4.0.0 destr: 2.0.5 devframe: 0.7.16(cac@7.0.0)(srvx@0.11.21)(typescript@5.9.3) nostics: 1.2.0 pathe: 2.0.3 perfect-debounce: 2.1.0 - tinyexec: 1.3.1 + tinyexec: 1.3.0 zigpty: 0.2.1 optional: true '@devframes/json-render@0.7.16(@devframes/hub@0.7.16(devframe@0.7.16(cac@7.0.0)(srvx@0.11.21)(typescript@5.9.3)))(devframe@0.7.16(cac@7.0.0)(srvx@0.11.21)(typescript@5.9.3))': dependencies: - '@json-render/core': 0.19.0(zod@4.5.4) + '@json-render/core': 0.19.0(zod@4.4.3) devframe: 0.7.16(cac@7.0.0)(srvx@0.11.21)(typescript@5.9.3) nostics: 1.2.0 - zod: 4.5.4 + zod: 4.4.3 optionalDependencies: '@devframes/hub': 0.7.16(devframe@0.7.16(cac@7.0.0)(srvx@0.11.21)(typescript@5.9.3)) optional: true @@ -9244,9 +9250,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.6.0 - '@json-render/core@0.19.0(zod@4.5.4)': + '@json-render/core@0.19.0(zod@4.4.3)': dependencies: - zod: 4.5.4 + zod: 4.4.3 optional: true '@kwsites/file-exists@1.1.1': @@ -13198,7 +13204,7 @@ snapshots: jiti: 2.7.0 lightningcss: 1.33.0 magic-string: 0.30.21 - ohash: 2.0.12 + ohash: 2.0.11 pathe: 2.0.3 ufo: 1.6.4 unifont: 0.7.4 @@ -13366,7 +13372,7 @@ snapshots: ufo: 1.6.4 uncrypto: 0.1.3 - h3@2.0.1-rc.22(crossws@0.4.5(srvx@0.11.15)): + h3@2.0.1-rc.22(crossws@0.4.5(srvx@0.11.21)): dependencies: rou3: 0.8.1 srvx: 0.11.15 @@ -14474,7 +14480,7 @@ snapshots: crossws: 0.4.5(srvx@0.11.15) db0: 0.3.4(better-sqlite3@12.11.1) env-runner: 0.1.7 - h3: 2.0.1-rc.22(crossws@0.4.5(srvx@0.11.15)) + h3: 2.0.1-rc.22(crossws@0.4.5(srvx@0.11.21)) hookable: 6.1.1 nf3: 0.3.17 ocache: 0.1.4 @@ -16998,7 +17004,7 @@ snapshots: dependencies: css-tree: 3.2.1 ofetch: 1.5.1 - ohash: 2.0.12 + ohash: 2.0.11 optional: true unimport@6.3.0(esbuild@0.28.1)(oxc-parser@0.133.0)(rollup@4.62.2)(vite@7.3.6(@types/node@26.4.0)(jiti@2.7.0)(lightningcss@1.33.0)(terser@5.49.0)(yaml@2.9.0)): @@ -17656,6 +17662,9 @@ snapshots: zod@3.25.76: {} + zod@4.4.3: + optional: true + zod@4.5.4: {} zwitch@2.0.4: {} diff --git a/public/community-poi/hafengebaeude/dockhafen.litematic b/public/community-poi/hafengebaeude/dockhafen.litematic index 243bfe0f..498e8d0e 100644 Binary files a/public/community-poi/hafengebaeude/dockhafen.litematic and b/public/community-poi/hafengebaeude/dockhafen.litematic differ diff --git a/public/community-poi/megabase/megabase.litematic b/public/community-poi/megabase/megabase.litematic new file mode 100644 index 00000000..3a9b1f47 Binary files /dev/null and b/public/community-poi/megabase/megabase.litematic differ diff --git a/tests/content/frontmatter-parses.spec.ts b/tests/content/frontmatter-parses.spec.ts new file mode 100644 index 00000000..a6046e97 --- /dev/null +++ b/tests/content/frontmatter-parses.spec.ts @@ -0,0 +1,108 @@ +import { readFileSync } from 'node:fs' +import { parse } from 'yaml' +import { describe, expect, it } from 'vitest' +import { collectSourceFiles, relativeToRepo } from '../helpers/sources' + +/** + * Frontmatter that does not parse fails silently and partially. + * + * A megabase entry shipped with `summary: 'B3nNy\'s largest undertaking: …'`. + * In a single-quoted YAML scalar an apostrophe is escaped by doubling it, not + * with a backslash, so the string ended early and the rest of the line became a + * second mapping key. Everything below that line — status, progress, category, + * the whole gallery — was never read. + * + * On the page it showed up as a status badge reading + * `community_poi.status.null`, because the missing value was interpolated + * straight into an i18n key. A harbour caption went the same way and rendered + * as raw JSON: `{ "Reference (someone else\\": "exterior views …" }`. + * + * Nothing caught it. The build passed, `@nuxt/content` swallowed the malformed + * document rather than failing, and all 177 tests stayed green — every one of + * them reads these files as text and none of them parses the frontmatter. + * + * So this suite parses it, strictly, and asserts that the fields the templates + * interpolate really arrived as the type they are used as. Type checks matter + * as much as the parse: a broken quote does not always throw, it can just as + * easily hand back an object where a string was expected, which is exactly what + * the harbour caption did. + */ + +const CONTENT_DIRS = ['content'] + +/** Every markdown document under content/, with its frontmatter block. */ +function documents(): { file: string, frontmatter: string }[] { + return collectSourceFiles(CONTENT_DIRS, ['.md']) + .map((file) => ({ file, text: readFileSync(file, 'utf8') })) + .filter((doc) => doc.text.startsWith('---')) + .map((doc) => ({ + file: relativeToRepo(doc.file), + // Between the first and second `---`. Splitting on the delimiter would + // also cut on any `---` inside the body, so slice explicitly. + frontmatter: doc.text.slice(3, doc.text.indexOf('\n---', 3)), + })) +} + +describe('content frontmatter', () => { + it('finds documents to check', () => { + // Without this the suite passes vacuously if the traversal ever breaks. + expect(documents().length).toBeGreaterThan(20) + }) + + it('parses as YAML in every document', () => { + const failures: string[] = [] + for (const doc of documents()) { + try { + parse(doc.frontmatter) + } catch (error) { + const message = error instanceof Error ? error.message.split('\n')[0] : String(error) + failures.push(`${doc.file}: ${message}`) + } + } + expect(failures.sort()).toEqual([]) + }) + + it('detects a backslash-escaped apostrophe', () => { + // The exact mistake that shipped, pinned so this check cannot be + // "simplified" into something that would let it through again. + expect(() => parse("summary: 'B3nNy\\'s largest undertaking: a site'")).toThrow() + expect(parse("summary: 'B3nNy''s largest undertaking'").summary) + .toBe("B3nNy's largest undertaking") + }) + + it('gives every community POI a string status the badge can name', () => { + // `CommunityPoiStatusBadge` interpolates this into + // `t('community_poi.status.' + status)`. A missing value does not throw — + // it renders the key itself, in a badge, on a public page. + const wrong: string[] = [] + for (const doc of documents()) { + if (!doc.file.startsWith('content/community-poi/')) continue + const data = parse(doc.frontmatter) as Record + if (typeof data.status !== 'string') { + wrong.push(`${doc.file}: status is ${JSON.stringify(data.status)}`) + } + } + expect(wrong.sort()).toEqual([]) + }) + + it('keeps gallery captions and alt text as strings', () => { + // A caption that parses into an object still renders — as `[object Object]` + // or, in the case that shipped, as visible JSON braces in the figure. + const wrong: string[] = [] + for (const doc of documents()) { + const data = parse(doc.frontmatter) as Record + const gallery = data.gallery + if (!Array.isArray(gallery)) continue + gallery.forEach((entry, index) => { + const item = entry as Record + if (typeof item.alt !== 'string') { + wrong.push(`${doc.file}: gallery[${index}].alt is ${JSON.stringify(item.alt)}`) + } + if (item.caption !== undefined && typeof item.caption !== 'string') { + wrong.push(`${doc.file}: gallery[${index}].caption is ${JSON.stringify(item.caption)}`) + } + }) + } + expect(wrong.sort()).toEqual([]) + }) +})