diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index e13ff301..586b75ad 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -89,22 +89,22 @@ jobs: id-token: write steps: - uses: actions/checkout@v5 - - name: "Set up Python 3.12" + - name: "Set up Python 3.x" uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.x" - name: "Install requirements" run: "python3 -m pip install -r requirements.txt" working-directory: "docs" - name: "Build documentation" - run: "python3 -m mkdocs build" + run: "zensical build --clean" working-directory: "docs" - name: "Setup Pages" uses: actions/configure-pages@v5 - - name: Upload artifact + - name: "Upload artifact" uses: actions/upload-pages-artifact@v3 with: path: "docs/site" - - name: Deploy to GitHub Pages + - name: "Deploy to GitHub Pages" id: deployment uses: actions/deploy-pages@v4 diff --git a/.github/workflows/documentation.yaml b/.github/workflows/documentation.yaml index 977cc976..15df5328 100644 --- a/.github/workflows/documentation.yaml +++ b/.github/workflows/documentation.yaml @@ -12,13 +12,13 @@ jobs: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v5 - - name: "Set up Python 3.12" + - name: "Set up Python 3.x" uses: actions/setup-python@v5 with: - python-version: "3.12" + python-version: "3.x" - name: "Install requirements" run: "python3 -m pip install -r requirements.txt" working-directory: "docs" - name: "Build documentation" - run: "python3 -m mkdocs build" + run: "zensical build --clean" working-directory: "docs" diff --git a/README.md b/README.md index 8f184447..43cea2e3 100644 --- a/README.md +++ b/README.md @@ -6,20 +6,12 @@ ## Introduction -**turnierplan.NET** is mostly written in C# using [.NET](https://dotnet.microsoft.com/). This includes the core logic, the backend API and database connection as well as all publicly visible web pages. In addition, it serves the *turnierplan.NET portal*, the client application for authenticated users, based on the [Angular](https://angular.dev/) framework. Some screenshots can be seen in the [section at the end](#screenshots). +**turnierplan.NET** is mostly written in C# using [.NET](https://dotnet.microsoft.com/). This includes the core logic, the backend API and database connection as well as all publicly visible web pages. In addition, it serves the *turnierplan.NET portal*, the client application for authenticated users, based on the [Angular](https://angular.dev/) framework. -> [!NOTE] -> The user interface is currently only available in German 🇩🇪 - -## Installation - -If you want to install **turnierplan.NET** on your server, please visit the [Installation guide](https://docs.turnierplan.net/installation). +Visit the **turnierplan.NET** documentation using the following link: [docs.turnierplan.net](https://docs.turnierplan.net). If you want to install **turnierplan.NET** on your server, please visit the [Installation guide](https://docs.turnierplan.net/installation). -## Documentation - -Visit the **turnierplan.NET** documentation using the following link: [docs.turnierplan.net](https://docs.turnierplan.net) - -The documentation sources are located in the `docs` directory. See the [docs readme](docs/README.md) for further information on how to edit and build the documentation. +> [!NOTE] +> The user interface and documentation are currently only available in German 🇩🇪 ## Development diff --git a/docs/README.md b/docs/README.md index c8f9dfa2..ba869c23 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,16 +1,16 @@ ## turnierplan.NET · Documentation -This directory contains the source markdown files and mkdocs configuration for the publically available turnierplan.NET documentation: [https://docs.turnierplan.net](https://docs.turnierplan.net). +This directory contains the turnierplan.NET documentation. The content files use an extended markdown format and are build into static HTML using [zensical](https://zensical.org). The documentation is hosted at [docs.turnierplan.net](https://docs.turnierplan.net). -In order to build the documentation locally, you must first install Python and [mkdocs](https://www.mkdocs.org): +In order to build the documentation locally, you must first install Python and `zensical`: ``` pip install -r requirements.txt ``` -Next, you can either view the rendered documentation using the mkdocs-build-in server or you can generate the static website files: +Next, you can either view the rendered documentation using the zensical built-in server or you can generate the static website files: ``` -python3 -m mkdocs serve # starts a local web server on port 8000 -python3 -m mkdocs build # generates static web site artifacts into the 'site' directory +python3 -m zensical serve # starts a local web server on port 8000 +python3 -m zensical build # generates static web site artifacts into the 'site' directory ``` diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml deleted file mode 100644 index b144ae2f..00000000 --- a/docs/mkdocs.yml +++ /dev/null @@ -1,32 +0,0 @@ -site_name: "turnierplan.NET" -site_author: "turnierplan.NET" -site_url: "https://docs.turnierplan.net" -site_description: "The administrator and user documentation for turnierplan.NET" - -repo_url: "https://github.com/turnierplan-NET/turnierplan.NET" -edit_uri: "blob/main/docs/pages/" - -copyright: "Copyright © 2026 Elias Hörner" - -docs_dir: "pages" - -theme: - name: mkdocs - color_mode: auto - user_color_mode_toggle: true - nav_style: dark - navigation_depth: 4 - locale: en - -nav: - - Home: "index.md" - - Installation: "installation.md" - - About: - - Releases: "https://github.com/turnierplan-NET/turnierplan.NET/releases" - - License: "https://github.com/turnierplan-NET/turnierplan.NET/blob/main/LICENSE" - -extra_css: - - "assets/turnierplan.css" - -markdown_extensions: - - admonition: diff --git a/docs/pages/assets/turnierplan.css b/docs/pages/assets/turnierplan.css index ac947a92..ddc08d85 100644 --- a/docs/pages/assets/turnierplan.css +++ b/docs/pages/assets/turnierplan.css @@ -1,46 +1,11 @@ -/* - * Some style improvements for the footer - */ - -footer hr { - opacity: 0.2; -} - -footer p { - font-size: 0.8em; - margin-bottom: 0.3em; -} - -/* - * Remove the sidebar on the homepage, copied from the mkdocs.org documentation - * => https://github.com/mkdocs/mkdocs/blob/2862536793b3c67d9d83c33e0dd6d50a791928f8/docs/css/extra.css#L48 - */ - -body.homepage > div.container > div.row > div.col-md-3 { - display: none; -} - -body.homepage > div.container > div.row > div.col-md-9 { - margin-left: 0; - flex: 0 0 100%; - max-width: 100%; -} -/* - * Some additional style changes for the homepage - */ - -body.homepage h1 { - margin-top: 2em; - margin-bottom: 0.7em; - text-align: center; - font-weight: bold; -} - -body.homepage > div.container p:first-of-type { - text-align: center; +.md-copyright { + /* Decrease size of the footer text */ + font-size: 0.8em; } -body.homepage > div.container img:first-of-type { - padding: unset; - border: unset; +.md-content img { + /* Center images and add small shadow */ + display: block; + margin: 0 auto; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); } diff --git a/docs/pages/configuration/index.md b/docs/pages/configuration/index.md new file mode 100644 index 00000000..f5ded4e8 --- /dev/null +++ b/docs/pages/configuration/index.md @@ -0,0 +1,122 @@ +--- +icon: lucide/wrench +--- + +# Konfiguration + +Unabhängig vom Deployment und der verwendeten Hardware/Server bietet turnierplan.NET zahlreiche Konfigurationsmöglichkeiten, welche nachfolgend näher beschrieben sind. + +## Erforderliche Einstellungen + +Für eine produktive Installation müssen die folgenden Umgebungsvariablen zwingend gesetzt sein: + +| Umgebungsvariable | Beschreibung | +|-------------------------------|--------------------------------------------------------------------| +| `Turnierplan__ApplicationUrl` | Die URL, welche für den Web-Zugriff auf den Server verwendet wird. | +| `Database__ConnectionString` | Connection-String für die PostgreSQL-Datenbank. | + +## Allgemeine Einstellungen + +Die folgenden Einstellungen können gesetzt werden, um das allgemeine Aussehen und Verhalten von turnierplan.NET zu konfigurieren: + +| Umgebungsvariable | Beschreibung | Standard | +|------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------| +| `Turnierplan__InstanceName` | Dieser Name wird in der Kopfzeile und Fußzeile von den öffentlichen Seiten angezeigt. Falls nicht spezifiert, wird der Text `turnierplan.NET` angezeigt. | - | +| `Turnierplan__LogoUrl` | Die URL für das Vereins-/Firmenlogo, welches in der Kopfzeile von öffentlichen Seiten angezeigt werden soll. Falls nicht spezifiert, wird das turnierplan.NET-Logo angezeigt. | - | +| `Turnierplan__ImprintUrl` | Die URL für den Verweis auf ein externes Impressum, welches bspw. auf Ihrer Vereins-/Firmenseite gehostet ist. | - | +| `Turnierplan__PrivacyUrl` | Die URL für den Verweis auf eine externe Datenschutz-Seite, welche bspw. auf Ihrer Vereins-/Firmenseite gehostet ist. | - | +| `Turnierplan__InitialUserName` | Der Benutzername für den initalen Administratorbenutzer. Sofern nicht angegeben, wird der Benutzername von der Anwendung vorgegeben und beim ersten Start in der Konsole ausgegeben. | - | +| `Turnierplan__InitialUserPassword` | Das Passwort für den initialen Administratorbenutzer. Sofern nicht angegeben, wird beim ersten Start der Anwendung ein zufälliges Passwort generiert und in der Konsole ausgegeben. | - | + +## Bilder-Uploads + +In der Weboberfläche können Bilddateien hochgeladen werden. Diese werden mit einer bestimmten Qualitätseinstellung in das `webp`-Format konvertiert und anschließend standardmäßig als Dateien in einem Container-Verzeichnis gespeichert. Das entsprechende Verzeichnis sollte [als Volume persistiert](http://localhost:8000/installation/#volume-mounts) werden. Folgende Einstellungen sind verfügbar: + +| Umgebungsvariable | Beschreibung | Standard | +|-----------------------------|-----------------------------------------------------------------------------------------------------------------------|---------------------------| +| `Turnierplan__ImageMaxSize` | Die maximale Dateigröße für Bild-Uploads in Bytes. Der Standard-Wert entspricht 8 MiB (8 · 1024 · 1024) | `8388608` | +| `Turnierplan__ImageQuality` | Die Qualitätseinstellung für Bild-Uploads. Ein Wert von `100` entspricht einer verlustfreien Komprimierung. | `80` | +| `ImageStorage__StoragePath` | Das Verzeichnis innerhalb vom Container, hochgeladene Bilder gespeichert werden. | `/var/turnierplan/images` | + +Alternativ können externe Services zum Speichern der Bilder konfiguriert werden. Dies hat den Vorteil, dass das Bereitstellen von Bilddateien keine CPU- und Netzwerkresourcen vom turnierplan.NET-Server beansprucht. Aktuell werden die folgenden externen Services unterstützt: + +- **AWS S3** (oder kompatibler Dienst) +- **Azure Blob Storage** + +!!! warning + Die nachfolgend vorgestellten Alternativen verwenden nicht zwangsläufig eine identische Verzeichnisstruktur zur Organisation der Dateien. Dadurch wird eine nachträgliche Umstellung ggf. erschwert! + +### AWS S3 + +Um Bilder in einem AWS S3 oder S3-kompatiblen Bucket zu speichern, müssen die folgenden Umgebungsvariablen gesetzt werden: + +| Umgebungsvariable | Beschreibung | +|---------------------------------|------------------------------------------------------------------| +| `ImageStorage__Type` | Muss `S3` sein. | +| `ImageStorage__RegionEndpoint` | Der Name der AWS-Region, bspw. `eu-central-1`. | +| `ImageStorage__ServiceUrl` | Die Service-URL, falls ein S3-kompatibler Bucket verwendet wird. | +| `ImageStorage__AccessKey` | Der Name vom Access-Key. | +| `ImageStorage__AccessKeySecret` | Der Schlüssel vom Access-Key. | +| `ImageStorage__BucketName` | Der Bucket-Name. | + +Der verwendete Access-Key benötigt Rechte zum Erstellen, Lesen und Löschen von Objekten. + +Die Eigenschaften `RegionEndpoint` und `ServiceUrl` schließen sich *gegenseitig aus*! Erstere muss verwendet werden, wenn ein AWS S3-Bucket verwendet wird. Letztere muss verwendet werden, wenn ein S3-kompatibler Bucket von einem Drittanbieter verwendet wird. + +### Azure Blob Storage + +Um Bilder in einem [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs/) Container zu speichern, müssen die folgenden Umgebungsvariablen gesetzt werden: + +| Umgebungsvariable | Beschreibung | +|------------------------------------|-------------------------------------------------------------| +| `ImageStorage__Type` | Muss `Azure` sein. | +| `ImageStorage__StorageAccountName` | Der Name des Azure Blob Storage Account. | +| `ImageStorage__ContainerName` | Der Name des Containers innerhalb vom o.g. Storage Account. | + +Standardmäßig wird ein [DefaultAzureCredential](https://learn.microsoft.com/en-us/dotnet/api/azure.identity.defaultazurecredential?view=azure-dotnet) verwendet. Falls also bspw. der turnierplan.NET-Container innerhalb eines Azure App Service betrieben wird, kann für diesen App Service eine Managed Identity erstellt und auf den Blob Storage Account berechtigt werden. Weitere Konfigurationsmöglichkeiten für Deployment-Szenarien, in denen keine Managed Identities verwendet werden können, sind nachfolgend beschrieben. + +Sofern eine Entra ID-basierte Authentifizierung verwendet wird (dies betrifft alle Optionen außer Access Keys), muss die entsprechende Managed Identity bzw. App-Registrierung die Rechte zum Erstellen, Lesen und Löschen von Blobs innerhalb vom Storage Account haben. Dies kann am besten mit der Zuweisung der Rolle [Storage Blob Data Contributor](https://learn.microsoft.com/en-us/azure/role-based-access-control/built-in-roles/storage#storage-blob-data-contributor) erreicht werden. + +#### Account Key + +Die Erstellung von einem Account Key ist in der [Dokumentation von Microsoft](https://learn.microsoft.com/en-us/azure/storage/common/storage-account-keys-manage?tabs=azure-portal) beschrieben. Um einen Account Key zu verwenden, müssen die folgenden Umgebungsvariablen *zusätzlich* zu den oben genannten gesetzt werden: + +| Umgebungsvariable | Beschreibung | +|-------------------------------|-----------------------------------------------| +| `ImageStorage__UseAccountKey` | Muss `true` sein, um Acount Key zu verwenden. | +| `ImageStorage__AccountKey` | Der eigentliche Account Key. | + +#### Client Secret + +Hierfür ist eine App-Registrierung innerhalb von Entra ID notwendig, welche wie o.g. die notwendigen Zugriffsrechte auf dem Blob Storage Account hat. Innerhalb der App-Registrierung muss zudem ein Client Secret angelegt werden. Um dieses zu verwenden, müssen die folgenden Umgebungsvariablen *zusätzlich* zu den oben genannten gesetzt werden: + +| Umgebungsvariable | Beschreibung | +|---------------------------------|-------------------------------------------------------------| +| `ImageStorage__UseClientSecret` | Muss `true` sein, um Client Secret zu verwenden. | +| `ImageStorage__TenantId` | Die ID des Tenant, wo die App-Registrierung angelegt wurde. | +| `ImageStorage__ClientId` | Die Client-ID der App-Registrierung. | +| `ImageStorage__ClientSecret` | Der Wert des angelegten Client Secrets. | + +## Authentifizierung + +Die folgenden Einstellungen können gesetzt werden, um die Benutzerauthentifizierung von turnierplan.NET zu konfigurieren: + +| Umgebungsvariable | Beschreibung | Standard | +|----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------| +| `Identity__AccessTokenLifetime` | Die Gültigkeitsdauer von ausgestellten Access-Tokens. | `00:03:00` | +| `Identity__RefreshTokenLifetime` | Die Gültigkeitsdauer von ausgestellten Refresh-Tokens. Innerhalb diesem Zeitraum ist kein erneuter Login erforderlich. | `1.00:00:00` | +| `Identity__StoragePath` | Das Verzeichnis innerhalb vom Container, wo der Schlüssel zur Signatur ausgesteller Tokens gespeichert wird. | `/var/turnierplan/identity` | +| `Identity__UseInsecureCookies` | Kann auf `true` gesetzt werde, um HTTP Cookies ohne *secure* auszustellen. Dies ist erforderlich, wenn nicht mit HTTPS auf turnierplan.NET zugegriffen wird. | `false` | + +Für ein produktives Deployment sind die Standardwerte ausreichend und müssen nicht geändert werden. + +!!! note + Die Gültigkeitsdauer muss als .NET `TimeSpan` formatiert werden. Das Format ist `HH:mm:ss` bzw. `d.HH:mm:ss` also bspw. `00:03:00` für 3 Minuten oder `1.00:00:00` für 1 Tag. + +## Monitoring + +Der turnierplan.NET-Server kann Telemetriedaten (Logs, Metrics & Traces) an [Azure Application Insights](https://learn.microsoft.com/en-us/azure/azure-monitor/app/app-insights-overview) senden: + +| Umgebungsvariable | Beschreibung | Standard | +|-----------------------------------------|------------------------------------------------------------------------|----------| +| `ApplicationInsights__ConnectionString` | Kann gesetzt werden, um Daten an Azure Application Insights zu senden. | - | diff --git a/docs/pages/getting-started/images/basic-tournament-config.png b/docs/pages/getting-started/images/basic-tournament-config.png new file mode 100644 index 00000000..bc60f4f0 Binary files /dev/null and b/docs/pages/getting-started/images/basic-tournament-config.png differ diff --git a/docs/pages/getting-started/images/empty-organization.png b/docs/pages/getting-started/images/empty-organization.png new file mode 100644 index 00000000..2fd6fc55 Binary files /dev/null and b/docs/pages/getting-started/images/empty-organization.png differ diff --git a/docs/pages/getting-started/images/first-tournament-groups.png b/docs/pages/getting-started/images/first-tournament-groups.png new file mode 100644 index 00000000..65f96a97 Binary files /dev/null and b/docs/pages/getting-started/images/first-tournament-groups.png differ diff --git a/docs/pages/getting-started/images/first-tournament-match-plan-2.png b/docs/pages/getting-started/images/first-tournament-match-plan-2.png new file mode 100644 index 00000000..5525dc14 Binary files /dev/null and b/docs/pages/getting-started/images/first-tournament-match-plan-2.png differ diff --git a/docs/pages/getting-started/images/first-tournament-match-plan.png b/docs/pages/getting-started/images/first-tournament-match-plan.png new file mode 100644 index 00000000..29d18089 Binary files /dev/null and b/docs/pages/getting-started/images/first-tournament-match-plan.png differ diff --git a/docs/pages/getting-started/images/new-tournament.png b/docs/pages/getting-started/images/new-tournament.png new file mode 100644 index 00000000..e5bce5f7 Binary files /dev/null and b/docs/pages/getting-started/images/new-tournament.png differ diff --git a/docs/pages/getting-started/images/report-first-match.png b/docs/pages/getting-started/images/report-first-match.png new file mode 100644 index 00000000..d8e665cf Binary files /dev/null and b/docs/pages/getting-started/images/report-first-match.png differ diff --git a/docs/pages/getting-started/index.md b/docs/pages/getting-started/index.md new file mode 100644 index 00000000..b44611ec --- /dev/null +++ b/docs/pages/getting-started/index.md @@ -0,0 +1,75 @@ +--- +icon: lucide/rocket +--- + +# Erste Schritte + +Nach einer Neuinstallation von turnierplan.NET gibt es zunächst nur einen Administratorbenutzer. Für produktive Anwendungen ist es dringend empfohlen, einen nicht-Adminnutzer anzulegen, und diesen für den täglichen Login zu verwenden. Dies wird im folgenden Abschnitt beschrieben. Es können jedoch auch mit dem Administratorbenutzer Turniere angelegt werden. Dies ist im Abschnitt weiter unten beschrieben. + +## Benutzer anlegen + +Zunächst muss sich mit den Zugangsdaten des Administratorbenutzers angemeldet werden. Auf der Startseite ist folgend der *Administrator*-Button sichtbar, welcher zum Administrator-Portal führt. Dort kann ein neuer Benutzer angelegt werden. Zwingend angegeben werden müssen der Benutzername und das Passwort des neuen Benutzers. Nachdem ein Benutzer erstellt wurde, muss ihm noch die Berechtigung erteilt werden, Organisationen zu erstellen. Hierfür muss man in der Zeile des Benutzers auf das Bearbeiten-Symbol drücken, den Haken bei *Benutzer darf neue Organisationen anlegen* setzen und speichern. Anschließend kann der Benutzer sich anmelden und eigenständig neue Organisationen erstellen. + +## Organisation erstellen + +Alle Turniere und andere Objekte, welche innerhalb von turnierplan.NET erstellt werden können, sind immer einer Organisation zugehörig. Eine neue Organisation kann jederzeit auf der Startseite erstellt werden und benötigt lediglich einen Namen. + +!!! tip + Durch die Trennung der Daten in mehrere Organisationen kann gesteuert werden, welche Benutzer innerhalb von welchen Organisationen Daten lesen und Änderungen vornehmen können. + +Für den Start genügt zunächst eine einzelne Organisation. + +## Turnier erstellen + +Ein neues Turnier kann innerhalb einer bestehenden Organisation mit der Schaltfläche *Neues Turnier* erstellt werden: + + + +In der Eingabemaske, welche sich darauf öffnet, müssen folgende Informationen bereitgestellt werden: + +- **Name**: Kann frei gewählt werden. +- **Ordner**: Kann optional verwendet werden, um mehrere Turniere zu gruppieren. Dies hat diverse Vorteile, welche separat beschrieben werden. +- **Sichtbarkeit**: Wenn ein Turnier auf *öffentlich* gestellt wird, kann jeder das Turnier mit einem speziellen Link sehen. Wenn das Turnier auf *privat* gestellt wird, kann das Turnier nur als angemeldeter Benutzer gesehen werden. + + + +Alle o.g. Informationen können nachträglich geändert werden. Nach der Bestätigung der Eingaben öffnet sich die Konfigurationsseite des neu erstellen Turniers: + +### Spielplan konfigurieren + +Auf der Konfigurationsseite wird festgelegt, welche Mannschaften am Turnier teilnehmen, wie diese Mannschaften in Gruppen aufgeteilt sind und welchen Spielmodus das Turnier verwendet. + +Für ein einfaches Turnier genügen die folgenden beiden Schritte:: + +- Erstellen Sie eine neue Gruppe mit der Schaltfläche *Neue Gruppe hinzufügen* +- Legen Sie innerhalb der Gruppe drei Mannschaften an, indem Sie einen Namen in das Textfeld eingeben und die Schaltfläche *Hinzufügen* betätigen + +Die Turnierkonfiguration sieht nun folgendermaßen aus (der untere Teil der Seite ist nachfolgend nicht abgebildet): + + + +Die Änderungen werden erst übernommen, wenn die *Übernehmen*-Schaltfläche am Ende der Seite geklickt wird. + +Anschließend erfolgt eine Weiterleitung auf die Startseite des Turniers. Dort ist der erstellte Spielplan nun sichtbar: + + + +### Turnierdurchführung + +Bei der Turnierdurchführung werden nacheinander die Ergebnisse der Spiele in den Spielplan eingetragen. Beim Klick auf eines der Spiele öffnet sich hierzu folgender Dialog: + + + +Der Dialog zeigt die Spielpaarung und bietet die Möglichkeit, für die teilnehmenden Mannschaften die jeweilige Anzahl der Tore einzutagen. Zudem kann neben einem Standardergebnis auch zwischen *n.V.*, *n.E.* oder der sog. *Sonderwertung* entscheiden werden. Letztere eignet sich z.B. im Fall, dass eine Mannschaft nicht angetreten ist. + +Ein Ergebnis kann als *LIVE-Ergebnis* oder als *Endergebnis* gespeichert werden. Spiele mit *LIVE-Ergebnis* werden optisch gekennzeichnet und zählen zudem noch nicht in die Gruppenwertung ein. Erst wenn bei einem Spiel das *Endergebnis* gespeichert wird, zählt das Spiel als beendet. + +Im folgenden Beispiel ist Spiel 1 beendet und Spiel 2 ist derzeit am Laufen: + + + +Nach jedem beendeten Spiel werden alle Gruppen durchgerechnet. Beim Klick auf den Reiter *Gruppen* wird die Gruppenstatistik sichtbar: + + + +Da es in diesem Turnier nur eine Gruppe sowie keine Finalrunde gibt, ist dies auch gleichzeitig die Endplatzierung des Turniers. diff --git a/docs/pages/img/favicon.ico b/docs/pages/images/favicon.ico similarity index 100% rename from docs/pages/img/favicon.ico rename to docs/pages/images/favicon.ico diff --git a/docs/pages/images/logo-64.png b/docs/pages/images/logo-64.png new file mode 100644 index 00000000..ae427211 Binary files /dev/null and b/docs/pages/images/logo-64.png differ diff --git a/docs/pages/img/logo-192.png b/docs/pages/img/logo-192.png deleted file mode 100644 index 478d9cad..00000000 Binary files a/docs/pages/img/logo-192.png and /dev/null differ diff --git a/docs/pages/index.md b/docs/pages/index.md index b063cdca..2a3c8bfe 100644 --- a/docs/pages/index.md +++ b/docs/pages/index.md @@ -1,13 +1,28 @@ -# turnierplan.NET +--- +icon: lucide/house +--- -**turnierplan.NET** ist a free and open-source web application for football tournaments +# Startseite -
+turnierplan.NET ist eine **Open-Source Webanwendung zur Organisation von Turnieren** in Fußballvereinen ([GitHub](https://github.com/turnierplan-NET/turnierplan.NET)).
+
+