mirror of
https://github.com/mleem97/gregWiki.git
synced 2026-04-10 19:19:18 +02:00
refactor: update project branding and structure for gregFramework
- Changed project title and tagline in docusaurus.config.js to reflect the new branding. - Updated package.json and package-lock.json to rename the project to gregwiki-docs-site. - Adjusted sidebar and documentation files to align with the new project structure and naming conventions. - Enhanced documentation content for clarity and consistency across various sections. - Added Prettier as a development dependency for code formatting. This commit aligns the project with the new branding and improves overall documentation structure.
This commit is contained in:
8
.prettierignore
Normal file
8
.prettierignore
Normal file
@@ -0,0 +1,8 @@
|
||||
node_modules
|
||||
build
|
||||
.docusaurus
|
||||
.cache
|
||||
package-lock.json
|
||||
pnpm-lock.yaml
|
||||
docs/wiki-import
|
||||
i18n
|
||||
7
.prettierrc.json
Normal file
7
.prettierrc.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"singleQuote": true,
|
||||
"trailingComma": "all",
|
||||
"printWidth": 100,
|
||||
"bracketSpacing": false,
|
||||
"arrowParens": "always"
|
||||
}
|
||||
@@ -44,3 +44,9 @@ Details: [`topics/wiki-import/overview.md`](./topics/wiki-import/overview.md).
|
||||
| Sync `../.wiki` → `docs/wiki-import/` | `scripts/sync-wiki-to-docs.mjs` | Copies `*.md` from the sibling `.wiki/` clone under `gregFramework/`. |
|
||||
| Split DE/EN pairs | `scripts/normalize-wiki-import-i18n.mjs` | EN default locale, DE under `i18n/de/...`. |
|
||||
| Sidebar category keys | `scripts/write-wiki-import-category-keys.mjs` | Regenerates `_category_.json` keys under Guides/Reference/Troubleshooting (if present). |
|
||||
|
||||
## Locales (EN / DE / others)
|
||||
|
||||
- **Default locale:** `en` — curated pages live under `docs/` (e.g. `intro.md`, `getting-started.md`).
|
||||
- **German:** override files under `i18n/de/docusaurus-plugin-content-docs/current/` with the **same path** as in `docs/` (same doc `id` / filename). Example: `intro.md` and `getting-started.md` are fully maintained in DE.
|
||||
- **fr, es, ru, ja:** enabled in `docusaurus.config.js`; where no translated file exists, Docusaurus **falls back** to the English `docs/` markdown. Add more translated files under `i18n/<locale>/docusaurus-plugin-content-docs/current/` as needed.
|
||||
|
||||
@@ -1,50 +1,49 @@
|
||||
---
|
||||
title: Getting started
|
||||
sidebar_label: Getting started
|
||||
description: "Aktueller Stand nach Repo-Split: Wrapper-Struktur, Core-Build und Mod-/Extension-Repos."
|
||||
description: "Split-repo workspace: gregFramework layout, building the core, and where docs live."
|
||||
---
|
||||
|
||||
Die Struktur ist jetzt **Multi-Repo** mit `gregFramework/` als lokalem Wrapper-Ordner. Darin liegen die eigenständigen Repositories, z. B.:
|
||||
The workspace is **multi-repo** with a local `gregFramework/` folder containing standalone repositories, for example:
|
||||
|
||||
- `gregCore/` (Core SDK, inkl. `FrikaMF-StandaloneRepo/`)
|
||||
- `gregMods/` (einzelne Mod-Repos)
|
||||
- `gregExtensions/` (einzelne Extension-Repos)
|
||||
- `gregWiki/` (Dokumentation)
|
||||
- `gregCore/` (core SDK, including `FrikaMF-StandaloneRepo/`)
|
||||
- `gregMods/` (per-mod repositories)
|
||||
- `gregExtensions/` (per-extension repositories)
|
||||
- `gregWiki/` (this documentation site)
|
||||
|
||||
`DataCenter-RustBridge` wird in den Core integriert und liegt im Core-Baum unter:
|
||||
`DataCenter-RustBridge` is integrated into the core tree at:
|
||||
|
||||
- `gregCore/FrikaMF-StandaloneRepo/bridges/gregSta.RustBridge/`
|
||||
|
||||
## Core bauen
|
||||
## Build the core
|
||||
|
||||
```text
|
||||
dotnet build gregCore/FrikaMF-StandaloneRepo/FrikaMF.sln -c Release
|
||||
```
|
||||
|
||||
Alternativ in IDE: `gregCore/FrikaMF-StandaloneRepo/FrikaMF.sln` öffnen.
|
||||
Or open `gregCore/FrikaMF-StandaloneRepo/FrikaMF.sln` in your IDE.
|
||||
|
||||
## Hook naming
|
||||
|
||||
- **Target convention:** `FMF.<DOMAIN>.<Event>` (see [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/master/CONTRIBUTING.md)).
|
||||
- **Registry:** [`FrikaModFramework/fmf_hooks.json`](https://github.com/mleem97/gregFramework/blob/master/FrikaModFramework/fmf_hooks.json).
|
||||
- **Registry:** [`FrikaModFramework/fmf_hooks.json`](https://github.com/mleem97/gregFramework/blob/master/FrikaModFramework/fmf_hooks.json) (path may vary by branch).
|
||||
- **Legacy runtime strings** may still use `FFM.*` in [`HookNames`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs) until migrated.
|
||||
|
||||
## Mod starten
|
||||
## Start a mod
|
||||
|
||||
1. Neues Mod-Repo unter `gregMods/` nach Schema `gregMod.<Name>` anlegen.
|
||||
2. Templates aus `gregCore/FrikaMF-StandaloneRepo/Templates/` nutzen.
|
||||
3. Hook-Metadaten pflegen und Mod im eigenen Repo versionieren.
|
||||
1. Create a new mod repo under `gregMods/` using the `gregMod.<Name>` pattern.
|
||||
2. Use templates from `gregCore/FrikaMF-StandaloneRepo/Templates/`.
|
||||
3. Maintain hook metadata and version the mod in its own repository.
|
||||
|
||||
## Documentation site
|
||||
|
||||
- **Repo:** `gregWiki/`
|
||||
- **Inhalt:** Markdown/MDX in diesem Repo, angepasst an den Split-Stand.
|
||||
- **Repository:** `gregWiki/`
|
||||
- **Content:** Markdown/MDX in this repo, aligned with the split layout.
|
||||
|
||||
### Docker
|
||||
|
||||
- **Dev server with hot reload:** from the `gregWiki` repo root, `docker build -t gregwiki-docs .` then `docker run --rm -p 3000:3000 gregwiki-docs` (or use your host compose file if you mount this repo).
|
||||
- **MCP:** see [`reference/mcp-server`](./reference/mcp-server.md) in the core repository (`gregCore/FrikaMF-StandaloneRepo/mcp-server/`).
|
||||
From the `gregWiki` root: `docker build -t gregwiki-docs .` then `docker run --rm -p 3000:3000 gregwiki-docs`.
|
||||
|
||||
## Assistants / MCP
|
||||
### MCP
|
||||
|
||||
Der MCP-Server für Framework-Scan/Tooling liegt im Core-Umfeld (`gregCore/FrikaMF-StandaloneRepo/mcp-server/`).
|
||||
See [`reference/mcp-server`](./reference/mcp-server.md) — the server lives next to the core sources (`gregCore/FrikaMF-StandaloneRepo/mcp-server/`).
|
||||
|
||||
@@ -1,43 +1,44 @@
|
||||
---
|
||||
id: intro
|
||||
title: FrikaMF Docs Start
|
||||
title: gregFramework documentation
|
||||
slug: /docs
|
||||
description: Entry point for the split-repo workspace — core, mods, extensions, and this wiki.
|
||||
---
|
||||
|
||||
Diese Dokumentation beschreibt den **aktuellen Split-Stand**: `gregFramework/` als Wrapper mit Einzel-Repositories für Core, Mods, Extensions und Wiki. Sie richtet sich an **Spieler**, **Mod-Developer**, **Contributors** und **Sponsoren**.
|
||||
This documentation describes the **current split layout**: a local `gregFramework/` workspace with separate repositories for **core**, **mods**, **extensions**, and **wiki**. It is written for **players**, **mod developers**, **contributors**, and **sponsors**.
|
||||
|
||||
## Für wen? — Who is this for?
|
||||
## Who is this for?
|
||||
|
||||
| Audience | Start here |
|
||||
|----------|------------|
|
||||
| **Spieler** — install, play, troubleshoot | [End users (hub)](./topics/end-user/overview.md) · [End user wiki (import)](./wiki-import/EndUser/) |
|
||||
| **Moddevs** — build mods, hooks, debugging | [Mod developers (hub)](./topics/mod-developers/overview.md) · [ModDevs wiki (import)](./wiki-import/ModDevs/) · [Framework](./mods/framework.md) |
|
||||
| **Contributor** — PRs, docs, plugins, CI | [Contributors (workflow)](./topics/contributors/overview.md) · [Contributors wiki (import)](./wiki-import/Contributors/) |
|
||||
| **Sponsorinnen & Sponsoren** — support & transparency | [Sponsors (hub)](./topics/sponsors/overview.md) · [Sponsors (EN)](./wiki-import/Sponsors) · [Sponsoren (DE)](./wiki-import/Sponsoren) |
|
||||
| **Players** — install, play, troubleshoot | [End users (hub)](./topics/end-user/overview.md) · [End user wiki (import)](./wiki-import/EndUser/) |
|
||||
| **Mod developers** — build mods, hooks, debugging | [Mod developers (hub)](./topics/mod-developers/overview.md) · [ModDevs wiki (import)](./wiki-import/ModDevs/) · [Framework](./mods/framework.md) |
|
||||
| **Contributors** — PRs, docs, plugins, CI | [Contributors (workflow)](./topics/contributors/overview.md) · [Contributors wiki (import)](./wiki-import/Contributors/) |
|
||||
| **Sponsors** — support & transparency | [Sponsors (hub)](./topics/sponsors/overview.md) · [Sponsors (EN)](./wiki-import/Sponsors) · [Sponsoren (DE)](./wiki-import/Sponsoren) |
|
||||
|
||||
**Experience tracks** (newbies → pros): [By audience](./topics/audiences/overview.md) → [Newbies](./audiences/newbies.md), [Intermediates](./audiences/intermediates.md), [Professionals](./audiences/professionals.md).
|
||||
|
||||
## Repository Hub
|
||||
## Repository hub
|
||||
|
||||
- Core: `gregCore/FrikaMF-StandaloneRepo/`
|
||||
- Mods: `gregMods/` (Repos `gregMod.<Name>`)
|
||||
- Extensions: `gregExtensions/` (Repos `gregExt.<Name>`)
|
||||
- Wiki: `gregWiki/`
|
||||
- Mods: `gregMods/` (repos `gregMod.<Name>`)
|
||||
- Extensions: `gregExtensions/` (repos `gregExt.<Name>`)
|
||||
- Wiki: `gregWiki/` (this site)
|
||||
|
||||
## Hooks and releases
|
||||
|
||||
- [FMF hook naming](./reference/fmf-hook-naming.md) — `FMF.<Domain>.…` and legacy `FFM.*`
|
||||
- [FMF hooks catalog](./reference/fmf-hooks-catalog.md) — generated from `framework/FrikaMF/HookNames.cs`
|
||||
- [FMF hooks catalog](./reference/fmf-hooks-catalog.md) — generated from core `HookNames.cs`
|
||||
- [Release channels](./reference/release-channels.md) — Steam Workshop vs GitHub (beta)
|
||||
- [MCP server](./reference/mcp-server.md) — LLM/IDE tools over docs + `fmf_hooks.json` (optional Docker bundle)
|
||||
- [MCP server](./reference/mcp-server.md) — optional LLM/IDE tooling over docs + `fmf_hooks.json`
|
||||
|
||||
## Repository layout (contributors)
|
||||
## Layout (contributors)
|
||||
|
||||
- [Repo inventory](./contributors/repo-inventory.md) — aktuelle Projekt-/Repo-Übersicht
|
||||
- Split-Konvention: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>`
|
||||
- [Repo inventory](./contributors/repo-inventory.md) — project and repository overview
|
||||
- Split naming: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>`
|
||||
|
||||
## Source model
|
||||
|
||||
- **Authoring:** Inhalte liegen im `gregWiki`-Repo.
|
||||
- **Core source of truth:** technische Runtime-/Bridge-Details kommen aus `gregCore`.
|
||||
- **RustBridge:** ist im Core integriert unter `FrikaMF-StandaloneRepo/bridges/gregSta.RustBridge/`.
|
||||
- **Authoring:** Markdown/MDX lives in the **gregWiki** repository.
|
||||
- **Technical source of truth:** runtime and bridge details come from **gregCore**.
|
||||
- **Rust bridge:** integrated in the core tree under `FrikaMF-StandaloneRepo/bridges/gregSta.RustBridge/`.
|
||||
|
||||
@@ -15,7 +15,7 @@ All **new** public hook and event identifiers should follow:
|
||||
FMF.<Domain>.<EventOrHook>
|
||||
```
|
||||
|
||||
- **`FMF`** — Fixed prefix (Frika Mod Framework).
|
||||
- **`FMF`** — Fixed prefix (Greg Mod Framework / **gregFramework** hook namespace).
|
||||
- **`<Domain>`** — Uppercase domain from the [approved domain list](#approved-domain-segments). Describes *where* the signal belongs in the game (player, rack, server, economy, …).
|
||||
- **`<EventOrHook>`** — `PascalCase` segment(s), usually `OnSomething` for events or a verb phrase for commands.
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FMF.ConsoleInputGuard.dll"
|
||||
releaseReady={false}
|
||||
version="NotReleasedYet"
|
||||
author="mleem97 / FrikaMF Community"
|
||||
author="mleem97 / gregFramework Community"
|
||||
category="Mod"
|
||||
dependencies={['MelonLoader', 'Harmony']}
|
||||
codeLanguages={['C#']}
|
||||
|
||||
@@ -11,7 +11,7 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FMF.GregifyEmployees.dll"
|
||||
releaseReady={false}
|
||||
version="NotReleasedYet"
|
||||
author="mleem97 / FrikaMF Community"
|
||||
author="mleem97 / gregFramework Community"
|
||||
category="Mod"
|
||||
dependencies={['MelonLoader', 'Harmony']}
|
||||
codeLanguages={['C#']}
|
||||
|
||||
@@ -11,7 +11,7 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FMF.HexLabelMod.dll"
|
||||
releaseReady={false}
|
||||
version="NotReleasedYet"
|
||||
author="mleem97 / FrikaMF Community"
|
||||
author="mleem97 / gregFramework Community"
|
||||
category="Mod"
|
||||
dependencies={['MelonLoader', 'Harmony']}
|
||||
codeLanguages={['C#']}
|
||||
|
||||
@@ -11,7 +11,7 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FMF.JoniMLCompatMod.dll"
|
||||
releaseReady={false}
|
||||
version="NotReleasedYet"
|
||||
author="mleem97 / FrikaMF Community"
|
||||
author="mleem97 / gregFramework Community"
|
||||
category="Mod"
|
||||
dependencies={['MelonLoader']}
|
||||
codeLanguages={['C#']}
|
||||
|
||||
@@ -11,9 +11,9 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FFM.Plugin.AssetExporter.dll"
|
||||
releaseReady={false}
|
||||
version="NotReleasedYet"
|
||||
author="mleem97 / FrikaMF Community"
|
||||
author="mleem97 / gregFramework Community"
|
||||
category="Plugin"
|
||||
dependencies={['MelonLoader', 'FrikaMF']}
|
||||
dependencies={['MelonLoader', 'gregFramework']}
|
||||
codeLanguages={['C#']}
|
||||
description="Provides export-focused tooling for asset-related workflows in Data Center modding pipelines."
|
||||
banner="Asset exporter plugin release"
|
||||
|
||||
@@ -11,11 +11,11 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FFM.Plugin.Multiplayer.dll"
|
||||
releaseReady={false}
|
||||
version="NotReleasedYet"
|
||||
author="mleem97 / FrikaMF Community"
|
||||
author="mleem97 / gregFramework Community"
|
||||
category="Plugin"
|
||||
dependencies={['MelonLoader', 'FrikaMF']}
|
||||
dependencies={['MelonLoader', 'gregFramework']}
|
||||
codeLanguages={['C#']}
|
||||
description="Contains multiplayer-oriented plugin functionality for FrikaMF ecosystems."
|
||||
description="Contains multiplayer-oriented plugin functionality for gregFramework ecosystems."
|
||||
banner="Multiplayer plugin release"
|
||||
releaseNotesPath="/mods/extensions/ffm-plugin-multiplayer"
|
||||
/>
|
||||
|
||||
@@ -11,9 +11,9 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FFM.Plugin.PlayerModels.dll"
|
||||
releaseReady={false}
|
||||
version="NotReleasedYet"
|
||||
author="mleem97 / FrikaMF Community"
|
||||
author="mleem97 / gregFramework Community"
|
||||
category="Plugin"
|
||||
dependencies={['MelonLoader', 'FrikaMF']}
|
||||
dependencies={['MelonLoader', 'gregFramework']}
|
||||
codeLanguages={['C#']}
|
||||
description="Extends player model handling and related rendering/gameplay presentation behavior."
|
||||
banner="Player models plugin release"
|
||||
|
||||
@@ -11,9 +11,9 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FFM.Plugin.Sysadmin.dll"
|
||||
releaseReady={false}
|
||||
version="NotReleasedYet"
|
||||
author="mleem97 / FrikaMF Community"
|
||||
author="mleem97 / gregFramework Community"
|
||||
category="Plugin"
|
||||
dependencies={['MelonLoader', 'FrikaMF']}
|
||||
dependencies={['MelonLoader', 'gregFramework']}
|
||||
codeLanguages={['C#']}
|
||||
description="Provides sysadmin-focused controls and quality-of-life command utilities."
|
||||
banner="Sysadmin plugin release"
|
||||
|
||||
@@ -11,9 +11,9 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FFM.Plugin.WebUIBridge.dll"
|
||||
releaseReady={false}
|
||||
version="NotReleasedYet"
|
||||
author="mleem97 / FrikaMF Community"
|
||||
author="mleem97 / gregFramework Community"
|
||||
category="Plugin"
|
||||
dependencies={['MelonLoader', 'FrikaMF']}
|
||||
dependencies={['MelonLoader', 'gregFramework']}
|
||||
codeLanguages={['C#']}
|
||||
description="Bridges runtime data to web interfaces for dashboards and remote overlays."
|
||||
banner="Web UI bridge plugin release"
|
||||
|
||||
@@ -12,7 +12,7 @@ import ModReleasePage from '@site/src/components/ModReleasePage';
|
||||
dllName="FMF.ModPathRedirector.dll"
|
||||
releaseReady={true}
|
||||
version="1.5.0"
|
||||
author="DataCenterExporter / FrikaMF Community"
|
||||
author="DataCenterExporter / gregFramework Community"
|
||||
category="MelonLoader plugin"
|
||||
dependencies={['MelonLoader', 'Steam (client)', 'Data Center']}
|
||||
codeLanguages={['C#']}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
// @ts-check
|
||||
|
||||
const config = {
|
||||
title: 'Frika Mod Framework',
|
||||
tagline: 'Community-driven docs for FrikaMF, plugins, Rust FFI, and multiplayer stacks',
|
||||
title: 'gregFramework',
|
||||
tagline:
|
||||
'Community docs for gregFramework — Data Center mods, FMF plugins, hooks, and split-repo layout',
|
||||
favicon: 'img/logo.svg',
|
||||
url: 'https://frikadellental.de',
|
||||
baseUrl: '/',
|
||||
@@ -140,7 +141,7 @@ const config = {
|
||||
respectPrefersColorScheme: false,
|
||||
},
|
||||
navbar: {
|
||||
title: 'Frika Mod Framework',
|
||||
title: 'gregFramework',
|
||||
hideOnScroll: false,
|
||||
style: 'dark',
|
||||
items: [
|
||||
@@ -163,10 +164,34 @@ const config = {
|
||||
dropdownItemsBefore: [],
|
||||
dropdownItemsAfter: [],
|
||||
},
|
||||
{to: '/mods', label: 'Mods', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-mods', 'aria-label': 'Mods'},
|
||||
{href: 'https://discord.gg/greg', label: 'Discord', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-discord', 'aria-label': 'Discord'},
|
||||
{href: 'https://github.com/mleem97/gregFramework/issues', label: 'Support', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-support', 'aria-label': 'Support'},
|
||||
{href: 'https://github.com/mleem97/gregFramework', label: 'GitHub', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-github', 'aria-label': 'GitHub'},
|
||||
{
|
||||
to: '/mods',
|
||||
label: 'Mods',
|
||||
position: 'right',
|
||||
className: 'nav-right-icon nav-icon-only nav-link-mods',
|
||||
'aria-label': 'Mods',
|
||||
},
|
||||
{
|
||||
href: 'https://discord.gg/greg',
|
||||
label: 'Discord',
|
||||
position: 'right',
|
||||
className: 'nav-right-icon nav-icon-only nav-link-discord',
|
||||
'aria-label': 'Discord',
|
||||
},
|
||||
{
|
||||
href: 'https://github.com/mleem97/gregFramework/issues',
|
||||
label: 'Support',
|
||||
position: 'right',
|
||||
className: 'nav-right-icon nav-icon-only nav-link-support',
|
||||
'aria-label': 'Support',
|
||||
},
|
||||
{
|
||||
href: 'https://github.com/mleem97/gregFramework',
|
||||
label: 'GitHub',
|
||||
position: 'right',
|
||||
className: 'nav-right-icon nav-icon-only nav-link-github',
|
||||
'aria-label': 'GitHub',
|
||||
},
|
||||
],
|
||||
},
|
||||
footer: {
|
||||
@@ -199,4 +224,3 @@ const config = {
|
||||
};
|
||||
|
||||
module.exports = config;
|
||||
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: Erste Schritte
|
||||
sidebar_label: Erste Schritte
|
||||
description: "Split-Repo-Workspace: gregFramework-Layout, Core bauen und wo die Doku liegt."
|
||||
---
|
||||
|
||||
Die Struktur ist **Multi-Repo** mit `gregFramework/` als lokalem Wrapper-Ordner. Darin liegen die eigenständigen Repositories, z. B.:
|
||||
|
||||
- `gregCore/` (Core SDK, inkl. `FrikaMF-StandaloneRepo/`)
|
||||
- `gregMods/` (einzelne Mod-Repos)
|
||||
- `gregExtensions/` (einzelne Extension-Repos)
|
||||
- `gregWiki/` (Dokumentation)
|
||||
|
||||
`DataCenter-RustBridge` wird in den Core integriert und liegt unter:
|
||||
|
||||
- `gregCore/FrikaMF-StandaloneRepo/bridges/gregSta.RustBridge/`
|
||||
|
||||
## Core bauen
|
||||
|
||||
```text
|
||||
dotnet build gregCore/FrikaMF-StandaloneRepo/FrikaMF.sln -c Release
|
||||
```
|
||||
|
||||
Alternativ in der IDE: `gregCore/FrikaMF-StandaloneRepo/FrikaMF.sln` öffnen.
|
||||
|
||||
## Hook-Naming
|
||||
|
||||
- **Zielkonvention:** `FMF.<DOMAIN>.<Event>` (siehe [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/master/CONTRIBUTING.md)).
|
||||
- **Registry:** [`FrikaModFramework/fmf_hooks.json`](https://github.com/mleem97/gregFramework/blob/master/FrikaModFramework/fmf_hooks.json).
|
||||
- **Legacy-Runtime-Strings** können noch `FFM.*` in [`HookNames`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs) nutzen, bis migriert.
|
||||
|
||||
## Mod starten
|
||||
|
||||
1. Neues Mod-Repo unter `gregMods/` nach Schema `gregMod.<Name>` anlegen.
|
||||
2. Templates aus `gregCore/FrikaMF-StandaloneRepo/Templates/` nutzen.
|
||||
3. Hook-Metadaten pflegen und Mod im eigenen Repo versionieren.
|
||||
|
||||
## Dokumentations-Site
|
||||
|
||||
- **Repo:** `gregWiki/`
|
||||
- **Inhalt:** Markdown/MDX in diesem Repo, angepasst an den Split-Stand.
|
||||
|
||||
### Docker
|
||||
|
||||
Im `gregWiki`-Root: `docker build -t gregwiki-docs .` und `docker run --rm -p 3000:3000 gregwiki-docs`.
|
||||
|
||||
### MCP
|
||||
|
||||
Siehe [`reference/mcp-server`](./reference/mcp-server.md) im Core (`gregCore/FrikaMF-StandaloneRepo/mcp-server/`).
|
||||
44
i18n/de/docusaurus-plugin-content-docs/current/intro.md
Normal file
44
i18n/de/docusaurus-plugin-content-docs/current/intro.md
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
id: intro
|
||||
title: gregFramework Dokumentation
|
||||
slug: /docs
|
||||
description: Einstieg für den Split-Repo-Workspace — Core, Mods, Extensions und dieses Wiki.
|
||||
---
|
||||
|
||||
Diese Dokumentation beschreibt den **aktuellen Split-Stand**: `gregFramework/` als Wrapper mit Einzel-Repositories für **Core**, **Mods**, **Extensions** und **Wiki**. Sie richtet sich an **Spieler**, **Mod-Developer**, **Contributors** und **Sponsoren**.
|
||||
|
||||
## Für wen?
|
||||
|
||||
| Zielgruppe | Einstieg |
|
||||
|------------|----------|
|
||||
| **Spieler** — installieren, spielen, Troubleshooting | [Endnutzer (Hub)](./topics/end-user/overview.md) · [Endnutzer-Wiki (Import)](./wiki-import/EndUser/) |
|
||||
| **Moddevs** — Mods bauen, Hooks, Debugging | [Mod-Entwickler (Hub)](./topics/mod-developers/overview.md) · [ModDevs-Wiki (Import)](./wiki-import/ModDevs/) · [Framework](./mods/framework.md) |
|
||||
| **Contributor** — PRs, Doku, Plugins, CI | [Contributors (Workflow)](./topics/contributors/overview.md) · [Contributors-Wiki (Import)](./wiki-import/Contributors/) |
|
||||
| **Sponsorinnen & Sponsoren** | [Sponsors (Hub)](./topics/sponsors/overview.md) · [Sponsors (EN)](./wiki-import/Sponsors) · [Sponsoren (DE)](./wiki-import/Sponsoren) |
|
||||
|
||||
**Erfahrungspfade** (Einsteiger → Profis): [Nach Zielgruppe](./topics/audiences/overview.md) → [Newbies](./audiences/newbies.md), [Intermediates](./audiences/intermediates.md), [Professionals](./audiences/professionals.md).
|
||||
|
||||
## Repository-Hub
|
||||
|
||||
- Core: `gregCore/FrikaMF-StandaloneRepo/`
|
||||
- Mods: `gregMods/` (Repos `gregMod.<Name>`)
|
||||
- Extensions: `gregExtensions/` (Repos `gregExt.<Name>`)
|
||||
- Wiki: `gregWiki/`
|
||||
|
||||
## Hooks und Releases
|
||||
|
||||
- [FMF Hook-Naming](./reference/fmf-hook-naming.md) — `FMF.<Domain>.…` und Legacy `FFM.*`
|
||||
- [FMF-Hooks-Katalog](./reference/fmf-hooks-catalog.md) — generiert aus Core-`HookNames.cs`
|
||||
- [Release-Kanäle](./reference/release-channels.md) — Steam Workshop vs GitHub (Beta)
|
||||
- [MCP-Server](./reference/mcp-server.md) — optionale LLM/IDE-Tools über Doku + `fmf_hooks.json`
|
||||
|
||||
## Layout (Contributors)
|
||||
|
||||
- [Repo-Inventar](./contributors/repo-inventory.md) — Projekt- und Repo-Übersicht
|
||||
- Split-Konvention: `gregMod.<Name>`, `gregExt.<Name>`, `gregSta.<Name>`
|
||||
|
||||
## Quellenmodell
|
||||
|
||||
- **Authoring:** Inhalte liegen im **gregWiki**-Repo.
|
||||
- **Technische Wahrheit:** Runtime/Bridge-Details kommen aus **gregCore**.
|
||||
- **RustBridge:** im Core unter `FrikaMF-StandaloneRepo/bridges/gregSta.RustBridge/`.
|
||||
23
package-lock.json
generated
23
package-lock.json
generated
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"name": "frikamf-docs-site",
|
||||
"name": "gregwiki-docs-site",
|
||||
"version": "0.1.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "frikamf-docs-site",
|
||||
"name": "gregwiki-docs-site",
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "3.9.2",
|
||||
@@ -29,7 +29,8 @@
|
||||
"tailwindcss": "^4.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/eslint-plugin": "^3.9.2"
|
||||
"@docusaurus/eslint-plugin": "^3.9.2",
|
||||
"prettier": "^3.5.3"
|
||||
}
|
||||
},
|
||||
"node_modules/@algolia/abtesting": {
|
||||
@@ -17203,6 +17204,22 @@
|
||||
"node": ">= 0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/prettier": {
|
||||
"version": "3.8.1",
|
||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz",
|
||||
"integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"prettier": "bin/prettier.cjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/prettier/prettier?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/pretty-error": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
|
||||
|
||||
10
package.json
10
package.json
@@ -1,17 +1,18 @@
|
||||
{
|
||||
"name": "frikamf-docs-site",
|
||||
"name": "gregwiki-docs-site",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "docusaurus clear && docusaurus build && docusaurus start --host 0.0.0.0 --port 3000",
|
||||
"start": "docusaurus start --host 0.0.0.0 --port 3000",
|
||||
"build": "docusaurus build",
|
||||
|
||||
"serve": "docusaurus serve",
|
||||
"clear": "docusaurus clear",
|
||||
"wiki:sync": "node ./scripts/sync-wiki-to-docs.mjs",
|
||||
"wiki:normalize-i18n": "node ./scripts/normalize-wiki-import-i18n.mjs",
|
||||
"wiki:refresh": "node ./scripts/sync-wiki-to-docs.mjs && node ./scripts/normalize-wiki-import-i18n.mjs"
|
||||
"wiki:refresh": "node ./scripts/sync-wiki-to-docs.mjs && node ./scripts/normalize-wiki-import-i18n.mjs",
|
||||
"format": "prettier --write src scripts docusaurus.config.js sidebars.js README.md docs/README.md package.json .prettierrc.json",
|
||||
"format:check": "prettier --check src scripts docusaurus.config.js sidebars.js README.md docs/README.md package.json .prettierrc.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"@docusaurus/core": "3.9.2",
|
||||
@@ -35,6 +36,7 @@
|
||||
"tailwindcss": "^4.2.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@docusaurus/eslint-plugin": "^3.9.2"
|
||||
"@docusaurus/eslint-plugin": "^3.9.2",
|
||||
"prettier": "^3.5.3"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import fs from 'node:fs';
|
||||
import path from 'node:path';
|
||||
|
||||
function walk(dir) {
|
||||
for (const ent of fs.readdirSync(dir, { withFileTypes: true })) {
|
||||
for (const ent of fs.readdirSync(dir, {withFileTypes: true})) {
|
||||
const p = path.join(dir, ent.name);
|
||||
if (ent.isDirectory()) walk(p);
|
||||
else if (ent.name.endsWith('.md')) {
|
||||
|
||||
@@ -19,7 +19,7 @@ import {
|
||||
statSync,
|
||||
writeFileSync,
|
||||
} from 'node:fs';
|
||||
import { basename, dirname, join, relative, resolve } from 'node:path';
|
||||
import {basename, dirname, join, relative, resolve} from 'node:path';
|
||||
|
||||
const repoRoot = resolve(import.meta.dirname, '..');
|
||||
const docsWikiImport = join(repoRoot, 'docs', 'wiki-import');
|
||||
@@ -48,7 +48,7 @@ This page is available in **German** in the legacy wiki import. Use the language
|
||||
}
|
||||
|
||||
function ensureDir(p) {
|
||||
mkdirSync(p, { recursive: true });
|
||||
mkdirSync(p, {recursive: true});
|
||||
}
|
||||
|
||||
function walkMarkdownFiles(root, base = root) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
|
||||
import { join, resolve } from 'node:path';
|
||||
import {existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync} from 'node:fs';
|
||||
import {join, resolve} from 'node:path';
|
||||
|
||||
const projectRoot = resolve(process.cwd());
|
||||
const gregFrameworkRoot = resolve(projectRoot, '..');
|
||||
@@ -14,10 +14,10 @@ if (!existsSync(wikiDir)) {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
mkdirSync(outDir, { recursive: true });
|
||||
mkdirSync(outDir, {recursive: true});
|
||||
|
||||
function collectMarkdownFiles(rootDir, prefix = '') {
|
||||
const entries = readdirSync(join(rootDir, prefix), { withFileTypes: true });
|
||||
const entries = readdirSync(join(rootDir, prefix), {withFileTypes: true});
|
||||
const results = [];
|
||||
|
||||
for (const entry of entries) {
|
||||
@@ -42,7 +42,7 @@ for (const file of files) {
|
||||
const sanitizedRelative = file.replace(/\s+/g, '-');
|
||||
const target = join(outDir, sanitizedRelative);
|
||||
const targetDir = resolve(target, '..');
|
||||
mkdirSync(targetDir, { recursive: true });
|
||||
mkdirSync(targetDir, {recursive: true});
|
||||
const raw = readFileSync(source, 'utf8');
|
||||
writeFileSync(target, raw, 'utf8');
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ for (const base of bases) {
|
||||
const dir = path.join(base, rel);
|
||||
if (!fs.existsSync(dir)) continue;
|
||||
const target = path.join(dir, '_category_.json');
|
||||
const body = JSON.stringify({ key }, null, 2) + '\n';
|
||||
const body = JSON.stringify({key}, null, 2) + '\n';
|
||||
fs.writeFileSync(target, body);
|
||||
console.log('wrote', target);
|
||||
}
|
||||
|
||||
16
sidebars.js
16
sidebars.js
@@ -48,11 +48,7 @@ const sidebars = {
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Guides',
|
||||
items: [
|
||||
'guides/enduser-workshop',
|
||||
'guides/contributor-workshop',
|
||||
'guides/release',
|
||||
],
|
||||
items: ['guides/enduser-workshop', 'guides/contributor-workshop', 'guides/release'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
@@ -74,9 +70,7 @@ const sidebars = {
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Tool releases',
|
||||
items: [
|
||||
'releases/tools/gregtools-modmanager-1.0-release',
|
||||
],
|
||||
items: ['releases/tools/gregtools-modmanager-1.0-release'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
@@ -127,11 +121,7 @@ const sidebars = {
|
||||
{
|
||||
type: 'category',
|
||||
label: 'Roadmap & planning',
|
||||
items: [
|
||||
'topics/roadmap/overview',
|
||||
'roadmap/unified-roadmap',
|
||||
'roadmap/mod-store-stages',
|
||||
],
|
||||
items: ['topics/roadmap/overview', 'roadmap/unified-roadmap', 'roadmap/mod-store-stages'],
|
||||
},
|
||||
{
|
||||
type: 'category',
|
||||
|
||||
@@ -17,7 +17,6 @@ type ModReleasePageProps = {
|
||||
releaseReady?: boolean;
|
||||
banner?: string;
|
||||
releaseNotesPath?: string;
|
||||
/** If set, replaces the default installation steps (e.g. MelonLoader `Plugins/` vs `Mods/`). */
|
||||
installation?: React.ReactNode;
|
||||
};
|
||||
|
||||
@@ -25,13 +24,24 @@ function toTitleCase(value: ReleaseKind): string {
|
||||
return value.charAt(0).toUpperCase() + value.slice(1);
|
||||
}
|
||||
|
||||
function normalizeReleaseNotesPath(releaseNotesPath?: string): string | undefined {
|
||||
if (!releaseNotesPath) return undefined;
|
||||
if (releaseNotesPath.startsWith('/mods/')) {
|
||||
return `/wiki${releaseNotesPath}`;
|
||||
}
|
||||
if (releaseNotesPath.startsWith('/wiki/')) {
|
||||
return releaseNotesPath;
|
||||
}
|
||||
return releaseNotesPath;
|
||||
}
|
||||
|
||||
export default function ModReleasePage({
|
||||
title,
|
||||
kind,
|
||||
dllName,
|
||||
description,
|
||||
version = 'NotReleasedYet',
|
||||
author = 'FrikaMF Community',
|
||||
author = 'gregFramework Community',
|
||||
category = 'Mod',
|
||||
dependencies = [],
|
||||
codeLanguages = ['C#'],
|
||||
@@ -42,118 +52,205 @@ export default function ModReleasePage({
|
||||
}: ModReleasePageProps): JSX.Element {
|
||||
const downloadPath = `/${kind}/${dllName}`;
|
||||
const downloadUrl =
|
||||
typeof window !== 'undefined' ? new URL(downloadPath, window.location.origin).toString() : downloadPath;
|
||||
const normalizedReleaseNotesPath = releaseNotesPath?.startsWith('/mods/')
|
||||
? `/wiki${releaseNotesPath}`
|
||||
: releaseNotesPath;
|
||||
typeof window !== 'undefined'
|
||||
? new URL(downloadPath, window.location.origin).toString()
|
||||
: downloadPath;
|
||||
const docPath = normalizeReleaseNotesPath(releaseNotesPath);
|
||||
|
||||
return (
|
||||
<div className="mod-release-page">
|
||||
<section className="mod-release-hero">
|
||||
<p className="mod-release-badge">{toTitleCase(kind)}</p>
|
||||
<h1>{title}</h1>
|
||||
<p>
|
||||
{banner ?? (
|
||||
<Translate id="modRelease.heroDefaultBanner">Official release download and module details</Translate>
|
||||
)}
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="mod-release-layout">
|
||||
<article className="mod-release-content">
|
||||
<h2>
|
||||
<Translate id="modRelease.descriptionTitle">Description</Translate>
|
||||
</h2>
|
||||
<p>{description}</p>
|
||||
|
||||
<h2>
|
||||
<Translate id="modRelease.installationTitle">Installation</Translate>
|
||||
</h2>
|
||||
{installation ?? (
|
||||
<ol>
|
||||
<li>
|
||||
<Translate id="modRelease.installStepOne">Download the release DLL.</Translate>
|
||||
</li>
|
||||
<li>
|
||||
<Translate id="modRelease.installStepTwo">Copy it to your Data Center `Mods/` folder.</Translate>
|
||||
</li>
|
||||
<li>
|
||||
<Translate id="modRelease.installStepThree">Start the game with MelonLoader.</Translate>
|
||||
</li>
|
||||
</ol>
|
||||
)}
|
||||
|
||||
<h2>
|
||||
<Translate id="modRelease.dllRouteTitle">Direct DLL Route</Translate>
|
||||
</h2>
|
||||
<p>
|
||||
<code>{downloadPath}</code>
|
||||
</p>
|
||||
</article>
|
||||
|
||||
<aside className="mod-release-sidebar" aria-label="Download Sidebar">
|
||||
<div className="mod-release-sidebar-card">
|
||||
<h3>
|
||||
<Translate id="modRelease.sidebarTitle">Download</Translate>
|
||||
</h3>
|
||||
|
||||
{releaseReady ? (
|
||||
<a className="button button--primary button--lg mod-release-download-btn" href={downloadUrl}>
|
||||
<Translate id="modRelease.downloadButton">Download DLL</Translate>
|
||||
</a>
|
||||
) : (
|
||||
<button className="button button--primary button--lg mod-release-download-btn" disabled type="button">
|
||||
<Translate id="modRelease.notReleasedYet">NotReleasedYet</Translate>
|
||||
</button>
|
||||
)}
|
||||
|
||||
{normalizedReleaseNotesPath ? (
|
||||
<Link className="button button--secondary button--sm mod-release-secondary-btn" to={normalizedReleaseNotesPath}>
|
||||
<Translate id="modRelease.releaseNotesButton">Open module docs</Translate>
|
||||
</Link>
|
||||
) : null}
|
||||
|
||||
<dl className="mod-release-meta-list">
|
||||
<div>
|
||||
<dt>
|
||||
<Translate id="modRelease.metaVersion">Version</Translate>
|
||||
</dt>
|
||||
<dd>{version}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>
|
||||
<Translate id="modRelease.metaAuthor">Author</Translate>
|
||||
</dt>
|
||||
<dd>{author}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>
|
||||
<Translate id="modRelease.metaCategory">Category</Translate>
|
||||
</dt>
|
||||
<dd>{category}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>
|
||||
<Translate id="modRelease.metaDependencies">Dependencies</Translate>
|
||||
</dt>
|
||||
<dd>{dependencies.join(', ')}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>
|
||||
<Translate id="modRelease.metaCodeLanguage">Code Language</Translate>
|
||||
</dt>
|
||||
<dd>{codeLanguages.join(', ')}</dd>
|
||||
</div>
|
||||
</dl>
|
||||
|
||||
<p className="mod-release-sidebar-note">
|
||||
<Translate id="modRelease.sidebarHint">
|
||||
The download route redirects to the latest GitHub release asset.
|
||||
</Translate>
|
||||
</p>
|
||||
<div className="mod-release-root bg-background text-on-surface min-h-screen">
|
||||
<div className="mx-auto max-w-7xl px-4 py-10 md:px-8 md:py-12">
|
||||
<header className="mb-12">
|
||||
<div className="mb-4 flex flex-wrap items-center gap-3">
|
||||
<span className="rounded-full border border-primary/30 bg-primary-container/20 px-3 py-1 text-[10px] font-bold uppercase tracking-widest text-primary">
|
||||
{releaseReady ? (
|
||||
<Translate id="modRelease.badgeStable">Stable release</Translate>
|
||||
) : (
|
||||
<Translate id="modRelease.badgePreview">Preview / in development</Translate>
|
||||
)}
|
||||
</span>
|
||||
<span className="font-mono text-xs text-on-surface-variant">{dllName}</span>
|
||||
</div>
|
||||
</aside>
|
||||
</section>
|
||||
<h1 className="mb-4 font-headline text-4xl font-bold leading-tight tracking-tighter text-on-surface md:text-6xl">
|
||||
{title}
|
||||
</h1>
|
||||
<p className="max-w-3xl text-xl leading-relaxed text-on-surface-variant">
|
||||
{banner ?? (
|
||||
<Translate id="modRelease.heroDefaultBanner">
|
||||
Official release download and module details
|
||||
</Translate>
|
||||
)}
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<div className="grid grid-cols-1 gap-12 lg:grid-cols-12">
|
||||
<article className="space-y-12 lg:col-span-8">
|
||||
<section>
|
||||
<h2 className="mb-6 flex items-center gap-2 font-headline text-2xl font-bold text-secondary">
|
||||
<span className="material-symbols-outlined text-primary">description</span>
|
||||
<Translate id="modRelease.descriptionTitle">Description</Translate>
|
||||
</h2>
|
||||
<div className="prose prose-invert max-w-none space-y-4 text-on-surface-variant">
|
||||
<p>{description}</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="rounded-xl bg-surface-container-low p-8 outline outline-1 outline-outline-variant/10">
|
||||
<h2 className="mb-6 flex items-center gap-2 font-headline text-2xl font-bold text-secondary">
|
||||
<span className="material-symbols-outlined text-primary">terminal</span>
|
||||
<Translate id="modRelease.installationTitle">Installation</Translate>
|
||||
</h2>
|
||||
{installation ?? (
|
||||
<ol className="space-y-6">
|
||||
<li className="flex gap-4">
|
||||
<span className="flex h-8 w-8 flex-none items-center justify-center rounded-full border border-primary/20 bg-primary/10 font-headline text-sm font-bold text-primary">
|
||||
01
|
||||
</span>
|
||||
<div>
|
||||
<h4 className="font-bold text-on-surface">
|
||||
<Translate id="modRelease.installStepOne">
|
||||
Download the release DLL.
|
||||
</Translate>
|
||||
</h4>
|
||||
<p className="text-sm text-on-surface-variant">
|
||||
<Translate id="modRelease.installStepOneHint">
|
||||
Use the GitHub release asset or the route below.
|
||||
</Translate>
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
<li className="flex gap-4">
|
||||
<span className="flex h-8 w-8 flex-none items-center justify-center rounded-full border border-primary/20 bg-primary/10 font-headline text-sm font-bold text-primary">
|
||||
02
|
||||
</span>
|
||||
<div>
|
||||
<h4 className="font-bold text-on-surface">
|
||||
<Translate id="modRelease.installStepTwoTitle">
|
||||
Copy into the game folder
|
||||
</Translate>
|
||||
</h4>
|
||||
<p className="text-sm text-on-surface-variant">
|
||||
<Translate id="modRelease.installStepTwo">
|
||||
Copy it to your Data Center `Mods/` folder.
|
||||
</Translate>
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
<li className="flex gap-4">
|
||||
<span className="flex h-8 w-8 flex-none items-center justify-center rounded-full border border-primary/20 bg-primary/10 font-headline text-sm font-bold text-primary">
|
||||
03
|
||||
</span>
|
||||
<div>
|
||||
<h4 className="font-bold text-on-surface">
|
||||
<Translate id="modRelease.installStepThreeTitle">Launch</Translate>
|
||||
</h4>
|
||||
<p className="text-sm text-on-surface-variant">
|
||||
<Translate id="modRelease.installStepThree">
|
||||
Start the game with MelonLoader.
|
||||
</Translate>
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
</ol>
|
||||
)}
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className="mb-6 flex items-center gap-2 font-headline text-2xl font-bold text-secondary">
|
||||
<span className="material-symbols-outlined text-primary">code</span>
|
||||
<Translate id="modRelease.dllRouteTitle">Direct DLL route</Translate>
|
||||
</h2>
|
||||
<div className="group relative">
|
||||
<div className="absolute -inset-0.5 rounded-xl bg-gradient-to-r from-primary/20 to-tertiary/20 opacity-30 blur transition group-hover:opacity-50" />
|
||||
<div className="relative overflow-x-auto rounded-xl bg-surface-container-highest p-6 font-mono text-sm text-on-surface">
|
||||
<code>{downloadPath}</code>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</article>
|
||||
|
||||
<aside className="space-y-6 lg:col-span-4" aria-label="Download sidebar">
|
||||
<div className="space-y-3">
|
||||
{releaseReady ? (
|
||||
<a
|
||||
className="flex w-full items-center justify-center gap-2 rounded-xl bg-gradient-to-br from-primary to-primary-container py-4 font-headline font-bold text-on-primary shadow-[0_0_32px_-4px_rgba(0,191,165,0.35)] transition hover:scale-[1.02] active:scale-[0.98]"
|
||||
href={downloadUrl}
|
||||
>
|
||||
<span className="material-symbols-outlined">download</span>
|
||||
<Translate id="modRelease.downloadButton">Download DLL</Translate>
|
||||
</a>
|
||||
) : (
|
||||
<button
|
||||
className="flex w-full cursor-not-allowed items-center justify-center gap-2 rounded-xl bg-surface-container py-4 font-headline font-bold text-on-surface-variant opacity-80 outline outline-1 outline-outline-variant/25"
|
||||
disabled
|
||||
type="button"
|
||||
>
|
||||
<span className="material-symbols-outlined">lock</span>
|
||||
<Translate id="modRelease.notReleasedYet">Not released yet</Translate>
|
||||
</button>
|
||||
)}
|
||||
{docPath ? (
|
||||
<Link
|
||||
className="flex w-full items-center justify-center gap-2 rounded-xl border border-outline-variant/40 bg-surface-container py-4 font-headline font-bold text-on-surface transition hover:border-outline-variant hover:bg-surface-container-high"
|
||||
to={docPath}
|
||||
>
|
||||
<span className="material-symbols-outlined">open_in_new</span>
|
||||
<Translate id="modRelease.releaseNotesButton">Open module docs</Translate>
|
||||
</Link>
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
<div className="rounded-xl bg-surface-container p-6 outline outline-1 outline-outline-variant/20">
|
||||
<h3 className="mb-6 font-headline text-sm font-bold uppercase tracking-widest text-primary">
|
||||
<Translate id="modRelease.sidebarMetaTitle">Reference metadata</Translate>
|
||||
</h3>
|
||||
<dl className="space-y-4 text-sm">
|
||||
<div className="flex items-center justify-between border-b border-outline-variant/10 py-2">
|
||||
<dt className="text-xs font-medium text-on-surface-variant">
|
||||
<Translate id="modRelease.metaVersion">Version</Translate>
|
||||
</dt>
|
||||
<dd className="rounded bg-surface-variant px-2 py-0.5 font-mono text-xs text-primary">
|
||||
{version}
|
||||
</dd>
|
||||
</div>
|
||||
<div className="flex items-center justify-between border-b border-outline-variant/10 py-2">
|
||||
<dt className="text-xs font-medium text-on-surface-variant">
|
||||
<Translate id="modRelease.metaAuthor">Author</Translate>
|
||||
</dt>
|
||||
<dd className="text-on-surface">{author}</dd>
|
||||
</div>
|
||||
<div className="flex items-center justify-between border-b border-outline-variant/10 py-2">
|
||||
<dt className="text-xs font-medium text-on-surface-variant">
|
||||
<Translate id="modRelease.metaCategory">Category</Translate>
|
||||
</dt>
|
||||
<dd className="text-on-surface">
|
||||
{category} · {toTitleCase(kind)}
|
||||
</dd>
|
||||
</div>
|
||||
<div className="flex items-center justify-between border-b border-outline-variant/10 py-2">
|
||||
<dt className="text-xs font-medium text-on-surface-variant">
|
||||
<Translate id="modRelease.metaDependencies">Dependencies</Translate>
|
||||
</dt>
|
||||
<dd className="text-right text-on-surface">
|
||||
{dependencies.length ? dependencies.join(', ') : '—'}
|
||||
</dd>
|
||||
</div>
|
||||
<div className="flex items-center justify-between py-2">
|
||||
<dt className="text-xs font-medium text-on-surface-variant">
|
||||
<Translate id="modRelease.metaCodeLanguage">Languages</Translate>
|
||||
</dt>
|
||||
<dd className="text-on-surface">{codeLanguages.join(', ')}</dd>
|
||||
</div>
|
||||
</dl>
|
||||
<p className="mt-6 text-xs leading-relaxed text-on-surface-variant">
|
||||
<Translate id="modRelease.sidebarHint">
|
||||
The download route redirects to the latest GitHub release asset when published.
|
||||
</Translate>
|
||||
</p>
|
||||
</div>
|
||||
</aside>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
@import url("https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&family=Space+Grotesk:wght@300;500;700&display=swap");
|
||||
@import "tailwindcss";
|
||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&family=Space+Grotesk:wght@300;500;700&display=swap');
|
||||
@import 'tailwindcss';
|
||||
|
||||
/* Luminescent Architect — design tokens (see docs/contributors/luminescent-design-system.md) */
|
||||
@theme {
|
||||
@@ -61,13 +61,13 @@
|
||||
--color-accent-violet: #1cede1;
|
||||
--color-code-bg: #001110;
|
||||
--color-code-surface: #002b29;
|
||||
--font-sans: "Inter", ui-sans-serif, system-ui, sans-serif;
|
||||
--font-headline: "Space Grotesk", ui-sans-serif, system-ui, sans-serif;
|
||||
--font-mono: "JetBrains Mono", ui-monospace, "Cascadia Code", monospace;
|
||||
--font-sans: 'Inter', ui-sans-serif, system-ui, sans-serif;
|
||||
--font-headline: 'Space Grotesk', ui-sans-serif, system-ui, sans-serif;
|
||||
--font-mono: 'JetBrains Mono', ui-monospace, 'Cascadia Code', monospace;
|
||||
}
|
||||
|
||||
:root,
|
||||
[data-theme="dark"] {
|
||||
[data-theme='dark'] {
|
||||
--ifm-color-primary: #61f4d8;
|
||||
--ifm-color-primary-dark: #4fe5ca;
|
||||
--ifm-color-primary-darker: #08c1a6;
|
||||
@@ -92,7 +92,7 @@ html {
|
||||
}
|
||||
|
||||
html.dark,
|
||||
html[data-theme="dark"] {
|
||||
html[data-theme='dark'] {
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
@@ -166,7 +166,7 @@ body {
|
||||
box-shadow: inset 0 -2px 0 0 var(--color-primary);
|
||||
}
|
||||
|
||||
.navbar [class*="colorModeToggle"] {
|
||||
.navbar [class*='colorModeToggle'] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@@ -193,23 +193,23 @@ body {
|
||||
}
|
||||
|
||||
.nav-link-mods::before {
|
||||
content: "🧩";
|
||||
content: '🧩';
|
||||
}
|
||||
|
||||
.nav-link-discord::before {
|
||||
content: "💬";
|
||||
content: '💬';
|
||||
}
|
||||
|
||||
.nav-link-support::before {
|
||||
content: "🛟";
|
||||
content: '🛟';
|
||||
}
|
||||
|
||||
.nav-link-github::before {
|
||||
content: "⌁";
|
||||
content: '⌁';
|
||||
}
|
||||
|
||||
.nav-locale::before {
|
||||
content: "🌐";
|
||||
content: '🌐';
|
||||
}
|
||||
|
||||
/* Editorial bleed + hero (homepage) */
|
||||
@@ -275,7 +275,12 @@ body {
|
||||
}
|
||||
|
||||
.text-gradient-brand {
|
||||
background-image: linear-gradient(90deg, var(--color-primary), var(--color-secondary), var(--color-tertiary));
|
||||
background-image: linear-gradient(
|
||||
90deg,
|
||||
var(--color-primary),
|
||||
var(--color-secondary),
|
||||
var(--color-tertiary)
|
||||
);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
@@ -307,7 +312,10 @@ body {
|
||||
box-shadow: 0 18px 36px rgba(0, 0, 0, 0.35);
|
||||
-webkit-backdrop-filter: blur(12px) saturate(125%);
|
||||
backdrop-filter: blur(12px) saturate(125%);
|
||||
transition: transform 0.28s ease, box-shadow 0.28s ease, border-color 0.28s ease;
|
||||
transition:
|
||||
transform 0.28s ease,
|
||||
box-shadow 0.28s ease,
|
||||
border-color 0.28s ease;
|
||||
}
|
||||
|
||||
.app-card-glow {
|
||||
@@ -315,7 +323,7 @@ body {
|
||||
}
|
||||
|
||||
.app-card-glow::after {
|
||||
content: "";
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: -1px;
|
||||
border-radius: inherit;
|
||||
@@ -326,7 +334,9 @@ body {
|
||||
.app-card-motion:hover {
|
||||
transform: translateY(-5px);
|
||||
border-color: rgba(97, 244, 216, 0.25);
|
||||
box-shadow: 0 24px 42px rgba(0, 0, 0, 0.4), 0 0 32px -4px rgba(0, 191, 165, 0.12);
|
||||
box-shadow:
|
||||
0 24px 42px rgba(0, 0, 0, 0.4),
|
||||
0 0 32px -4px rgba(0, 191, 165, 0.12);
|
||||
}
|
||||
|
||||
.btn-primary,
|
||||
@@ -337,7 +347,11 @@ body {
|
||||
justify-content: center;
|
||||
gap: 0.5rem;
|
||||
text-decoration: none !important;
|
||||
transition: transform 0.25s ease, box-shadow 0.25s ease, background 0.25s ease, color 0.25s ease;
|
||||
transition:
|
||||
transform 0.25s ease,
|
||||
box-shadow 0.25s ease,
|
||||
background 0.25s ease,
|
||||
color 0.25s ease;
|
||||
}
|
||||
|
||||
/* Primary CTA: 135° primary → primary-container, on-primary text */
|
||||
@@ -354,7 +368,9 @@ body {
|
||||
.btn-primary:hover {
|
||||
color: var(--color-on-primary);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 0 20px rgba(97, 244, 216, 0.3), 0 14px 28px rgba(0, 0, 0, 0.35);
|
||||
box-shadow:
|
||||
0 0 20px rgba(97, 244, 216, 0.3),
|
||||
0 14px 28px rgba(0, 0, 0, 0.35);
|
||||
}
|
||||
|
||||
/* Secondary: ghost border outline-variant @ 40% */
|
||||
@@ -405,10 +421,15 @@ body {
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
/* Doc canvas — editorial bleed (wiki layout alignment); no hard section borders */
|
||||
.theme-doc-wrapper {
|
||||
background: linear-gradient(180deg, var(--color-surface-container-low) 0%, var(--color-background) 42%);
|
||||
}
|
||||
|
||||
.theme-doc-root .theme-doc-sidebar-container {
|
||||
border: 0;
|
||||
background: var(--color-surface-container-low);
|
||||
box-shadow: inset -1px 0 0 rgba(15, 81, 76, 0.12);
|
||||
background: color-mix(in srgb, var(--color-surface-container-low) 92%, transparent);
|
||||
box-shadow: inset -1px 0 0 color-mix(in srgb, var(--color-outline-variant) 12%, transparent);
|
||||
}
|
||||
|
||||
.menu {
|
||||
@@ -423,7 +444,10 @@ body {
|
||||
padding-left: 0.75rem;
|
||||
color: var(--color-on-surface-variant);
|
||||
font-weight: 500;
|
||||
transition: color 0.22s ease, background 0.22s ease, border-color 0.22s ease;
|
||||
transition:
|
||||
color 0.22s ease,
|
||||
background 0.22s ease,
|
||||
border-color 0.22s ease;
|
||||
}
|
||||
|
||||
.menu__link:hover {
|
||||
@@ -458,7 +482,7 @@ body {
|
||||
|
||||
.theme-doc-markdown h2::after,
|
||||
.theme-doc-markdown h3::after {
|
||||
content: "";
|
||||
content: '';
|
||||
display: block;
|
||||
width: 64px;
|
||||
height: 2px;
|
||||
@@ -494,10 +518,16 @@ body {
|
||||
}
|
||||
|
||||
.theme-doc-markdown pre {
|
||||
background: linear-gradient(180deg, var(--color-surface-container-highest) 0%, var(--color-surface-container-high) 100%) !important;
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
var(--color-surface-container-highest) 0%,
|
||||
var(--color-surface-container-high) 100%
|
||||
) !important;
|
||||
border-radius: 0.75rem;
|
||||
border: 0;
|
||||
box-shadow: 0 18px 32px rgba(0, 0, 0, 0.35), inset 0 0 0 1px rgba(15, 81, 76, 0.12);
|
||||
box-shadow:
|
||||
0 18px 32px rgba(0, 0, 0, 0.35),
|
||||
inset 0 0 0 1px rgba(15, 81, 76, 0.12);
|
||||
}
|
||||
|
||||
.theme-doc-markdown pre code {
|
||||
@@ -506,7 +536,7 @@ body {
|
||||
|
||||
.footer {
|
||||
border: 0;
|
||||
border-top: 1px solid rgba(0, 36, 34, 0.15);
|
||||
box-shadow: 0 -12px 40px -28px color-mix(in srgb, var(--color-primary) 14%, transparent);
|
||||
background: var(--color-background);
|
||||
color: rgba(192, 252, 246, 0.4);
|
||||
font-size: 0.75rem;
|
||||
@@ -540,15 +570,15 @@ body {
|
||||
}
|
||||
|
||||
.footer-link-github::before {
|
||||
content: "⌁";
|
||||
content: '⌁';
|
||||
}
|
||||
|
||||
.footer-link-discord::before {
|
||||
content: "💬";
|
||||
content: '💬';
|
||||
}
|
||||
|
||||
.footer-link-support::before {
|
||||
content: "🛟";
|
||||
content: '🛟';
|
||||
}
|
||||
|
||||
.button.button--primary {
|
||||
@@ -573,7 +603,9 @@ body {
|
||||
.mod-release-card {
|
||||
background: linear-gradient(180deg, rgba(0, 30, 28, 0.85) 0%, rgba(0, 17, 16, 0.92) 100%);
|
||||
border-radius: 0.8rem;
|
||||
box-shadow: inset 0 0 0 1px rgba(15, 81, 76, 0.12), 0 12px 24px rgba(0, 0, 0, 0.35);
|
||||
box-shadow:
|
||||
inset 0 0 0 1px rgba(15, 81, 76, 0.12),
|
||||
0 12px 24px rgba(0, 0, 0, 0.35);
|
||||
}
|
||||
|
||||
.mod-release-badge {
|
||||
@@ -637,8 +669,12 @@ body {
|
||||
|
||||
/* Optional: Material Symbols (loaded via docusaurus.config.js headTags) */
|
||||
.material-symbols-outlined {
|
||||
font-family: "Material Symbols Outlined", sans-serif;
|
||||
font-variation-settings: "FILL" 0, "wght" 400, "GRAD" 0, "opsz" 24;
|
||||
font-family: 'Material Symbols Outlined', sans-serif;
|
||||
font-variation-settings:
|
||||
'FILL' 0,
|
||||
'wght' 400,
|
||||
'GRAD' 0,
|
||||
'opsz' 24;
|
||||
font-style: normal;
|
||||
line-height: 1;
|
||||
letter-spacing: normal;
|
||||
|
||||
@@ -22,9 +22,9 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
type: 'plugin',
|
||||
description: 'Export-focused asset tooling for Data Center workflows.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'FrikaMF'],
|
||||
dependencies: ['MelonLoader', 'gregFramework'],
|
||||
wikiPath: '/wiki/mods/extensions/ffm-plugin-asset-exporter',
|
||||
releasePath: '/wiki/releases/plugins/ffm-plugin-asset-exporter-release',
|
||||
downloadPath: '/plugin/FFM.Plugin.AssetExporter.dll',
|
||||
@@ -34,11 +34,11 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
id: 'ffm-plugin-multiplayer',
|
||||
name: 'FFM.Plugin.Multiplayer',
|
||||
type: 'plugin',
|
||||
description: 'Multiplayer-oriented plugin surface for FrikaMF ecosystems.',
|
||||
description: 'Multiplayer-oriented plugin surface for gregFramework ecosystems.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'FrikaMF'],
|
||||
dependencies: ['MelonLoader', 'gregFramework'],
|
||||
wikiPath: '/wiki/mods/extensions/ffm-plugin-multiplayer',
|
||||
releasePath: '/wiki/releases/plugins/ffm-plugin-multiplayer-release',
|
||||
downloadPath: '/plugin/FFM.Plugin.Multiplayer.dll',
|
||||
@@ -50,9 +50,9 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
type: 'plugin',
|
||||
description: 'Player model extension plugin for runtime and presentation logic.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'FrikaMF'],
|
||||
dependencies: ['MelonLoader', 'gregFramework'],
|
||||
wikiPath: '/wiki/mods/extensions/ffm-plugin-player-models',
|
||||
releasePath: '/wiki/releases/plugins/ffm-plugin-player-models-release',
|
||||
downloadPath: '/plugin/FFM.Plugin.PlayerModels.dll',
|
||||
@@ -64,9 +64,9 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
type: 'plugin',
|
||||
description: 'Sysadmin utility plugin for diagnostics and operations.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'FrikaMF'],
|
||||
dependencies: ['MelonLoader', 'gregFramework'],
|
||||
wikiPath: '/wiki/mods/extensions/ffm-plugin-sysadmin',
|
||||
releasePath: '/wiki/releases/plugins/ffm-plugin-sysadmin-release',
|
||||
downloadPath: '/plugin/FFM.Plugin.Sysadmin.dll',
|
||||
@@ -78,9 +78,9 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
type: 'plugin',
|
||||
description: 'Bridge plugin between game runtime data and web UI overlays.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'FrikaMF'],
|
||||
dependencies: ['MelonLoader', 'gregFramework'],
|
||||
wikiPath: '/wiki/mods/extensions/ffm-plugin-web-ui-bridge',
|
||||
releasePath: '/wiki/releases/plugins/ffm-plugin-web-ui-bridge-release',
|
||||
downloadPath: '/plugin/FFM.Plugin.WebUIBridge.dll',
|
||||
@@ -90,9 +90,10 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
id: 'fmf-modpathredirector',
|
||||
name: 'FMF.ModPathRedirector',
|
||||
type: 'plugin',
|
||||
description: 'MelonLoader plugin: waits for each subscribed Workshop item (Steam + StreamingAssets/Mods/workshop_*) before MelonMods load.',
|
||||
description:
|
||||
'MelonLoader plugin: waits for each subscribed Workshop item (Steam + StreamingAssets/Mods/workshop_*) before MelonMods load.',
|
||||
version: '1.5.0',
|
||||
author: 'DataCenterExporter / FrikaMF Community',
|
||||
author: 'DataCenterExporter / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'Steam client'],
|
||||
wikiPath: '/wiki/workshop-uploader',
|
||||
@@ -106,7 +107,7 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
type: 'mod',
|
||||
description: 'Console interaction guardrails for safer gameplay input handling.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'Harmony'],
|
||||
wikiPath: '/wiki/mods/mods/fmf-console-input-guard',
|
||||
@@ -120,7 +121,7 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
type: 'mod',
|
||||
description: 'Gameplay mod for employee theming and behavior customization.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'Harmony'],
|
||||
wikiPath: '/wiki/mods/mods/fmf-gregify-employees',
|
||||
@@ -134,7 +135,7 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
type: 'mod',
|
||||
description: 'In-world hex color labels for cable spinners and racks.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'Harmony'],
|
||||
wikiPath: '/wiki/mods/extensions/fmf-hex-label-mod',
|
||||
@@ -148,7 +149,7 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
type: 'mod',
|
||||
description: 'Localization compatibility bridge for mixed mod stacks.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader'],
|
||||
wikiPath: '/wiki/mods/extensions/fmf-lang-compat-bridge',
|
||||
@@ -162,7 +163,7 @@ export const moduleCatalog: ModuleEntry[] = [
|
||||
type: 'mod',
|
||||
description: 'Replaces and modernizes selected in-game UI layers.',
|
||||
version: 'NotReleasedYet',
|
||||
author: 'mleem97 / FrikaMF Community',
|
||||
author: 'mleem97 / gregFramework Community',
|
||||
languages: ['C#'],
|
||||
dependencies: ['MelonLoader', 'Harmony'],
|
||||
wikiPath: '/wiki/mods/extensions/fmf-ui-replacement-mod',
|
||||
|
||||
@@ -1,45 +1,23 @@
|
||||
import React, { useMemo } from 'react';
|
||||
import React, {useMemo} from 'react';
|
||||
import Layout from '@theme/Layout';
|
||||
import Link from '@docusaurus/Link';
|
||||
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
||||
import { motion, type Variants, useReducedMotion } from 'framer-motion';
|
||||
import { getHomepageContent } from '../i18n/homepage';
|
||||
import {motion, type Variants, useReducedMotion} from 'framer-motion';
|
||||
import {getHomepageContent} from '../i18n/homepage';
|
||||
import gregImage from '../image.png';
|
||||
import {
|
||||
FaArrowUpRightFromSquare,
|
||||
FaBookOpen,
|
||||
FaCode,
|
||||
FaDiscord,
|
||||
FaGithub,
|
||||
FaLifeRing,
|
||||
FaPeopleGroup,
|
||||
FaShop,
|
||||
FaScrewdriverWrench,
|
||||
} from 'react-icons/fa6';
|
||||
import {FaArrowUpRightFromSquare, FaDiscord, FaGithub, FaLifeRing, FaShop} from 'react-icons/fa6';
|
||||
|
||||
type FeatureItem = {
|
||||
icon: React.ReactNode;
|
||||
title: string;
|
||||
description: string;
|
||||
};
|
||||
|
||||
type DocPathItem = {
|
||||
title: string;
|
||||
description: string;
|
||||
link: string;
|
||||
};
|
||||
|
||||
const viewport = { once: true, margin: '-90px' };
|
||||
const viewport = {once: true, margin: '-90px'};
|
||||
|
||||
function buildVariants(reducedMotion: boolean) {
|
||||
const section: Variants = reducedMotion
|
||||
? { hidden: { opacity: 0 }, show: { opacity: 1 } }
|
||||
? {hidden: {opacity: 0}, show: {opacity: 1}}
|
||||
: {
|
||||
hidden: { opacity: 0, y: 26 },
|
||||
hidden: {opacity: 0, y: 26},
|
||||
show: {
|
||||
opacity: 1,
|
||||
y: 0,
|
||||
transition: { duration: 0.65, ease: [0.16, 1, 0.3, 1] },
|
||||
transition: {duration: 0.65, ease: [0.16, 1, 0.3, 1]},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -54,100 +32,75 @@ function buildVariants(reducedMotion: boolean) {
|
||||
};
|
||||
|
||||
const card: Variants = reducedMotion
|
||||
? { hidden: { opacity: 0 }, show: { opacity: 1 } }
|
||||
? {hidden: {opacity: 0}, show: {opacity: 1}}
|
||||
: {
|
||||
hidden: { opacity: 0, y: 18, scale: 0.98 },
|
||||
hidden: {opacity: 0, y: 18, scale: 0.98},
|
||||
show: {
|
||||
opacity: 1,
|
||||
y: 0,
|
||||
scale: 1,
|
||||
transition: { duration: 0.45, ease: [0.16, 1, 0.3, 1] },
|
||||
transition: {duration: 0.45, ease: [0.16, 1, 0.3, 1]},
|
||||
},
|
||||
};
|
||||
|
||||
const textReveal: Variants = reducedMotion
|
||||
? { hidden: { opacity: 0 }, show: { opacity: 1 } }
|
||||
? {hidden: {opacity: 0}, show: {opacity: 1}}
|
||||
: {
|
||||
hidden: { opacity: 0, y: 18 },
|
||||
hidden: {opacity: 0, y: 18},
|
||||
show: {
|
||||
opacity: 1,
|
||||
y: 0,
|
||||
transition: { duration: 0.5, ease: [0.16, 1, 0.3, 1] },
|
||||
transition: {duration: 0.5, ease: [0.16, 1, 0.3, 1]},
|
||||
},
|
||||
};
|
||||
|
||||
return { section, grid, card, textReveal };
|
||||
return {section, grid, card, textReveal};
|
||||
}
|
||||
|
||||
export default function HomePage(): JSX.Element {
|
||||
const {
|
||||
i18n: { currentLocale },
|
||||
i18n: {currentLocale},
|
||||
} = useDocusaurusContext();
|
||||
|
||||
const t = getHomepageContent(currentLocale);
|
||||
const reducedMotion = useReducedMotion();
|
||||
const variants = useMemo(() => buildVariants(Boolean(reducedMotion)), [reducedMotion]);
|
||||
|
||||
const features: FeatureItem[] = [
|
||||
{
|
||||
icon: <FaScrewdriverWrench className="text-xl" />,
|
||||
title: t.featureTitles[0],
|
||||
description: t.featureDescriptions[0],
|
||||
},
|
||||
{
|
||||
icon: <FaCode className="text-xl" />,
|
||||
title: t.featureTitles[1],
|
||||
description: t.featureDescriptions[1],
|
||||
},
|
||||
{
|
||||
icon: <FaBookOpen className="text-xl" />,
|
||||
title: t.featureTitles[2],
|
||||
description: t.featureDescriptions[2],
|
||||
},
|
||||
{
|
||||
icon: <FaPeopleGroup className="text-xl" />,
|
||||
title: t.featureTitles[3],
|
||||
description: t.featureDescriptions[3],
|
||||
},
|
||||
];
|
||||
|
||||
const knowledgePaths: DocPathItem[] = [
|
||||
{ title: 'Wiki Overview', description: 'Canonical docs entrypoint under /wiki.', link: '/wiki' },
|
||||
{ title: 'Framework Core', description: 'Runtime hooks, bridge, events and architecture.', link: '/wiki/mods/framework' },
|
||||
{ title: 'Plugin Wiki', description: 'Plugin-specific docs and release pages.', link: '/wiki/mods/extensions/' },
|
||||
{ title: 'Mod Wiki', description: 'Gameplay mods, release state and module docs.', link: '/wiki/mods/mods' },
|
||||
{ title: 'FMF Hooks Catalog', description: 'Auto-generated hook strings and event-id map from framework sources.', link: '/wiki/reference/fmf-hooks-catalog' },
|
||||
{ title: 'Release Channels', description: 'Steam Workshop for discovery; GitHub for beta and alternate DLLs.', link: '/wiki/reference/release-channels' },
|
||||
{ title: 'Unified Roadmap', description: 'Consolidated roadmap with duplicate tracks removed.', link: '/wiki/roadmap/unified-roadmap' },
|
||||
{ title: 'Mods Catalog', description: 'Dynamic /mods catalog with wiki and download links.', link: '/mods' },
|
||||
];
|
||||
|
||||
const workflowPaths: DocPathItem[] = [
|
||||
{ title: 'End-User Docs', description: 'Install, update and troubleshooting paths.', link: '/wiki/wiki-import/EndUser/End-User-Release' },
|
||||
{ title: 'Mod Developer Docs', description: 'Setup, debug and hook integration guides.', link: '/wiki/wiki-import/ModDevs/Mod-Developer-Debug' },
|
||||
{ title: 'Repo Inventory', description: 'Monorepo layout, projects, and solution drift for contributors.', link: '/wiki/contributors/repo-inventory' },
|
||||
{ title: 'Contributor Workflow', description: 'Contribution standards and repository workflow.', link: '/wiki/contributors/docusaurus-workflow' },
|
||||
{ title: 'Plugin Security Audit', description: 'Git-link submission and malicious-code audit process.', link: '/wiki/contributors/plugin-submission-audit' },
|
||||
];
|
||||
|
||||
return (
|
||||
<Layout
|
||||
description="Community docs for FrikaMF, standalone Rust stacks, multiplayer, and plugins.">
|
||||
title="Home"
|
||||
description="Community documentation for gregFramework — Data Center modding, plugins, and hooks."
|
||||
>
|
||||
<main className="bg-background text-on-surface font-sans min-h-screen editorial-bleed bg-hero-gradient">
|
||||
<section className="hero-motion-wrap relative flex min-h-[68vh] flex-col items-center justify-center overflow-hidden px-4 py-20 text-center">
|
||||
<section className="hero-motion-wrap relative flex min-h-[72vh] flex-col items-center justify-center overflow-hidden px-4 py-24 text-center">
|
||||
<div className="hero-particles" aria-hidden="true" />
|
||||
<div className="hero-orb hero-orb-pink" aria-hidden="true" />
|
||||
<div className="hero-orb hero-orb-green" aria-hidden="true" />
|
||||
|
||||
<motion.h1
|
||||
className="homepage-logo-title text-reveal-glow mb-8 text-4xl font-black leading-none tracking-tight text-on-surface md:text-6xl"
|
||||
<motion.div
|
||||
className="mb-8 inline-flex items-center gap-2 rounded-full border border-outline-variant/20 bg-surface-container-high px-4 py-1.5"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.textReveal}>
|
||||
FRIKA MOD <span className="text-primary">🍪</span>
|
||||
<br />
|
||||
<span className="text-gradient-brand">FRAMEWORK</span>
|
||||
variants={variants.textReveal}
|
||||
>
|
||||
<span className="h-2 w-2 animate-pulse rounded-full bg-primary" aria-hidden />
|
||||
<span className="text-xs font-bold uppercase tracking-widest text-primary-dim">
|
||||
{t.heroBadge}
|
||||
</span>
|
||||
</motion.div>
|
||||
|
||||
<motion.h1
|
||||
className="homepage-logo-title mb-6 text-5xl font-black leading-none tracking-tighter text-on-surface md:text-7xl lg:text-8xl"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.textReveal}
|
||||
>
|
||||
<span className="text-on-surface">{t.heroBrandLine1}</span>
|
||||
<span className="bg-gradient-to-br from-primary to-primary-container bg-clip-text text-transparent">
|
||||
{t.heroBrandLine2Gradient}
|
||||
</span>
|
||||
</motion.h1>
|
||||
|
||||
<motion.h2
|
||||
@@ -156,35 +109,41 @@ export default function HomePage(): JSX.Element {
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.textReveal}
|
||||
transition={{ delay: reducedMotion ? 0 : 0.08 }}>
|
||||
transition={{delay: reducedMotion ? 0 : 0.08}}
|
||||
>
|
||||
{t.heroLine1}
|
||||
<br />
|
||||
<span className="text-on-surface-variant">{t.heroLine2}</span>
|
||||
</motion.h2>
|
||||
|
||||
<motion.p
|
||||
className="mb-10 max-w-lg text-base font-medium text-on-surface-variant md:text-lg"
|
||||
className="mb-10 max-w-2xl text-base font-medium leading-relaxed text-on-surface-variant md:text-xl"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.textReveal}
|
||||
transition={{ delay: reducedMotion ? 0 : 0.14 }}>
|
||||
transition={{delay: reducedMotion ? 0 : 0.14}}
|
||||
>
|
||||
{t.heroSub1}
|
||||
<br />
|
||||
{t.heroSub2}
|
||||
</motion.p>
|
||||
|
||||
<motion.div
|
||||
className="flex flex-wrap items-center justify-center gap-3"
|
||||
className="flex flex-wrap items-center justify-center gap-4"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.textReveal}
|
||||
transition={{ delay: reducedMotion ? 0 : 0.22 }}>
|
||||
<Link to="/wiki/mods/framework" className="btn-primary hero-glow px-8 py-4 rounded-xl text-lg">
|
||||
transition={{delay: reducedMotion ? 0 : 0.22}}
|
||||
>
|
||||
<Link
|
||||
to="/wiki/mods/framework"
|
||||
className="btn-primary hero-glow rounded-lg px-10 py-4 text-lg"
|
||||
>
|
||||
{t.ctaStart}
|
||||
</Link>
|
||||
<Link to="/mods" className="btn-outline px-8 py-4 rounded-xl text-lg">
|
||||
<Link to="/mods" className="btn-outline rounded-lg px-10 py-4 text-lg">
|
||||
{t.ctaMods}
|
||||
</Link>
|
||||
</motion.div>
|
||||
@@ -192,55 +151,178 @@ export default function HomePage(): JSX.Element {
|
||||
|
||||
<motion.section
|
||||
id="features"
|
||||
className="section-surface-alt px-4 py-20"
|
||||
className="section-surface-alt px-4 py-24"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.section}>
|
||||
<motion.div className="mx-auto grid max-w-6xl grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-4" variants={variants.grid}>
|
||||
{features.map((feature) => (
|
||||
<motion.article
|
||||
key={feature.title}
|
||||
className="app-card app-card-motion app-card-glow glass-card p-5 rounded-xl text-on-surface"
|
||||
variants={variants.card}
|
||||
whileHover={
|
||||
reducedMotion
|
||||
? undefined
|
||||
: {
|
||||
y: -6,
|
||||
rotateX: 2,
|
||||
rotateY: -2,
|
||||
scale: 1.01,
|
||||
transition: { type: 'spring', stiffness: 280, damping: 18 },
|
||||
}
|
||||
}
|
||||
style={{ transformStyle: 'preserve-3d' }}>
|
||||
<h3 className="mb-2 flex items-center gap-2 font-headline text-lg font-bold text-on-surface">
|
||||
<span className="text-primary">{feature.icon}</span>
|
||||
<span>{feature.title}</span>
|
||||
variants={variants.section}
|
||||
>
|
||||
<motion.div
|
||||
className="mx-auto grid max-w-7xl grid-cols-1 gap-6 md:grid-cols-12"
|
||||
variants={variants.grid}
|
||||
>
|
||||
<motion.article
|
||||
className="app-card app-card-motion app-card-glow glass-card relative overflow-hidden rounded-2xl p-10 md:col-span-8"
|
||||
variants={variants.card}
|
||||
whileHover={
|
||||
reducedMotion
|
||||
? undefined
|
||||
: {
|
||||
y: -4,
|
||||
transition: {type: 'spring', stiffness: 280, damping: 18},
|
||||
}
|
||||
}
|
||||
>
|
||||
<div className="relative z-10">
|
||||
<span className="material-symbols-outlined mb-6 text-4xl text-primary">layers</span>
|
||||
<h3 className="mb-4 font-headline text-3xl font-bold text-on-surface">
|
||||
{t.featureTitles[0]}
|
||||
</h3>
|
||||
<p className="text-sm font-medium text-on-surface-variant">{feature.description}</p>
|
||||
</motion.article>
|
||||
))}
|
||||
<p className="max-w-md text-lg leading-relaxed text-on-surface-variant">
|
||||
{t.featureDescriptions[0]}
|
||||
</p>
|
||||
</div>
|
||||
</motion.article>
|
||||
<motion.article
|
||||
className="app-card app-card-motion app-card-glow rounded-2xl border border-outline-variant/10 p-8 md:col-span-4"
|
||||
variants={variants.card}
|
||||
>
|
||||
<span className="material-symbols-outlined mb-6 text-3xl text-tertiary">cable</span>
|
||||
<h3 className="mb-3 font-headline text-xl font-bold text-on-surface">
|
||||
{t.featureTitles[1]}
|
||||
</h3>
|
||||
<p className="text-sm leading-relaxed text-on-surface-variant">
|
||||
{t.featureDescriptions[1]}
|
||||
</p>
|
||||
</motion.article>
|
||||
<motion.article
|
||||
className="app-card app-card-motion app-card-glow rounded-2xl border border-outline-variant/10 p-8 md:col-span-4"
|
||||
variants={variants.card}
|
||||
>
|
||||
<span className="material-symbols-outlined mb-6 text-3xl text-secondary">
|
||||
menu_book
|
||||
</span>
|
||||
<h3 className="mb-3 font-headline text-xl font-bold text-on-surface">
|
||||
{t.featureTitles[2]}
|
||||
</h3>
|
||||
<p className="text-sm leading-relaxed text-on-surface-variant">
|
||||
{t.featureDescriptions[2]}
|
||||
</p>
|
||||
</motion.article>
|
||||
<motion.article
|
||||
className="app-card app-card-motion app-card-glow flex flex-col justify-between rounded-2xl border border-outline-variant/10 p-10 md:col-span-8"
|
||||
variants={variants.card}
|
||||
>
|
||||
<div>
|
||||
<span className="material-symbols-outlined mb-6 text-4xl text-primary">groups</span>
|
||||
<h3 className="mb-4 font-headline text-3xl font-bold text-on-surface">
|
||||
{t.featureTitles[3]}
|
||||
</h3>
|
||||
<p className="max-w-lg text-lg leading-relaxed text-on-surface-variant">
|
||||
{t.featureDescriptions[3]}
|
||||
</p>
|
||||
</div>
|
||||
</motion.article>
|
||||
</motion.div>
|
||||
</motion.section>
|
||||
|
||||
<motion.section
|
||||
id="code"
|
||||
className="section-surface-alt px-4 py-24"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.section}
|
||||
>
|
||||
<div className="mx-auto grid max-w-7xl items-center gap-16 px-2 md:grid-cols-2">
|
||||
<div>
|
||||
<h2 className="mb-6 font-headline text-4xl font-bold text-on-surface">
|
||||
{t.codeSectionTitle}
|
||||
</h2>
|
||||
<p className="mb-8 text-lg leading-relaxed text-on-surface-variant">
|
||||
{t.codeSectionLead}
|
||||
</p>
|
||||
<ul className="space-y-4 text-on-surface-variant">
|
||||
<li className="flex items-start gap-3">
|
||||
<span className="material-symbols-outlined mt-0.5 text-primary">
|
||||
check_circle
|
||||
</span>
|
||||
<span>MelonLoader + Harmony patches with typed hook names</span>
|
||||
</li>
|
||||
<li className="flex items-start gap-3">
|
||||
<span className="material-symbols-outlined mt-0.5 text-primary">
|
||||
check_circle
|
||||
</span>
|
||||
<span>FFM plugins and FMF mods documented beside release metadata</span>
|
||||
</li>
|
||||
<li className="flex items-start gap-3">
|
||||
<span className="material-symbols-outlined mt-0.5 text-primary">
|
||||
check_circle
|
||||
</span>
|
||||
<span>Split repos: gregCore, gregMods, gregExtensions, gregWiki</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div className="rounded-xl border border-outline-variant/20 bg-surface-container-highest p-1 shadow-2xl">
|
||||
<div className="rounded-lg bg-surface-container-lowest p-6 font-mono text-sm">
|
||||
<div className="mb-4 flex gap-2">
|
||||
<div className="h-3 w-3 rounded-full bg-error-dim" />
|
||||
<div className="h-3 w-3 rounded-full bg-tertiary" />
|
||||
<div className="h-3 w-3 rounded-full bg-primary" />
|
||||
</div>
|
||||
<pre className="leading-relaxed text-on-surface/90">
|
||||
<span className="text-error-dim">using</span> MelonLoader;
|
||||
{'\n\n'}
|
||||
<span className="text-tertiary">public</span>{' '}
|
||||
<span className="text-tertiary">sealed</span>{' '}
|
||||
<span className="text-tertiary">class</span>{' '}
|
||||
<span className="text-primary">MyMod</span> : MelonMod
|
||||
{' {\n'}
|
||||
{' '}
|
||||
<span className="text-tertiary">public</span>{' '}
|
||||
<span className="text-tertiary">override</span>{' '}
|
||||
<span className="text-tertiary">void</span>{' '}
|
||||
<span className="text-primary-dim">OnInitializeMelon</span>
|
||||
{'() {\n'}
|
||||
{' '}
|
||||
<span className="text-on-surface-variant">
|
||||
// gregFramework — attach hooks, log, ship.
|
||||
</span>
|
||||
{'\n }\n}'}
|
||||
</pre>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</motion.section>
|
||||
|
||||
<motion.section
|
||||
id="docs"
|
||||
className="px-4 py-20"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.section}>
|
||||
<div className="mx-auto max-w-5xl text-center">
|
||||
<motion.h2 className="mb-10 font-headline text-3xl font-bold text-on-surface" variants={variants.textReveal}>
|
||||
Knowledge Architecture
|
||||
variants={variants.section}
|
||||
>
|
||||
<div className="mx-auto max-w-6xl text-center">
|
||||
<motion.h2
|
||||
className="mb-10 font-headline text-3xl font-bold text-on-surface"
|
||||
variants={variants.textReveal}
|
||||
>
|
||||
{t.knowledgeSectionTitle}
|
||||
</motion.h2>
|
||||
<motion.div className="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3" variants={variants.grid}>
|
||||
{knowledgePaths.map((doc) => (
|
||||
<motion.div
|
||||
className="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3"
|
||||
variants={variants.grid}
|
||||
>
|
||||
{t.knowledgeLinks.map((doc) => (
|
||||
<motion.div key={doc.link} variants={variants.card}>
|
||||
<Link to={doc.link} className="app-card app-card-motion app-card-glow rounded-lg p-5 text-left text-on-surface block group">
|
||||
<div className="mb-2 font-headline text-lg font-bold text-on-surface transition-colors group-hover:text-primary">{doc.title}</div>
|
||||
<Link
|
||||
to={doc.link}
|
||||
className="app-card app-card-motion app-card-glow group block rounded-lg p-5 text-left text-on-surface"
|
||||
>
|
||||
<div className="mb-2 font-headline text-lg font-bold text-on-surface transition-colors group-hover:text-primary">
|
||||
{doc.title}
|
||||
</div>
|
||||
<div className="text-sm text-on-surface-variant">{doc.description}</div>
|
||||
</Link>
|
||||
</motion.div>
|
||||
@@ -255,16 +337,25 @@ export default function HomePage(): JSX.Element {
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.section}>
|
||||
variants={variants.section}
|
||||
>
|
||||
<div className="mx-auto max-w-5xl text-center">
|
||||
<motion.h2 className="mb-10 font-headline text-3xl font-bold text-on-surface" variants={variants.textReveal}>
|
||||
Workflows
|
||||
<motion.h2
|
||||
className="mb-10 font-headline text-3xl font-bold text-on-surface"
|
||||
variants={variants.textReveal}
|
||||
>
|
||||
{t.workflowSectionTitle}
|
||||
</motion.h2>
|
||||
<motion.div className="grid grid-cols-1 gap-4 md:grid-cols-2" variants={variants.grid}>
|
||||
{workflowPaths.map((doc) => (
|
||||
{t.workflowLinks.map((doc) => (
|
||||
<motion.div key={doc.link} variants={variants.card}>
|
||||
<Link to={doc.link} className="app-card app-card-motion app-card-glow rounded-lg p-5 text-left text-on-surface block group">
|
||||
<div className="mb-2 font-headline text-lg font-bold text-on-surface transition-colors group-hover:text-primary">{doc.title}</div>
|
||||
<Link
|
||||
to={doc.link}
|
||||
className="app-card app-card-motion app-card-glow group block rounded-lg p-5 text-left text-on-surface"
|
||||
>
|
||||
<div className="mb-2 font-headline text-lg font-bold text-on-surface transition-colors group-hover:text-primary">
|
||||
{doc.title}
|
||||
</div>
|
||||
<div className="text-sm text-on-surface-variant">{doc.description}</div>
|
||||
</Link>
|
||||
</motion.div>
|
||||
@@ -273,27 +364,69 @@ export default function HomePage(): JSX.Element {
|
||||
</div>
|
||||
</motion.section>
|
||||
|
||||
<motion.section
|
||||
id="discord-cta"
|
||||
className="px-4 py-24"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.section}
|
||||
>
|
||||
<div className="relative mx-auto max-w-4xl overflow-hidden rounded-3xl border border-primary/10 bg-gradient-to-br from-surface-container to-surface-container-high p-12 text-center md:p-16">
|
||||
<div
|
||||
className="absolute -left-24 -top-24 h-64 w-64 rounded-full bg-primary/10 blur-[100px]"
|
||||
aria-hidden
|
||||
/>
|
||||
<div className="relative z-10">
|
||||
<h2 className="mb-6 font-headline text-3xl font-bold text-on-surface md:text-4xl">
|
||||
{t.ctaDiscordTitle}
|
||||
</h2>
|
||||
<p className="mx-auto mb-10 max-w-xl text-lg text-on-surface-variant">
|
||||
{t.ctaDiscordLead}
|
||||
</p>
|
||||
<Link
|
||||
to="https://discord.gg/greg"
|
||||
className="btn-primary hero-glow inline-flex items-center gap-2 rounded-lg px-10 py-4 text-lg"
|
||||
>
|
||||
<FaDiscord className="text-xl" />
|
||||
{t.ctaDiscordButton}
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
</motion.section>
|
||||
|
||||
<motion.section
|
||||
id="greg-story"
|
||||
className="px-4 py-20"
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.section}>
|
||||
variants={variants.section}
|
||||
>
|
||||
<div className="mx-auto max-w-6xl">
|
||||
<motion.div className="app-card app-card-glow rounded-2xl p-6 md:p-8 flex flex-col md:flex-row md:items-center md:justify-between gap-6" variants={variants.card}>
|
||||
<motion.div
|
||||
className="app-card app-card-glow flex flex-col gap-6 rounded-2xl p-6 md:flex-row md:items-center md:justify-between md:p-8"
|
||||
variants={variants.card}
|
||||
>
|
||||
<div>
|
||||
<h2 className="mb-4 font-headline text-2xl font-bold text-on-surface md:text-3xl">{t.gregTitle}</h2>
|
||||
<p className="mb-4 text-on-surface-variant text-sm md:text-base leading-relaxed max-w-md">
|
||||
<h2 className="mb-4 font-headline text-2xl font-bold text-on-surface md:text-3xl">
|
||||
{t.gregTitle}
|
||||
</h2>
|
||||
<p className="mb-4 max-w-md text-sm leading-relaxed text-on-surface-variant md:text-base">
|
||||
{t.gregText1}
|
||||
</p>
|
||||
<p className="mb-4 text-on-surface-variant text-sm md:text-base leading-relaxed max-w-md">
|
||||
<p className="mb-4 max-w-md text-sm leading-relaxed text-on-surface-variant md:text-base">
|
||||
{t.gregText2}
|
||||
</p>
|
||||
<p className="font-headline text-lg font-bold text-secondary italic">{t.gregQuote}</p>
|
||||
<p className="font-headline text-lg font-bold italic text-secondary">
|
||||
{t.gregQuote}
|
||||
</p>
|
||||
</div>
|
||||
<motion.div className="shrink-0" whileHover={reducedMotion ? undefined : { rotate: 1.2, y: -3 }}>
|
||||
<div className="w-32 h-40 md:w-48 md:h-56 overflow-hidden rounded-xl border-2 border-primary/25">
|
||||
<motion.div
|
||||
className="shrink-0"
|
||||
whileHover={reducedMotion ? undefined : {rotate: 1.2, y: -3}}
|
||||
>
|
||||
<div className="h-40 w-32 overflow-hidden rounded-xl border-2 border-primary/25 md:h-56 md:w-48">
|
||||
<img src={gregImage} alt="Greg" className="h-full w-full object-cover" />
|
||||
</div>
|
||||
</motion.div>
|
||||
@@ -307,18 +440,27 @@ export default function HomePage(): JSX.Element {
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.section}>
|
||||
variants={variants.section}
|
||||
>
|
||||
<div className="mx-auto max-w-6xl">
|
||||
<motion.div
|
||||
className="mb-6 rounded-xl border border-outline-variant/15 bg-surface-container-high p-4"
|
||||
variants={variants.card}>
|
||||
<div className="text-sm font-semibold uppercase tracking-wide text-tertiary">{t.comingSoon}</div>
|
||||
variants={variants.card}
|
||||
>
|
||||
<div className="text-sm font-semibold uppercase tracking-wide text-tertiary">
|
||||
{t.comingSoon}
|
||||
</div>
|
||||
<div className="mt-1 text-base font-medium text-on-surface">{t.comingSoonText}</div>
|
||||
</motion.div>
|
||||
|
||||
<motion.div className="app-card app-card-glow p-6 rounded-xl flex flex-col md:flex-row md:items-center md:justify-between gap-6" variants={variants.card}>
|
||||
<motion.div
|
||||
className="app-card app-card-glow flex flex-col gap-6 rounded-xl p-6 md:flex-row md:items-center md:justify-between"
|
||||
variants={variants.card}
|
||||
>
|
||||
<div>
|
||||
<h3 className="font-headline text-2xl font-bold text-on-surface">{t.communityTitle}</h3>
|
||||
<h3 className="font-headline text-2xl font-bold text-on-surface">
|
||||
{t.communityTitle}
|
||||
</h3>
|
||||
<p className="mt-2 text-on-surface-variant">{t.communityText}</p>
|
||||
</div>
|
||||
<div className="flex flex-wrap gap-3">
|
||||
@@ -331,7 +473,10 @@ export default function HomePage(): JSX.Element {
|
||||
<Link to="https://github.com/mleem97/gregFramework" className="btn-social">
|
||||
<FaGithub /> {t.repositoryLabel}
|
||||
</Link>
|
||||
<Link to="https://discord.gg/greg" className="btn-social bg-[#5865F2] border-transparent text-white hover:bg-[#4752C4]">
|
||||
<Link
|
||||
to="https://discord.gg/greg"
|
||||
className="btn-social border-transparent bg-[#5865F2] text-white hover:bg-[#4752C4]"
|
||||
>
|
||||
<FaDiscord /> {t.joinLabel}
|
||||
</Link>
|
||||
</div>
|
||||
@@ -345,24 +490,24 @@ export default function HomePage(): JSX.Element {
|
||||
initial="hidden"
|
||||
whileInView="show"
|
||||
viewport={viewport}
|
||||
variants={variants.section}>
|
||||
<div className="mx-auto max-w-6xl flex flex-col md:flex-row md:items-center md:justify-between gap-4">
|
||||
variants={variants.section}
|
||||
>
|
||||
<div className="mx-auto flex max-w-6xl flex-col gap-4 md:flex-row md:items-center md:justify-between">
|
||||
<div>
|
||||
<h3 className="font-headline text-2xl font-bold text-on-surface">{t.supportTitle}</h3>
|
||||
<p className="text-on-surface-variant">{t.supportText}</p>
|
||||
</div>
|
||||
<motion.div whileHover={reducedMotion ? undefined : { y: -2, scale: 1.01 }}>
|
||||
<motion.div whileHover={reducedMotion ? undefined : {y: -2, scale: 1.01}}>
|
||||
<Link
|
||||
to="https://github.com/mleem97/gregFramework/issues"
|
||||
className="btn-primary inline-flex items-center gap-2 rounded-xl px-5 py-3">
|
||||
className="btn-primary inline-flex items-center gap-2 rounded-xl px-5 py-3"
|
||||
>
|
||||
<FaLifeRing /> {t.supportCta}
|
||||
</Link>
|
||||
</motion.div>
|
||||
</div>
|
||||
</motion.section>
|
||||
</main>
|
||||
|
||||
</Layout>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,16 @@
|
||||
import React, {useMemo} from 'react';
|
||||
import Layout from '@theme/Layout';
|
||||
import Link from '@docusaurus/Link';
|
||||
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
|
||||
import {moduleCatalog} from '../data/moduleCatalog';
|
||||
import {getModsPageStrings} from '../i18n/modsPage';
|
||||
|
||||
export default function ModsCatalogPage(): JSX.Element {
|
||||
const {
|
||||
i18n: {currentLocale},
|
||||
} = useDocusaurusContext();
|
||||
const m = useMemo(() => getModsPageStrings(currentLocale), [currentLocale]);
|
||||
|
||||
const grouped = useMemo(() => {
|
||||
const plugins = moduleCatalog.filter((entry) => entry.type === 'plugin');
|
||||
const mods = moduleCatalog.filter((entry) => entry.type === 'mod');
|
||||
@@ -11,85 +18,116 @@ export default function ModsCatalogPage(): JSX.Element {
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<Layout title="Mods Catalog" description="Dynamic catalog of mods and plugins with wiki and release links.">
|
||||
<main className="bg-background min-h-screen text-on-surface px-4 py-12">
|
||||
<section className="mx-auto max-w-6xl mb-10">
|
||||
<h1 className="font-headline text-4xl font-bold text-on-surface mb-3">Mods & Plugins Catalog</h1>
|
||||
<p className="text-on-surface-variant">
|
||||
This page is generated from the module catalog and links each entry to its wiki page, release page, and
|
||||
download route.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
<section className="mx-auto max-w-6xl mb-10">
|
||||
<h2 className="font-headline text-2xl font-bold text-on-surface mb-4">Plugins</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
{grouped.plugins.map((entry) => (
|
||||
<article key={entry.id} className="app-card app-card-motion app-card-glow rounded-xl p-5">
|
||||
<h3 className="font-headline text-lg font-bold text-on-surface mb-2">{entry.name}</h3>
|
||||
<p className="text-sm text-on-surface-variant mb-4">{entry.description}</p>
|
||||
<p className="text-xs text-on-surface-variant mb-1">Version: {entry.version}</p>
|
||||
<p className="text-xs text-on-surface-variant mb-4">Languages: {entry.languages.join(', ')}</p>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<Link to={entry.wikiPath} className="button button--secondary button--sm">
|
||||
Wiki
|
||||
</Link>
|
||||
<Link to={entry.releasePath} className="button button--secondary button--sm">
|
||||
Release
|
||||
</Link>
|
||||
{entry.releaseReady ? (
|
||||
<a href={entry.downloadPath} className="button button--primary button--sm">
|
||||
Download DLL
|
||||
</a>
|
||||
) : (
|
||||
<span
|
||||
className="button button--secondary button--sm cursor-not-allowed opacity-80"
|
||||
role="button"
|
||||
aria-disabled="true"
|
||||
tabIndex={-1}>
|
||||
NotReleasedYet
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
<Layout title={m.title} description={m.description}>
|
||||
<main className="bg-background min-h-screen text-on-surface">
|
||||
<div className="border-b border-outline-variant/10 bg-surface-container-low/80 py-10 backdrop-blur-md">
|
||||
<div className="mx-auto max-w-6xl px-4 md:px-8">
|
||||
<div className="mb-3 inline-flex items-center gap-2 rounded-full border border-outline-variant/20 bg-surface-container-high px-3 py-1">
|
||||
<span className="material-symbols-outlined text-sm text-primary">extension</span>
|
||||
<span className="text-[10px] font-bold uppercase tracking-widest text-primary-dim">
|
||||
gregFramework
|
||||
</span>
|
||||
</div>
|
||||
<h1 className="font-headline text-4xl font-bold tracking-tighter text-on-surface md:text-5xl">
|
||||
{m.title}
|
||||
</h1>
|
||||
<p className="mt-3 max-w-2xl text-on-surface-variant">{m.description}</p>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<section className="mx-auto max-w-6xl">
|
||||
<h2 className="font-headline text-2xl font-bold text-on-surface mb-4">Mods</h2>
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
{grouped.mods.map((entry) => (
|
||||
<article key={entry.id} className="app-card app-card-motion app-card-glow rounded-xl p-5">
|
||||
<h3 className="font-headline text-lg font-bold text-on-surface mb-2">{entry.name}</h3>
|
||||
<p className="text-sm text-on-surface-variant mb-4">{entry.description}</p>
|
||||
<p className="text-xs text-on-surface-variant mb-1">Version: {entry.version}</p>
|
||||
<p className="text-xs text-on-surface-variant mb-4">Dependencies: {entry.dependencies.join(', ')}</p>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<Link to={entry.wikiPath} className="button button--secondary button--sm">
|
||||
Wiki
|
||||
</Link>
|
||||
<Link to={entry.releasePath} className="button button--secondary button--sm">
|
||||
Release
|
||||
</Link>
|
||||
{entry.releaseReady ? (
|
||||
<a href={entry.downloadPath} className="button button--primary button--sm">
|
||||
Download DLL
|
||||
</a>
|
||||
) : (
|
||||
<span
|
||||
className="button button--secondary button--sm cursor-not-allowed opacity-80"
|
||||
role="button"
|
||||
aria-disabled="true"
|
||||
tabIndex={-1}>
|
||||
NotReleasedYet
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
<div className="mx-auto max-w-6xl px-4 py-12 md:px-8">
|
||||
<section className="mb-12">
|
||||
<h2 className="mb-4 flex items-center gap-2 font-headline text-2xl font-bold text-on-surface">
|
||||
<span className="material-symbols-outlined text-tertiary">widgets</span>
|
||||
{m.pluginsHeading}
|
||||
</h2>
|
||||
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||
{grouped.plugins.map((entry) => (
|
||||
<article
|
||||
key={entry.id}
|
||||
className="app-card app-card-motion app-card-glow rounded-xl p-5"
|
||||
>
|
||||
<h3 className="mb-2 font-headline text-lg font-bold text-on-surface">
|
||||
{entry.name}
|
||||
</h3>
|
||||
<p className="mb-4 text-sm text-on-surface-variant">{entry.description}</p>
|
||||
<p className="mb-1 text-xs text-on-surface-variant">Version: {entry.version}</p>
|
||||
<p className="mb-4 text-xs text-on-surface-variant">
|
||||
Languages: {entry.languages.join(', ')}
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<Link to={entry.wikiPath} className="button button--secondary button--sm">
|
||||
{m.wiki}
|
||||
</Link>
|
||||
<Link to={entry.releasePath} className="button button--secondary button--sm">
|
||||
{m.release}
|
||||
</Link>
|
||||
{entry.releaseReady ? (
|
||||
<a href={entry.downloadPath} className="button button--primary button--sm">
|
||||
{m.download}
|
||||
</a>
|
||||
) : (
|
||||
<span
|
||||
className="button button--secondary button--sm cursor-not-allowed opacity-80"
|
||||
role="button"
|
||||
aria-disabled="true"
|
||||
tabIndex={-1}
|
||||
>
|
||||
{m.notReleased}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className="mb-4 flex items-center gap-2 font-headline text-2xl font-bold text-on-surface">
|
||||
<span className="material-symbols-outlined text-secondary">sports_esports</span>
|
||||
{m.modsHeading}
|
||||
</h2>
|
||||
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||
{grouped.mods.map((entry) => (
|
||||
<article
|
||||
key={entry.id}
|
||||
className="app-card app-card-motion app-card-glow rounded-xl p-5"
|
||||
>
|
||||
<h3 className="mb-2 font-headline text-lg font-bold text-on-surface">
|
||||
{entry.name}
|
||||
</h3>
|
||||
<p className="mb-4 text-sm text-on-surface-variant">{entry.description}</p>
|
||||
<p className="mb-1 text-xs text-on-surface-variant">Version: {entry.version}</p>
|
||||
<p className="mb-4 text-xs text-on-surface-variant">
|
||||
Dependencies: {entry.dependencies.join(', ')}
|
||||
</p>
|
||||
<div className="flex flex-wrap gap-2">
|
||||
<Link to={entry.wikiPath} className="button button--secondary button--sm">
|
||||
{m.wiki}
|
||||
</Link>
|
||||
<Link to={entry.releasePath} className="button button--secondary button--sm">
|
||||
{m.release}
|
||||
</Link>
|
||||
{entry.releaseReady ? (
|
||||
<a href={entry.downloadPath} className="button button--primary button--sm">
|
||||
{m.download}
|
||||
</a>
|
||||
) : (
|
||||
<span
|
||||
className="button button--secondary button--sm cursor-not-allowed opacity-80"
|
||||
role="button"
|
||||
aria-disabled="true"
|
||||
tabIndex={-1}
|
||||
>
|
||||
{m.notReleased}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
</article>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</main>
|
||||
</Layout>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user