12 Commits

Author SHA1 Message Date
6d486f49 d6eabf4990 ... 2026-06-11 17:18:18 -04:00
6d486f49 beed3cfded ... 2026-06-11 17:12:09 -04:00
6d486f49 7757ff9895 ... 2026-06-11 17:10:30 -04:00
6d486f49 2d2d6d2250 tele... 2026-06-11 17:10:06 -04:00
6d486f49 ab65724a96 Temp removing tele 2026-06-11 17:09:01 -04:00
6d486f49 7713f3b7ec ... 2026-06-11 17:06:58 -04:00
6d486f49 b0fdabbe67 ... 2026-06-11 16:53:18 -04:00
JonathanMcCaffrey b6d03afe56 ... 2026-06-11 12:29:57 -04:00
JonathanMcCaffrey 6609d911fc ... 2026-06-11 12:26:33 -04:00
JonathanMcCaffrey e147856b57 Update workspace.json 2026-06-11 11:39:33 -04:00
JonathanMcCaffrey 1388182ebe Day 2 vibes 2026-06-11 10:56:01 -04:00
JonathanMcCaffrey adeb4ae7cb Day 1 vibes 2026-06-11 09:16:01 -04:00
100 changed files with 54917 additions and 46178 deletions
+174 -35
View File
@@ -1,10 +1,12 @@
using System.Text.RegularExpressions;
using System.Text;
using System.Text.Encodings.Web;
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"));
@@ -18,13 +20,18 @@ if (!Directory.Exists(srcDir))
return 1;
}
SyncNotes(srcDir, dstDir);
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);
GenerateMap(srcDir, Path.GetFullPath(Path.Combine(solutionDir, "Web", "wwwroot", "docs")));
GenerateOverviewPage(solutionDir);
Console.WriteLine("Done.");
return 0;
static void SyncNotes(string srcDir, string dstDir)
static List<object> SyncNotes(string srcDir, string dstDir)
{
Directory.CreateDirectory(dstDir);
@@ -38,16 +45,33 @@ static void SyncNotes(string srcDir, string dstDir)
var name = Path.GetFileNameWithoutExtension(file);
var slug = Slugify(name);
File.Copy(file, Path.Combine(dstDir, $"{slug}.md"), overwrite: true);
File.Copy(file, Path.Combine(dstDir, $"{slug}.md"), 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 catMatch = Regex.Match(fmMatch.Groups[1].Value, @"(?m)^category:\s*(.+)$");
var fm = fmMatch.Groups[1].Value;
var catMatch = Regex.Match(fm, @"(?m)^category:\s*(.+)$", RegexOptions.IgnoreCase);
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?>
@@ -57,18 +81,122 @@ static void 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);
}
var index = new Dictionary<string, object> { ["notes"] = entries };
var json = JsonSerializer.Serialize(index, new JsonSerializerOptions { WriteIndented = true });
var indexPath = Path.Combine(Path.GetDirectoryName(dstDir)!, "notes-index.json");
File.WriteAllText(indexPath, json);
Console.WriteLine($"Copied {entries.Count} notes.");
Console.WriteLine($"Index written to: {indexPath}");
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 });
}
static void GenerateOverviewPage(string solutionDir)
{
var pagesDir = Path.GetFullPath(Path.Combine(solutionDir, "Web", "Pages"));
Directory.CreateDirectory(pagesDir);
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}");
}
static void GenerateMap(string srcDir, string dstDir)
@@ -79,7 +207,7 @@ static void GenerateMap(string srcDir, string dstDir)
["Forest"] = "#2e7d32",
["Mountain"] = "#78909c",
["Water"] = "#42a5f5",
["Wasteland"] = "#8d6e63",
["Wasteland"] = "#8d6e63"
};
var regionFiles = Directory.EnumerateFiles(srcDir, "*.md")
@@ -126,18 +254,23 @@ 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\">");
var svg = new System.Text.StringBuilder();
svg.AppendLine($"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 {maxX} {maxY}\">");
svg.AppendLine("""<image href="Map.png" width="700" height="461" preserveAspectRatio="xMidYMid meet"/>""");
svg.AppendLine($"""<rect width="100%" height="100%" fill="#1a1a2e" rx="8"/>""");
svg.AppendLine($"""<defs>""");
svg.AppendLine("""<defs>""");
foreach (var (terrain, color) in terrainColors)
{
svg.AppendLine($"""<radialGradient id="glow-{terrain}" cx="50%" cy="50%" r="50%">""");
@@ -145,45 +278,50 @@ 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)
{
foreach (var conn in region.Connections)
{
if (!nameLookup.TryGetValue(conn, out var target) || string.Compare(region.Name, conn, StringComparison.OrdinalIgnoreCase) >= 0)
continue;
if (!nameLookup.TryGetValue(conn, out var target) ||
string.Compare(region.Name, conn, StringComparison.OrdinalIgnoreCase) >= 0)
continue;
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"/>""");
}
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"/>""");
}
foreach (var region in regions)
{
var cx = region.X + pad;
var cy = region.Y + pad;
var cx = region.X;
var cy = region.Y;
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}" stroke="rgba(255,255,255,0.4)" stroke-width="2"/>""");
svg.AppendLine(
$"""<circle cx="{cx}" cy="{cy}" r="18" fill="{color}cc" stroke="rgba(255,255,255,0.5)" 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(System.Text.Encodings.Web.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(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(System.Text.Encodings.Web.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(HtmlEncoder.Default.Encode($"\u2605 {lm}"));
svg.AppendLine("</text>");
}
svg.AppendLine("</a>");
}
var legendX = maxX - 160;
/**
var legendX = 700 - 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>""");
@@ -194,6 +332,7 @@ 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>");
@@ -224,10 +363,11 @@ static string? FindContainingDir(string startDir, string markerFile)
return dir.FullName;
dir = dir.Parent;
}
return null;
}
class RegionData
internal class RegionData
{
public string Name { get; set; } = "";
public string Slug { get; set; } = "";
@@ -237,4 +377,3 @@ class RegionData
public List<string> Connections { get; set; } = new();
public List<string> Landmarks { get; set; } = new();
}
+2 -1
View File
@@ -1,4 +1,5 @@
<Router AppAssembly="@typeof(App).Assembly" NotFoundPage="typeof(Pages.NotFound)">
@using Web.Pages
<Router AppAssembly="@typeof(App).Assembly" NotFoundPage="typeof(NotFound)">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
<FocusOnNavigate RouteData="@routeData" Selector="h1"/>
+3 -1
View File
@@ -5,7 +5,9 @@
</div>
<main>
<article class="content px-4">
@Body
<TelerikRootComponent>
@Body
</TelerikRootComponent>
</article>
</main>
</div>
+14 -13
View File
@@ -9,7 +9,8 @@ main {
}
.sidebar {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
background-color: var(--bg-sidebar);
border-right: 1px solid var(--border-color);
}
.top-row {
@@ -21,20 +22,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 {
+18 -5
View File
@@ -1,8 +1,10 @@
@inject Web.Services.DocsService DocsService
@inject DocsService DocsService
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">Web</a>
<a class="navbar-brand" href="">
<span class="brand-text">Trailblazer</span>
</a>
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span>
</button>
@@ -16,7 +18,17 @@
<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)
{
<div class="nav-item px-3"><span class="nav-link text-secondary">Loading...</span></div>
@@ -53,7 +65,7 @@
protected override async Task OnInitializedAsync()
{
var index = await DocsService.GetIndexAsync();
groupedNotes = (index.Notes ?? new())
groupedNotes = (index.Notes ?? new List<NoteInfo>())
.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() })
@@ -63,6 +75,7 @@
private class NoteGroup
{
public string Category { get; set; } = "";
public List<Web.Models.NoteInfo> Notes { get; set; } = new();
public List<NoteInfo> Notes { get; set; } = new();
}
}
+42 -24
View File
@@ -9,9 +9,17 @@
}
.navbar-brand {
font-size: 1.1rem;
font-weight: 600;
letter-spacing: 0.02em;
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;
}
.bi {
@@ -37,6 +45,14 @@
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");
}
@@ -47,40 +63,42 @@
}
.nav-item ::deep a {
color: rgba(255, 255, 255, 0.75);
border-radius: 0;
height: 2.6rem;
color: var(--text-main);
border-radius: 8px;
height: 2.8rem;
display: flex;
align-items: center;
line-height: 2.6rem;
line-height: 2.8rem;
padding: 0 1rem;
border-left: 3px solid transparent;
transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;
margin: 0.2rem 0.5rem;
transition: all 0.2s ease;
}
.nav-item ::deep a.active {
background-color: rgba(255, 255, 255, 0.12);
color: white;
border-left-color: rgba(255, 255, 255, 0.7);
background-color: var(--primary);
color: #fff;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.nav-item ::deep a:hover {
background-color: rgba(255, 255, 255, 0.07);
color: white;
background-color: rgba(255, 255, 255, 0.05);
color: var(--accent);
}
.nav-item-doc ::deep a {
padding-left: 1.75rem !important;
font-size: 0.8rem;
height: 1.85rem !important;
line-height: 1.85rem !important;
border-left-color: transparent;
padding-left: 2.5rem !important;
font-size: 0.85rem;
height: 2.2rem !important;
line-height: 2.2rem !important;
margin: 0.1rem 0.5rem;
}
.nav-item-doc ::deep a.active {
background-color: rgba(255, 255, 255, 0.1);
color: white;
border-left-color: #6ea8fe;
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;
}
.nav-item-doc ::deep a:hover {
@@ -105,7 +123,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 {
@@ -117,7 +135,7 @@
}
.nav-scrollable::-webkit-scrollbar-thumb {
background: rgba(255,255,255,0.15);
background: rgba(255, 255, 255, 0.15);
border-radius: 3px;
}
+5 -1
View File
@@ -5,6 +5,10 @@ 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
@@ -19,4 +23,4 @@ public class NoteDocument
public string? Category { get; set; }
public string FrontmatterHtml { get; set; } = "";
public string HtmlContent { get; set; } = "";
}
}
+3 -2
View File
@@ -1,5 +1,5 @@
@page "/docs/{Slug}"
@inject Web.Services.DocsService DocsService
@inject DocsService DocsService
<PageTitle>@(doc?.Title ?? "Not Found")</PageTitle>
@@ -39,7 +39,7 @@ else
@code {
[Parameter] public string Slug { get; set; } = "";
private Web.Models.NoteDocument? doc;
private NoteDocument? doc;
private bool loading = true;
protected override async Task OnParametersSetAsync()
@@ -49,4 +49,5 @@ else
doc = await DocsService.GetNoteAsync(Slug);
loading = false;
}
}
+38 -3
View File
@@ -1,7 +1,42 @@
@page "/docs"
@inject DocsService DocsService
<PageTitle>Docs</PageTitle>
<PageTitle>Documentation</PageTitle>
<h1>Documentation</h1>
<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>
<p>Select a note from the sidebar to view its contents.</p>
@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();
}
}
+18 -4
View File
@@ -2,8 +2,22 @@
<PageTitle>Earthborne Trailblazer</PageTitle>
<h1>Earthborne Trailblazer</h1>
<div class="map-container">
<object data="docs/map.svg" type="image/svg+xml" class="map-svg"></object>
<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>
<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>
+15 -4
View File
@@ -1,5 +1,16 @@
@page "/not-found"
@layout MainLayout
@page "/404"
@page "/not-found"
<h3>Not Found</h3>
<p>Sorry, the content you are looking for does not exist.</p>
<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>
+48
View File
@@ -0,0 +1,48 @@
@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,4 +10,6 @@ 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();
+84 -16
View File
@@ -1,4 +1,7 @@
using System.Net;
using System.Net.Http.Json;
using System.Text;
using System.Text.RegularExpressions;
using Markdig;
using Web.Models;
@@ -6,12 +9,20 @@ namespace Web.Services;
public class DocsService
{
private readonly HttpClient _http;
private NotesIndex? _index;
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();
public DocsService(HttpClient http)
{
_http = http;
@@ -38,7 +49,7 @@ public class DocsService
try
{
var markdown = await _http.GetStringAsync($"docs/notes/{slug}.md");
return ParseDocument(slug, noteInfo.Title, markdown);
return await ParseDocument(slug, noteInfo.Title, markdown);
}
catch
{
@@ -46,7 +57,7 @@ public class DocsService
}
}
private static NoteDocument ParseDocument(string slug, string title, string markdown)
private async Task<NoteDocument> ParseDocument(string slug, string title, string markdown, int depth = 0)
{
var doc = new NoteDocument
{
@@ -69,6 +80,7 @@ public class DocsService
inFrontmatter = true;
continue;
}
inFrontmatter = false;
frontmatterDone = true;
continue;
@@ -89,13 +101,11 @@ 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 System.Text.StringBuilder();
var fmHtml = new StringBuilder();
fmHtml.Append("<table class=\"frontmatter\">");
foreach (var line in frontmatterLines)
{
@@ -105,35 +115,93 @@ public class DocsService
var key = line[..colonIdx].Trim();
var value = line[(colonIdx + 1)..].Trim().Trim('"');
fmHtml.Append("<tr><td class=\"fm-key\">");
fmHtml.Append(System.Net.WebUtility.HtmlEncode(key));
fmHtml.Append(WebUtility.HtmlEncode(key));
fmHtml.Append("</td><td class=\"fm-value\">");
var encoded = System.Net.WebUtility.HtmlEncode(value);
var encoded = WebUtility.HtmlEncode(value);
fmHtml.Append(ConvertWikiLinks(encoded));
fmHtml.Append("</td></tr>");
}
else
{
fmHtml.Append("<tr><td colspan=\"2\">");
fmHtml.Append(ConvertWikiLinks(System.Net.WebUtility.HtmlEncode(line.Trim())));
fmHtml.Append(ConvertWikiLinks(WebUtility.HtmlEncode(line.Trim())));
fmHtml.Append("</td></tr>");
}
}
fmHtml.Append("</table>");
doc.FrontmatterHtml = fmHtml.ToString();
}
var body = string.Join("\n", bodyLines);
body = ConvertWikiLinks(body);
doc.HtmlContent = Markdown.ToHtml(body, Pipeline);
var html = Markdown.ToHtml(body, Pipeline);
html = await ResolveEmbedsInHtml(html, depth);
doc.HtmlContent = html;
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 System.Text.RegularExpressions.Regex.Replace(
return Regex.Replace(
text,
@"\[\[([^\]]+)\]\]",
@"(?<!!)\[\[([^\]]+)\]\]",
match =>
{
var content = match.Groups[1].Value;
@@ -141,7 +209,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}\">{System.Net.WebUtility.HtmlEncode(linkText)}</a>";
return $"<a href=\"/docs/{slug}\">{WebUtility.HtmlEncode(linkText)}</a>";
});
}
@@ -153,8 +221,8 @@ public class DocsService
.Replace(".", "")
.Replace("(", "")
.Replace(")", "");
slug = System.Text.RegularExpressions.Regex.Replace(slug, @"[^a-z0-9\-]", "");
slug = System.Text.RegularExpressions.Regex.Replace(slug, @"-+", "-");
slug = Regex.Replace(slug, @"[^a-z0-9\-]", "");
slug = Regex.Replace(slug, @"-+", "-");
return slug.Trim('-');
}
}
+522 -75
View File
@@ -1,5 +1,66 @@
: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: 'Helvetica Neue', Helvetica, Arial, sans-serif;
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;
}
h1:focus {
@@ -7,17 +68,34 @@ h1:focus {
}
a, .btn-link {
color: #0071c1;
color: var(--primary-light);
text-decoration: none;
transition: color 0.2s ease;
}
a:hover, .btn-link:hover {
color: var(--accent);
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
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);
}
.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 {
@@ -50,12 +128,12 @@ a, .btn-link {
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;
@@ -63,9 +141,9 @@ a, .btn-link {
color: white;
}
.blazor-error-boundary::after {
content: "An error has occurred."
}
.blazor-error-boundary::after {
content: "An error has occurred."
}
.loading-progress {
position: absolute;
@@ -76,19 +154,19 @@ a, .btn-link {
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;
@@ -97,9 +175,9 @@ a, .btn-link {
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;
@@ -118,95 +196,204 @@ 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(200px, 1fr));
gap: 1rem;
margin-top: 1rem;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
margin-top: 1.5rem;
}
.docs-card {
display: block;
padding: 0.75rem 1rem;
border: 1px solid #dee2e6;
border-radius: 8px;
display: flex;
flex-direction: column;
padding: 1.5rem;
background: var(--bg-sidebar);
border: 1px solid var(--border-color);
border-radius: 12px;
text-decoration: none;
color: inherit;
transition: box-shadow 0.15s ease-in-out, border-color 0.15s ease-in-out;
color: var(--text-main);
transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
height: 100%;
}
.docs-card:hover {
border-color: #1b6ec2;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
border-color: var(--primary-light);
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
text-decoration: none;
color: #fff;
}
.docs-card h3 {
margin: 0;
font-size: 1rem;
font-weight: 500;
margin: 0.5rem 0 0.75rem 0;
font-size: 1.25rem;
color: #fff;
font-family: 'Outfit', sans-serif;
}
.frontmatter-section {
margin: 1rem 0;
padding: 0.5rem;
border: 1px solid #e9ecef;
border-radius: 6px;
background: #f8f9fa;
margin: 2rem 0;
padding: 1.25rem;
border: 1px solid var(--border-color);
border-radius: 12px;
background: rgba(255, 255, 255, 0.02);
}
.frontmatter-section summary {
cursor: pointer;
font-weight: 600;
color: #495057;
padding: 0.25rem 0;
color: var(--accent);
padding: 0;
font-family: 'Outfit', sans-serif;
}
table.frontmatter {
width: 100%;
border-collapse: collapse;
margin-top: 0.5rem;
border-collapse: separate;
border-spacing: 0;
margin-top: 1rem;
font-size: 0.9rem;
border-radius: 8px;
overflow: hidden;
border: 1px solid var(--border-color);
}
table.frontmatter td {
padding: 0.25rem 0.5rem;
border: 1px solid #dee2e6;
padding: 0.75rem 1rem;
border-bottom: 1px solid var(--border-color);
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: #495057;
color: var(--accent);
white-space: nowrap;
width: 1%;
background: #e9ecef;
width: 30%;
background: rgba(255, 255, 255, 0.03);
}
.markdown-body {
line-height: 1.7;
margin-top: 1rem;
line-height: 1.8;
margin-top: 2rem;
color: #d1d1d1;
}
.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; }
.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;
}
.map-container {
max-width: 100%;
margin: 1.5rem 0;
border: 1px solid #dee2e6;
border-radius: 8px;
margin: 1rem 0;
border: 1px solid var(--border-color);
border-radius: 12px;
overflow: hidden;
background: #1a1a2e;
background: #0f100d;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
}
.map-svg {
@@ -228,4 +415,264 @@ table.frontmatter td.fm-key {
background: #e8f4fd;
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.

After

Width:  |  Height:  |  Size: 589 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 590 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 MiB

+95 -107
View File
@@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 760 530">
<rect width="100%" height="100%" fill="#1a1a2e" rx="8"/>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 700 461">
<image href="Map.png" width="700" height="461" preserveAspectRatio="xMidYMid meet"/>
<defs>
<radialGradient id="glow-Grass" cx="50%" cy="50%" r="50%">
<stop offset="0%" stop-color="#4caf50" stop-opacity="0.3"/>
@@ -22,176 +22,164 @@
<stop offset="100%" stop-color="#8d6e63" stop-opacity="0"/>
</radialGradient>
</defs>
<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"/>
<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"/>
<a href="/docs/forest-1" target="_top">
<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">
<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">
Forest 1</text>
</a>
<a href="/docs/forest-2" target="_top">
<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">
<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">
Forest 2</text>
</a>
<a href="/docs/forest-3" target="_top">
<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">
<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">
Forest 3</text>
</a>
<a href="/docs/forest-4" target="_top">
<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">
<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">
Forest 4</text>
</a>
<a href="/docs/forest-5" target="_top">
<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">
<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">
Forest 5</text>
</a>
<a href="/docs/grass-1" target="_top">
<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">
<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">
Grass 1</text>
<text x="99" y="338" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
<text x="39" y="278" 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="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">
<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">
Grass 2</text>
<text x="234" y="478" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
<text x="174" y="418" 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="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">
<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">
Grass 3</text>
</a>
<a href="/docs/grass-4" target="_top">
<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">
<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">
Grass 4</text>
</a>
<a href="/docs/grass-5" target="_top">
<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">
<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">
Grass 5</text>
</a>
<a href="/docs/mountain-1" target="_top">
<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">
<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">
Mountain 1</text>
</a>
<a href="/docs/mountain-2" target="_top">
<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">
<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">
Mountain 2</text>
</a>
<a href="/docs/mountain-3" target="_top">
<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">
<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">
Mountain 3</text>
</a>
<a href="/docs/mountain-4" target="_top">
<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">
<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">
Mountain 4</text>
</a>
<a href="/docs/mountain-5" target="_top">
<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">
<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">
Mountain 5</text>
</a>
<a href="/docs/wasteland-1" target="_top">
<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">
<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">
Wasteland 1</text>
</a>
<a href="/docs/water-1" target="_top">
<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">
<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">
Water 1</text>
<text x="114" y="488" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
<text x="54" y="428" 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="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">
<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">
Water 2</text>
<text x="224" y="338" fill="rgba(255,255,255,0.45)" font-family="system-ui,sans-serif" font-size="9" font-style="italic">
<text x="164" y="278" 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="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">
<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">
Water 3</text>
</a>
<a href="/docs/water-4" target="_top">
<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">
<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">
Water 4</text>
</a>
<a href="/docs/water-5" target="_top">
<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">
<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">
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: 13 KiB

After

Width:  |  Height:  |  Size: 12 KiB

+109 -19
View File
@@ -1,5 +1,17 @@
{
"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",
@@ -12,12 +24,20 @@
{
"slug": "cache-map",
"title": "Cache Map",
"category": "Gear"
"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"
},
{
"slug": "card-library",
"title": "Card Library"
},
{
"slug": "companion-cards",
"title": "Companion Cards"
},
{
"slug": "concoliator",
"title": "Concoliator",
@@ -27,6 +47,11 @@
"slug": "contents",
"title": "Contents"
},
{
"slug": "crest",
"title": "Crest",
"category": "EventType"
},
{
"slug": "crisis-markers",
"title": "Crisis Markers"
@@ -46,7 +71,11 @@
{
"slug": "dolewood-canoe",
"title": "Dolewood Canoe",
"category": "Gear"
"category": "Gear",
"cost": "4",
"gearCategory": "Tool",
"effect": "Boat. Travel: You need 1 less Progress to place trail markers in water regions.",
"location": "[[White Sky]]"
},
{
"slug": "e03",
@@ -57,6 +86,10 @@
"slug": "ecology",
"title": "Ecology"
},
{
"slug": "end-turn",
"title": "End Turn"
},
{
"slug": "endeavor-tokens",
"title": "Endeavor Tokens"
@@ -69,6 +102,10 @@
"slug": "event-cards",
"title": "Event Cards"
},
{
"slug": "event-type",
"title": "Event Type"
},
{
"slug": "events",
"title": "Events"
@@ -85,7 +122,11 @@
{
"slug": "ferinodex",
"title": "Ferinodex",
"category": "Gear"
"category": "Gear",
"cost": "2",
"gearCategory": "Tool",
"effect": "Explore: Once per day, use in the place of 1[[Focus]].",
"location": "Anywhere"
},
{
"slug": "flora-meeples",
@@ -117,13 +158,18 @@
"category": "Region"
},
{
"slug": "forest",
"title": "Forest"
"slug": "forest-regions",
"title": "Forest Regions",
"category": "RegionType"
},
{
"slug": "gauzeblade",
"title": "Gauzeblade",
"category": "Gear"
"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]]"
},
{
"slug": "gear-cards",
@@ -155,8 +201,8 @@
"category": "Region"
},
{
"slug": "grasslands",
"title": "Grasslands"
"slug": "grass-regions",
"title": "Grass Regions"
},
{
"slug": "guide",
@@ -166,16 +212,16 @@
{
"slug": "hidden-trail-map",
"title": "Hidden Trail Map",
"category": "Gear"
"category": "Gear",
"cost": "3",
"gearCategory": "Tool",
"effect": "Prepare: Discard to travel to a nearby region.",
"location": "Anywhere"
},
{
"slug": "injury-cards",
"title": "Injury Cards"
},
{
"slug": "lake",
"title": "Lake"
},
{
"slug": "losing-the-game",
"title": "Losing the Game"
@@ -211,12 +257,17 @@
},
{
"slug": "mountain",
"title": "Mountain"
"title": "Mountain",
"category": "EventType"
},
{
"slug": "paratrepsis-whistle",
"title": "Paratrepsis Whistle",
"category": "Gear"
"category": "Gear",
"cost": "6",
"gearCategory": "Tool",
"effect": "Explore: You can spend 1 [[Focus]] to prevent suffering 1 injury.",
"location": "[[Lone Tree Station]]"
},
{
"slug": "paved-roads",
@@ -225,12 +276,17 @@
{
"slug": "perfect-day-1",
"title": "Perfect Day 1",
"category": "Event"
"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."
},
{
"slug": "phonoscopic-headset",
"title": "Phonoscopic Headset",
"category": "Gear"
"category": "Gear",
"cost": "2",
"gearCategory": "Garment",
"effect": "Explore: Once per day, use in the place of 1 [[Awareness]]",
"location": ""
},
{
"slug": "player-boards",
@@ -268,6 +324,10 @@
"slug": "ranger-meeples",
"title": "Ranger Meeples"
},
{
"slug": "region-types",
"title": "Region Types"
},
{
"slug": "research-station",
"title": "Research Station"
@@ -287,7 +347,11 @@
{
"slug": "ruins-map",
"title": "Ruins Map",
"category": "Gear"
"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"
},
{
"slug": "scout",
@@ -307,6 +371,11 @@
"slug": "story",
"title": "Story"
},
{
"slug": "sun",
"title": "Sun",
"category": "EventType"
},
{
"slug": "supply",
"title": "Supply"
@@ -325,6 +394,10 @@
"slug": "terrain-cards",
"title": "Terrain Cards"
},
{
"slug": "terrain-deck",
"title": "Terrain Deck"
},
{
"slug": "terrain",
"title": "Terrain",
@@ -333,7 +406,11 @@
{
"slug": "totem-of-the-irix",
"title": "Totem of the Irix",
"category": "Gear"
"category": "Gear",
"cost": "2",
"gearCategory": "Consumable",
"effect": "Explore: Discard to help a Ranger anywhere.",
"location": "Anywhere"
},
{
"slug": "trade",
@@ -356,6 +433,10 @@
"slug": "traverse",
"title": "Traverse"
},
{
"slug": "turn-start",
"title": "Turn Start"
},
{
"slug": "unmaintained-roads",
"title": "Unmaintained Roads"
@@ -402,6 +483,10 @@
"title": "Water 5",
"category": "Region"
},
{
"slug": "water-regions",
"title": "Water Regions"
},
{
"slug": "weather",
"title": "Weather"
@@ -417,6 +502,11 @@
{
"slug": "xp",
"title": "XP"
},
{
"slug": "overview",
"title": "Overview",
"category": "Overview"
}
]
}
@@ -0,0 +1 @@
Add 1 flora to the activated region.
@@ -0,0 +1,4 @@
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.
@@ -0,0 +1,4 @@
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.
@@ -0,0 +1,3 @@
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
@@ -0,0 +1,6 @@
---
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
@@ -0,0 +1,3 @@
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,3 +5,4 @@ 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
@@ -0,0 +1,3 @@
![[Sun]]
![[Mountain]]
![[Crest]]
+1 -1
View File
@@ -1,3 +1,3 @@
[[Sun]]
[[Mountain]]
[[Seal]]
[[Crest]]
@@ -0,0 +1,3 @@
---
category: RegionType
---
@@ -0,0 +1,2 @@
Default region that has [[Lone Tree Station]] and [[Spire]].
-2
View File
@@ -1,2 +0,0 @@
Default region that has [[Lone Tree Station]].
+4
View File
@@ -0,0 +1,4 @@
---
category: EventType
---
An event that represents something to do with mountains.
@@ -0,0 +1,3 @@
[[Forest Regions]]
[[Water Regions]]
[[Grass Regions]]
+4
View File
@@ -0,0 +1,4 @@
---
category: EventType
---
An event that was something to do with it being sunny.
+3 -1
View File
@@ -1 +1,3 @@
The deck of gear. Things that can get something, like a tool, and get the top most tool from the supply.
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 one 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 1 location to the west.
# Categories
![[Lake]]
![[Grasslands]]
![[Forest]]
![[Water Regions]]
![[Grass Regions]]
![[Forest Regions]]
![[Mountain]]
![[Wasteland]]
@@ -0,0 +1,8 @@
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
@@ -0,0 +1,33 @@
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]]
+26 -21
View File
@@ -2,33 +2,38 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta charset="utf-8"/>
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>Web</title>
<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" />
<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"/>
<script type="importmap"></script>
</head>
<body>
<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="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="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>
<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>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+339 -327
View File
@@ -5,427 +5,435 @@
*/
: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,
@@ -434,21 +442,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,
@@ -456,76 +464,80 @@ 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,
@@ -535,16 +547,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:
@@ -556,42 +568,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 */
+342 -328
View File
@@ -5,427 +5,435 @@
*/
: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,
@@ -434,21 +442,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,
@@ -456,76 +464,80 @@ 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,
@@ -535,60 +547,62 @@ 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": "obsidian"
"theme": "moonstone"
}
+53 -141
View File
@@ -4,114 +4,24 @@
"type": "split",
"children": [
{
"id": "418aa81bf380daf2",
"id": "8d7e193d56bb328e",
"type": "tabs",
"children": [
{
"id": "f9c65a18cd3b4b8e",
"id": "a4348c23136fecb0",
"type": "leaf",
"pinned": true,
"state": {
"type": "markdown",
"state": {
"file": "_Overview.md",
"file": "Notes/Region Types.md",
"mode": "source",
"source": false
},
"pinned": true,
"icon": "lucide-file",
"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"
"title": "Region Types"
}
}
],
"currentTab": 6
]
}
],
"direction": "vertical"
@@ -143,7 +53,7 @@
"state": {
"type": "search",
"state": {
"query": "Explore",
"query": "Region Types",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
@@ -164,7 +74,8 @@
"title": "Bookmarks"
}
}
]
],
"currentTab": 1
}
],
"direction": "horizontal",
@@ -273,52 +184,53 @@
"bases:Create new base": false
}
},
"active": "e8ba8e9287dfab25",
"active": "a4348c23136fecb0",
"lastOpenFiles": [
"Bases/Regions.base",
"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",
"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/Awareness.md",
"Notes/Crisis.md",
"Notes/XP Cubes.md",
"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",
"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",
"Notes/Water Regions.md",
"Rules.md",
"Notes/Grass Regions.md",
"Tasks/_Tasks.base",
"Untitled",
"Notes/Supply.md",
"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"
"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.base",
"_Overview.md",
"Bases/_Gear.base",
"Tasks",
"Bases/Terrain.base",
"Bases/Event.base",
"Notes"
]
}
+1
View File
@@ -0,0 +1 @@
Add 1 flora to the activated region.
+4
View File
@@ -0,0 +1,4 @@
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
@@ -0,0 +1,4 @@
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
@@ -0,0 +1,3 @@
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
@@ -0,0 +1,6 @@
---
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
@@ -0,0 +1,3 @@
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,3 +5,4 @@ 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
@@ -0,0 +1,3 @@
![[Sun]]
![[Mountain]]
![[Crest]]
+1 -1
View File
@@ -1,3 +1,3 @@
[[Sun]]
[[Mountain]]
[[Seal]]
[[Crest]]
+3
View File
@@ -0,0 +1,3 @@
---
category: Region Type
---
View File
+2
View File
@@ -0,0 +1,2 @@
Default region that has [[Lone Tree Station]] and [[Spire]].
-2
View File
@@ -1,2 +0,0 @@
Default region that has [[Lone Tree Station]].
View File
+4
View File
@@ -0,0 +1,4 @@
---
category: EventType
---
An event that represents something to do with mountains.
+4
View File
@@ -0,0 +1,4 @@
[[Forest Regions]]
[[Water Regions]]
[[Grass Regions]]
[[Mountain Regions]]
+4
View File
@@ -0,0 +1,4 @@
---
category: EventType
---
An event that was something to do with it being sunny.
+3 -1
View File
@@ -1 +1,3 @@
The deck of gear. Things that can get something, like a tool, and get the top most tool from the supply.
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 one 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 1 location to the west.
# Categories
![[Lake]]
![[Grasslands]]
![[Forest]]
![[Water Regions]]
![[Grass Regions]]
![[Forest Regions]]
![[Mountain]]
![[Wasteland]]
+8
View File
@@ -0,0 +1,8 @@
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
@@ -0,0 +1,33 @@
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
@@ -0,0 +1,3 @@
---
category: Region Type
---
+26
View File
@@ -0,0 +1,26 @@
![[Contents]]
![[Map.png]]
![[Terrain Cards]]
![[Victory Condition]]
![[Event Cards]]
![[Market]]
![[Prepare Phase]]
![[Explore Phase]]
![[Travel Phase]]
![[Role Cards]]
+12
View File
@@ -0,0 +1,12 @@
!
![[Prepare Phase]]
![[Explore Phase]]
![[Travel Phase]]
![[End Turn]]
+15
View File
@@ -0,0 +1,15 @@
---
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
@@ -0,0 +1,26 @@
---
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.
+3 -1
View File
@@ -132,14 +132,16 @@ 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: {}