18 Commits

Author SHA1 Message Date
6d486f49 64ac0c41b3 ... 2026-06-11 00:52:30 -04:00
JonathanMcCaffrey 4afb1d6227 ... 2026-06-10 22:42:40 -04:00
JonathanMcCaffrey fd418cb506 ... 2026-06-10 22:40:12 -04:00
JonathanMcCaffrey 436151d642 ... 2026-06-10 22:37:25 -04:00
JonathanMcCaffrey 4b762c168d ... 2026-06-10 22:15:08 -04:00
JonathanMcCaffrey 409489a507 ... 2026-06-10 22:12:02 -04:00
JonathanMcCaffrey 7291c3565f ... 2026-06-10 22:11:00 -04:00
JonathanMcCaffrey 43be7d4ddc ... 2026-06-10 22:06:26 -04:00
JonathanMcCaffrey ca567c65a0 ... 2026-06-10 22:03:35 -04:00
JonathanMcCaffrey bc8d92d06d ... 2026-06-10 22:01:17 -04:00
JonathanMcCaffrey e471875dc3 ... 2026-06-10 21:57:37 -04:00
JonathanMcCaffrey 97ec82dd7f ... 2026-06-10 21:49:39 -04:00
JonathanMcCaffrey d184980586 ... 2026-06-10 21:47:32 -04:00
JonathanMcCaffrey 654ce3e9b0 ... 2026-06-10 21:46:16 -04:00
JonathanMcCaffrey 6bf1b87207 ... 2026-06-10 21:35:28 -04:00
JonathanMcCaffrey 3e80ce78a0 ... 2026-06-10 21:31:37 -04:00
JonathanMcCaffrey 01a49c1c30 ... 2026-06-10 21:22:38 -04:00
JonathanMcCaffrey 3f6dda9602 ... 2026-06-10 21:11:24 -04:00
100 changed files with 46118 additions and 54857 deletions
+33 -172
View File
@@ -1,12 +1,10 @@
using System.Text;
using System.Text.Encodings.Web;
using System.Text.RegularExpressions;
using System.Text.Json;
using System.Text.RegularExpressions;
var exeDir = AppContext.BaseDirectory;
var solutionDir = FindContainingDir(exeDir, "ET.sln")
?? throw new InvalidOperationException("Cannot find ET.sln");
?? throw new InvalidOperationException("Cannot find ET.sln");
var srcDir = Path.GetFullPath(Path.Combine(solutionDir, "..", "docs", "Notes"));
var dstDir = Path.GetFullPath(Path.Combine(solutionDir, "Web", "wwwroot", "docs", "notes"));
@@ -20,18 +18,13 @@ if (!Directory.Exists(srcDir))
return 1;
}
var entries = SyncNotes(srcDir, dstDir);
CopyOverview(solutionDir, dstDir, entries);
CopyImages(solutionDir, Path.GetFullPath(Path.Combine(solutionDir, "Web", "wwwroot", "docs")));
var indexJson = BuildIndex(entries);
File.WriteAllText(Path.Combine(Path.GetDirectoryName(dstDir)!, "notes-index.json"), indexJson);
SyncNotes(srcDir, dstDir);
GenerateMap(srcDir, Path.GetFullPath(Path.Combine(solutionDir, "Web", "wwwroot", "docs")));
GenerateOverviewPage(solutionDir);
Console.WriteLine("Done.");
return 0;
static List<object> SyncNotes(string srcDir, string dstDir)
static void SyncNotes(string srcDir, string dstDir)
{
Directory.CreateDirectory(dstDir);
@@ -45,33 +38,16 @@ static List<object> SyncNotes(string srcDir, string dstDir)
var name = Path.GetFileNameWithoutExtension(file);
var slug = Slugify(name);
File.Copy(file, Path.Combine(dstDir, $"{slug}.md"), true);
File.Copy(file, Path.Combine(dstDir, $"{slug}.md"), overwrite: true);
string? category = null;
string? cost = null;
string? gearCategory = null;
string? effect = null;
string? location = null;
var content = File.ReadAllText(file);
var fmMatch = Regex.Match(content, @"^---\s*\n(.*?)\n---", RegexOptions.Singleline);
if (fmMatch.Success)
{
var fm = fmMatch.Groups[1].Value;
var catMatch = Regex.Match(fm, @"(?m)^category:\s*(.+)$", RegexOptions.IgnoreCase);
var catMatch = Regex.Match(fmMatch.Groups[1].Value, @"(?m)^category:\s*(.+)$");
if (catMatch.Success)
category = catMatch.Groups[1].Value.Trim().Trim('"');
var costMatch = Regex.Match(fm, @"(?m)^cost:\s*(.+)$", RegexOptions.IgnoreCase);
if (costMatch.Success)
cost = costMatch.Groups[1].Value.Trim().Trim('"');
var gcMatch = Regex.Match(fm, @"(?m)^gear category:\s*(.+)$", RegexOptions.IgnoreCase);
if (gcMatch.Success)
gearCategory = gcMatch.Groups[1].Value.Trim().Trim('"');
var effMatch = Regex.Match(fm, @"(?m)^effect:\s*(.+)$", RegexOptions.IgnoreCase);
if (effMatch.Success)
effect = effMatch.Groups[1].Value.Trim().Trim('"');
var locMatch = Regex.Match(fm, @"(?m)^location:\s*(.+)$", RegexOptions.IgnoreCase);
if (locMatch.Success)
location = locMatch.Groups[1].Value.Trim().Trim('"');
}
var entry = new Dictionary<string, object?>
@@ -81,122 +57,18 @@ static List<object> SyncNotes(string srcDir, string dstDir)
};
if (category != null)
entry["category"] = category;
if (cost != null)
entry["cost"] = cost;
if (gearCategory != null)
entry["gearCategory"] = gearCategory;
if (effect != null)
entry["effect"] = effect;
if (location != null)
entry["location"] = location;
entries.Add(entry);
}
Console.WriteLine($"Copied {entries.Count} notes.");
return entries;
}
static void CopyOverview(string solutionDir, string dstDir, List<object> entries)
{
var srcOverview = Path.GetFullPath(Path.Combine(solutionDir, "..", "docs", "Overview.md"));
if (!File.Exists(srcOverview)) return;
var slug = "overview";
File.Copy(srcOverview, Path.Combine(dstDir, $"{slug}.md"), true);
entries.Add(new Dictionary<string, object?>
{
["slug"] = slug,
["title"] = "Overview",
["category"] = "Overview"
});
Console.WriteLine("Copied Overview.md.");
}
static void CopyImages(string solutionDir, string dstDir)
{
var srcImgs = Path.GetFullPath(Path.Combine(solutionDir, "..", "docs", "Images"));
if (!Directory.Exists(srcImgs)) return;
var dstImgs = Path.Combine(dstDir, "images");
Directory.CreateDirectory(dstImgs);
foreach (var file in Directory.EnumerateFiles(srcImgs))
{
var name = Path.GetFileName(file);
File.Copy(file, Path.Combine(dstImgs, name), true);
}
Console.WriteLine($"Copied images from {srcImgs}.");
}
static string BuildIndex(List<object> entries)
{
var index = new Dictionary<string, object> { ["notes"] = entries };
return JsonSerializer.Serialize(index, new JsonSerializerOptions { WriteIndented = true });
}
var json = JsonSerializer.Serialize(index, new JsonSerializerOptions { WriteIndented = true });
static void GenerateOverviewPage(string solutionDir)
{
var pagesDir = Path.GetFullPath(Path.Combine(solutionDir, "Web", "Pages"));
Directory.CreateDirectory(pagesDir);
var indexPath = Path.Combine(Path.GetDirectoryName(dstDir)!, "notes-index.json");
File.WriteAllText(indexPath, json);
var component = """
@page "/overview"
@inject DocsService DocsService
<PageTitle>Overview</PageTitle>
@if (loading)
{
<div class="d-flex justify-content-center py-5">
<div class="spinner-border text-success" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
}
else if (doc == null)
{
<h1>Overview Not Found</h1>
<p>The overview document could not be found.</p>
}
else
{
<div class="section-header d-flex align-items-center mb-4">
<h1 class="mb-0">@doc.Title</h1>
<div class="ms-3 flex-grow-1 border-bottom opacity-25"></div>
</div>
@if (!string.IsNullOrEmpty(doc.FrontmatterHtml))
{
<details class="frontmatter-section" open>
<summary>Frontmatter</summary>
@((MarkupString)doc.FrontmatterHtml)
</details>
}
<div class="markdown-body overview-markdown">
@((MarkupString)doc.HtmlContent)
</div>
}
@code {
private NoteDocument? doc;
private bool loading = true;
protected override async Task OnInitializedAsync()
{
doc = await DocsService.GetNoteAsync("overview");
loading = false;
}
}
""";
var overviewPagePath = Path.Combine(pagesDir, "Overview.razor");
File.WriteAllText(overviewPagePath, component);
Console.WriteLine($"Overview page written to: {overviewPagePath}");
Console.WriteLine($"Copied {entries.Count} notes.");
Console.WriteLine($"Index written to: {indexPath}");
}
static void GenerateMap(string srcDir, string dstDir)
@@ -207,7 +79,7 @@ static void GenerateMap(string srcDir, string dstDir)
["Forest"] = "#2e7d32",
["Mountain"] = "#78909c",
["Water"] = "#42a5f5",
["Wasteland"] = "#8d6e63"
["Wasteland"] = "#8d6e63",
};
var regionFiles = Directory.EnumerateFiles(srcDir, "*.md")
@@ -254,23 +126,18 @@ static void GenerateMap(string srcDir, string dstDir)
});
}
var srcMapImage = Path.GetFullPath(Path.Combine(srcDir, "..", "Images", "Map.png"));
var dstMapImage = Path.Combine(dstDir, "Map.png");
if (File.Exists(srcMapImage))
File.Copy(srcMapImage, dstMapImage, true);
var nameLookup = regions.ToDictionary(r => r.Name);
var pad = 60;
var maxX = (regions.Count > 0 ? regions.Max(r => r.X) : 0) + pad * 2;
var maxY = (regions.Count > 0 ? regions.Max(r => r.Y) : 0) + pad * 2;
var svg = new StringBuilder();
svg.AppendLine("<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 700 461\">");
svg.AppendLine("""<image href="Map.png" width="700" height="461" preserveAspectRatio="xMidYMid meet"/>""");
var svg = new System.Text.StringBuilder();
svg.AppendLine($"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 {maxX} {maxY}\">");
svg.AppendLine("""<defs>""");
svg.AppendLine($"""<rect width="100%" height="100%" fill="#1a1a2e" rx="8"/>""");
svg.AppendLine($"""<defs>""");
foreach (var (terrain, color) in terrainColors)
{
svg.AppendLine($"""<radialGradient id="glow-{terrain}" cx="50%" cy="50%" r="50%">""");
@@ -278,50 +145,45 @@ static void GenerateMap(string srcDir, string dstDir)
svg.AppendLine($"""<stop offset="100%" stop-color="{color}" stop-opacity="0"/>""");
svg.AppendLine("</radialGradient>");
}
svg.AppendLine("</defs>");
foreach (var region in regions)
foreach (var conn in region.Connections)
{
if (!nameLookup.TryGetValue(conn, out var target) ||
string.Compare(region.Name, conn, StringComparison.OrdinalIgnoreCase) >= 0)
continue;
foreach (var conn in region.Connections)
{
if (!nameLookup.TryGetValue(conn, out var target) || string.Compare(region.Name, conn, StringComparison.OrdinalIgnoreCase) >= 0)
continue;
svg.AppendLine(
$"""<line x1="{region.X}" y1="{region.Y}" x2="{target.X}" y2="{target.Y}" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>""");
svg.AppendLine($"""<line x1="{region.X + pad}" y1="{region.Y + pad}" x2="{target.X + pad}" y2="{target.Y + pad}" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>""");
}
}
foreach (var region in regions)
{
var cx = region.X;
var cy = region.Y;
var cx = region.X + pad;
var cy = region.Y + pad;
var color = terrainColors.GetValueOrDefault(region.Terrain, "#888");
svg.AppendLine($"""<a href="/docs/{region.Slug}" target="_top">""");
svg.AppendLine($"""<circle cx="{cx}" cy="{cy}" r="32" fill="url(#glow-{region.Terrain})"/>""");
svg.AppendLine(
$"""<circle cx="{cx}" cy="{cy}" r="18" fill="{color}cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>""");
svg.AppendLine($"""<circle cx="{cx}" cy="{cy}" r="18" fill="{color}" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>""");
var labelX = cx + 24;
svg.AppendLine(
$"""<text x="{labelX}" y="{cy + 4}" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">""");
svg.Append(HtmlEncoder.Default.Encode(region.Name));
svg.AppendLine($"""<text x="{labelX}" y="{cy + 4}" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">""");
svg.Append(System.Text.Encodings.Web.HtmlEncoder.Default.Encode(region.Name));
svg.AppendLine("</text>");
foreach (var lm in region.Landmarks)
{
svg.AppendLine(
$"""<text x="{labelX}" y="{cy + 18}" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">""");
svg.Append(HtmlEncoder.Default.Encode($"\u2605 {lm}"));
svg.AppendLine($"""<text x="{labelX}" y="{cy + 18}" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">""");
svg.Append(System.Text.Encodings.Web.HtmlEncoder.Default.Encode($"\u2605 {lm}"));
svg.AppendLine("</text>");
}
svg.AppendLine("</a>");
}
/**
var legendX = 700 - 160;
var legendX = maxX - 160;
var legendY = 20;
svg.AppendLine($"""<rect x="{legendX}" y="{legendY}" width="140" height="{20 + terrainColors.Count * 22}" rx="6" fill="rgba(0,0,0,0.4)" stroke="rgba(255,255,255,0.08)"/>""");
svg.AppendLine($"""<text x="{legendX + 10}" y="{legendY + 15}" fill="rgba(255,255,255,0.6)" font-family="system-ui,sans-serif" font-size="10" font-weight="600">Legend</text>""");
@@ -332,7 +194,6 @@ static void GenerateMap(string srcDir, string dstDir)
svg.AppendLine($"""<text x="{legendX + 26}" y="{ly + 1}" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="10">{terrain}</text>""");
ly += 22;
}
*/
svg.AppendLine("</svg>");
@@ -363,11 +224,10 @@ static string? FindContainingDir(string startDir, string markerFile)
return dir.FullName;
dir = dir.Parent;
}
return null;
}
internal class RegionData
class RegionData
{
public string Name { get; set; } = "";
public string Slug { get; set; } = "";
@@ -377,3 +237,4 @@ internal class RegionData
public List<string> Connections { get; set; } = new();
public List<string> Landmarks { get; set; } = new();
}
+1 -2
View File
@@ -1,5 +1,4 @@
@using Web.Pages
<Router AppAssembly="@typeof(App).Assembly" NotFoundPage="typeof(NotFound)">
<Router AppAssembly="@typeof(App).Assembly" NotFoundPage="typeof(Pages.NotFound)">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
<FocusOnNavigate RouteData="@routeData" Selector="h1"/>
+1 -3
View File
@@ -5,9 +5,7 @@
</div>
<main>
<article class="content px-4">
<TelerikRootComponent>
@Body
</TelerikRootComponent>
@Body
</article>
</main>
</div>
+13 -14
View File
@@ -9,8 +9,7 @@ main {
}
.sidebar {
background-color: var(--bg-sidebar);
border-right: 1px solid var(--border-color);
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row {
@@ -22,20 +21,20 @@ main {
align-items: center;
}
.top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap;
margin-left: 1.5rem;
text-decoration: none;
}
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
text-decoration: underline;
}
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
text-decoration: underline;
}
.top-row ::deep a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
.top-row ::deep a:first-child {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row {
+4 -17
View File
@@ -1,10 +1,8 @@
@inject DocsService DocsService
@inject Web.Services.DocsService DocsService
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">
<span class="brand-text">Trailblazer</span>
</a>
<a class="navbar-brand" href="">Web</a>
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
@@ -18,16 +16,6 @@
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="overview">
<span class="bi bi-book-nav-menu" aria-hidden="true"></span> Overview
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="gear">
<span class="bi bi-tools-nav-menu" aria-hidden="true"></span> Gear
</NavLink>
</div>
@if (groupedNotes == null)
{
@@ -65,7 +53,7 @@
protected override async Task OnInitializedAsync()
{
var index = await DocsService.GetIndexAsync();
groupedNotes = (index.Notes ?? new List<NoteInfo>())
groupedNotes = (index.Notes ?? new())
.GroupBy(n => string.IsNullOrEmpty(n.Category) ? "Uncategorized" : n.Category)
.OrderBy(g => g.Key)
.Select(g => new NoteGroup { Category = g.Key, Notes = g.OrderBy(n => n.Title).ToList() })
@@ -75,7 +63,6 @@
private class NoteGroup
{
public string Category { get; set; } = "";
public List<NoteInfo> Notes { get; set; } = new();
public List<Web.Models.NoteInfo> Notes { get; set; } = new();
}
}
+24 -42
View File
@@ -9,17 +9,9 @@
}
.navbar-brand {
font-family: 'Outfit', sans-serif;
font-size: 1.25rem;
font-weight: 700;
letter-spacing: -0.01em;
color: var(--accent) !important;
}
.brand-text {
background: linear-gradient(135deg, var(--accent) 0%, var(--primary-light) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
font-size: 1.1rem;
font-weight: 600;
letter-spacing: 0.02em;
}
.bi {
@@ -45,14 +37,6 @@
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E");
}
.bi-book-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-book' viewBox='0 0 16 16'%3E%3Cpath d='M1 2.828c.885-.37 2.154-.769 4-.388A5 5 0 0 1 8 3.03V13.5a.5.5 0 0 1-.5.5c-1.777 0-3.158-.551-4.21-1.11-.534-.284-.822-.702-1.02-1.106C1.879 11.08 1.5 10.183 1.5 9V3c0-.138.172-.255.5-.172zM2 10.304c.367.214.9.482 1.5.662.6.18 1.174.243 1.5.256V3.881c-.563-.064-1.242-.08-2-.354C2.462 3.267 2.184 3.04 2 2.816v7.488zM7.5 13.5V3.03a5 5 0 0 1 2.5-.59c1.846-.38 3.115-.018 4 .388V2.67c0-.138.328-.255.5-.172.328.083.5.255.5.172v7.5c0 .828-.5 1.5-1.5 1.5s-1.5-.672-1.5-1.5v-5.5a.5.5 0 0 0-1 0v5.5c0 .828-.5 1.5-1.5 1.5s-1.5-.672-1.5-1.5v-.5z'/%3E%3C/svg%3E");
}
.bi-tools-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-gear' viewBox='0 0 16 16'%3E%3Cpath d='M8 4.754a3.246 3.246 0 1 0 0 6.492 3.246 3.246 0 0 0 0-6.492zM5.754 8a2.246 2.246 0 1 1 4.492 0 2.246 2.246 0 0 1-4.492 0z'/%3E%3Cpath d='M9.796 1.343c-.527-1.79-3.065-1.79-3.592 0l-.094.319a.873.873 0 0 1-1.255.52l-.292-.16c-1.64-.892-3.433.902-2.54 2.541l.159.292a.873.873 0 0 1-.52 1.255l-.319.094c-1.79.527-1.79 3.065 0 3.592l.319.094a.873.873 0 0 1 .52 1.255l-.16.292c-.892 1.64.901 3.434 2.541 2.54l.292-.159a.873.873 0 0 1 1.255.52l.094.319c.527 1.79 3.065 1.79 3.592 0l.094-.319a.873.873 0 0 1 1.255-.52l.292.16c1.64.893 3.434-.902 2.54-2.541l-.159-.292a.873.873 0 0 1 .52-1.255l.319-.094c1.79-.527 1.79-3.065 0-3.592l-.319-.094a.873.873 0 0 1-.52-1.255l.16-.292c.893-1.64-.902-3.433-2.541-2.54l-.292.159a.873.873 0 0 1-1.255-.52l-.094-.319zm-2.633.283c.246-.835 1.428-.835 1.674 0l.094.319a1.873 1.873 0 0 0 2.693 1.115l.291-.16c.764-.415 1.6.42 1.184 1.185l-.159.292a1.873 1.873 0 0 0 1.116 2.692l.318.094c.835.246.835 1.428 0 1.674l-.319.094a1.873 1.873 0 0 0-1.115 2.693l.16.291c.415.764-.42 1.6-1.185 1.184l-.291-.159a1.873 1.873 0 0 0-2.693 1.116l-.094.318c-.246.835-1.428.835-1.674 0l-.094-.319a1.873 1.873 0 0 0-2.692-1.115l-.292.16c-.764.415-1.6-.42-1.184-1.185l.159-.291A1.873 1.873 0 0 0 1.945 8.93l-.319-.094c-.835-.246-.835-1.428 0-1.674l.319-.094A1.873 1.873 0 0 0 3.06 4.377l-.16-.292c-.415-.764.42-1.6 1.185-1.184l.292.159a1.873 1.873 0 0 0 2.692-1.115l.094-.319z'/%3E%3C/svg%3E");
}
.bi-file-text-nav-menu {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-file-text' viewBox='0 0 16 16'%3E%3Cpath d='M5 4a.5.5 0 0 0 0 1h6a.5.5 0 0 0 0-1H5zm-.5 2.5A.5.5 0 0 1 5 6h6a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zM5 8a.5.5 0 0 0 0 1h6a.5.5 0 0 0 0-1H5zm0 2a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1H5z'/%3E%3Cpath d='M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1z'/%3E%3C/svg%3E");
}
@@ -63,42 +47,40 @@
}
.nav-item ::deep a {
color: var(--text-main);
border-radius: 8px;
height: 2.8rem;
color: rgba(255, 255, 255, 0.75);
border-radius: 0;
height: 2.6rem;
display: flex;
align-items: center;
line-height: 2.8rem;
line-height: 2.6rem;
padding: 0 1rem;
margin: 0.2rem 0.5rem;
transition: all 0.2s ease;
border-left: 3px solid transparent;
transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.nav-item ::deep a.active {
background-color: var(--primary);
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
background-color: rgba(255, 255, 255, 0.12);
color: white;
border-left-color: rgba(255, 255, 255, 0.7);
}
.nav-item ::deep a:hover {
background-color: rgba(255, 255, 255, 0.05);
color: var(--accent);
background-color: rgba(255, 255, 255, 0.07);
color: white;
}
.nav-item-doc ::deep a {
padding-left: 2.5rem !important;
font-size: 0.85rem;
height: 2.2rem !important;
line-height: 2.2rem !important;
margin: 0.1rem 0.5rem;
padding-left: 1.75rem !important;
font-size: 0.8rem;
height: 1.85rem !important;
line-height: 1.85rem !important;
border-left-color: transparent;
}
.nav-item-doc ::deep a.active {
background-color: rgba(88, 129, 87, 0.2);
color: var(--accent);
border-left: 2px solid var(--accent);
border-radius: 0 8px 8px 0;
margin-left: 0;
background-color: rgba(255, 255, 255, 0.1);
color: white;
border-left-color: #6ea8fe;
}
.nav-item-doc ::deep a:hover {
@@ -123,7 +105,7 @@
.nav-scrollable {
scrollbar-width: thin;
scrollbar-color: rgba(255, 255, 255, 0.15) transparent;
scrollbar-color: rgba(255,255,255,0.15) transparent;
}
.nav-scrollable::-webkit-scrollbar {
@@ -135,7 +117,7 @@
}
.nav-scrollable::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.15);
background: rgba(255,255,255,0.15);
border-radius: 3px;
}
-4
View File
@@ -5,10 +5,6 @@ public class NoteInfo
public string Slug { get; set; } = "";
public string Title { get; set; } = "";
public string? Category { get; set; }
public string? Cost { get; set; }
public string? GearCategory { get; set; }
public string? Effect { get; set; }
public string? Location { get; set; }
}
public class NotesIndex
+2 -3
View File
@@ -1,5 +1,5 @@
@page "/docs/{Slug}"
@inject DocsService DocsService
@inject Web.Services.DocsService DocsService
<PageTitle>@(doc?.Title ?? "Not Found")</PageTitle>
@@ -39,7 +39,7 @@ else
@code {
[Parameter] public string Slug { get; set; } = "";
private NoteDocument? doc;
private Web.Models.NoteDocument? doc;
private bool loading = true;
protected override async Task OnParametersSetAsync()
@@ -49,5 +49,4 @@ else
doc = await DocsService.GetNoteAsync(Slug);
loading = false;
}
}
+3 -38
View File
@@ -1,42 +1,7 @@
@page "/docs"
@inject DocsService DocsService
<PageTitle>Documentation</PageTitle>
<PageTitle>Docs</PageTitle>
<div class="section-header d-flex align-items-center mb-4">
<h1 class="mb-0">Documentation</h1>
<div class="ms-3 flex-grow-1 border-bottom opacity-25"></div>
</div>
<h1>Documentation</h1>
@if (index == null)
{
<div class="d-flex justify-content-center py-5">
<div class="spinner-border text-success" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
}
else
{
<div class="docs-grid">
@foreach (var note in index.Notes.OrderBy(n => n.Title))
{
<NavLink href="@($"docs/{note.Slug}")" class="docs-card">
<div class="d-flex justify-content-between align-items-start mb-2">
<span class="badge bg-dark text-success border border-success border-opacity-25">@note.Category</span>
</div>
<h3>@note.Title</h3>
<p class="text-muted small mb-0">Explore details about @note.Title</p>
</NavLink>
}
</div>
}
@code {
private NotesIndex? index;
protected override async Task OnInitializedAsync()
{
index = await DocsService.GetIndexAsync();
}
}
<p>Select a note from the sidebar to view its contents.</p>
+3 -17
View File
@@ -2,22 +2,8 @@
<PageTitle>Earthborne Trailblazer</PageTitle>
<div class="hero-section text-center">
<div class="hero-content py-5">
<h1 class="display-4 mb-3">Earthborne Trailblazer</h1>
<p class="lead mb-4">Your essential companion guide for navigating the Valley and mastering your craft.</p>
<div class="hero-actions">
<NavLink href="overview" class="btn btn-primary btn-lg px-4">Begin Journey</NavLink>
</div>
</div>
</div>
<h1>Earthborne Trailblazer</h1>
<div class="container-fluid px-0 mt-4">
<div class="section-header d-flex align-items-center mb-3">
<h2 class="h4 mb-0">Valley Map</h2>
<div class="ms-3 flex-grow-1 border-bottom opacity-25"></div>
</div>
<div class="map-container shadow-lg">
<object data="docs/map.svg" type="image/svg+xml" class="map-svg"></object>
</div>
<div class="map-container">
<object data="docs/map.svg" type="image/svg+xml" class="map-svg"></object>
</div>
+4 -15
View File
@@ -1,16 +1,5 @@
@page "/404"
@page "/not-found"
@page "/not-found"
@layout MainLayout
<PageTitle>404 - Not Found</PageTitle>
<div class="d-flex flex-column align-items-center justify-content-center py-5 text-center">
<div class="mb-4">
<i class="bi bi-exclamation-triangle text-warning" style="font-size: 4rem;"></i>
</div>
<h1 class="display-4 mb-3">404</h1>
<h2 class="mb-4">Path Not Found</h2>
<p class="lead mb-5 text-muted">The trail you are following seems to have vanished into the wilderness.</p>
<NavLink href="" class="btn btn-primary px-4">
Return to Safety
</NavLink>
</div>
<h3>Not Found</h3>
<p>Sorry, the content you are looking for does not exist.</p>
-48
View File
@@ -1,48 +0,0 @@
@page "/overview"
@inject DocsService DocsService
<PageTitle>Overview</PageTitle>
@if (loading)
{
<div class="d-flex justify-content-center py-5">
<div class="spinner-border text-success" role="status">
<span class="visually-hidden">Loading...</span>
</div>
</div>
}
else if (doc == null)
{
<h1>Overview Not Found</h1>
<p>The overview document could not be found.</p>
}
else
{
<div class="section-header d-flex align-items-center mb-4">
<h1 class="mb-0">@doc.Title</h1>
<div class="ms-3 flex-grow-1 border-bottom opacity-25"></div>
</div>
@if (!string.IsNullOrEmpty(doc.FrontmatterHtml))
{
<details class="frontmatter-section" open>
<summary>Frontmatter</summary>
@((MarkupString)doc.FrontmatterHtml)
</details>
}
<div class="markdown-body overview-markdown">
@((MarkupString)doc.HtmlContent)
</div>
}
@code {
private NoteDocument? doc;
private bool loading = true;
protected override async Task OnInitializedAsync()
{
doc = await DocsService.GetNoteAsync("overview");
loading = false;
}
}
-2
View File
@@ -10,6 +10,4 @@ builder.RootComponents.Add<HeadOutlet>("head::after");
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddScoped<DocsService>();
//builder.Services.AddTelerikBlazor();
await builder.Build().RunAsync();
+17 -85
View File
@@ -1,7 +1,4 @@
using System.Net;
using System.Net.Http.Json;
using System.Text;
using System.Text.RegularExpressions;
using Markdig;
using Web.Models;
@@ -9,19 +6,11 @@ namespace Web.Services;
public class DocsService
{
private static readonly MarkdownPipeline Pipeline = new MarkdownPipelineBuilder()
.UseYamlFrontMatter()
.UsePipeTables()
.Build();
private static readonly HashSet<string> ImageExtensions = new(StringComparer.OrdinalIgnoreCase)
{
".png", ".jpg", ".jpeg", ".gif", ".svg", ".webp", ".bmp"
};
private readonly HttpClient _http;
private NotesIndex? _index;
private readonly Dictionary<string, string> _markdownCache = new();
private static readonly MarkdownPipeline Pipeline = new MarkdownPipelineBuilder()
.UseYamlFrontMatter()
.Build();
public DocsService(HttpClient http)
{
@@ -49,7 +38,7 @@ public class DocsService
try
{
var markdown = await _http.GetStringAsync($"docs/notes/{slug}.md");
return await ParseDocument(slug, noteInfo.Title, markdown);
return ParseDocument(slug, noteInfo.Title, markdown);
}
catch
{
@@ -57,7 +46,7 @@ public class DocsService
}
}
private async Task<NoteDocument> ParseDocument(string slug, string title, string markdown, int depth = 0)
private static NoteDocument ParseDocument(string slug, string title, string markdown)
{
var doc = new NoteDocument
{
@@ -80,7 +69,6 @@ public class DocsService
inFrontmatter = true;
continue;
}
inFrontmatter = false;
frontmatterDone = true;
continue;
@@ -101,11 +89,13 @@ public class DocsService
{
var key = line[..colonIdx].Trim();
if (string.Equals(key, "category", StringComparison.OrdinalIgnoreCase))
{
doc.Category = line[(colonIdx + 1)..].Trim().Trim('"');
}
}
}
var fmHtml = new StringBuilder();
var fmHtml = new System.Text.StringBuilder();
fmHtml.Append("<table class=\"frontmatter\">");
foreach (var line in frontmatterLines)
{
@@ -115,93 +105,35 @@ public class DocsService
var key = line[..colonIdx].Trim();
var value = line[(colonIdx + 1)..].Trim().Trim('"');
fmHtml.Append("<tr><td class=\"fm-key\">");
fmHtml.Append(WebUtility.HtmlEncode(key));
fmHtml.Append(System.Net.WebUtility.HtmlEncode(key));
fmHtml.Append("</td><td class=\"fm-value\">");
var encoded = WebUtility.HtmlEncode(value);
var encoded = System.Net.WebUtility.HtmlEncode(value);
fmHtml.Append(ConvertWikiLinks(encoded));
fmHtml.Append("</td></tr>");
}
else
{
fmHtml.Append("<tr><td colspan=\"2\">");
fmHtml.Append(ConvertWikiLinks(WebUtility.HtmlEncode(line.Trim())));
fmHtml.Append(ConvertWikiLinks(System.Net.WebUtility.HtmlEncode(line.Trim())));
fmHtml.Append("</td></tr>");
}
}
fmHtml.Append("</table>");
doc.FrontmatterHtml = fmHtml.ToString();
}
var body = string.Join("\n", bodyLines);
body = ConvertWikiLinks(body);
var html = Markdown.ToHtml(body, Pipeline);
html = await ResolveEmbedsInHtml(html, depth);
doc.HtmlContent = html;
doc.HtmlContent = Markdown.ToHtml(body, Pipeline);
return doc;
}
private async Task<string> ResolveEmbedsInHtml(string html, int depth)
{
if (depth > 10) return html;
var regex = new Regex(@"(?:<p>)?!\[\[([^\]]+)\]\](?:</p>)?");
var sb = new StringBuilder();
var lastIndex = 0;
foreach (Match match in regex.Matches(html))
{
sb.Append(html, lastIndex, match.Index - lastIndex);
var filename = match.Groups[1].Value.Trim();
var replacement = await ResolveEmbed(filename, depth);
sb.Append(replacement);
lastIndex = match.Index + match.Length;
}
sb.Append(html, lastIndex, html.Length - lastIndex);
return sb.ToString();
}
private async Task<string> ResolveEmbed(string filename, int depth)
{
var ext = Path.GetExtension(filename);
if (ImageExtensions.Contains(ext))
{
return $"<img src=\"/docs/images/{filename}\" alt=\"{WebUtility.HtmlEncode(filename)}\" />";
}
var slug = Slugify(filename);
try
{
var markdown = await GetMarkdownAsync(slug);
var embedded = await ParseDocument(slug, filename, markdown, depth + 1);
return $"<div class=\"embed\">{embedded.HtmlContent}</div>";
}
catch
{
return $"<div class=\"embed-error\">[Embed not found: {WebUtility.HtmlEncode(filename)}]</div>";
}
}
private async Task<string> GetMarkdownAsync(string slug)
{
if (_markdownCache.TryGetValue(slug, out var cached))
return cached;
var markdown = await _http.GetStringAsync($"docs/notes/{slug}.md");
_markdownCache[slug] = markdown;
return markdown;
}
private static string ConvertWikiLinks(string text)
{
return Regex.Replace(
return System.Text.RegularExpressions.Regex.Replace(
text,
@"(?<!!)\[\[([^\]]+)\]\]",
@"\[\[([^\]]+)\]\]",
match =>
{
var content = match.Groups[1].Value;
@@ -209,7 +141,7 @@ public class DocsService
var linkText = parts.Length > 1 ? parts[1].Trim() : parts[0].Trim();
var target = parts[0].Trim();
var slug = Slugify(target);
return $"<a href=\"/docs/{slug}\">{WebUtility.HtmlEncode(linkText)}</a>";
return $"<a href=\"/docs/{slug}\">{System.Net.WebUtility.HtmlEncode(linkText)}</a>";
});
}
@@ -221,8 +153,8 @@ public class DocsService
.Replace(".", "")
.Replace("(", "")
.Replace(")", "");
slug = Regex.Replace(slug, @"[^a-z0-9\-]", "");
slug = Regex.Replace(slug, @"-+", "-");
slug = System.Text.RegularExpressions.Regex.Replace(slug, @"[^a-z0-9\-]", "");
slug = System.Text.RegularExpressions.Regex.Replace(slug, @"-+", "-");
return slug.Trim('-');
}
}
+74 -521
View File
@@ -1,66 +1,5 @@
:root {
--primary: #3a5a40;
--primary-light: #588157;
--primary-dark: #344e41;
--accent: #a3b18a;
--bg-dark: #1b1c17;
--bg-sidebar: #24251f;
--text-main: #dad7cd;
--text-muted: #a3b18a;
--border-color: rgba(218, 215, 205, 0.1);
/* Telerik UI Overrides - Earthborne Ranger Theme */
--kendo-color-app-surface: var(--bg-dark);
--kendo-color-on-app-surface: var(--text-main);
--kendo-color-subtle: var(--text-muted);
--kendo-color-surface: var(--bg-sidebar);
--kendo-color-surface-alt: rgba(255, 255, 255, 0.02);
--kendo-color-border: var(--border-color);
--kendo-color-border-alt: rgba(255, 255, 255, 0.15);
--kendo-color-base: var(--bg-sidebar);
--kendo-color-base-hover: rgba(255, 255, 255, 0.05);
--kendo-color-base-active: rgba(255, 255, 255, 0.1);
--kendo-color-on-base: var(--text-main);
--kendo-color-primary: var(--primary);
--kendo-color-primary-hover: var(--primary-light);
--kendo-color-primary-active: var(--primary-dark);
--kendo-color-on-primary: #ffffff;
--kendo-color-primary-subtle: rgba(58, 90, 64, 0.15);
--kendo-color-primary-on-subtle: var(--primary-light);
--kendo-color-secondary: var(--accent);
--kendo-color-on-secondary: var(--bg-dark);
--kendo-color-success: var(--primary-light);
--kendo-color-warning: #e9c46a;
--kendo-color-error: #e76f51;
--kendo-color-info: #5fa8d3;
--kendo-color-tertiary: #d4a373;
--kendo-color-inverse: #ffffff;
--kendo-color-on-inverse: #000000;
/* Series Colors */
--kendo-color-series: var(--primary);
--kendo-color-series-a: var(--kendo-color-series);
--kendo-color-series-b: var(--accent);
--kendo-color-series-c: var(--primary-light);
--kendo-color-series-d: #d4a373;
--kendo-color-series-e: #ccd5ae;
--kendo-color-series-f: #e9edc9;
}
html, body {
font-family: 'Inter', system-ui, -apple-system, sans-serif;
background-color: var(--bg-dark);
color: var(--text-main);
}
h1, h2, h3, h4, h5, h6 {
font-family: 'Outfit', sans-serif;
font-weight: 600;
color: #fff;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
}
h1:focus {
@@ -68,34 +7,17 @@ h1:focus {
}
a, .btn-link {
color: var(--primary-light);
text-decoration: none;
transition: color 0.2s ease;
}
a:hover, .btn-link:hover {
color: var(--accent);
color: #0071c1;
}
.btn-primary {
color: #fff;
background-color: var(--primary);
border-color: var(--primary-dark);
font-weight: 500;
padding: 0.5rem 1.25rem;
border-radius: 6px;
transition: all 0.2s ease;
}
.btn-primary:hover {
background-color: var(--primary-light);
border-color: var(--primary);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(58, 90, 64, 0.3);
background-color: #1b6ec2;
border-color: #1861ac;
}
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}
.content {
@@ -128,12 +50,12 @@ a:hover, .btn-link:hover {
z-index: 1000;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
}
.blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
@@ -141,9 +63,9 @@ a:hover, .btn-link:hover {
color: white;
}
.blazor-error-boundary::after {
content: "An error has occurred."
}
.blazor-error-boundary::after {
content: "An error has occurred."
}
.loading-progress {
position: absolute;
@@ -154,19 +76,19 @@ a:hover, .btn-link:hover {
margin: 0 auto 0 auto;
}
.loading-progress circle {
fill: none;
stroke: #e0e0e0;
stroke-width: 0.6rem;
transform-origin: 50% 50%;
transform: rotate(-90deg);
}
.loading-progress circle {
fill: none;
stroke: #e0e0e0;
stroke-width: 0.6rem;
transform-origin: 50% 50%;
transform: rotate(-90deg);
}
.loading-progress circle:last-child {
stroke: #1b6ec2;
stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
transition: stroke-dasharray 0.05s ease-in-out;
}
.loading-progress circle:last-child {
stroke: #1b6ec2;
stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
transition: stroke-dasharray 0.05s ease-in-out;
}
.loading-progress-text {
position: absolute;
@@ -175,9 +97,9 @@ a:hover, .btn-link:hover {
inset: calc(20vh + 3.25rem) 0 auto 0.2rem;
}
.loading-progress-text:after {
content: var(--blazor-load-percentage-text, "Loading");
}
.loading-progress-text:after {
content: var(--blazor-load-percentage-text, "Loading");
}
code {
color: #c02d76;
@@ -196,204 +118,95 @@ code {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-file-text' viewBox='0 0 16 16'%3E%3Cpath d='M5 4a.5.5 0 0 0 0 1h6a.5.5 0 0 0 0-1H5zm-.5 2.5A.5.5 0 0 1 5 6h6a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zM5 8a.5.5 0 0 0 0 1h6a.5.5 0 0 0 0-1H5zm0 2a.5.5 0 0 0 0 1h3a.5.5 0 0 0 0-1H5z'/%3E%3Cpath d='M2 2a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2zm10-1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1z'/%3E%3C/svg%3E");
}
.hero-section {
background: linear-gradient(135deg, var(--bg-sidebar) 0%, var(--bg-dark) 100%);
border: 1px solid var(--border-color);
border-radius: 16px;
margin-bottom: 2rem;
position: relative;
overflow: hidden;
}
.hero-section::before {
content: "";
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(58, 90, 64, 0.1) 0%, transparent 70%);
z-index: 0;
}
.hero-content {
position: relative;
z-index: 1;
}
.lead {
color: var(--text-muted);
font-weight: 400;
}
.docs-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
margin-top: 1.5rem;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 1rem;
margin-top: 1rem;
}
.docs-card {
display: flex;
flex-direction: column;
padding: 1.5rem;
background: var(--bg-sidebar);
border: 1px solid var(--border-color);
border-radius: 12px;
display: block;
padding: 0.75rem 1rem;
border: 1px solid #dee2e6;
border-radius: 8px;
text-decoration: none;
color: var(--text-main);
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
height: 100%;
color: inherit;
transition: box-shadow 0.15s ease-in-out, border-color 0.15s ease-in-out;
}
.docs-card:hover {
border-color: var(--primary-light);
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
border-color: #1b6ec2;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
text-decoration: none;
color: #fff;
}
.docs-card h3 {
margin: 0.5rem 0 0.75rem 0;
font-size: 1.25rem;
color: #fff;
font-family: 'Outfit', sans-serif;
margin: 0;
font-size: 1rem;
font-weight: 500;
}
.frontmatter-section {
margin: 2rem 0;
padding: 1.25rem;
border: 1px solid var(--border-color);
border-radius: 12px;
background: rgba(255, 255, 255, 0.02);
margin: 1rem 0;
padding: 0.5rem;
border: 1px solid #e9ecef;
border-radius: 6px;
background: #f8f9fa;
}
.frontmatter-section summary {
cursor: pointer;
font-weight: 600;
color: var(--accent);
padding: 0;
font-family: 'Outfit', sans-serif;
color: #495057;
padding: 0.25rem 0;
}
table.frontmatter {
width: 100%;
border-collapse: separate;
border-spacing: 0;
margin-top: 1rem;
border-collapse: collapse;
margin-top: 0.5rem;
font-size: 0.9rem;
border-radius: 8px;
overflow: hidden;
border: 1px solid var(--border-color);
}
table.frontmatter td {
padding: 0.75rem 1rem;
border-bottom: 1px solid var(--border-color);
padding: 0.25rem 0.5rem;
border: 1px solid #dee2e6;
vertical-align: top;
background: transparent;
color: var(--text-main);
}
table.frontmatter tr:last-child td {
border-bottom: none;
}
table.frontmatter td.fm-key {
font-weight: 600;
color: var(--accent);
color: #495057;
white-space: nowrap;
width: 30%;
background: rgba(255, 255, 255, 0.03);
width: 1%;
background: #e9ecef;
}
.markdown-body {
line-height: 1.8;
margin-top: 2rem;
color: #d1d1d1;
line-height: 1.7;
margin-top: 1rem;
}
.markdown-body h1 {
font-size: 2.25rem;
margin: 2rem 0 1rem;
border-bottom: 1px solid var(--border-color);
padding-bottom: 0.5rem;
}
.markdown-body h2 {
font-size: 1.75rem;
margin: 2rem 0 1rem;
color: var(--accent);
}
.markdown-body h3 {
font-size: 1.4rem;
margin: 1.5rem 0 0.75rem;
color: var(--primary-light);
}
.markdown-body p {
margin: 1rem 0;
}
.markdown-body table {
width: 100%;
max-width: 100%;
display: block;
overflow-x: auto;
overflow-y: hidden;
border-collapse: separate;
border-spacing: 0;
margin: 1.5rem 0;
border-radius: 12px;
border: 1px solid var(--border-color);
}
.markdown-body th, .markdown-body td {
padding: 0.75rem 1rem;
border-bottom: 1px solid var(--border-color);
}
.markdown-body th {
background: rgba(255, 255, 255, 0.05);
color: var(--accent);
font-weight: 600;
text-align: left;
}
.markdown-body tr:last-child td {
border-bottom: none;
}
.markdown-body code {
background: rgba(255, 255, 255, 0.1);
color: var(--accent);
padding: 0.2rem 0.4rem;
border-radius: 4px;
font-size: 0.9em;
}
.markdown-body pre code {
background: none;
padding: 0;
}
.markdown-body blockquote {
border-left: 3px solid #dee2e6;
padding-left: 1rem;
color: #6c757d;
margin: 0.75rem 0;
}
.markdown-body h1 { font-size: 1.75rem; margin: 1.5rem 0 0.75rem; }
.markdown-body h2 { font-size: 1.4rem; margin: 1.25rem 0 0.5rem; }
.markdown-body h3 { font-size: 1.15rem; margin: 1rem 0 0.5rem; }
.markdown-body p { margin: 0.5rem 0; }
.markdown-body ul, .markdown-body ol { margin: 0.5rem 0; padding-left: 1.5rem; }
.markdown-body table { border-collapse: collapse; margin: 0.75rem 0; }
.markdown-body th, .markdown-body td { border: 1px solid #dee2e6; padding: 0.4rem 0.6rem; }
.markdown-body th { background: #f8f9fa; }
.markdown-body code { background: #f0f0f0; padding: 0.15rem 0.3rem; border-radius: 3px; font-size: 0.9em; }
.markdown-body pre code { background: none; padding: 0; }
.markdown-body blockquote { border-left: 3px solid #dee2e6; padding-left: 1rem; color: #6c757d; margin: 0.75rem 0; }
.map-container {
max-width: 100%;
margin: 1rem 0;
border: 1px solid var(--border-color);
border-radius: 12px;
margin: 1.5rem 0;
border: 1px solid #dee2e6;
border-radius: 8px;
overflow: hidden;
background: #0f100d;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
background: #1a1a2e;
}
.map-svg {
@@ -416,263 +229,3 @@ table.frontmatter td.fm-key {
color: #1b6ec2;
border: 1px solid #b8daff;
}
.embed {
margin: 1rem 0;
padding: 0.75rem 1rem;
border-left: 3px solid rgba(255, 255, 255, 0.2);
background: rgba(255, 255, 255, 0.03);
border-radius: 0 6px 6px 0;
}
.embed-error {
color: #e06c75;
font-style: italic;
padding: 0.5rem 0;
}
/* Document Content */
.doc-content {
max-width: 900px;
margin: 0 auto;
background: var(--bg-sidebar);
padding: 2.5rem;
border-radius: 16px;
border: 1px solid var(--border-color);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
}
/* Gear Styles */
.gear-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 1.5rem;
}
.gear-card {
background: var(--bg-sidebar);
border: 1px solid var(--border-color);
border-radius: 12px;
overflow: hidden;
transition: all 0.2s ease;
}
.gear-card:hover {
border-color: var(--primary-light);
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3);
}
.gear-header {
background: rgba(255, 255, 255, 0.03);
padding: 1.25rem;
border-bottom: 1px solid var(--border-color);
}
.gear-body {
padding: 1.25rem;
}
.gear-stat {
display: flex;
justify-content: space-between;
margin-bottom: 0.5rem;
font-size: 0.9rem;
}
.gear-stat-label {
color: var(--text-muted);
}
.gear-stat-value {
color: var(--text-main);
font-weight: 500;
}
/* Telerik Grid Overrides */
.k-grid {
background-color: var(--kendo-color-surface) !important;
border: 1px solid var(--kendo-color-border) !important;
color: var(--kendo-color-on-surface) !important;
border-radius: 12px !important;
overflow: hidden !important;
}
.k-grid-header,
.k-grid-header-wrap,
.k-header,
.k-table-header,
.k-table-thead,
.k-grid-header-table,
.k-table-header-wrap,
.k-table-thead > tr,
.k-column-title,
.k-filter-row {
background-color: var(--kendo-color-app-surface) !important;
background-image: none !important;
border-color: var(--kendo-color-border) !important;
}
.k-grid-header .k-header,
.k-table-th {
background: transparent !important;
color: var(--accent) !important;
border-color: var(--kendo-color-border) !important;
font-family: 'Outfit', sans-serif !important;
font-weight: 600 !important;
text-transform: uppercase;
font-size: 0.85rem;
padding: 1rem !important;
letter-spacing: 0.025em;
}
.k-grid td,
.k-table-td {
padding: 1rem !important;
border-color: var(--kendo-color-border) !important;
background: transparent !important;
vertical-align: middle !important;
}
.k-grid tr,
.k-table-row {
background-color: transparent !important;
}
.k-grid tr.k-alt,
.k-table-row.k-alt,
.k-table-row.k-table-alt-row {
background-color: rgba(255, 255, 255, 0.01) !important;
}
.k-grid tr:hover,
.k-table-row:hover {
background-color: rgba(255, 255, 255, 0.03) !important;
}
.k-grid-content,
.k-grid-table,
.k-table {
background-color: transparent !important;
}
.k-grid-header-wrap {
border-color: var(--border-color) !important;
}
/* Pager Styles */
.k-pager-wrap,
.k-pager,
.k-grid-pager,
.k-pager-td,
.k-pager-numbers-wrap {
background-color: var(--kendo-color-app-surface) !important;
background-image: none !important;
border-top: 1px solid var(--kendo-color-border) !important;
color: var(--text-muted) !important;
padding: 0.75rem !important;
}
.k-pager-numbers .k-link {
background-color: transparent !important;
color: var(--text-muted) !important;
border-radius: 6px !important;
transition: all 0.2s !important;
margin: 0 2px !important;
}
.k-pager-numbers .k-link.k-selected,
.k-pager-numbers .k-link.k-state-selected {
background-color: var(--kendo-color-primary) !important;
color: var(--kendo-color-on-primary) !important;
border-color: var(--primary-light) !important;
}
.k-pager-numbers .k-link:hover {
background-color: var(--kendo-color-primary-hover) !important;
color: var(--kendo-color-on-primary) !important;
}
.k-pager-nav.k-link {
background-color: transparent !important;
color: var(--kendo-color-on-app-surface) !important;
}
/* Filter Row Styles */
.k-filter-row td,
.k-filter-row th {
background-color: rgba(0, 0, 0, 0.2) !important;
padding: 0.5rem 1rem !important;
border-color: var(--kendo-color-border) !important;
}
.k-filtercell .k-textbox,
.k-filtercell .k-input,
.k-filtercell .k-input-inner {
background-color: var(--kendo-color-app-surface) !important;
color: var(--kendo-color-on-app-surface) !important;
border: 1px solid var(--kendo-color-border) !important;
border-radius: 4px !important;
}
.k-filtercell .k-input-inner {
padding: 4px 8px !important;
}
.k-filtercell .k-button {
background-color: var(--kendo-color-primary-active) !important;
border-color: var(--kendo-color-border) !important;
color: var(--kendo-color-on-primary) !important;
}
.k-filtercell .k-button:hover {
background-color: var(--kendo-color-primary) !important;
}
/* Custom scrollbar for grid content */
.k-grid-content::-webkit-scrollbar {
width: 10px;
}
.k-grid-content::-webkit-scrollbar-track {
background: var(--kendo-color-app-surface);
}
.k-grid-content::-webkit-scrollbar-thumb {
background: var(--kendo-color-primary-active);
border-radius: 5px;
border: 2px solid var(--kendo-color-app-surface);
}
.k-grid-content::-webkit-scrollbar-thumb:hover {
background: var(--kendo-color-primary-hover);
}
/* Typography in Grid */
.k-grid td .fw-bold {
color: var(--primary-light);
}
.k-grid td .fw-bold:hover {
color: var(--accent);
text-decoration: underline;
}
/* Loading and Empty State */
.k-loading-mask {
background-color: rgba(0, 0, 0, 0.5) !important;
}
.k-loading-image {
background-image: none !important;
}
.k-loading-color {
background-color: var(--primary) !important;
}
.k-grid-norecords {
color: var(--text-muted) !important;
padding: 3rem !important;
text-align: center !important;
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 589 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 904 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 590 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 589 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 MiB

+107 -95
View File
@@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 461">
<image href="Map.png" width="700" height="461" preserveAspectRatio="xMidYMid meet"/>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 760 530">
<rect width="100%" height="100%" fill="#1a1a2e" rx="8"/>
<defs>
<radialGradient id="glow-Grass" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#4caf50" stop-opacity="0.3"/>
@@ -22,164 +22,176 @@
<stop offset="100%" stop-color="#8d6e63" stop-opacity="0"/>
</radialGradient>
</defs>
<line x1="60" y1="330" x2="15" y2="260" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="60" y1="330" x2="150" y2="400" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="60" y1="330" x2="30" y2="410" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="60" y1="330" x2="250" y2="370" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="250" y1="370" x2="150" y2="400" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="250" y1="370" x2="140" y2="260" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="150" y1="125" x2="140" y2="260" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="150" y1="125" x2="50" y2="50" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="420" y1="100" x2="510" y2="30" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="420" y1="100" x2="560" y2="120" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="420" y1="100" x2="550" y2="290" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="470" y1="410" x2="600" y2="400" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="15" y1="260" x2="20" y2="120" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="15" y1="260" x2="140" y2="260" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="300" y1="230" x2="140" y2="260" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="300" y1="230" x2="260" y2="110" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="300" y1="230" x2="380" y2="180" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="510" y1="30" x2="370" y2="30" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="510" y1="30" x2="560" y2="120" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="550" y1="290" x2="430" y2="330" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="550" y1="290" x2="600" y2="400" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="550" y1="290" x2="560" y2="120" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="20" y1="120" x2="50" y2="50" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="260" y1="110" x2="50" y2="50" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="380" y1="180" x2="430" y2="330" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="560" y1="120" x2="640" y2="110" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="120" y1="390" x2="75" y2="320" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="120" y1="390" x2="210" y2="460" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="120" y1="390" x2="90" y2="470" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="120" y1="390" x2="310" y2="430" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="310" y1="430" x2="210" y2="460" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="310" y1="430" x2="200" y2="320" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="210" y1="185" x2="200" y2="320" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="210" y1="185" x2="110" y2="110" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="480" y1="160" x2="570" y2="90" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="480" y1="160" x2="620" y2="180" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="480" y1="160" x2="610" y2="350" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="530" y1="470" x2="660" y2="460" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="75" y1="320" x2="80" y2="180" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="75" y1="320" x2="200" y2="320" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="360" y1="290" x2="200" y2="320" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="360" y1="290" x2="320" y2="170" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="360" y1="290" x2="440" y2="240" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="570" y1="90" x2="430" y2="90" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="570" y1="90" x2="620" y2="180" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="610" y1="350" x2="490" y2="390" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="610" y1="350" x2="660" y2="460" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="610" y1="350" x2="620" y2="180" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="80" y1="180" x2="110" y2="110" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="320" y1="170" x2="110" y2="110" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="440" y1="240" x2="490" y2="390" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<line x1="620" y1="180" x2="700" y2="170" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>
<a href="/docs/forest-1" target="_top">
<circle cx="60" cy="330" r="32" fill="url(#glow-Forest)"/>
<circle cx="60" cy="330" r="18" fill="#2e7d32cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="84" y="334" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="120" cy="390" r="32" fill="url(#glow-Forest)"/>
<circle cx="120" cy="390" r="18" fill="#2e7d32" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="144" y="394" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Forest 1</text>
</a>
<a href="/docs/forest-2" target="_top">
<circle cx="250" cy="370" r="32" fill="url(#glow-Forest)"/>
<circle cx="250" cy="370" r="18" fill="#2e7d32cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="274" y="374" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="310" cy="430" r="32" fill="url(#glow-Forest)"/>
<circle cx="310" cy="430" r="18" fill="#2e7d32" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="334" y="434" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Forest 2</text>
</a>
<a href="/docs/forest-3" target="_top">
<circle cx="150" cy="125" r="32" fill="url(#glow-Forest)"/>
<circle cx="150" cy="125" r="18" fill="#2e7d32cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="174" y="129" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="210" cy="185" r="32" fill="url(#glow-Forest)"/>
<circle cx="210" cy="185" r="18" fill="#2e7d32" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="234" y="189" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Forest 3</text>
</a>
<a href="/docs/forest-4" target="_top">
<circle cx="420" cy="100" r="32" fill="url(#glow-Forest)"/>
<circle cx="420" cy="100" r="18" fill="#2e7d32cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="444" y="104" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="480" cy="160" r="32" fill="url(#glow-Forest)"/>
<circle cx="480" cy="160" r="18" fill="#2e7d32" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="504" y="164" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Forest 4</text>
</a>
<a href="/docs/forest-5" target="_top">
<circle cx="470" cy="410" r="32" fill="url(#glow-Forest)"/>
<circle cx="470" cy="410" r="18" fill="#2e7d32cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="494" y="414" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="530" cy="470" r="32" fill="url(#glow-Forest)"/>
<circle cx="530" cy="470" r="18" fill="#2e7d32" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="554" y="474" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Forest 5</text>
</a>
<a href="/docs/grass-1" target="_top">
<circle cx="15" cy="260" r="32" fill="url(#glow-Grass)"/>
<circle cx="15" cy="260" r="18" fill="#4caf50cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="39" y="264" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="75" cy="320" r="32" fill="url(#glow-Grass)"/>
<circle cx="75" cy="320" r="18" fill="#4caf50" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="99" y="324" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Grass 1</text>
<text x="39" y="278" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
<text x="99" y="338" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
&#x2605; Lone Tree Station</text>
</a>
<a href="/docs/grass-2" target="_top">
<circle cx="150" cy="400" r="32" fill="url(#glow-Grass)"/>
<circle cx="150" cy="400" r="18" fill="#4caf50cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="174" y="404" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="210" cy="460" r="32" fill="url(#glow-Grass)"/>
<circle cx="210" cy="460" r="18" fill="#4caf50" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="234" y="464" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Grass 2</text>
<text x="174" y="418" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
<text x="234" y="478" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
&#x2605; Spire</text>
</a>
<a href="/docs/grass-3" target="_top">
<circle cx="300" cy="230" r="32" fill="url(#glow-Grass)"/>
<circle cx="300" cy="230" r="18" fill="#4caf50cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="324" y="234" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="360" cy="290" r="32" fill="url(#glow-Grass)"/>
<circle cx="360" cy="290" r="18" fill="#4caf50" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="384" y="294" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Grass 3</text>
</a>
<a href="/docs/grass-4" target="_top">
<circle cx="510" cy="30" r="32" fill="url(#glow-Grass)"/>
<circle cx="510" cy="30" r="18" fill="#4caf50cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="534" y="34" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="570" cy="90" r="32" fill="url(#glow-Grass)"/>
<circle cx="570" cy="90" r="18" fill="#4caf50" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="594" y="94" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Grass 4</text>
</a>
<a href="/docs/grass-5" target="_top">
<circle cx="550" cy="290" r="32" fill="url(#glow-Grass)"/>
<circle cx="550" cy="290" r="18" fill="#4caf50cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="574" y="294" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="610" cy="350" r="32" fill="url(#glow-Grass)"/>
<circle cx="610" cy="350" r="18" fill="#4caf50" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="634" y="354" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Grass 5</text>
</a>
<a href="/docs/mountain-1" target="_top">
<circle cx="20" cy="120" r="32" fill="url(#glow-Mountain)"/>
<circle cx="20" cy="120" r="18" fill="#78909ccc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="44" y="124" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="80" cy="180" r="32" fill="url(#glow-Mountain)"/>
<circle cx="80" cy="180" r="18" fill="#78909c" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="104" y="184" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Mountain 1</text>
</a>
<a href="/docs/mountain-2" target="_top">
<circle cx="260" cy="110" r="32" fill="url(#glow-Mountain)"/>
<circle cx="260" cy="110" r="18" fill="#78909ccc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="284" y="114" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="320" cy="170" r="32" fill="url(#glow-Mountain)"/>
<circle cx="320" cy="170" r="18" fill="#78909c" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="344" y="174" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Mountain 2</text>
</a>
<a href="/docs/mountain-3" target="_top">
<circle cx="380" cy="180" r="32" fill="url(#glow-Mountain)"/>
<circle cx="380" cy="180" r="18" fill="#78909ccc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="404" y="184" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="440" cy="240" r="32" fill="url(#glow-Mountain)"/>
<circle cx="440" cy="240" r="18" fill="#78909c" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="464" y="244" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Mountain 3</text>
</a>
<a href="/docs/mountain-4" target="_top">
<circle cx="370" cy="30" r="32" fill="url(#glow-Mountain)"/>
<circle cx="370" cy="30" r="18" fill="#78909ccc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="394" y="34" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="430" cy="90" r="32" fill="url(#glow-Mountain)"/>
<circle cx="430" cy="90" r="18" fill="#78909c" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="454" y="94" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Mountain 4</text>
</a>
<a href="/docs/mountain-5" target="_top">
<circle cx="430" cy="330" r="32" fill="url(#glow-Mountain)"/>
<circle cx="430" cy="330" r="18" fill="#78909ccc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="454" y="334" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="490" cy="390" r="32" fill="url(#glow-Mountain)"/>
<circle cx="490" cy="390" r="18" fill="#78909c" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="514" y="394" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Mountain 5</text>
</a>
<a href="/docs/wasteland-1" target="_top">
<circle cx="560" cy="120" r="32" fill="url(#glow-Wasteland)"/>
<circle cx="560" cy="120" r="18" fill="#8d6e63cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="584" y="124" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="620" cy="180" r="32" fill="url(#glow-Wasteland)"/>
<circle cx="620" cy="180" r="18" fill="#8d6e63" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="644" y="184" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Wasteland 1</text>
</a>
<a href="/docs/water-1" target="_top">
<circle cx="30" cy="410" r="32" fill="url(#glow-Water)"/>
<circle cx="30" cy="410" r="18" fill="#42a5f5cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="54" y="414" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="90" cy="470" r="32" fill="url(#glow-Water)"/>
<circle cx="90" cy="470" r="18" fill="#42a5f5" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="114" y="474" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Water 1</text>
<text x="54" y="428" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
<text x="114" y="488" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
&#x2605; Research Station</text>
</a>
<a href="/docs/water-2" target="_top">
<circle cx="140" cy="260" r="32" fill="url(#glow-Water)"/>
<circle cx="140" cy="260" r="18" fill="#42a5f5cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="164" y="264" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="200" cy="320" r="32" fill="url(#glow-Water)"/>
<circle cx="200" cy="320" r="18" fill="#42a5f5" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="224" y="324" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Water 2</text>
<text x="164" y="278" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
<text x="224" y="338" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
&#x2605; White Sky</text>
</a>
<a href="/docs/water-3" target="_top">
<circle cx="50" cy="50" r="32" fill="url(#glow-Water)"/>
<circle cx="50" cy="50" r="18" fill="#42a5f5cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="74" y="54" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="110" cy="110" r="32" fill="url(#glow-Water)"/>
<circle cx="110" cy="110" r="18" fill="#42a5f5" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="134" y="114" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Water 3</text>
</a>
<a href="/docs/water-4" target="_top">
<circle cx="640" cy="110" r="32" fill="url(#glow-Water)"/>
<circle cx="640" cy="110" r="18" fill="#42a5f5cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="664" y="114" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="700" cy="170" r="32" fill="url(#glow-Water)"/>
<circle cx="700" cy="170" r="18" fill="#42a5f5" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="724" y="174" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Water 4</text>
</a>
<a href="/docs/water-5" target="_top">
<circle cx="600" cy="400" r="32" fill="url(#glow-Water)"/>
<circle cx="600" cy="400" r="18" fill="#42a5f5cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>
<text x="624" y="404" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
<circle cx="660" cy="460" r="32" fill="url(#glow-Water)"/>
<circle cx="660" cy="460" r="18" fill="#42a5f5" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>
<text x="684" y="464" fill="rgba(255,255,255,0.9)" font-family="system-ui,sans-serif" font-size="11" font-weight="600">
Water 5</text>
</a>
<rect x="600" y="20" width="140" height="130" rx="6" fill="rgba(0,0,0,0.4)" stroke="rgba(255,255,255,0.08)"/>
<text x="610" y="35" fill="rgba(255,255,255,0.6)" font-family="system-ui,sans-serif" font-size="10" font-weight="600">Legend</text>
<circle cx="614" cy="49" r="5" fill="#4caf50"/>
<text x="626" y="53" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="10">Grass</text>
<circle cx="614" cy="71" r="5" fill="#2e7d32"/>
<text x="626" y="75" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="10">Forest</text>
<circle cx="614" cy="93" r="5" fill="#78909c"/>
<text x="626" y="97" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="10">Mountain</text>
<circle cx="614" cy="115" r="5" fill="#42a5f5"/>
<text x="626" y="119" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="10">Water</text>
<circle cx="614" cy="137" r="5" fill="#8d6e63"/>
<text x="626" y="141" fill="rgba(255,255,255,0.7)" font-family="system-ui,sans-serif" font-size="10">Wasteland</text>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

+19 -109
View File
@@ -1,17 +1,5 @@
{
"notes": [
{
"slug": "activate-flora-ecology",
"title": "Activate Flora Ecology"
},
{
"slug": "activate-predator-ecology",
"title": "Activate Predator Ecology"
},
{
"slug": "activate-prey-ecology",
"title": "Activate Prey Ecology"
},
{
"slug": "artificer",
"title": "Artificer",
@@ -24,20 +12,12 @@
{
"slug": "cache-map",
"title": "Cache Map",
"category": "Gear",
"cost": "1",
"gearCategory": "Tool",
"effect": "Travel: Discard this gear and spend 2 [[Progress]] while in this region to gain 1 [[Tool]].",
"location": "Anywhere"
"category": "Gear"
},
{
"slug": "card-library",
"title": "Card Library"
},
{
"slug": "companion-cards",
"title": "Companion Cards"
},
{
"slug": "concoliator",
"title": "Concoliator",
@@ -47,11 +27,6 @@
"slug": "contents",
"title": "Contents"
},
{
"slug": "crest",
"title": "Crest",
"category": "EventType"
},
{
"slug": "crisis-markers",
"title": "Crisis Markers"
@@ -71,11 +46,7 @@
{
"slug": "dolewood-canoe",
"title": "Dolewood Canoe",
"category": "Gear",
"cost": "4",
"gearCategory": "Tool",
"effect": "Boat. Travel: You need 1 less Progress to place trail markers in water regions.",
"location": "[[White Sky]]"
"category": "Gear"
},
{
"slug": "e03",
@@ -86,10 +57,6 @@
"slug": "ecology",
"title": "Ecology"
},
{
"slug": "end-turn",
"title": "End Turn"
},
{
"slug": "endeavor-tokens",
"title": "Endeavor Tokens"
@@ -102,10 +69,6 @@
"slug": "event-cards",
"title": "Event Cards"
},
{
"slug": "event-type",
"title": "Event Type"
},
{
"slug": "events",
"title": "Events"
@@ -122,11 +85,7 @@
{
"slug": "ferinodex",
"title": "Ferinodex",
"category": "Gear",
"cost": "2",
"gearCategory": "Tool",
"effect": "Explore: Once per day, use in the place of 1[[Focus]].",
"location": "Anywhere"
"category": "Gear"
},
{
"slug": "flora-meeples",
@@ -158,18 +117,13 @@
"category": "Region"
},
{
"slug": "forest-regions",
"title": "Forest Regions",
"category": "RegionType"
"slug": "forest",
"title": "Forest"
},
{
"slug": "gauzeblade",
"title": "Gauzeblade",
"category": "Gear",
"cost": "5",
"gearCategory": "Weapon",
"effect": "Explore: Spend 2 [[Fitness]] before encountering a predator or prey to store it. The stored being can be traded as a gear of value 2.",
"location": "[[Lone Tree Station]]"
"category": "Gear"
},
{
"slug": "gear-cards",
@@ -201,8 +155,8 @@
"category": "Region"
},
{
"slug": "grass-regions",
"title": "Grass Regions"
"slug": "grasslands",
"title": "Grasslands"
},
{
"slug": "guide",
@@ -212,16 +166,16 @@
{
"slug": "hidden-trail-map",
"title": "Hidden Trail Map",
"category": "Gear",
"cost": "3",
"gearCategory": "Tool",
"effect": "Prepare: Discard to travel to a nearby region.",
"location": "Anywhere"
"category": "Gear"
},
{
"slug": "injury-cards",
"title": "Injury Cards"
},
{
"slug": "lake",
"title": "Lake"
},
{
"slug": "losing-the-game",
"title": "Losing the Game"
@@ -257,17 +211,12 @@
},
{
"slug": "mountain",
"title": "Mountain",
"category": "EventType"
"title": "Mountain"
},
{
"slug": "paratrepsis-whistle",
"title": "Paratrepsis Whistle",
"category": "Gear",
"cost": "6",
"gearCategory": "Tool",
"effect": "Explore: You can spend 1 [[Focus]] to prevent suffering 1 injury.",
"location": "[[Lone Tree Station]]"
"category": "Gear"
},
{
"slug": "paved-roads",
@@ -276,17 +225,12 @@
{
"slug": "perfect-day-1",
"title": "Perfect Day 1",
"category": "Event",
"effect": "In each region with 3 or more prey, they stampede! Each Ranger in that region suffers 1 injury, then distribute the prey nearby. Shuffle and add 5 random cards from E to the top of the event deck."
"category": "Event"
},
{
"slug": "phonoscopic-headset",
"title": "Phonoscopic Headset",
"category": "Gear",
"cost": "2",
"gearCategory": "Garment",
"effect": "Explore: Once per day, use in the place of 1 [[Awareness]]",
"location": ""
"category": "Gear"
},
{
"slug": "player-boards",
@@ -324,10 +268,6 @@
"slug": "ranger-meeples",
"title": "Ranger Meeples"
},
{
"slug": "region-types",
"title": "Region Types"
},
{
"slug": "research-station",
"title": "Research Station"
@@ -347,11 +287,7 @@
{
"slug": "ruins-map",
"title": "Ruins Map",
"category": "Gear",
"cost": "2",
"gearCategory": "Tool",
"effect": "Travel: Retire this gear an spend 2[[Progress]] while in this region to gain 1 [[Artifact]].",
"location": "Anywhere"
"category": "Gear"
},
{
"slug": "scout",
@@ -371,11 +307,6 @@
"slug": "story",
"title": "Story"
},
{
"slug": "sun",
"title": "Sun",
"category": "EventType"
},
{
"slug": "supply",
"title": "Supply"
@@ -394,10 +325,6 @@
"slug": "terrain-cards",
"title": "Terrain Cards"
},
{
"slug": "terrain-deck",
"title": "Terrain Deck"
},
{
"slug": "terrain",
"title": "Terrain",
@@ -406,11 +333,7 @@
{
"slug": "totem-of-the-irix",
"title": "Totem of the Irix",
"category": "Gear",
"cost": "2",
"gearCategory": "Consumable",
"effect": "Explore: Discard to help a Ranger anywhere.",
"location": "Anywhere"
"category": "Gear"
},
{
"slug": "trade",
@@ -433,10 +356,6 @@
"slug": "traverse",
"title": "Traverse"
},
{
"slug": "turn-start",
"title": "Turn Start"
},
{
"slug": "unmaintained-roads",
"title": "Unmaintained Roads"
@@ -483,10 +402,6 @@
"title": "Water 5",
"category": "Region"
},
{
"slug": "water-regions",
"title": "Water Regions"
},
{
"slug": "weather",
"title": "Weather"
@@ -502,11 +417,6 @@
{
"slug": "xp",
"title": "XP"
},
{
"slug": "overview",
"title": "Overview",
"category": "Overview"
}
]
}
@@ -1 +0,0 @@
Add 1 flora to the activated region.
@@ -1,4 +0,0 @@
Remove 1 prey for each 1 predator on the region. For each 1 prey removed, add one predator to replace it.
If there are no prey in the region, the predator will instead travel to a nearby region in search for prey. They will favour regions that contain the most prey. If no region contains prey they will move to a region that would be closet to getting them to prey.
@@ -1,4 +0,0 @@
Remove 1 flora for each 1 prey on the region. For each 1 flora removed, add one prey to replace it.
If there are no flora in the region, the prey will instead travel to a nearby region in search for flora. They will favour regions that contain the most flora. If no region contains flora they will move to a region that would be closet to getting them to flora.
@@ -1,3 +0,0 @@
Companion cards that can be pulled from the [[Card Library]]. They can be recruitable for [[Spirit]] or other means, and will follow you.
Up to two companions can follow a Ranger, unless stated otherwise, such as by the [[Concoliator]] role.
-6
View File
@@ -1,6 +0,0 @@
---
category: EventType
---
An event that symbolizes something dangerous.
+1 -1
View File
@@ -3,5 +3,5 @@ category: Gear
Cost: 4
Gear Category: Tool
Effect: "Boat. Travel: You need 1 less Progress to place trail markers in water regions."
Location: "[[White Sky]]"
Location: White Sky
---
-3
View File
@@ -1,3 +0,0 @@
At the end of the turn, we move some of the gear out of the [[Market]] and move some gear from the [[Supply]] back in.
After move to the next [[Turn Start]].
-1
View File
@@ -5,4 +5,3 @@ Draw and resolve on event card at the start of each [[Round]].
Event cards spawn [[Crisis]], activate the [[Ecology]], and represent the [[Story]] and [[Weather]] affecting the [[Valley]].
-3
View File
@@ -1,3 +0,0 @@
![[Sun]]
![[Mountain]]
![[Crest]]
+1 -1
View File
@@ -1,3 +1,3 @@
[[Sun]]
[[Mountain]]
[[Crest]]
[[Seal]]
@@ -1,3 +0,0 @@
---
category: RegionType
---
@@ -1,2 +0,0 @@
Default region that has [[Lone Tree Station]] and [[Spire]].
+2
View File
@@ -0,0 +1,2 @@
Default region that has [[Lone Tree Station]].
-4
View File
@@ -1,4 +0,0 @@
---
category: EventType
---
An event that represents something to do with mountains.
@@ -1,3 +0,0 @@
[[Forest Regions]]
[[Water Regions]]
[[Grass Regions]]
-4
View File
@@ -1,4 +0,0 @@
---
category: EventType
---
An event that was something to do with it being sunny.
-2
View File
@@ -1,3 +1 @@
The deck of gear. Things that can get something, like a tool, and get the top most tool from the supply.
This might not be what this deck is called. The supply could refer to items leaving the [[Market]].
+4 -4
View File
@@ -3,12 +3,12 @@ count: "198"
---
Cards you draw when exploring the matching region.
Each Terrain type appears to be spread out across 5 regions in the map, the exception being [[Wasteland]] which is just 1 location to the west.
Each Terrain type appears to be spread out across 5 regions in the map, the exception being [[Wasteland]] which is just one location to the west.
# Categories
![[Water Regions]]
![[Grass Regions]]
![[Forest Regions]]
![[Lake]]
![[Grasslands]]
![[Forest]]
![[Mountain]]
![[Wasteland]]
@@ -1,8 +0,0 @@
A collection of [[Terrain Cards]] that belong to a certain [[Region Types]].
The default Terrain Deck is comprised of a default deck of [[Terrain Cards]].
Additional cards can be added to each Terrain Deck via [[Event Cards]] or other happenstances.
As such, a Terrain Deck will never start with a [[Crisis]], but it will eventually get one.
-33
View File
@@ -1,33 +0,0 @@
Activate an [[Event Cards]].
You can read the flavor text of the card to the group if your into that kind of roleplay.
If the event card has the [[Crisis]] symbol. Activate a random [[Crisis]] from the [[Card Library]] by shuffling it into the appropriate [[Terrain Deck]]
If it has an [[Event Type]] activate existing event markers. They could be on already made [[Crisis]], equipped [[Gear Cards]], [[Injury Cards]] or [[Companion Cards]].
Once all [[Event Type]] triggers are resolved, activate any ecology visible for it's given terrain type.
- [[Activate Predator Ecology]]
- [[Activate Prey Ecology]]
- [[Activate Flora Ecology]]
> You might be concerned about the idea of the world getting swarmed by Predators as the game goes on. This concern seems resolved by being able to remove [[Predator Meeples]] with Gear or random events. [[Predator Meeples]], [[Prey Meeples]], and [[Flora Meeples]] are also used to activate events on [[Terrain Cards]] so they are not purely a negative. They are also the spice of life.
Then read the main contents of the card.
It may contain a description like: Add 3 predators to the area with the most prey. Shuffle and add 5 random cards from [[Card Library]] D to the top of the event deck.
If so, do what it says, add the 3 [[Predator Meeples]] and take 5 random cards from the [[Card Library]] with that D marking.
---
At this point, the Rangers take their turns in any order in the:
- [[Prepare Phase]]
- [[Explore Phase]]
- [[Travel Phase]]
[[End Turn]]
+21 -26
View File
@@ -2,38 +2,33 @@
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Web</title>
<base href="/"/>
<link id="webassembly" rel="preload"/>
<link href="lib/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"/>
<link href="favicon.png" rel="icon" type="image/png"/>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Outfit:wght@500;700&display=swap" rel="stylesheet">
<link href="_content/Telerik.UI.for.Blazor/css/kendo-theme-default/all.css" rel="stylesheet"/>
<link href="css/app.css" rel="stylesheet"/>
<link href="Web.styles.css" rel="stylesheet"/>
<base href="/" />
<link rel="preload" id="webassembly" />
<link rel="stylesheet" href="lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="css/app.css" />
<link rel="icon" type="image/png" href="favicon.png" />
<link href="Web.styles.css" rel="stylesheet" />
<script type="importmap"></script>
</head>
<body>
<div id="app">
<svg class="loading-progress">
<circle cx="50%" cy="50%" r="40%"/>
<circle cx="50%" cy="50%" r="40%"/>
</svg>
<div class="loading-progress-text"></div>
</div>
<div id="app">
<svg class="loading-progress">
<circle r="40%" cx="50%" cy="50%" />
<circle r="40%" cx="50%" cy="50%" />
</svg>
<div class="loading-progress-text"></div>
</div>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a class="reload" href=".">Reload</a>
<span class="dismiss">🗙</span>
</div>
<script defer src="_content/Telerik.UI.for.Blazor/js/telerik-blazor.js"></script>
<script src="_framework/blazor.webassembly#[.{fingerprint}].js"></script>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="." class="reload">Reload</a>
<span class="dismiss">🗙</span>
</div>
<script src="_framework/blazor.webassembly#[.{fingerprint}].js"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+327 -339
View File
@@ -5,435 +5,427 @@
*/
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*,
*::before,
*::after {
box-sizing: border-box;
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1 {
font-size: calc(1.375rem + 1.5vw);
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-left: 2rem;
padding-left: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
margin-bottom: 0;
}
dt {
font-weight: 700;
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-left: 0;
margin-bottom: 0.5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
font-weight: bolder;
}
small {
font-size: 0.875em;
font-size: 0.875em;
}
mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
bottom: -0.25em;
}
sup {
top: -0.5em;
top: -0.5em;
}
a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
}
a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: var(--bs-font-monospace);
font-size: 1em;
font-family: var(--bs-font-monospace);
font-size: 1em;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
padding: 0;
font-size: 1em;
}
figure {
margin: 0 0 1rem;
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: left;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: left;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
@@ -442,21 +434,21 @@ tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
display: inline-block;
}
button {
border-radius: 0;
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
outline: 0;
}
input,
@@ -464,80 +456,76 @@ button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
text-transform: none;
}
[role=button] {
cursor: pointer;
cursor: pointer;
}
select {
word-wrap: normal;
word-wrap: normal;
}
select:disabled {
opacity: 1;
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: left;
clear: left;
}
::-webkit-datetime-edit-fields-wrapper,
@@ -547,16 +535,16 @@ legend + * {
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
-webkit-appearance: textfield;
outline-offset: -2px;
}
/* rtl:raw:
@@ -568,42 +556,42 @@ legend + * {
}
*/
::-webkit-search-decoration {
-webkit-appearance: none;
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
padding: 0;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
font: inherit;
-webkit-appearance: button;
}
::file-selector-button {
font: inherit;
-webkit-appearance: button;
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
display: inline-block;
}
iframe {
border: 0;
border: 0;
}
summary {
display: list-item;
cursor: pointer;
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
vertical-align: baseline;
}
[hidden] {
display: none !important;
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */
+328 -342
View File
@@ -5,435 +5,427 @@
*/
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*,
*::before,
*::after {
box-sizing: border-box;
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1 {
font-size: calc(1.375rem + 1.5vw);
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-right: 2rem;
padding-right: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
margin-bottom: 0;
}
dt {
font-weight: 700;
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-right: 0;
margin-bottom: 0.5rem;
margin-right: 0;
}
blockquote {
margin: 0 0 1rem;
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
font-weight: bolder;
}
small {
font-size: 0.875em;
font-size: 0.875em;
}
mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
bottom: -0.25em;
}
sup {
top: -0.5em;
top: -0.5em;
}
a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
}
a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: var(--bs-font-monospace);
font-size: 1em;
font-family: var(--bs-font-monospace);
font-size: 1em;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
padding: 0;
font-size: 1em;
}
figure {
margin: 0 0 1rem;
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: right;
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: right;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
@@ -442,21 +434,21 @@ tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
display: inline-block;
}
button {
border-radius: 0;
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
outline: 0;
}
input,
@@ -464,80 +456,76 @@ button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
text-transform: none;
}
[role=button] {
cursor: pointer;
cursor: pointer;
}
select {
word-wrap: normal;
word-wrap: normal;
}
select:disabled {
opacity: 1;
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: right;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
float: right;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: right;
clear: right;
}
::-webkit-datetime-edit-fields-wrapper,
@@ -547,62 +535,60 @@ legend + * {
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
direction: ltr;
}
::-webkit-search-decoration {
-webkit-appearance: none;
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
padding: 0;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
font: inherit;
-webkit-appearance: button;
}
::file-selector-button {
font: inherit;
-webkit-appearance: button;
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
display: inline-block;
}
iframe {
border: 0;
border: 0;
}
summary {
display: list-item;
cursor: pointer;
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
vertical-align: baseline;
}
[hidden] {
display: none !important;
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,3 +1,3 @@
{
"theme": "moonstone"
"theme": "obsidian"
}
+137 -49
View File
@@ -4,24 +4,114 @@
"type": "split",
"children": [
{
"id": "8d7e193d56bb328e",
"id": "418aa81bf380daf2",
"type": "tabs",
"children": [
{
"id": "a4348c23136fecb0",
"id": "f9c65a18cd3b4b8e",
"type": "leaf",
"pinned": true,
"state": {
"type": "markdown",
"state": {
"file": "Notes/Region Types.md",
"file": "_Overview.md",
"mode": "source",
"source": false
},
"pinned": true,
"icon": "lucide-file",
"title": "Region Types"
"title": "_Overview"
}
},
{
"id": "87cde5984a735b23",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "Bases/_Roles.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "_Roles"
}
},
{
"id": "610d4da422cb5c59",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "Bases/_Gear.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "_Gear"
}
},
{
"id": "7aa08c31ba9f2e43",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "Bases/_Roles.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "_Roles"
}
},
{
"id": "d213a79cb6445cda",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "Bases/Terrain.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "Terrain"
}
},
{
"id": "93dd7864d3dae537",
"type": "leaf",
"pinned": true,
"state": {
"type": "bases",
"state": {
"file": "Bases/Regions.base",
"viewName": "Table"
},
"pinned": true,
"icon": "lucide-table",
"title": "Regions"
}
},
{
"id": "eb09ddd2e6309f90",
"type": "leaf",
"state": {
"type": "image",
"state": {
"file": "Images/Map.png"
},
"icon": "lucide-image",
"title": "Map"
}
}
]
],
"currentTab": 6
}
],
"direction": "vertical"
@@ -53,7 +143,7 @@
"state": {
"type": "search",
"state": {
"query": "Region Types",
"query": "Explore",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
@@ -74,8 +164,7 @@
"title": "Bookmarks"
}
}
],
"currentTab": 1
]
}
],
"direction": "horizontal",
@@ -184,53 +273,52 @@
"bases:Create new base": false
}
},
"active": "a4348c23136fecb0",
"active": "e8ba8e9287dfab25",
"lastOpenFiles": [
"Tasks/Simulate the game state.md",
"Notes/Terrain Deck.md",
"Notes/Region Types.md",
"Mountain Regions.md",
"Notes/Activate Prey Ecology.md",
"Notes/Activate Flora Ecology.md",
"Notes/End Turn.md",
"Notes/Forest Regions.md",
"Images/Map 1.png",
"Notes/Water Regions.md",
"Rules.md",
"Notes/Grass Regions.md",
"Tasks/_Tasks.base",
"Untitled",
"Notes/Supply.md",
"Images/Pasted image 20260609163414.png",
"Overview.md",
"Tasks/Generate overview page.md",
"Notes/Event Type.md",
"Notes/Turn Start.md",
"Notes/Event Cards.md",
"Notes/Activate Predator Ecology.md",
"Notes/Concoliator.md",
"Notes/Companion Cards.md",
"Notes/Sun.md",
"Notes/Mountain.md",
"Notes/Crest.md",
"Notes/Terrain Cards.md",
"Images/Pasted image 20260609163839.png",
"Images/Pasted image 20260609163625.png",
"Images/Pasted image 20260609211711.png",
"Images/Pasted image 20260609170335.png",
"Images/Pasted image 20260609170252.png",
"Images/Pasted image 20260609170321.png",
"Images/Market Example.png",
"Notes/Trader.md",
"Bases/_Roles.base",
"Bases/Regions.base",
"Images/Map.png",
"Tasks/Generate a csharp script to do what you did.md",
"Tasks/Generate a Markdown Website.md",
"_Tasks.base",
"Tasks/Generate a map of regions and how they connect.md",
"Bases/_Roles.base",
"_Overview.md",
"Bases/_Gear.base",
"Untitled 2.md",
"Tasks",
"Notes/Artificer.md",
"Bases/Terrain.base",
"Notes/Contents.md",
"Notes/Dolewood Canoe.md",
"Bases/_Gear.base",
"Notes/Concoliator.md",
"Notes/Explorer.md",
"Notes/Guide.md",
"Notes/Shaper.md",
"Notes/Shepard.md",
"Notes/Trader.md",
"Bases/Event.base",
"Notes"
"Notes/Awareness.md",
"Notes/Crisis.md",
"Notes/XP Cubes.md",
"Images/Map 1.png",
"Notes",
"Images/Role Example.png",
"Images/Role Example 2.png",
"Images/Table MVP Example.png",
"Notes/Scout.md",
"Images/Pasted image 20260609211711.png",
"Images/Market Deck.png",
"Images/Map.png",
"Images/Event Card Example.png",
"Images/Event Card Example 2.png",
"Images/Pasted image 20260609163414.png",
"Images",
"Notes/Research Station.md",
"Notes/White Sky.md",
"Notes/Wasteland.md",
"Notes/Wasteland 1.md",
"Notes/Mountain 5.md",
"Notes/Mountain 4.md",
"Notes/Mountain 3.md",
"Bases"
]
}
-1
View File
@@ -1 +0,0 @@
Add 1 flora to the activated region.
-4
View File
@@ -1,4 +0,0 @@
Remove 1 prey for each 1 predator on the region. For each 1 prey removed, add one predator to replace it.
If there are no prey in the region, the predator will instead travel to a nearby region in search for prey. They will favour regions that contain the most prey. If no region contains prey they will move to a region that would be closet to getting them to prey.
-4
View File
@@ -1,4 +0,0 @@
Remove 1 flora for each 1 prey on the region. For each 1 flora removed, add one prey to replace it.
If there are no flora in the region, the prey will instead travel to a nearby region in search for flora. They will favour regions that contain the most flora. If no region contains flora they will move to a region that would be closet to getting them to flora.
-3
View File
@@ -1,3 +0,0 @@
Companion cards that can be pulled from the [[Card Library]]. They can be recruitable for [[Spirit]] or other means, and will follow you.
Up to two companions can follow a Ranger, unless stated otherwise, such as by the [[Concoliator]] role.
-6
View File
@@ -1,6 +0,0 @@
---
category: EventType
---
An event that symbolizes something dangerous.
+1 -1
View File
@@ -3,5 +3,5 @@ category: Gear
Cost: 4
Gear Category: Tool
Effect: "Boat. Travel: You need 1 less Progress to place trail markers in water regions."
Location: "[[White Sky]]"
Location: White Sky
---
-3
View File
@@ -1,3 +0,0 @@
At the end of the turn, we move some of the gear out of the [[Market]] and move some gear from the [[Supply]] back in.
After move to the next [[Turn Start]].
-1
View File
@@ -5,4 +5,3 @@ Draw and resolve on event card at the start of each [[Round]].
Event cards spawn [[Crisis]], activate the [[Ecology]], and represent the [[Story]] and [[Weather]] affecting the [[Valley]].
-3
View File
@@ -1,3 +0,0 @@
![[Sun]]
![[Mountain]]
![[Crest]]
+1 -1
View File
@@ -1,3 +1,3 @@
[[Sun]]
[[Mountain]]
[[Crest]]
[[Seal]]
-3
View File
@@ -1,3 +0,0 @@
---
category: Region Type
---
View File
-2
View File
@@ -1,2 +0,0 @@
Default region that has [[Lone Tree Station]] and [[Spire]].
+2
View File
@@ -0,0 +1,2 @@
Default region that has [[Lone Tree Station]].
View File
-4
View File
@@ -1,4 +0,0 @@
---
category: EventType
---
An event that represents something to do with mountains.
-4
View File
@@ -1,4 +0,0 @@
[[Forest Regions]]
[[Water Regions]]
[[Grass Regions]]
[[Mountain Regions]]
-4
View File
@@ -1,4 +0,0 @@
---
category: EventType
---
An event that was something to do with it being sunny.
-2
View File
@@ -1,3 +1 @@
The deck of gear. Things that can get something, like a tool, and get the top most tool from the supply.
This might not be what this deck is called. The supply could refer to items leaving the [[Market]].
+4 -4
View File
@@ -3,12 +3,12 @@ count: "198"
---
Cards you draw when exploring the matching region.
Each Terrain type appears to be spread out across 5 regions in the map, the exception being [[Wasteland]] which is just 1 location to the west.
Each Terrain type appears to be spread out across 5 regions in the map, the exception being [[Wasteland]] which is just one location to the west.
# Categories
![[Water Regions]]
![[Grass Regions]]
![[Forest Regions]]
![[Lake]]
![[Grasslands]]
![[Forest]]
![[Mountain]]
![[Wasteland]]
-8
View File
@@ -1,8 +0,0 @@
A collection of [[Terrain Cards]] that belong to a certain [[Region Types]].
The default Terrain Deck is comprised of a default deck of [[Terrain Cards]].
Additional cards can be added to each Terrain Deck via [[Event Cards]] or other happenstances.
As such, a Terrain Deck will never start with a [[Crisis]], but it will eventually get one.
-33
View File
@@ -1,33 +0,0 @@
Activate an [[Event Cards]].
You can read the flavor text of the card to the group if your into that kind of roleplay.
If the event card has the [[Crisis]] symbol. Activate a random [[Crisis]] from the [[Card Library]] by shuffling it into the appropriate [[Terrain Deck]]
If it has an [[Event Type]] activate existing event markers. They could be on already made [[Crisis]], equipped [[Gear Cards]], [[Injury Cards]] or [[Companion Cards]].
Once all [[Event Type]] triggers are resolved, activate any ecology visible for it's given terrain type.
- [[Activate Predator Ecology]]
- [[Activate Prey Ecology]]
- [[Activate Flora Ecology]]
> You might be concerned about the idea of the world getting swarmed by Predators as the game goes on. This concern seems resolved by being able to remove [[Predator Meeples]] with Gear or random events. [[Predator Meeples]], [[Prey Meeples]], and [[Flora Meeples]] are also used to activate events on [[Terrain Cards]] so they are not purely a negative. They are also the spice of life.
Then read the main contents of the card.
It may contain a description like: Add 3 predators to the area with the most prey. Shuffle and add 5 random cards from [[Card Library]] D to the top of the event deck.
If so, do what it says, add the 3 [[Predator Meeples]] and take 5 random cards from the [[Card Library]] with that D marking.
---
At this point, the Rangers take their turns in any order in the:
- [[Prepare Phase]]
- [[Explore Phase]]
- [[Travel Phase]]
[[End Turn]]
-3
View File
@@ -1,3 +0,0 @@
---
category: Region Type
---
-26
View File
@@ -1,26 +0,0 @@
![[Contents]]
![[Map.png]]
![[Terrain Cards]]
![[Victory Condition]]
![[Event Cards]]
![[Market]]
![[Prepare Phase]]
![[Explore Phase]]
![[Travel Phase]]
![[Role Cards]]
-12
View File
@@ -1,12 +0,0 @@
!
![[Prepare Phase]]
![[Explore Phase]]
![[Travel Phase]]
![[End Turn]]
-15
View File
@@ -1,15 +0,0 @@
---
category: Task
status: Done
---
Look at the docs/Overview.md file.
I want you to create a new script in ET\Console\Program.cs that will make a new page with the href /overview.
This page will be all the reference markdown files referenced in Overview.md rendered on the page.
So for ![[Contents]] in the Overview.md page, I want to see all the contents of docs\Notes\Contents.md rendered on that /overview page. i.e. Overview.razor.
This overview page is just a easy connection of markdown documents for the user to read and get a structured understanding of Earthborne Trailblazer.
Do not worry about circular references in the documents.
-26
View File
@@ -1,26 +0,0 @@
---
category: Task
status:
---
At the start of a game, we have 1 flora added to each region, except [[Grass 1]], [[Grass 2]], and [[Wasteland 1]]. Let's also assume we exclude [[Mountain 1]], [[Mountain 2]], [[Mountain 3]], [[Mountain 4]], [[Mountain 5]].
Then we add a random combination of [[Predator Meeples]], [[Prey Meeples]], and [[Flora Meeples]] to each board. Up to a total of three, and down to a total of 1.
Examples could be:
- 2 [[Prey Meeples]]
- 1 [[Predator Meeples]]
- 2 [[Flora Meeples]], 1 [[Predator Meeples]]
No duplicates of combinations can be used.
On each turn, we can randomly activate one of those [[Ecology]] meeple types in 1 to 3 random [[Region Types]]. Such as activating all [[Flora Meeples]] in [[Water Regions]], and all [[Predator Meeples]] in [[Forest Regions]].
See the [[Activate Prey Ecology]], [[Activate Predator Ecology]], and [[Activate Flora Ecology]] markdown files for the rules of what an activation does.
We are going to simulate 20 turns. Allow the user to click prev and next in the timeline to see the next simulated turn.
In theory, the world will get fully over ran with predators, given we are currently not considering events that remove predators, or the fact that the players will remove predators.
Add a UI button to randomize the [[Ecology]] activation events in the timeline.
Use docs/map.svg as an example of how you could layout the data per turn in the timeline in a visual way.
+1 -3
View File
@@ -132,16 +132,14 @@ views:
- TODO
- Working On
- Done
- Uncategorized
cardOrders:
file.file: {}
note.status:
Working On: []
Done:
- Tasks/Generate a Markdown Website.md
- Generate a csharp script to do what you did.md
- Tasks/Generate a map of regions and how they connect.md
- Tasks/Generate a csharp script to do what you did.md
- Tasks/Generate overview page.md
Uncategorized: []
columnColors:
file.file: {}