CLI-Fixes: Help/Version vor Build, Content-Check, Default-Envs, Artefakte aus Git

- Program.cs: --help/--version werden vor Config-Laden und
  Directories.Init geprüft (verhindert Crashes außerhalb eines
  Site-Verzeichnisses)
- Builder.cs: Pre-flight-Check ob content/ existiert; bei Fehlen
  klare Fehlermeldung + Exit 1 statt unhandled Exception.
  Build() gibt bool zurück, Program.cs setzt Environment.ExitCode.
- BuildConfig.cs: Default-Environments von work/review/staging/deploy
  auf development/staging/deploy bereinigt (konsistent mit CLI-Aliasen)
- .gitignore: build_log.txt/run_log.txt und webstatic.example/dist/
  ignoriert; entsprechende Artefakte aus Git entfernt
- tests/README.md: Platzhalter für künftige Test-Strategie
- plans/01-offensichtliche-fixes.md: Fix-Plan dokumentiert
This commit is contained in:
2026-07-11 17:11:38 +02:00
parent ff634a328a
commit 18c2108d81
54 changed files with 216 additions and 3742 deletions
+9
View File
@@ -20,6 +20,15 @@ artifacts/
# Generated site output # Generated site output
/dist/ /dist/
# Build logs (written into the build root by every `webstatic build`)
/build_log.txt
/run_log.txt
# Example site output and logs (regenerated on build)
webstatic.example/dist/
webstatic.example/build_log.txt
webstatic.example/run_log.txt
# Machine-translation drafts (never commit) # Machine-translation drafts (never commit)
.translation-drafts/ .translation-drafts/
-6
View File
@@ -1,6 +0,0 @@
=== Build Started: 2026-07-11 16:11:56.657 ===
ENV: development
BASE_URL: http://localhost:8000
CDN_ASSETS: /assets
ROOT: /mnt/brx5/work/OSS/build_webstatic
+158
View File
@@ -0,0 +1,158 @@
# Plan 01 — Offensichtliche Fixes
> Status: Draft (2026-07-11). Aus der Code-Inspektion und Testläufen gegen das
> GCBoK-Website-Repo (`/mnt/brx5/REPOS/GCC/gcbok.gitcover.org`) und das
> Dev-Quell-Repo (`/mnt/brx5/work/OSS/build_webstatic`) abgeleitet.
## Kontext
Die GCBoK-Website nutzt jetzt ausschließlich die `webstatic`-CLI (alte
`www/build.py`, `www/build.sh` und `www/oss/`-Vendor-Snapshot wurden entfernt).
Dabei zeigten sich Probleme, die hier zur Behebung anstehen.
## Fix 1 — Installierte Binary ist veraltet (`/opt/GitCover/webstatic`)
**Symptom:** `webstatic --version` und `webstatic --help` crashen mit
`DirectoryNotFoundException: .../content` — der Build läuft los, bevor
`--help`/`--version` ausgewertet werden.
**Ursache:** `/opt/GitCover/webstatic/src/Program.cs` (7223 B, 11. Jul 15:59)
ist älter als der aktuelle Dev-Stand (`src/Program.cs`, 380 Zeilen). Die
installierte Binary wurde aus einem Zwischenstand gebaut, in dem
`--help`/`--version`-Checks erst *nach* `Builder.Build()` kamen. Der aktuelle
Dev-Stand hat die Checks bereits an richtiger Position (Zeile 5064, vor dem
Build-Aufruf Zeile 118).
**Maßnahme:**
1. Dev-Quellbaum baut sauber (`dotnet build -c Release` ✓ verifiziert).
2. System-Installation aktualisieren:
```bash
sudo env PATH="$PATH" \
WEBSTATIC_INSTALL_DIR=/opt/GitCover/webstatic \
WEBSTATIC_BIN_DIR=/usr/local/bin \
/mnt/brx5/work/OSS/build_webstatic/install.sh
```
(oder `webstatic update`, falls die Installation ein Clone ist —
`/opt/GitCover/webstatic/.git` prüfen).
3. Verifizieren: `webstatic --version` (erwartet: `1.0.0.0` + Commit-Hash),
`webstatic --help` (erwartet: Hilfe-Text, Exit 0),
`webstatic build --root /mnt/brx5/REPOS/GCC/gcbok.gitcover.org/www --env development --verbose`
(erwartet: erfolgreicher Build, Exit 0).
## Fix 2 — `--help`/`--version` sollten VOR Config-Laden und `Directories.Init` geprüft werden
**Symptom:** Aktuell läuft `BuildConfig.Load()` (Zeile 24) und
`Directories.Init()` (Zeile 47), bevor `--help`/`--version` abgefragt werden
(Zeile 50/57). Das funktioniert zwar (Load ist fehlertolerant), ist aber
fragil und verschwendet Arbeit.
**Maßnahme:** In `src/Program.cs` die `--help`/`-h`/`help`/`--version`-Checks
ganz an den Anfang der `Main` verschieben (direkt nach den Hilfsfunktionen
`Has`/`Val`, vor `BuildConfig.Load`).
## Fix 3 — Fehlendes `content/`-Verzeichnis nicht graceful behandelt
**Symptom:** Wenn `--root` auf ein Verzeichnis ohne `content/` zeigt (z. B.
Repo-Root statt `www/`), crasht `ContentLoader.LoadContent` (Zeile 22:
`Directory.GetFiles(contentDir, ...)`) mit ungefangenem
`DirectoryNotFoundException`.
**Maßnahme:** In `Builder.Build()` (oder `ContentLoader.LoadContent`) prüfen,
ob `Directories.ContentDir` existiert. Wenn nicht: klare Fehlermeldung
```
ERROR: content directory not found: <path>
Specify --root <dir> or --content <dir>.
```
und `return` (Exit 1), statt Exception-Stacktrace.
## Fix 4 — `webstatic.example/` enthält Build-Artefakte im Git
**Symptom:** `git ls-files webstatic.example/` zeigt `build_log.txt`,
`run_log.txt` und das komplette `dist/`-Verzeichnis (HTML, Pagefind-Index)
sind versioniert. Diese werden bei `webstatic init` mitkopiert.
**Maßnahme:**
1. `webstatic.example/build_log.txt`, `webstatic.example/run_log.txt` aus Git
entfernen (`git rm`).
2. `webstatic.example/dist/` aus Git entfernen (`git rm -r`).
3. `.gitignore` erweitern:
```
webstatic.example/dist/
webstatic.example/build_log.txt
webstatic.example/run_log.txt
```
4. Sicherstellen, dass `webstatic init` die Beispiel-Site sauber scaffoldet
(ohne Artefakte).
## Fix 5 — Repo-eigene `build_log.txt`/`run_log.txt` werden beim Dev-Build geschrieben
**Symptom:** Ein Build im Dev-Quellbaum (z. B.
`dotnet ... build --root webstatic.example`) schreibt `build_log.txt` und
`run_log.txt` in den Build-Root (`webstatic.example/`). Das ist korrekt.
Zusätzlich stehen aber `build_log.txt` und `run_log.txt` im Repo-Root
(`/mnt/brx5/work/OSS/build_webstatic/`) und sind versioniert — sie werden bei
jedem versehentlichen Build ohne `--root` (Default = cwd = Repo-Root)
überschrieben.
**Maßnahme:**
1. `build_log.txt` und `run_log.txt` im Repo-Root aus Git entfernen (`git rm`).
2. In `.gitignore` aufnehmen:
```
/build_log.txt
/run_log.txt
```
3. (Optional) Guard im Code: wenn kein Subcommand und keine Build-Flags
gegeben sind, Hilfe ausgeben statt blind zu bauen (verhindert
versehentliche Builds im falschen Verzeichnis).
## Fix 6 — `BuildConfig.Defaults()`-Umgebungen inkonsistent mit CLI-Aliasen
**Symptom:** `BuildConfig.Defaults()` (Zeile 8288) definiert `work` und
`review` als eigene Umgebungen. Die CLI mappt `--work`/`--review` aber auf
`development` (Program.cs:103105). Wenn ein Nutzer `--env work` direkt
aufruft, bekommt er die Default-`work`-Umgebung (mit
`BaseUrl=http://localhost:8000`), während `--work` auf `development` mappt.
Da `webstatic.json` die Environments überschreibt, betrifft das nur Sites ohne
eigene Config.
**Maßnahme:** `BuildConfig.Defaults()` bereinigen: `work`/`review` entfernen
oder durch `development` ersetzen, so dass Defaults und CLI-Aliase
konsistent sind. Dokumentation in `plans/00` und `README` anpassen.
## Fix 7 — `tests/` ist leer
**Symptom:** `tests/`-Verzeichnis existiert, ist aber leer. Keine
Unit-/Integrationstests vorhanden.
**Maßnahme:** (nicht Teil dieses Plans — separater Plan für Test-Aufbau).
Vorläufig: `tests/README.md` anlegen, das den Platzhalter erklärt und auf
den künftigen Test-Plan verweist.
## Priorisierung
| Fix | Priorität | Aufwand | Risiko |
|-----|-----------|---------|--------|
| 1 — Installierte Binary aktualisieren | **hoch** | gering | gering |
| 3 — Content-Verzeichnis-Check | **hoch** | gering | gering |
| 4 — Example-Artefakte aus Git | **hoch** | gering | gering |
| 5 — Repo-Root-Logs aus Git | mittel | gering | gering |
| 2 — Help/Version frühe Prüfung | mittel | gering | gering |
| 6 — Default-Environments bereinigen | mittel | gering | gering |
| 7 — tests/ Platzhalter | niedrig | trivial | — |
## Verifizierung nach allen Fixes
```bash
cd /mnt/brx5/work/OSS/build_webstatic
dotnet build -c Release
dotnet bin/Release/net10.0/webstatic.dll --version # Exit 0
dotnet bin/Release/net10.0/webstatic.dll --help # Exit 0
dotnet bin/Release/net10.0/webstatic.dll build --root . # klare Fehlermeldung, Exit 1
dotnet bin/Release/net10.0/webstatic.dll build --root webstatic.example --env development # Exit 0
git status # keine Artefakte, clean
# System-Install aktualisieren und GCBoK bauen:
sudo env PATH="$PATH" WEBSTATIC_INSTALL_DIR=/opt/GitCover/webstatic \
WEBSTATIC_BIN_DIR=/usr/local/bin ./install.sh
webstatic --version
webstatic build --root /mnt/brx5/REPOS/GCC/gcbok.gitcover.org/www --env development --verbose
```
-2
View File
@@ -1,2 +0,0 @@
=== Run Started: 2026-07-11 16:11:56.696 ===
+3 -4
View File
@@ -22,7 +22,7 @@ public class PathsConfig
public string I18n { get; set; } = "i18n.json"; public string I18n { get; set; } = "i18n.json";
} }
/// <summary>Build environment (work/review/staging/deploy) with base URL and CDN.</summary> /// <summary>Build environment (development/staging/deploy) with base URL and CDN.</summary>
public class EnvironmentConfig public class EnvironmentConfig
{ {
public string BaseUrl { get; set; } = "http://localhost:8000"; public string BaseUrl { get; set; } = "http://localhost:8000";
@@ -81,9 +81,8 @@ public class BuildConfig
}, },
Environments = new() Environments = new()
{ {
["work"] = new EnvironmentConfig { BaseUrl = "http://localhost:8000", Cdn = "/assets" }, ["development"] = new EnvironmentConfig { BaseUrl = "http://localhost:8000", Cdn = "/assets" },
["review"] = new EnvironmentConfig { BaseUrl = "https://review.gitcover.org", Cdn = "https://gitcover.org/assets" }, ["staging"] = new EnvironmentConfig { BaseUrl = "https://staging.gitcover.org", Cdn = "https://gitcover.org/assets" },
["staging"] = new EnvironmentConfig { BaseUrl = "https://gcbok.gitcover.org", Cdn = "https://gitcover.org/assets" },
["deploy"] = new EnvironmentConfig { BaseUrl = "https://gcbok.org", Cdn = "https://gitcover.org/assets" }, ["deploy"] = new EnvironmentConfig { BaseUrl = "https://gcbok.org", Cdn = "https://gitcover.org/assets" },
}, },
}; };
+17 -1
View File
@@ -7,8 +7,22 @@ namespace GCBoK.WebStaticBuilder;
/// <summary>Main build orchestrator.</summary> /// <summary>Main build orchestrator.</summary>
public static class Builder public static class Builder
{ {
public static void Build(BuildConfig cfg, EnvironmentConfig env, string envName, bool verbose, bool dryRun) /// <returns><c>true</c> if the build completed; <c>false</c> if it was
/// aborted due to a pre-flight check failure (missing content directory).</returns>
public static bool Build(BuildConfig cfg, EnvironmentConfig env, string envName, bool verbose, bool dryRun)
{ {
// Pre-flight: content directory must exist — otherwise ContentLoader
// throws an unhandled DirectoryNotFoundException. Fail gracefully with
// an actionable message instead of a stack trace.
if (!Directory.Exists(Directories.ContentDir))
{
Console.Error.WriteLine(
$"ERROR: content directory not found: {Directories.ContentDir}");
Console.Error.WriteLine(
" Specify --root <dir> or --content <dir>.");
return false;
}
File.WriteAllText(Directories.BuildLogPath, File.WriteAllText(Directories.BuildLogPath,
$"=== Build Started: {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ===\n"); $"=== Build Started: {DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} ===\n");
File.AppendAllText(Directories.BuildLogPath, File.AppendAllText(Directories.BuildLogPath,
@@ -179,6 +193,8 @@ public static class Builder
if (cfg.Pagefind) BuildSearchIndex(verbose); if (cfg.Pagefind) BuildSearchIndex(verbose);
else if (verbose) Console.WriteLine(" Pagefind disabled (config)."); else if (verbose) Console.WriteLine(" Pagefind disabled (config).");
return true;
} }
private static string LoadLayout() private static string LoadLayout()
+22 -18
View File
@@ -15,6 +15,22 @@ string? Val(string f)
var verbose = Has("--verbose") || Has("-v"); var verbose = Has("--verbose") || Has("-v");
var dryRun = Has("--dry-run") || Has("-n"); var dryRun = Has("--dry-run") || Has("-n");
// Help / Version — check before any filesystem access to avoid crashes
// when invoked outside a site directory (e.g. `webstatic --help` in $HOME).
if (argsList.Contains("--help") || argsList.Contains("-h") || argsList.Contains("help"))
{
PrintHelp();
return;
}
if (argsList.Contains("--version"))
{
var v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
Console.WriteLine($"GCBoK.WebStaticBuilder {v?.ToString() ?? "0.0.0"}");
var hash = GitShortHash(AppContext.BaseDirectory);
if (hash != null) Console.WriteLine($"commit: {hash}");
return;
}
// Resolve config file + site root // Resolve config file + site root
var configPath = Val("--config"); var configPath = Val("--config");
var root = Val("--root") ?? Directory.GetCurrentDirectory(); var root = Val("--root") ?? Directory.GetCurrentDirectory();
@@ -46,23 +62,6 @@ if (Val("--cdn") is { } cdn) { /* applied to chosen env below */ }
Directories.Init(cfg, root); Directories.Init(cfg, root);
// Help
if (argsList.Contains("--help") || argsList.Contains("-h") || argsList.Contains("help"))
{
PrintHelp();
return;
}
// Version
if (argsList.Contains("--version"))
{
var v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
Console.WriteLine($"GCBoK.WebStaticBuilder {v?.ToString() ?? "0.0.0"}");
var hash = GitShortHash(AppContext.BaseDirectory);
if (hash != null) Console.WriteLine($"commit: {hash}");
return;
}
// Self-update (Hermes-Konzept: lokale Aenderungen stashen, pull, mergen, rebuild) // Self-update (Hermes-Konzept: lokale Aenderungen stashen, pull, mergen, rebuild)
if (argsList.Contains("update")) if (argsList.Contains("update"))
{ {
@@ -115,7 +114,12 @@ if (Val("--base-url") is { } bu2) env.BaseUrl = bu2;
if (Val("--cdn") is { } cdn2) env.Cdn = cdn2; if (Val("--cdn") is { } cdn2) env.Cdn = cdn2;
if (verbose) Console.WriteLine($"GCBoK.WebStaticBuilder — building (env={envName})"); if (verbose) Console.WriteLine($"GCBoK.WebStaticBuilder — building (env={envName})");
Builder.Build(cfg, env, envName, verbose, dryRun); var ok = Builder.Build(cfg, env, envName, verbose, dryRun);
if (!ok)
{
Environment.ExitCode = 1;
return;
}
Console.WriteLine("Build completed successfully."); Console.WriteLine("Build completed successfully.");
static void PrintHelp() static void PrintHelp()
+7
View File
@@ -0,0 +1,7 @@
# tests/
Dieses Verzeichnis ist für künftige Unit- und Integrationstests des
GCBoK.WebStaticBuilder vorgesehen. Es ist derzeit leer.
Ein eigener Plan (`plans/02-tests.md`) wird die Test-Strategie festlegen
(xUnit, Test-Runner, Coverage-Ziele, Smoke-Test für `webstatic build`).
-34
View File
@@ -1,34 +0,0 @@
=== Build Started: 2026-07-11 12:00:07.845 ===
ENV: work
BASE_URL: http://localhost:8000
CDN_ASSETS: /assets
ROOT: /mnt/brx5/work/OSS/build_webstatic/webstatic.example
Assets copied to: /mnt/brx5/work/OSS/build_webstatic/webstatic.example/dist/assets
Legal: /mnt/brx5/work/OSS/build_webstatic/webstatic.example/dist/de/impressum.html
Legal: /mnt/brx5/work/OSS/build_webstatic/webstatic.example/dist/en/impressum.html
Legal: /mnt/brx5/work/OSS/build_webstatic/webstatic.example/dist/vi/impressum.html
Pagefind (exit 0): Running Pagefind v1.5.2 (Extended)
Running from: "/mnt/brx5/work/OSS/build_webstatic/webstatic.example"
Source: "dist"
Output: "dist/pagefind"
[Walking source directory]
Found 10 files matching **/*.{html}
[Parsing files]
Found a data-pagefind-body element on the site.
↳ Ignoring pages without this tag.
[Reading languages]
Discovered 3 languages: vi, en, de
[Building search indexes]
Total:
Indexed 3 languages
Indexed 9 pages
Indexed 337 words
Indexed 0 filters
Indexed 0 sorts
Finished in 0.036 seconds
-12
View File
@@ -1,12 +0,0 @@
:root { color-scheme: light dark; }
body { font-family: system-ui, sans-serif; margin: 0; color: #1a1a1a; }
.container { max-width: 760px; margin: 0 auto; padding: 1.5rem; }
.skip-link { position: absolute; left: -999px; }
.skip-link:focus { left: 1rem; top: 1rem; background: #0b5fff; color: #fff; padding: .5rem; }
.site-header { display: flex; gap: 1rem; align-items: center; padding: .75rem 1.5rem; border-bottom: 1px solid #ddd; }
.site-nav { display: flex; gap: 1rem; }
.brand { font-weight: 700; text-decoration: none; color: #0b5fff; }
.lang-dropdown__menu { list-style: none; display: flex; gap: .5rem; }
.site-footer { border-top: 1px solid #ddd; padding: 1.5rem; margin-top: 2rem; color: #555; }
.muted { color: #777; }
.page-nav { display: flex; justify-content: space-between; margin-top: 2rem; }
-1
View File
@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="6" fill="#0b5fff"/><text x="16" y="22" font-size="16" text-anchor="middle" fill="#fff" font-family="sans-serif">G</text></svg>

Before

Width:  |  Height:  |  Size: 220 B

@@ -1,9 +0,0 @@
{
"name": "Meine Website",
"short_name": "Website",
"icons": [
{ "src": "/assets/favicon/favicon.svg", "sizes": "any", "type": "image/svg+xml" }
],
"start_url": "/",
"display": "standalone"
}
-12
View File
@@ -1,12 +0,0 @@
// GCBoK.WebStaticBuilder example theme script.
(function () {
var t = localStorage.getItem('gc-theme') || 'light';
document.documentElement.setAttribute('data-theme', t);
var btn = document.getElementById('themeToggle');
if (btn) btn.addEventListener('click', function () {
var cur = document.documentElement.getAttribute('data-theme');
var next = cur === 'light' ? 'dark' : 'light';
document.documentElement.setAttribute('data-theme', next);
localStorage.setItem('gc-theme', next);
});
})();
-73
View File
@@ -1,73 +0,0 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Impressum</title>
<meta name="description" content="Eine mehrsprachige, statische Website.">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="96x96" href="/assets/favicon/favicon-96x96.png">
<link rel="icon" href="/assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<meta property="og:title" content="Impressum">
<meta property="og:description" content="Eine mehrsprachige, statische Website.">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:8000/impressum/">
<meta property="og:locale" content="">
<meta property="og:image" content="/assets/favicon/web-app-manifest-512x512.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Impressum">
<meta name="twitter:description" content="Eine mehrsprachige, statische Website.">
<link rel="canonical" href="http://localhost:8000/impressum/">
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
</head>
<body>
<a href="#main" class="skip-link">Zum Hauptinhalt springen</a>
<header class="site-header">
<a href="index.html" class="brand" aria-label="Zur Startseite">Meine Website</a>
<nav class="site-nav" aria-label="Hauptnavigation">
<a class="nav-gcbok__link" href="ueber.html">Über</a>
</nav>
<div class="lang-dropdown" aria-label="Sprachumschalter">
<ul class="lang-dropdown__menu">
<li><a href="/de/" hreflang="de"><span>Deutsch</span> <span class="lang-dropdown__code">DE</span></a></li>
<li><a href="/en/" hreflang="en"><span>English</span> <span class="lang-dropdown__code">EN</span></a></li>
<li><a href="/vi/" hreflang="vi"><span>Tiếng Việt</span> <span class="lang-dropdown__code">VI</span></a></li>
</ul>
</div>
</header>
<main id="main" tabindex="-1" data-pagefind-body>
<div class="container">
<h2 id="impressum">Impressum</h2>
<p>Beispiel-Website · Ansprechpartner: webmaster@example.org</p>
<p>© 2026 Beispiel-Website. Erstellt mit GCBoK.WebStaticBuilder (MIT).</p>
</div>
</main>
<footer class="site-footer">
<div class="container">
<h4>MEINE WEBSITE</h4>
<p class="muted">Ein Beispiel für GCBoK.WebStaticBuilder</p>
<ul>
<li><a href="glossar.html">Glossar</a></li>
<li><a href="impressum.html">Impressum</a></li>
</ul>
<p>© 2026 Meine Website</p>
</div>
</footer>
<script src="/assets/js/gcbok-theme.js"></script>
</body>
</html>
-85
View File
@@ -1,85 +0,0 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Startseite</title>
<meta name="description" content="Die Landing-Page dieser Beispiel-Website">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="96x96" href="/assets/favicon/favicon-96x96.png">
<link rel="icon" href="/assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<meta property="og:title" content="Startseite">
<meta property="og:description" content="Die Landing-Page dieser Beispiel-Website">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:8000/">
<meta property="og:locale" content="">
<meta property="og:image" content="/assets/favicon/web-app-manifest-512x512.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Startseite">
<meta name="twitter:description" content="Die Landing-Page dieser Beispiel-Website">
<link rel="canonical" href="http://localhost:8000/">
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
</head>
<body>
<a href="#main" class="skip-link">Zum Hauptinhalt springen</a>
<header class="site-header">
<a href="index.html" class="brand" aria-label="Zur Startseite">Meine Website</a>
<nav class="site-nav" aria-label="Hauptnavigation">
<a class="nav-gcbok__link" href="ueber.html">Über</a>
</nav>
<div class="lang-dropdown" aria-label="Sprachumschalter">
<ul class="lang-dropdown__menu">
<li><a href="/de/" hreflang="de"><span>Deutsch</span> <span class="lang-dropdown__code">DE</span></a></li>
<li><a href="/en/" hreflang="en"><span>English</span> <span class="lang-dropdown__code">EN</span></a></li>
<li><a href="/vi/" hreflang="vi"><span>Tiếng Việt</span> <span class="lang-dropdown__code">VI</span></a></li>
</ul>
</div>
</header>
<main id="main" tabindex="-1" data-pagefind-body>
<div class="container">
<h1 id="willkommen-bei-gcbok.webstaticbuilder">Willkommen bei GCBoK.WebStaticBuilder</h1>
<p>Dies ist der Banner-Block (order 0), der auf der Startseite (Hero/Landing) eingebettet wird.</p>
<h2 id="einfuhrung">Einführung</h2>
<p>Diese Seite wurde mit <strong>GCBoK.WebStaticBuilder</strong> erzeugt — einem statischen, mehrsprachigen
Generator für compliance-freundliche Websites (MIT, OSS).</p>
<h2 id="funktionen">Funktionen</h2>
<ul>
<li>Markdown mit YAML-Frontmatter</li>
<li>Mehrsprachigkeit (de / en / vi)</li>
<li>SEO-Kopf, Sitemap, robots.txt</li>
<li>Client-Suche via Pagefind</li>
<li>UI-Lokalisierung über <code>{{ i18n.* }}</code></li>
</ul>
<h2 id="nachste-schritte">Nächste Schritte</h2>
<p>Siehe <code>docs/</code> im Repository für die Einrichtung.</p>
</div>
</main>
<footer class="site-footer">
<div class="container">
<h4>MEINE WEBSITE</h4>
<p class="muted">Ein Beispiel für GCBoK.WebStaticBuilder</p>
<ul>
<li><a href="glossar.html">Glossar</a></li>
<li><a href="impressum.html">Impressum</a></li>
</ul>
<p>© 2026 Meine Website</p>
</div>
</footer>
<script src="/assets/js/gcbok-theme.js"></script>
</body>
</html>
-81
View File
@@ -1,81 +0,0 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Über das Projekt</title>
<meta name="description" content="Hintergrund zum Beispiel-Projekt">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="96x96" href="/assets/favicon/favicon-96x96.png">
<link rel="icon" href="/assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<meta property="og:title" content="Über das Projekt">
<meta property="og:description" content="Hintergrund zum Beispiel-Projekt">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:8000/ueber/">
<meta property="og:locale" content="">
<meta property="og:image" content="/assets/favicon/web-app-manifest-512x512.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Über das Projekt">
<meta name="twitter:description" content="Hintergrund zum Beispiel-Projekt">
<link rel="canonical" href="http://localhost:8000/ueber/">
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
</head>
<body>
<a href="#main" class="skip-link">Zum Hauptinhalt springen</a>
<header class="site-header">
<a href="index.html" class="brand" aria-label="Zur Startseite">Meine Website</a>
<nav class="site-nav" aria-label="Hauptnavigation">
<a class="nav-gcbok__link" href="ueber.html">Über</a>
</nav>
<div class="lang-dropdown" aria-label="Sprachumschalter">
<ul class="lang-dropdown__menu">
<li><a href="/de/" hreflang="de"><span>Deutsch</span> <span class="lang-dropdown__code">DE</span></a></li>
<li><a href="/en/" hreflang="en"><span>English</span> <span class="lang-dropdown__code">EN</span></a></li>
<li><a href="/vi/" hreflang="vi"><span>Tiếng Việt</span> <span class="lang-dropdown__code">VI</span></a></li>
</ul>
</div>
</header>
<main id="main" tabindex="-1" data-pagefind-body>
<div class="container">
<h2 id="uber">Über</h2>
<p>GCBoK.WebStaticBuilder ist ein eigenständiges OSS-Tool der GitCover Commons.
Es erzeugt statische Websites ohne Server, Datenbank oder Build-Service.</p>
<div class="mermaid">graph TD
A[Markdown] --> B(Builder)
B --> C[HTML]
C --> D[Pagefind Index]
</div>
<nav class="page-nav" aria-label="Seitennavigation">
<span class="page-nav__link">&nbsp;</span>
<span class="page-nav__link page-nav__link--next">&nbsp;</span>
</nav>
</div>
</main>
<footer class="site-footer">
<div class="container">
<h4>MEINE WEBSITE</h4>
<p class="muted">Ein Beispiel für GCBoK.WebStaticBuilder</p>
<ul>
<li><a href="glossar.html">Glossar</a></li>
<li><a href="impressum.html">Impressum</a></li>
</ul>
<p>© 2026 Meine Website</p>
</div>
</footer>
<script src="/assets/js/gcbok-theme.js"></script>
</body>
</html>
-73
View File
@@ -1,73 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Impressum</title>
<meta name="description" content="A multilingual, static website.">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="96x96" href="/assets/favicon/favicon-96x96.png">
<link rel="icon" href="/assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<meta property="og:title" content="Impressum">
<meta property="og:description" content="A multilingual, static website.">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:8000/impressum/">
<meta property="og:locale" content="">
<meta property="og:image" content="/assets/favicon/web-app-manifest-512x512.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Impressum">
<meta name="twitter:description" content="A multilingual, static website.">
<link rel="canonical" href="http://localhost:8000/impressum/">
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
</head>
<body>
<a href="#main" class="skip-link">Skip to main content</a>
<header class="site-header">
<a href="index.html" class="brand" aria-label="Back to home">My Website</a>
<nav class="site-nav" aria-label="Main navigation">
<a class="nav-gcbok__link" href="ueber.html">Über</a>
</nav>
<div class="lang-dropdown" aria-label="Language switcher">
<ul class="lang-dropdown__menu">
<li><a href="/de/" hreflang="de"><span>Deutsch</span> <span class="lang-dropdown__code">DE</span></a></li>
<li><a href="/en/" hreflang="en"><span>English</span> <span class="lang-dropdown__code">EN</span></a></li>
<li><a href="/vi/" hreflang="vi"><span>Tiếng Việt</span> <span class="lang-dropdown__code">VI</span></a></li>
</ul>
</div>
</header>
<main id="main" tabindex="-1" data-pagefind-body>
<div class="container">
<h2 id="impressum">Impressum</h2>
<p>Beispiel-Website · Ansprechpartner: webmaster@example.org</p>
<p>© 2026 Beispiel-Website. Erstellt mit GCBoK.WebStaticBuilder (MIT).</p>
</div>
</main>
<footer class="site-footer">
<div class="container">
<h4>MY WEBSITE</h4>
<p class="muted">An example for GCBoK.WebStaticBuilder</p>
<ul>
<li><a href="glossary.html">Glossary</a></li>
<li><a href="impressum.html">Imprint</a></li>
</ul>
<p>© 2026 My Website</p>
</div>
</footer>
<script src="/assets/js/gcbok-theme.js"></script>
</body>
</html>
-85
View File
@@ -1,85 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Startseite</title>
<meta name="description" content="Die Landing-Page dieser Beispiel-Website">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="96x96" href="/assets/favicon/favicon-96x96.png">
<link rel="icon" href="/assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<meta property="og:title" content="Startseite">
<meta property="og:description" content="Die Landing-Page dieser Beispiel-Website">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:8000/">
<meta property="og:locale" content="">
<meta property="og:image" content="/assets/favicon/web-app-manifest-512x512.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Startseite">
<meta name="twitter:description" content="Die Landing-Page dieser Beispiel-Website">
<link rel="canonical" href="http://localhost:8000/">
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
</head>
<body>
<a href="#main" class="skip-link">Skip to main content</a>
<header class="site-header">
<a href="index.html" class="brand" aria-label="Back to home">My Website</a>
<nav class="site-nav" aria-label="Main navigation">
<a class="nav-gcbok__link" href="ueber.html">Über</a>
</nav>
<div class="lang-dropdown" aria-label="Language switcher">
<ul class="lang-dropdown__menu">
<li><a href="/de/" hreflang="de"><span>Deutsch</span> <span class="lang-dropdown__code">DE</span></a></li>
<li><a href="/en/" hreflang="en"><span>English</span> <span class="lang-dropdown__code">EN</span></a></li>
<li><a href="/vi/" hreflang="vi"><span>Tiếng Việt</span> <span class="lang-dropdown__code">VI</span></a></li>
</ul>
</div>
</header>
<main id="main" tabindex="-1" data-pagefind-body>
<div class="container">
<h1 id="willkommen-bei-gcbok.webstaticbuilder">Willkommen bei GCBoK.WebStaticBuilder</h1>
<p>Dies ist der Banner-Block (order 0), der auf der Startseite (Hero/Landing) eingebettet wird.</p>
<h2 id="einfuhrung">Einführung</h2>
<p>Diese Seite wurde mit <strong>GCBoK.WebStaticBuilder</strong> erzeugt — einem statischen, mehrsprachigen
Generator für compliance-freundliche Websites (MIT, OSS).</p>
<h2 id="funktionen">Funktionen</h2>
<ul>
<li>Markdown mit YAML-Frontmatter</li>
<li>Mehrsprachigkeit (de / en / vi)</li>
<li>SEO-Kopf, Sitemap, robots.txt</li>
<li>Client-Suche via Pagefind</li>
<li>UI-Lokalisierung über <code>{{ i18n.* }}</code></li>
</ul>
<h2 id="nachste-schritte">Nächste Schritte</h2>
<p>Siehe <code>docs/</code> im Repository für die Einrichtung.</p>
</div>
</main>
<footer class="site-footer">
<div class="container">
<h4>MY WEBSITE</h4>
<p class="muted">An example for GCBoK.WebStaticBuilder</p>
<ul>
<li><a href="glossary.html">Glossary</a></li>
<li><a href="impressum.html">Imprint</a></li>
</ul>
<p>© 2026 My Website</p>
</div>
</footer>
<script src="/assets/js/gcbok-theme.js"></script>
</body>
</html>
-81
View File
@@ -1,81 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Über das Projekt</title>
<meta name="description" content="Hintergrund zum Beispiel-Projekt">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="96x96" href="/assets/favicon/favicon-96x96.png">
<link rel="icon" href="/assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<meta property="og:title" content="Über das Projekt">
<meta property="og:description" content="Hintergrund zum Beispiel-Projekt">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:8000/ueber/">
<meta property="og:locale" content="">
<meta property="og:image" content="/assets/favicon/web-app-manifest-512x512.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Über das Projekt">
<meta name="twitter:description" content="Hintergrund zum Beispiel-Projekt">
<link rel="canonical" href="http://localhost:8000/ueber/">
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
</head>
<body>
<a href="#main" class="skip-link">Skip to main content</a>
<header class="site-header">
<a href="index.html" class="brand" aria-label="Back to home">My Website</a>
<nav class="site-nav" aria-label="Main navigation">
<a class="nav-gcbok__link" href="ueber.html">Über</a>
</nav>
<div class="lang-dropdown" aria-label="Language switcher">
<ul class="lang-dropdown__menu">
<li><a href="/de/" hreflang="de"><span>Deutsch</span> <span class="lang-dropdown__code">DE</span></a></li>
<li><a href="/en/" hreflang="en"><span>English</span> <span class="lang-dropdown__code">EN</span></a></li>
<li><a href="/vi/" hreflang="vi"><span>Tiếng Việt</span> <span class="lang-dropdown__code">VI</span></a></li>
</ul>
</div>
</header>
<main id="main" tabindex="-1" data-pagefind-body>
<div class="container">
<h2 id="uber">Über</h2>
<p>GCBoK.WebStaticBuilder ist ein eigenständiges OSS-Tool der GitCover Commons.
Es erzeugt statische Websites ohne Server, Datenbank oder Build-Service.</p>
<div class="mermaid">graph TD
A[Markdown] --> B(Builder)
B --> C[HTML]
C --> D[Pagefind Index]
</div>
<nav class="page-nav" aria-label="Seitennavigation">
<span class="page-nav__link">&nbsp;</span>
<span class="page-nav__link page-nav__link--next">&nbsp;</span>
</nav>
</div>
</main>
<footer class="site-footer">
<div class="container">
<h4>MY WEBSITE</h4>
<p class="muted">An example for GCBoK.WebStaticBuilder</p>
<ul>
<li><a href="glossary.html">Glossary</a></li>
<li><a href="impressum.html">Imprint</a></li>
</ul>
<p>© 2026 My Website</p>
</div>
</footer>
<script src="/assets/js/gcbok-theme.js"></script>
</body>
</html>
-30
View File
@@ -1,30 +0,0 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Meine Website</title>
<script>
(function() {
var supported = ["de","en","vi"];
var defaultLang = "de";
var lang = defaultLang;
if (navigator.languages && navigator.languages.length) {
for (var i = 0; i < navigator.languages.length; i++) {
var pref = navigator.languages[i].toLowerCase().split("-")[0];
if (supported.indexOf(pref) !== -1) { lang = pref; break; }
}
} else if (navigator.language) {
var pref = navigator.language.toLowerCase().split("-")[0];
if (supported.indexOf(pref) !== -1) lang = pref;
}
window.location.replace("/" + lang + "/");
})();
</script>
<meta http-equiv="refresh" content="0; url=/de/">
<link rel="canonical" href="http://localhost:8000/de/">
</head>
<body>
<p>Redirecting to <a href="/de/">Deutsch</a> | <a href="/en/">English</a> | <a href="/vi/">Tiếng Việt</a></p>
</body>
</html>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
-1
View File
@@ -1 +0,0 @@
{"version":"1.5.2","languages":{"de":{"hash":"de_8987bfa9ae","wasm":"de","page_count":3},"vi":{"hash":"vi_2270a45bad","wasm":null,"page_count":3},"en":{"hash":"en_9b2654cc0d","wasm":"en","page_count":3}},"include_characters":["_","‿","⁀","⁔","︳","︴","","","","_"]}
File diff suppressed because it is too large Load Diff
-214
View File
@@ -1,214 +0,0 @@
:root {
--pagefind-ui-scale: 0.8;
--pagefind-ui-primary: #034AD8;
--pagefind-ui-fade: #707070;
--pagefind-ui-text: #393939;
--pagefind-ui-background: #ffffff;
--pagefind-ui-border: #eeeeee;
--pagefind-ui-tag: #eeeeee;
--pagefind-ui-border-width: 2px;
--pagefind-ui-border-radius: 8px;
--pagefind-ui-image-border-radius: 8px;
--pagefind-ui-image-box-ratio: 3 / 2;
--pagefind-ui-font: system, -apple-system, ".SFNSText-Regular",
"San Francisco", "Roboto", "Segoe UI", "Helvetica Neue",
"Lucida Grande", sans-serif;
}
[data-pfmod-hidden] {
display: none !important;
}
[data-pfmod-suppressed] {
opacity: 0 !important;
pointer-events: none !important;
}
[data-pfmod-sr-hidden] {
-webkit-clip: rect(0 0 0 0) !important;
clip: rect(0 0 0 0) !important;
-webkit-clip-path: inset(100%) !important;
clip-path: inset(100%) !important;
height: 1px !important;
overflow: hidden !important;
overflow: clip !important;
position: absolute !important;
white-space: nowrap !important;
width: 1px !important;
}
[data-pfmod-loading] {
color: var(--pagefind-ui-text);
background-color: var(--pagefind-ui-text);
border-radius: var(--pagefind-ui-border-radius);
opacity: 0.1;
pointer-events: none;
}
/* Input */
.pagefind-modular-input-wrapper {
position: relative;
}
.pagefind-modular-input-wrapper::before {
background-color: var(--pagefind-ui-text);
width: calc(18px * var(--pagefind-ui-scale));
height: calc(18px * var(--pagefind-ui-scale));
top: calc(23px * var(--pagefind-ui-scale));
left: calc(20px * var(--pagefind-ui-scale));
content: "";
position: absolute;
display: block;
opacity: 0.7;
-webkit-mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");
mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");
-webkit-mask-size: 100%;
mask-size: 100%;
z-index: 9;
pointer-events: none;
}
.pagefind-modular-input {
height: calc(64px * var(--pagefind-ui-scale));
padding: 0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale));
background-color: var(--pagefind-ui-background);
border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);
border-radius: var(--pagefind-ui-border-radius);
font-size: calc(21px * var(--pagefind-ui-scale));
position: relative;
appearance: none;
-webkit-appearance: none;
display: flex;
width: 100%;
box-sizing: border-box;
font-weight: 700;
}
.pagefind-modular-input::placeholder {
opacity: 0.2;
}
.pagefind-modular-input-clear {
position: absolute;
top: calc(2px * var(--pagefind-ui-scale));
right: calc(2px * var(--pagefind-ui-scale));
height: calc(60px * var(--pagefind-ui-scale));
border-radius: var(--pagefind-ui-border-radius);
padding: 0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale));
color: var(--pagefind-ui-text);
font-size: calc(14px * var(--pagefind-ui-scale));
cursor: pointer;
background-color: var(--pagefind-ui-background);
border: none;
appearance: none;
}
/* ResultList */
.pagefind-modular-list-result {
list-style-type: none;
display: flex;
align-items: flex-start;
gap: min(calc(40px * var(--pagefind-ui-scale)), 3%);
padding: calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));
border-top: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border);
}
.pagefind-modular-list-result:last-of-type {
border-bottom: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border);
}
.pagefind-modular-list-thumb {
width: min(30%,
calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));
max-width: calc(120px * var(--pagefind-ui-scale));
margin-top: calc(10px * var(--pagefind-ui-scale));
aspect-ratio: var(--pagefind-ui-image-box-ratio);
position: relative;
}
.pagefind-modular-list-image {
display: block;
position: absolute;
left: 50%;
transform: translateX(-50%);
font-size: 0;
width: auto;
height: auto;
max-width: 100%;
max-height: 100%;
border-radius: var(--pagefind-ui-image-border-radius);
}
.pagefind-modular-list-inner {
flex: 1;
display: flex;
flex-direction: column;
align-items: flex-start;
margin-top: calc(10px * var(--pagefind-ui-scale));
}
.pagefind-modular-list-title {
display: inline-block;
font-weight: 700;
font-size: calc(21px * var(--pagefind-ui-scale));
margin-top: 0;
margin-bottom: 0;
}
.pagefind-modular-list-link {
color: var(--pagefind-ui-text);
text-decoration: none;
}
.pagefind-modular-list-link:hover {
text-decoration: underline;
}
.pagefind-modular-list-excerpt {
display: inline-block;
font-weight: 400;
font-size: calc(16px * var(--pagefind-ui-scale));
margin-top: calc(4px * var(--pagefind-ui-scale));
margin-bottom: 0;
min-width: calc(250px * var(--pagefind-ui-scale));
}
/* FilterPills */
.pagefind-modular-filter-pills-wrapper {
overflow-x: scroll;
padding: 15px 0;
}
.pagefind-modular-filter-pills {
display: flex;
gap: 6px;
}
.pagefind-modular-filter-pill {
display: flex;
justify-content: center;
align-items: center;
border: none;
appearance: none;
padding: 0 calc(24px * var(--pagefind-ui-scale));
background-color: var(--pagefind-ui-background);
color: var(--pagefind-ui-fade);
border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);
border-radius: calc(25px * var(--pagefind-ui-scale));
font-size: calc(18px * var(--pagefind-ui-scale));
height: calc(50px * var(--pagefind-ui-scale));
cursor: pointer;
white-space: nowrap;
}
.pagefind-modular-filter-pill:hover {
border-color: var(--pagefind-ui-primary);
}
.pagefind-modular-filter-pill[aria-pressed="true"] {
border-color: var(--pagefind-ui-primary);
color: var(--pagefind-ui-primary);
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-3
View File
@@ -1,3 +0,0 @@
User-agent: *
Allow: /
Sitemap: http://localhost:8000/sitemap.xml
-15
View File
@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>http://localhost:8000/de/</loc></url>
<url><loc>http://localhost:8000/</loc></url>
<url><loc>http://localhost:8000/</loc></url>
<url><loc>http://localhost:8000/ueber/</loc></url>
<url><loc>http://localhost:8000/en/</loc></url>
<url><loc>http://localhost:8000/</loc></url>
<url><loc>http://localhost:8000/</loc></url>
<url><loc>http://localhost:8000/ueber/</loc></url>
<url><loc>http://localhost:8000/vi/</loc></url>
<url><loc>http://localhost:8000/</loc></url>
<url><loc>http://localhost:8000/</loc></url>
<url><loc>http://localhost:8000/ueber/</loc></url>
</urlset>
-73
View File
@@ -1,73 +0,0 @@
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Impressum</title>
<meta name="description" content="Một trang web tĩnh, đa ngôn ngữ.">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="96x96" href="/assets/favicon/favicon-96x96.png">
<link rel="icon" href="/assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<meta property="og:title" content="Impressum">
<meta property="og:description" content="Một trang web tĩnh, đa ngôn ngữ.">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:8000/impressum/">
<meta property="og:locale" content="">
<meta property="og:image" content="/assets/favicon/web-app-manifest-512x512.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Impressum">
<meta name="twitter:description" content="Một trang web tĩnh, đa ngôn ngữ.">
<link rel="canonical" href="http://localhost:8000/impressum/">
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
</head>
<body>
<a href="#main" class="skip-link">Đến nội dung chính</a>
<header class="site-header">
<a href="index.html" class="brand" aria-label="Về trang chủ">Trang web của tôi</a>
<nav class="site-nav" aria-label="Điều hướng chính">
<a class="nav-gcbok__link" href="ueber.html">Über</a>
</nav>
<div class="lang-dropdown" aria-label="Chuyển ngôn ngữ">
<ul class="lang-dropdown__menu">
<li><a href="/de/" hreflang="de"><span>Deutsch</span> <span class="lang-dropdown__code">DE</span></a></li>
<li><a href="/en/" hreflang="en"><span>English</span> <span class="lang-dropdown__code">EN</span></a></li>
<li><a href="/vi/" hreflang="vi"><span>Tiếng Việt</span> <span class="lang-dropdown__code">VI</span></a></li>
</ul>
</div>
</header>
<main id="main" tabindex="-1" data-pagefind-body>
<div class="container">
<h2 id="impressum">Impressum</h2>
<p>Beispiel-Website · Ansprechpartner: webmaster@example.org</p>
<p>© 2026 Beispiel-Website. Erstellt mit GCBoK.WebStaticBuilder (MIT).</p>
</div>
</main>
<footer class="site-footer">
<div class="container">
<h4>TRANG WEB CỦA TÔI</h4>
<p class="muted">Một ví dụ cho GCBoK.WebStaticBuilder</p>
<ul>
<li><a href="b-ng-thu-t-ng.html">Bảng thuật ngữ</a></li>
<li><a href="impressum.html">Thông tin pháp lý</a></li>
</ul>
<p>© 2026 Trang web của tôi</p>
</div>
</footer>
<script src="/assets/js/gcbok-theme.js"></script>
</body>
</html>
-85
View File
@@ -1,85 +0,0 @@
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Startseite</title>
<meta name="description" content="Die Landing-Page dieser Beispiel-Website">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="96x96" href="/assets/favicon/favicon-96x96.png">
<link rel="icon" href="/assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<meta property="og:title" content="Startseite">
<meta property="og:description" content="Die Landing-Page dieser Beispiel-Website">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:8000/">
<meta property="og:locale" content="">
<meta property="og:image" content="/assets/favicon/web-app-manifest-512x512.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Startseite">
<meta name="twitter:description" content="Die Landing-Page dieser Beispiel-Website">
<link rel="canonical" href="http://localhost:8000/">
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
</head>
<body>
<a href="#main" class="skip-link">Đến nội dung chính</a>
<header class="site-header">
<a href="index.html" class="brand" aria-label="Về trang chủ">Trang web của tôi</a>
<nav class="site-nav" aria-label="Điều hướng chính">
<a class="nav-gcbok__link" href="ueber.html">Über</a>
</nav>
<div class="lang-dropdown" aria-label="Chuyển ngôn ngữ">
<ul class="lang-dropdown__menu">
<li><a href="/de/" hreflang="de"><span>Deutsch</span> <span class="lang-dropdown__code">DE</span></a></li>
<li><a href="/en/" hreflang="en"><span>English</span> <span class="lang-dropdown__code">EN</span></a></li>
<li><a href="/vi/" hreflang="vi"><span>Tiếng Việt</span> <span class="lang-dropdown__code">VI</span></a></li>
</ul>
</div>
</header>
<main id="main" tabindex="-1" data-pagefind-body>
<div class="container">
<h1 id="willkommen-bei-gcbok.webstaticbuilder">Willkommen bei GCBoK.WebStaticBuilder</h1>
<p>Dies ist der Banner-Block (order 0), der auf der Startseite (Hero/Landing) eingebettet wird.</p>
<h2 id="einfuhrung">Einführung</h2>
<p>Diese Seite wurde mit <strong>GCBoK.WebStaticBuilder</strong> erzeugt — einem statischen, mehrsprachigen
Generator für compliance-freundliche Websites (MIT, OSS).</p>
<h2 id="funktionen">Funktionen</h2>
<ul>
<li>Markdown mit YAML-Frontmatter</li>
<li>Mehrsprachigkeit (de / en / vi)</li>
<li>SEO-Kopf, Sitemap, robots.txt</li>
<li>Client-Suche via Pagefind</li>
<li>UI-Lokalisierung über <code>{{ i18n.* }}</code></li>
</ul>
<h2 id="nachste-schritte">Nächste Schritte</h2>
<p>Siehe <code>docs/</code> im Repository für die Einrichtung.</p>
</div>
</main>
<footer class="site-footer">
<div class="container">
<h4>TRANG WEB CỦA TÔI</h4>
<p class="muted">Một ví dụ cho GCBoK.WebStaticBuilder</p>
<ul>
<li><a href="b-ng-thu-t-ng.html">Bảng thuật ngữ</a></li>
<li><a href="impressum.html">Thông tin pháp lý</a></li>
</ul>
<p>© 2026 Trang web của tôi</p>
</div>
</footer>
<script src="/assets/js/gcbok-theme.js"></script>
</body>
</html>
-81
View File
@@ -1,81 +0,0 @@
<!doctype html>
<html lang="vi">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Über das Projekt</title>
<meta name="description" content="Hintergrund zum Beispiel-Projekt">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="icon" type="image/png" sizes="96x96" href="/assets/favicon/favicon-96x96.png">
<link rel="icon" href="/assets/favicon/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="theme-color" content="#ffffff">
<meta property="og:title" content="Über das Projekt">
<meta property="og:description" content="Hintergrund zum Beispiel-Projekt">
<meta property="og:type" content="website">
<meta property="og:url" content="http://localhost:8000/ueber/">
<meta property="og:locale" content="">
<meta property="og:image" content="/assets/favicon/web-app-manifest-512x512.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Über das Projekt">
<meta name="twitter:description" content="Hintergrund zum Beispiel-Projekt">
<link rel="canonical" href="http://localhost:8000/ueber/">
<link rel="stylesheet" href="/assets/css/main.css">
<link rel="icon" type="image/svg+xml" href="/assets/favicon/favicon.svg">
<link rel="manifest" href="/assets/favicon/site.webmanifest">
</head>
<body>
<a href="#main" class="skip-link">Đến nội dung chính</a>
<header class="site-header">
<a href="index.html" class="brand" aria-label="Về trang chủ">Trang web của tôi</a>
<nav class="site-nav" aria-label="Điều hướng chính">
<a class="nav-gcbok__link" href="ueber.html">Über</a>
</nav>
<div class="lang-dropdown" aria-label="Chuyển ngôn ngữ">
<ul class="lang-dropdown__menu">
<li><a href="/de/" hreflang="de"><span>Deutsch</span> <span class="lang-dropdown__code">DE</span></a></li>
<li><a href="/en/" hreflang="en"><span>English</span> <span class="lang-dropdown__code">EN</span></a></li>
<li><a href="/vi/" hreflang="vi"><span>Tiếng Việt</span> <span class="lang-dropdown__code">VI</span></a></li>
</ul>
</div>
</header>
<main id="main" tabindex="-1" data-pagefind-body>
<div class="container">
<h2 id="uber">Über</h2>
<p>GCBoK.WebStaticBuilder ist ein eigenständiges OSS-Tool der GitCover Commons.
Es erzeugt statische Websites ohne Server, Datenbank oder Build-Service.</p>
<div class="mermaid">graph TD
A[Markdown] --> B(Builder)
B --> C[HTML]
C --> D[Pagefind Index]
</div>
<nav class="page-nav" aria-label="Seitennavigation">
<span class="page-nav__link">&nbsp;</span>
<span class="page-nav__link page-nav__link--next">&nbsp;</span>
</nav>
</div>
</main>
<footer class="site-footer">
<div class="container">
<h4>TRANG WEB CỦA TÔI</h4>
<p class="muted">Một ví dụ cho GCBoK.WebStaticBuilder</p>
<ul>
<li><a href="b-ng-thu-t-ng.html">Bảng thuật ngữ</a></li>
<li><a href="impressum.html">Thông tin pháp lý</a></li>
</ul>
<p>© 2026 Trang web của tôi</p>
</div>
</footer>
<script src="/assets/js/gcbok-theme.js"></script>
</body>
</html>
-5
View File
@@ -1,5 +0,0 @@
=== Run Started: 2026-07-11 12:00:07.880 ===
Language: de, Files: 3
Language: en, Files: 3
Language: vi, Files: 3