Day 2 vibes

This commit is contained in:
2026-06-11 09:04:54 -04:00
parent adeb4ae7cb
commit 1388182ebe
53 changed files with 54413 additions and 45907 deletions
+101 -31
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.Json;
using System.Text.RegularExpressions;
var exeDir = AppContext.BaseDirectory; var exeDir = AppContext.BaseDirectory;
var solutionDir = FindContainingDir(exeDir, "ET.sln") 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 srcDir = Path.GetFullPath(Path.Combine(solutionDir, "..", "docs", "Notes"));
var dstDir = Path.GetFullPath(Path.Combine(solutionDir, "Web", "wwwroot", "docs", "notes")); var dstDir = Path.GetFullPath(Path.Combine(solutionDir, "Web", "wwwroot", "docs", "notes"));
@@ -18,13 +20,17 @@ if (!Directory.Exists(srcDir))
return 1; 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"))); GenerateMap(srcDir, Path.GetFullPath(Path.Combine(solutionDir, "Web", "wwwroot", "docs")));
Console.WriteLine("Done."); Console.WriteLine("Done.");
return 0; return 0;
static void SyncNotes(string srcDir, string dstDir) static List<object> SyncNotes(string srcDir, string dstDir)
{ {
Directory.CreateDirectory(dstDir); Directory.CreateDirectory(dstDir);
@@ -38,16 +44,33 @@ static void SyncNotes(string srcDir, string dstDir)
var name = Path.GetFileNameWithoutExtension(file); var name = Path.GetFileNameWithoutExtension(file);
var slug = Slugify(name); 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? category = null;
string? cost = null;
string? gearCategory = null;
string? effect = null;
string? location = null;
var content = File.ReadAllText(file); var content = File.ReadAllText(file);
var fmMatch = Regex.Match(content, @"^---\s*\n(.*?)\n---", RegexOptions.Singleline); var fmMatch = Regex.Match(content, @"^---\s*\n(.*?)\n---", RegexOptions.Singleline);
if (fmMatch.Success) 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) if (catMatch.Success)
category = catMatch.Groups[1].Value.Trim().Trim('"'); 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?> var entry = new Dictionary<string, object?>
@@ -57,18 +80,61 @@ static void SyncNotes(string srcDir, string dstDir)
}; };
if (category != null) if (category != null)
entry["category"] = category; 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); 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($"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 GenerateMap(string srcDir, string dstDir) static void GenerateMap(string srcDir, string dstDir)
@@ -79,7 +145,7 @@ static void GenerateMap(string srcDir, string dstDir)
["Forest"] = "#2e7d32", ["Forest"] = "#2e7d32",
["Mountain"] = "#78909c", ["Mountain"] = "#78909c",
["Water"] = "#42a5f5", ["Water"] = "#42a5f5",
["Wasteland"] = "#8d6e63", ["Wasteland"] = "#8d6e63"
}; };
var regionFiles = Directory.EnumerateFiles(srcDir, "*.md") var regionFiles = Directory.EnumerateFiles(srcDir, "*.md")
@@ -130,19 +196,19 @@ static void GenerateMap(string srcDir, string dstDir)
var srcMapImage = Path.GetFullPath(Path.Combine(srcDir, "..", "Images", "Map.png")); var srcMapImage = Path.GetFullPath(Path.Combine(srcDir, "..", "Images", "Map.png"));
var dstMapImage = Path.Combine(dstDir, "Map.png"); var dstMapImage = Path.Combine(dstDir, "Map.png");
if (File.Exists(srcMapImage)) if (File.Exists(srcMapImage))
File.Copy(srcMapImage, dstMapImage, overwrite: true); File.Copy(srcMapImage, dstMapImage, true);
var nameLookup = regions.ToDictionary(r => r.Name); var nameLookup = regions.ToDictionary(r => r.Name);
var pad = 60; var pad = 60;
var maxX = (regions.Count > 0 ? regions.Max(r => r.X) : 0) + pad * 2; 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 maxY = (regions.Count > 0 ? regions.Max(r => r.Y) : 0) + pad * 2;
var svg = new System.Text.StringBuilder(); var svg = new StringBuilder();
svg.AppendLine("<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 700 461\">"); svg.AppendLine("<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 700 461\">");
svg.AppendLine("""<image href="Map.png" width="700" height="461" preserveAspectRatio="xMidYMid meet"/>"""); svg.AppendLine("""<image href="Map.png" width="700" height="461" preserveAspectRatio="xMidYMid meet"/>""");
svg.AppendLine($"""<defs>"""); svg.AppendLine("""<defs>""");
foreach (var (terrain, color) in terrainColors) foreach (var (terrain, color) in terrainColors)
{ {
svg.AppendLine($"""<radialGradient id="glow-{terrain}" cx="50%" cy="50%" r="50%">"""); svg.AppendLine($"""<radialGradient id="glow-{terrain}" cx="50%" cy="50%" r="50%">""");
@@ -150,17 +216,18 @@ static void GenerateMap(string srcDir, string dstDir)
svg.AppendLine($"""<stop offset="100%" stop-color="{color}" stop-opacity="0"/>"""); svg.AppendLine($"""<stop offset="100%" stop-color="{color}" stop-opacity="0"/>""");
svg.AppendLine("</radialGradient>"); svg.AppendLine("</radialGradient>");
} }
svg.AppendLine("</defs>"); svg.AppendLine("</defs>");
foreach (var region in regions) 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)
if (!nameLookup.TryGetValue(conn, out var target) || string.Compare(region.Name, conn, StringComparison.OrdinalIgnoreCase) >= 0) continue;
continue;
svg.AppendLine($"""<line x1="{region.X}" y1="{region.Y}" x2="{target.X}" y2="{target.Y}" stroke="rgba(255,255,255,0.12)" stroke-width="2" stroke-linecap="round"/>"""); svg.AppendLine(
} $"""<line x1="{region.X}" 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) foreach (var region in regions)
@@ -171,17 +238,20 @@ static void GenerateMap(string srcDir, string dstDir)
svg.AppendLine($"""<a href="/docs/{region.Slug}" target="_top">"""); 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="32" fill="url(#glow-{region.Terrain})"/>""");
svg.AppendLine($"""<circle cx="{cx}" cy="{cy}" r="18" fill="{color}cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>"""); svg.AppendLine(
$"""<circle cx="{cx}" cy="{cy}" r="18" fill="{color}cc" stroke="rgba(255,255,255,0.5)" stroke-width="2"/>""");
var labelX = cx + 24; 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.AppendLine(
svg.Append(System.Text.Encodings.Web.HtmlEncoder.Default.Encode(region.Name)); $"""<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>"); svg.AppendLine("</text>");
foreach (var lm in region.Landmarks) 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.AppendLine(
svg.Append(System.Text.Encodings.Web.HtmlEncoder.Default.Encode($"\u2605 {lm}")); $"""<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("</text>");
} }
@@ -231,10 +301,11 @@ static string? FindContainingDir(string startDir, string markerFile)
return dir.FullName; return dir.FullName;
dir = dir.Parent; dir = dir.Parent;
} }
return null; return null;
} }
class RegionData internal class RegionData
{ {
public string Name { get; set; } = ""; public string Name { get; set; } = "";
public string Slug { get; set; } = ""; public string Slug { get; set; } = "";
@@ -243,5 +314,4 @@ class RegionData
public int Y { get; set; } public int Y { get; set; }
public List<string> Connections { get; set; } = new(); public List<string> Connections { get; set; } = new();
public List<string> Landmarks { 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"> <Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/> <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
<FocusOnNavigate RouteData="@routeData" Selector="h1"/> <FocusOnNavigate RouteData="@routeData" Selector="h1"/>
+3 -1
View File
@@ -5,7 +5,9 @@
</div> </div>
<main> <main>
<article class="content px-4"> <article class="content px-4">
@Body <TelerikRootComponent>
@Body
</TelerikRootComponent>
</article> </article>
</main> </main>
</div> </div>
+14 -13
View File
@@ -9,7 +9,8 @@ main {
} }
.sidebar { .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 { .top-row {
@@ -21,20 +22,20 @@ main {
align-items: center; align-items: center;
} }
.top-row ::deep a, .top-row ::deep .btn-link { .top-row ::deep a, .top-row ::deep .btn-link {
white-space: nowrap; white-space: nowrap;
margin-left: 1.5rem; margin-left: 1.5rem;
text-decoration: none; text-decoration: none;
} }
.top-row ::deep a:hover, .top-row ::deep .btn-link:hover { .top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
text-decoration: underline; text-decoration: underline;
} }
.top-row ::deep a:first-child { .top-row ::deep a:first-child {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
@media (max-width: 640.98px) { @media (max-width: 640.98px) {
.top-row { .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="top-row ps-3 navbar navbar-dark">
<div class="container-fluid"> <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"> <button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
@@ -16,7 +18,17 @@
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home <span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
</NavLink> </NavLink>
</div> </div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="docs/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) @if (groupedNotes == null)
{ {
<div class="nav-item px-3"><span class="nav-link text-secondary">Loading...</span></div> <div class="nav-item px-3"><span class="nav-link text-secondary">Loading...</span></div>
@@ -53,7 +65,7 @@
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
var index = await DocsService.GetIndexAsync(); var index = await DocsService.GetIndexAsync();
groupedNotes = (index.Notes ?? new()) groupedNotes = (index.Notes ?? new List<NoteInfo>())
.GroupBy(n => string.IsNullOrEmpty(n.Category) ? "Uncategorized" : n.Category) .GroupBy(n => string.IsNullOrEmpty(n.Category) ? "Uncategorized" : n.Category)
.OrderBy(g => g.Key) .OrderBy(g => g.Key)
.Select(g => new NoteGroup { Category = g.Key, Notes = g.OrderBy(n => n.Title).ToList() }) .Select(g => new NoteGroup { Category = g.Key, Notes = g.OrderBy(n => n.Title).ToList() })
@@ -63,6 +75,7 @@
private class NoteGroup private class NoteGroup
{ {
public string Category { get; set; } = ""; 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 { .navbar-brand {
font-size: 1.1rem; font-family: 'Outfit', sans-serif;
font-weight: 600; font-size: 1.25rem;
letter-spacing: 0.02em; 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 { .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"); 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 { .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"); 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 { .nav-item ::deep a {
color: rgba(255, 255, 255, 0.75); color: var(--text-main);
border-radius: 0; border-radius: 8px;
height: 2.6rem; height: 2.8rem;
display: flex; display: flex;
align-items: center; align-items: center;
line-height: 2.6rem; line-height: 2.8rem;
padding: 0 1rem; padding: 0 1rem;
border-left: 3px solid transparent; margin: 0.2rem 0.5rem;
transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease; transition: all 0.2s ease;
} }
.nav-item ::deep a.active { .nav-item ::deep a.active {
background-color: rgba(255, 255, 255, 0.12); background-color: var(--primary);
color: white; color: #fff;
border-left-color: rgba(255, 255, 255, 0.7); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
} }
.nav-item ::deep a:hover { .nav-item ::deep a:hover {
background-color: rgba(255, 255, 255, 0.07); background-color: rgba(255, 255, 255, 0.05);
color: white; color: var(--accent);
} }
.nav-item-doc ::deep a { .nav-item-doc ::deep a {
padding-left: 1.75rem !important; padding-left: 2.5rem !important;
font-size: 0.8rem; font-size: 0.85rem;
height: 1.85rem !important; height: 2.2rem !important;
line-height: 1.85rem !important; line-height: 2.2rem !important;
border-left-color: transparent; margin: 0.1rem 0.5rem;
} }
.nav-item-doc ::deep a.active { .nav-item-doc ::deep a.active {
background-color: rgba(255, 255, 255, 0.1); background-color: rgba(88, 129, 87, 0.2);
color: white; color: var(--accent);
border-left-color: #6ea8fe; border-left: 2px solid var(--accent);
border-radius: 0 8px 8px 0;
margin-left: 0;
} }
.nav-item-doc ::deep a:hover { .nav-item-doc ::deep a:hover {
@@ -105,7 +123,7 @@
.nav-scrollable { .nav-scrollable {
scrollbar-width: thin; 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 { .nav-scrollable::-webkit-scrollbar {
@@ -117,7 +135,7 @@
} }
.nav-scrollable::-webkit-scrollbar-thumb { .nav-scrollable::-webkit-scrollbar-thumb {
background: rgba(255,255,255,0.15); background: rgba(255, 255, 255, 0.15);
border-radius: 3px; border-radius: 3px;
} }
+5 -1
View File
@@ -5,6 +5,10 @@ public class NoteInfo
public string Slug { get; set; } = ""; public string Slug { get; set; } = "";
public string Title { get; set; } = ""; public string Title { get; set; } = "";
public string? Category { 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 public class NotesIndex
@@ -19,4 +23,4 @@ public class NoteDocument
public string? Category { get; set; } public string? Category { get; set; }
public string FrontmatterHtml { get; set; } = ""; public string FrontmatterHtml { get; set; } = "";
public string HtmlContent { get; set; } = ""; public string HtmlContent { get; set; } = "";
} }
+3 -2
View File
@@ -1,5 +1,5 @@
@page "/docs/{Slug}" @page "/docs/{Slug}"
@inject Web.Services.DocsService DocsService @inject DocsService DocsService
<PageTitle>@(doc?.Title ?? "Not Found")</PageTitle> <PageTitle>@(doc?.Title ?? "Not Found")</PageTitle>
@@ -39,7 +39,7 @@ else
@code { @code {
[Parameter] public string Slug { get; set; } = ""; [Parameter] public string Slug { get; set; } = "";
private Web.Models.NoteDocument? doc; private NoteDocument? doc;
private bool loading = true; private bool loading = true;
protected override async Task OnParametersSetAsync() protected override async Task OnParametersSetAsync()
@@ -49,4 +49,5 @@ else
doc = await DocsService.GetNoteAsync(Slug); doc = await DocsService.GetNoteAsync(Slug);
loading = false; loading = false;
} }
} }
+38 -3
View File
@@ -1,7 +1,42 @@
@page "/docs" @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();
}
}
+51
View File
@@ -0,0 +1,51 @@
@page "/gear"
@inject DocsService DocsService
<PageTitle>Gear & Equipment</PageTitle>
<div class="section-header d-flex align-items-center mb-4">
<h1 class="mb-0">Gear & Equipment</h1>
<div class="ms-3 flex-grow-1 border-bottom opacity-25"></div>
</div>
@if (gearNotes == 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="grid-container">
<TelerikGrid Data="@gearNotes" Pageable="true" PageSize="50" Sortable="true" FilterMode="@GridFilterMode.FilterRow"
Height="calc(100vh - 250px)">
<GridColumns>
<GridColumn Field="@(nameof(NoteInfo.Title))" Title="Item Name" Width="200px">
<Template>
<NavLink href="@($"docs/{(context as NoteInfo)!.Slug}")" class="fw-bold">@((context as NoteInfo)!.Title)</NavLink>
</Template>
</GridColumn>
<GridColumn Field="@(nameof(NoteInfo.Cost))" Title="Cost" Width="90px" />
<GridColumn Field="@(nameof(NoteInfo.GearCategory))" Title="Category" Width="140px"/>
<GridColumn Field="@(nameof(NoteInfo.Effect))" Title="Effect"/>
<GridColumn Field="@(nameof(NoteInfo.Location))" Title="Acquisition" Width="150px"/>
</GridColumns>
</TelerikGrid>
</div>
}
@code {
private List<NoteInfo>? gearNotes;
protected override async Task OnInitializedAsync()
{
var index = await DocsService.GetIndexAsync();
gearNotes = index.Notes
.Where(n => string.Equals(n.Category, "Gear", StringComparison.OrdinalIgnoreCase))
.OrderBy(n => n.Title)
.ToList();
}
}
+18 -4
View File
@@ -2,8 +2,22 @@
<PageTitle>Earthborne Trailblazer</PageTitle> <PageTitle>Earthborne Trailblazer</PageTitle>
<h1>Earthborne Trailblazer</h1> <div class="hero-section text-center">
<div class="hero-content py-5">
<div class="map-container"> <h1 class="display-4 mb-3">Earthborne Trailblazer</h1>
<object data="docs/map.svg" type="image/svg+xml" class="map-svg"></object> <p class="lead mb-4">Your essential companion guide for navigating the Valley and mastering your craft.</p>
<div class="hero-actions">
<NavLink href="docs/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> </div>
+15 -4
View File
@@ -1,5 +1,16 @@
@page "/not-found" @page "/404"
@layout MainLayout @page "/not-found"
<h3>Not Found</h3> <PageTitle>404 - Not Found</PageTitle>
<p>Sorry, the content you are looking for does not exist.</p>
<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>
+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(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddScoped<DocsService>(); builder.Services.AddScoped<DocsService>();
builder.Services.AddTelerikBlazor();
await builder.Build().RunAsync(); await builder.Build().RunAsync();
+82 -15
View File
@@ -1,4 +1,7 @@
using System.Net;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text;
using System.Text.RegularExpressions;
using Markdig; using Markdig;
using Web.Models; using Web.Models;
@@ -6,12 +9,19 @@ namespace Web.Services;
public class DocsService public class DocsService
{ {
private readonly HttpClient _http;
private NotesIndex? _index;
private static readonly MarkdownPipeline Pipeline = new MarkdownPipelineBuilder() private static readonly MarkdownPipeline Pipeline = new MarkdownPipelineBuilder()
.UseYamlFrontMatter() .UseYamlFrontMatter()
.Build(); .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) public DocsService(HttpClient http)
{ {
_http = http; _http = http;
@@ -38,7 +48,7 @@ public class DocsService
try try
{ {
var markdown = await _http.GetStringAsync($"docs/notes/{slug}.md"); var markdown = await _http.GetStringAsync($"docs/notes/{slug}.md");
return ParseDocument(slug, noteInfo.Title, markdown); return await ParseDocument(slug, noteInfo.Title, markdown);
} }
catch catch
{ {
@@ -46,7 +56,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 var doc = new NoteDocument
{ {
@@ -69,6 +79,7 @@ public class DocsService
inFrontmatter = true; inFrontmatter = true;
continue; continue;
} }
inFrontmatter = false; inFrontmatter = false;
frontmatterDone = true; frontmatterDone = true;
continue; continue;
@@ -89,13 +100,11 @@ public class DocsService
{ {
var key = line[..colonIdx].Trim(); var key = line[..colonIdx].Trim();
if (string.Equals(key, "category", StringComparison.OrdinalIgnoreCase)) if (string.Equals(key, "category", StringComparison.OrdinalIgnoreCase))
{
doc.Category = line[(colonIdx + 1)..].Trim().Trim('"'); doc.Category = line[(colonIdx + 1)..].Trim().Trim('"');
}
} }
} }
var fmHtml = new System.Text.StringBuilder(); var fmHtml = new StringBuilder();
fmHtml.Append("<table class=\"frontmatter\">"); fmHtml.Append("<table class=\"frontmatter\">");
foreach (var line in frontmatterLines) foreach (var line in frontmatterLines)
{ {
@@ -105,33 +114,91 @@ public class DocsService
var key = line[..colonIdx].Trim(); var key = line[..colonIdx].Trim();
var value = line[(colonIdx + 1)..].Trim().Trim('"'); var value = line[(colonIdx + 1)..].Trim().Trim('"');
fmHtml.Append("<tr><td class=\"fm-key\">"); 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\">"); 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(ConvertWikiLinks(encoded));
fmHtml.Append("</td></tr>"); fmHtml.Append("</td></tr>");
} }
else else
{ {
fmHtml.Append("<tr><td colspan=\"2\">"); 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("</td></tr>");
} }
} }
fmHtml.Append("</table>"); fmHtml.Append("</table>");
doc.FrontmatterHtml = fmHtml.ToString(); doc.FrontmatterHtml = fmHtml.ToString();
} }
var body = string.Join("\n", bodyLines); var body = string.Join("\n", bodyLines);
body = ConvertWikiLinks(body); 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; 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) private static string ConvertWikiLinks(string text)
{ {
return System.Text.RegularExpressions.Regex.Replace( return Regex.Replace(
text, text,
@"\[\[([^\]]+)\]\]", @"\[\[([^\]]+)\]\]",
match => match =>
@@ -141,7 +208,7 @@ public class DocsService
var linkText = parts.Length > 1 ? parts[1].Trim() : parts[0].Trim(); var linkText = parts.Length > 1 ? parts[1].Trim() : parts[0].Trim();
var target = parts[0].Trim(); var target = parts[0].Trim();
var slug = Slugify(target); 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 +220,8 @@ public class DocsService
.Replace(".", "") .Replace(".", "")
.Replace("(", "") .Replace("(", "")
.Replace(")", ""); .Replace(")", "");
slug = System.Text.RegularExpressions.Regex.Replace(slug, @"[^a-z0-9\-]", ""); slug = Regex.Replace(slug, @"[^a-z0-9\-]", "");
slug = System.Text.RegularExpressions.Regex.Replace(slug, @"-+", "-"); slug = Regex.Replace(slug, @"-+", "-");
return slug.Trim('-'); return slug.Trim('-');
} }
} }
+4
View File
@@ -11,6 +11,10 @@
<PackageReference Include="Markdig" Version="0.40.0"/> <PackageReference Include="Markdig" Version="0.40.0"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.9"/> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.9"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.9" PrivateAssets="all"/> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.9" PrivateAssets="all"/>
<PackageReference Include="Telerik.ReportViewer.Blazor" Version="20.1.26.520"/>
<PackageReference Include="Telerik.ReportViewer.BlazorNative" Version="20.1.26.520"/>
<PackageReference Include="Telerik.UI.for.Blazor" Version="14.0.0"/>
<PackageReference Include="Telerik.WebReportDesigner.Blazor" Version="20.1.26.520"/>
</ItemGroup> </ItemGroup>
<Target Name="SyncDocsNotes" BeforeTargets="BeforeBuild"> <Target Name="SyncDocsNotes" BeforeTargets="BeforeBuild">
+2
View File
@@ -9,4 +9,6 @@
@using Web @using Web
@using Web.Layout @using Web.Layout
@using Web.Models @using Web.Models
@using Telerik.Blazor
@using Telerik.Blazor.Components
@using Web.Services @using Web.Services
+518 -74
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 { 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 { h1:focus {
@@ -7,17 +68,34 @@ h1:focus {
} }
a, .btn-link { 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 { .btn-primary {
color: #fff; color: #fff;
background-color: #1b6ec2; background-color: var(--primary);
border-color: #1861ac; 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 { .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 { .content {
@@ -50,12 +128,12 @@ a, .btn-link {
z-index: 1000; z-index: 1000;
} }
#blazor-error-ui .dismiss { #blazor-error-ui .dismiss {
cursor: pointer; cursor: pointer;
position: absolute; position: absolute;
right: 0.75rem; right: 0.75rem;
top: 0.5rem; top: 0.5rem;
} }
.blazor-error-boundary { .blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; 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; color: white;
} }
.blazor-error-boundary::after { .blazor-error-boundary::after {
content: "An error has occurred." content: "An error has occurred."
} }
.loading-progress { .loading-progress {
position: absolute; position: absolute;
@@ -76,19 +154,19 @@ a, .btn-link {
margin: 0 auto 0 auto; margin: 0 auto 0 auto;
} }
.loading-progress circle { .loading-progress circle {
fill: none; fill: none;
stroke: #e0e0e0; stroke: #e0e0e0;
stroke-width: 0.6rem; stroke-width: 0.6rem;
transform-origin: 50% 50%; transform-origin: 50% 50%;
transform: rotate(-90deg); transform: rotate(-90deg);
} }
.loading-progress circle:last-child { .loading-progress circle:last-child {
stroke: #1b6ec2; stroke: #1b6ec2;
stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
transition: stroke-dasharray 0.05s ease-in-out; transition: stroke-dasharray 0.05s ease-in-out;
} }
.loading-progress-text { .loading-progress-text {
position: absolute; position: absolute;
@@ -97,9 +175,9 @@ a, .btn-link {
inset: calc(20vh + 3.25rem) 0 auto 0.2rem; inset: calc(20vh + 3.25rem) 0 auto 0.2rem;
} }
.loading-progress-text:after { .loading-progress-text:after {
content: var(--blazor-load-percentage-text, "Loading"); content: var(--blazor-load-percentage-text, "Loading");
} }
code { code {
color: #c02d76; color: #c02d76;
@@ -118,95 +196,201 @@ 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"); 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 { .docs-grid {
display: grid; display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1rem; gap: 1.5rem;
margin-top: 1rem; margin-top: 1.5rem;
} }
.docs-card { .docs-card {
display: block; display: flex;
padding: 0.75rem 1rem; flex-direction: column;
border: 1px solid #dee2e6; padding: 1.5rem;
border-radius: 8px; background: var(--bg-sidebar);
border: 1px solid var(--border-color);
border-radius: 12px;
text-decoration: none; text-decoration: none;
color: inherit; color: var(--text-main);
transition: box-shadow 0.15s ease-in-out, border-color 0.15s ease-in-out; transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
height: 100%;
} }
.docs-card:hover { .docs-card:hover {
border-color: #1b6ec2; border-color: var(--primary-light);
box-shadow: 0 2px 8px rgba(0,0,0,0.1); transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
text-decoration: none; text-decoration: none;
color: #fff;
} }
.docs-card h3 { .docs-card h3 {
margin: 0; margin: 0.5rem 0 0.75rem 0;
font-size: 1rem; font-size: 1.25rem;
font-weight: 500; color: #fff;
font-family: 'Outfit', sans-serif;
} }
.frontmatter-section { .frontmatter-section {
margin: 1rem 0; margin: 2rem 0;
padding: 0.5rem; padding: 1.25rem;
border: 1px solid #e9ecef; border: 1px solid var(--border-color);
border-radius: 6px; border-radius: 12px;
background: #f8f9fa; background: rgba(255, 255, 255, 0.02);
} }
.frontmatter-section summary { .frontmatter-section summary {
cursor: pointer; cursor: pointer;
font-weight: 600; font-weight: 600;
color: #495057; color: var(--accent);
padding: 0.25rem 0; padding: 0;
font-family: 'Outfit', sans-serif;
} }
table.frontmatter { table.frontmatter {
width: 100%; width: 100%;
border-collapse: collapse; border-collapse: separate;
margin-top: 0.5rem; border-spacing: 0;
margin-top: 1rem;
font-size: 0.9rem; font-size: 0.9rem;
border-radius: 8px;
overflow: hidden;
border: 1px solid var(--border-color);
} }
table.frontmatter td { table.frontmatter td {
padding: 0.25rem 0.5rem; padding: 0.75rem 1rem;
border: 1px solid #dee2e6; border-bottom: 1px solid var(--border-color);
vertical-align: top; vertical-align: top;
background: transparent;
color: var(--text-main);
}
table.frontmatter tr:last-child td {
border-bottom: none;
} }
table.frontmatter td.fm-key { table.frontmatter td.fm-key {
font-weight: 600; font-weight: 600;
color: #495057; color: var(--accent);
white-space: nowrap; white-space: nowrap;
width: 1%; width: 30%;
background: #e9ecef; background: rgba(255, 255, 255, 0.03);
} }
.markdown-body { .markdown-body {
line-height: 1.7; line-height: 1.8;
margin-top: 1rem; margin-top: 2rem;
color: #d1d1d1;
} }
.markdown-body h1 { font-size: 1.75rem; margin: 1.5rem 0 0.75rem; } .markdown-body h1 {
.markdown-body h2 { font-size: 1.4rem; margin: 1.25rem 0 0.5rem; } font-size: 2.25rem;
.markdown-body h3 { font-size: 1.15rem; margin: 1rem 0 0.5rem; } margin: 2rem 0 1rem;
.markdown-body p { margin: 0.5rem 0; } border-bottom: 1px solid var(--border-color);
.markdown-body ul, .markdown-body ol { margin: 0.5rem 0; padding-left: 1.5rem; } padding-bottom: 0.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 h2 {
.markdown-body code { background: #f0f0f0; padding: 0.15rem 0.3rem; border-radius: 3px; font-size: 0.9em; } font-size: 1.75rem;
.markdown-body pre code { background: none; padding: 0; } margin: 2rem 0 1rem;
.markdown-body blockquote { border-left: 3px solid #dee2e6; padding-left: 1rem; color: #6c757d; margin: 0.75rem 0; } 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%;
border-collapse: separate;
border-spacing: 0;
margin: 1.5rem 0;
border-radius: 12px;
overflow: hidden;
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 { .map-container {
max-width: 100%; max-width: 100%;
margin: 1.5rem 0; margin: 1rem 0;
border: 1px solid #dee2e6; border: 1px solid var(--border-color);
border-radius: 8px; border-radius: 12px;
overflow: hidden; overflow: hidden;
background: #1a1a2e; background: #0f100d;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
} }
.map-svg { .map-svg {
@@ -228,4 +412,264 @@ table.frontmatter td.fm-key {
background: #e8f4fd; background: #e8f4fd;
color: #1b6ec2; color: #1b6ec2;
border: 1px solid #b8daff; 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: 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

+52 -10
View File
@@ -12,7 +12,11 @@
{ {
"slug": "cache-map", "slug": "cache-map",
"title": "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", "slug": "card-library",
@@ -46,7 +50,11 @@
{ {
"slug": "dolewood-canoe", "slug": "dolewood-canoe",
"title": "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", "slug": "e03",
@@ -85,7 +93,11 @@
{ {
"slug": "ferinodex", "slug": "ferinodex",
"title": "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", "slug": "flora-meeples",
@@ -123,7 +135,11 @@
{ {
"slug": "gauzeblade", "slug": "gauzeblade",
"title": "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", "slug": "gear-cards",
@@ -166,7 +182,11 @@
{ {
"slug": "hidden-trail-map", "slug": "hidden-trail-map",
"title": "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", "slug": "injury-cards",
@@ -216,7 +236,11 @@
{ {
"slug": "paratrepsis-whistle", "slug": "paratrepsis-whistle",
"title": "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", "slug": "paved-roads",
@@ -225,12 +249,17 @@
{ {
"slug": "perfect-day-1", "slug": "perfect-day-1",
"title": "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", "slug": "phonoscopic-headset",
"title": "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", "slug": "player-boards",
@@ -287,7 +316,11 @@
{ {
"slug": "ruins-map", "slug": "ruins-map",
"title": "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", "slug": "scout",
@@ -333,7 +366,11 @@
{ {
"slug": "totem-of-the-irix", "slug": "totem-of-the-irix",
"title": "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", "slug": "trade",
@@ -417,6 +454,11 @@
{ {
"slug": "xp", "slug": "xp",
"title": "XP" "title": "XP"
},
{
"slug": "overview",
"title": "Overview",
"category": "Overview"
} }
] ]
} }
+1 -1
View File
@@ -3,5 +3,5 @@ category: Gear
Cost: 4 Cost: 4
Gear Category: Tool Gear Category: Tool
Effect: "Boat. Travel: You need 1 less Progress to place trail markers in water regions." Effect: "Boat. Travel: You need 1 less Progress to place trail markers in water regions."
Location: White Sky Location: "[[White Sky]]"
--- ---
+26 -21
View File
@@ -2,33 +2,38 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
<title>Web</title> <title>Web</title>
<base href="/" /> <base href="/"/>
<link rel="preload" id="webassembly" /> <link id="webassembly" rel="preload"/>
<link rel="stylesheet" href="lib/bootstrap/dist/css/bootstrap.min.css" /> <link href="lib/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"/>
<link rel="stylesheet" href="css/app.css" /> <link href="favicon.png" rel="icon" type="image/png"/>
<link rel="icon" type="image/png" href="favicon.png" /> <link rel="preconnect" href="https://fonts.googleapis.com">
<link href="Web.styles.css" rel="stylesheet" /> <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> <script type="importmap"></script>
</head> </head>
<body> <body>
<div id="app"> <div id="app">
<svg class="loading-progress"> <svg class="loading-progress">
<circle r="40%" cx="50%" cy="50%" /> <circle cx="50%" cy="50%" r="40%"/>
<circle r="40%" cx="50%" cy="50%" /> <circle cx="50%" cy="50%" r="40%"/>
</svg> </svg>
<div class="loading-progress-text"></div> <div class="loading-progress-text"></div>
</div> </div>
<div id="blazor-error-ui"> <div id="blazor-error-ui">
An unhandled error has occurred. An unhandled error has occurred.
<a href="." class="reload">Reload</a> <a class="reload" href=".">Reload</a>
<span class="dismiss">🗙</span> <span class="dismiss">🗙</span>
</div> </div>
<script src="_framework/blazor.webassembly#[.{fingerprint}].js"></script> <script defer src="_content/Telerik.UI.for.Blazor/js/telerik-blazor.js"></script>
<script src="_framework/blazor.webassembly#[.{fingerprint}].js"></script>
</body> </body>
</html> </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, :root,
[data-bs-theme=light] { [data-bs-theme=light] {
--bs-blue: #0d6efd; --bs-blue: #0d6efd;
--bs-indigo: #6610f2; --bs-indigo: #6610f2;
--bs-purple: #6f42c1; --bs-purple: #6f42c1;
--bs-pink: #d63384; --bs-pink: #d63384;
--bs-red: #dc3545; --bs-red: #dc3545;
--bs-orange: #fd7e14; --bs-orange: #fd7e14;
--bs-yellow: #ffc107; --bs-yellow: #ffc107;
--bs-green: #198754; --bs-green: #198754;
--bs-teal: #20c997; --bs-teal: #20c997;
--bs-cyan: #0dcaf0; --bs-cyan: #0dcaf0;
--bs-black: #000; --bs-black: #000;
--bs-white: #fff; --bs-white: #fff;
--bs-gray: #6c757d; --bs-gray: #6c757d;
--bs-gray-dark: #343a40; --bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa; --bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef; --bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6; --bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da; --bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd; --bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d; --bs-gray-600: #6c757d;
--bs-gray-700: #495057; --bs-gray-700: #495057;
--bs-gray-800: #343a40; --bs-gray-800: #343a40;
--bs-gray-900: #212529; --bs-gray-900: #212529;
--bs-primary: #0d6efd; --bs-primary: #0d6efd;
--bs-secondary: #6c757d; --bs-secondary: #6c757d;
--bs-success: #198754; --bs-success: #198754;
--bs-info: #0dcaf0; --bs-info: #0dcaf0;
--bs-warning: #ffc107; --bs-warning: #ffc107;
--bs-danger: #dc3545; --bs-danger: #dc3545;
--bs-light: #f8f9fa; --bs-light: #f8f9fa;
--bs-dark: #212529; --bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253; --bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125; --bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84; --bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240; --bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7; --bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69; --bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250; --bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41; --bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65; --bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32; --bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622; --bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160; --bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03; --bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c; --bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057; --bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057; --bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff; --bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5; --bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd; --bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc; --bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd; --bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da; --bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd; --bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da; --bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe; --bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb; --bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb; --bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9; --bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c; --bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5; --bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef; --bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd; --bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255; --bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0; --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-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-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-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-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem; --bs-body-font-size: 1rem;
--bs-body-font-weight: 400; --bs-body-font-weight: 400;
--bs-body-line-height: 1.5; --bs-body-line-height: 1.5;
--bs-body-color: #212529; --bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41; --bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff; --bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255; --bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000; --bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0; --bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75); --bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41; --bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef; --bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239; --bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5); --bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41; --bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa; --bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250; --bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit; --bs-heading-color: inherit;
--bs-link-color: #0d6efd; --bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253; --bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline; --bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca; --bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202; --bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384; --bs-code-color: #d63384;
--bs-highlight-color: #212529; --bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd; --bs-highlight-bg: #fff3cd;
--bs-border-width: 1px; --bs-border-width: 1px;
--bs-border-style: solid; --bs-border-style: solid;
--bs-border-color: #dee2e6; --bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175); --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem; --bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem; --bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem; --bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem; --bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem; --bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl); --bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem; --bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); --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-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-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-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem; --bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25; --bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25); --bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754; --bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754; --bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545; --bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545; --bs-form-invalid-border-color: #dc3545;
} }
[data-bs-theme=dark] { [data-bs-theme=dark] {
color-scheme: dark; color-scheme: dark;
--bs-body-color: #dee2e6; --bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230; --bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529; --bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41; --bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff; --bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255; --bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75); --bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230; --bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40; --bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64; --bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5); --bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230; --bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035; --bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53; --bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe; --bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1; --bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798; --bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6; --bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a; --bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f; --bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa; --bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6; --bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633; --bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719; --bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11; --bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830; --bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701; --bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e; --bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40; --bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20; --bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298; --bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b; --bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132; --bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990; --bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404; --bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029; --bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057; --bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40; --bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit; --bs-heading-color: inherit;
--bs-link-color: #6ea8fe; --bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe; --bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254; --bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254; --bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5; --bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6; --bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03; --bs-highlight-bg: #664d03;
--bs-border-color: #495057; --bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15); --bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798; --bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798; --bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f; --bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f; --bs-form-invalid-border-color: #ea868f;
} }
*, *,
*::before, *::before,
*::after { *::after {
box-sizing: border-box; box-sizing: border-box;
} }
@media (prefers-reduced-motion: no-preference) { @media (prefers-reduced-motion: no-preference) {
:root { :root {
scroll-behavior: smooth; scroll-behavior: smooth;
} }
} }
body { body {
margin: 0; margin: 0;
font-family: var(--bs-body-font-family); font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size); font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight); font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height); line-height: var(--bs-body-line-height);
color: var(--bs-body-color); color: var(--bs-body-color);
text-align: var(--bs-body-text-align); text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg); background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
} }
hr { hr {
margin: 1rem 0; margin: 1rem 0;
color: inherit; color: inherit;
border: 0; border: 0;
border-top: var(--bs-border-width) solid; border-top: var(--bs-border-width) solid;
opacity: 0.25; opacity: 0.25;
} }
h6, h5, h4, h3, h2, h1 { h6, h5, h4, h3, h2, h1 {
margin-top: 0; margin-top: 0;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-weight: 500; font-weight: 500;
line-height: 1.2; line-height: 1.2;
color: var(--bs-heading-color); color: var(--bs-heading-color);
} }
h1 { h1 {
font-size: calc(1.375rem + 1.5vw); font-size: calc(1.375rem + 1.5vw);
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
h1 { h1 {
font-size: 2.5rem; font-size: 2.5rem;
} }
} }
h2 { h2 {
font-size: calc(1.325rem + 0.9vw); font-size: calc(1.325rem + 0.9vw);
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
h2 { h2 {
font-size: 2rem; font-size: 2rem;
} }
} }
h3 { h3 {
font-size: calc(1.3rem + 0.6vw); font-size: calc(1.3rem + 0.6vw);
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
h3 { h3 {
font-size: 1.75rem; font-size: 1.75rem;
} }
} }
h4 { h4 {
font-size: calc(1.275rem + 0.3vw); font-size: calc(1.275rem + 0.3vw);
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
h4 { h4 {
font-size: 1.5rem; font-size: 1.5rem;
} }
} }
h5 { h5 {
font-size: 1.25rem; font-size: 1.25rem;
} }
h6 { h6 {
font-size: 1rem; font-size: 1rem;
} }
p { p {
margin-top: 0; margin-top: 0;
margin-bottom: 1rem; margin-bottom: 1rem;
} }
abbr[title] { abbr[title] {
-webkit-text-decoration: underline dotted; -webkit-text-decoration: underline dotted;
text-decoration: underline dotted; text-decoration: underline dotted;
cursor: help; cursor: help;
-webkit-text-decoration-skip-ink: none; -webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none; text-decoration-skip-ink: none;
} }
address { address {
margin-bottom: 1rem; margin-bottom: 1rem;
font-style: normal; font-style: normal;
line-height: inherit; line-height: inherit;
} }
ol, ol,
ul { ul {
padding-left: 2rem; padding-left: 2rem;
} }
ol, ol,
ul, ul,
dl { dl {
margin-top: 0; margin-top: 0;
margin-bottom: 1rem; margin-bottom: 1rem;
} }
ol ol, ol ol,
ul ul, ul ul,
ol ul, ol ul,
ul ol { ul ol {
margin-bottom: 0; margin-bottom: 0;
} }
dt { dt {
font-weight: 700; font-weight: 700;
} }
dd { dd {
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
margin-left: 0; margin-left: 0;
} }
blockquote { blockquote {
margin: 0 0 1rem; margin: 0 0 1rem;
} }
b, b,
strong { strong {
font-weight: bolder; font-weight: bolder;
} }
small { small {
font-size: 0.875em; font-size: 0.875em;
} }
mark { mark {
padding: 0.1875em; padding: 0.1875em;
color: var(--bs-highlight-color); color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg); background-color: var(--bs-highlight-bg);
} }
sub, sub,
sup { sup {
position: relative; position: relative;
font-size: 0.75em; font-size: 0.75em;
line-height: 0; line-height: 0;
vertical-align: baseline; vertical-align: baseline;
} }
sub { sub {
bottom: -0.25em; bottom: -0.25em;
} }
sup { sup {
top: -0.5em; top: -0.5em;
} }
a { a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline; text-decoration: underline;
} }
a:hover { 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 { a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit; color: inherit;
text-decoration: none; text-decoration: none;
} }
pre, pre,
code, code,
kbd, kbd,
samp { samp {
font-family: var(--bs-font-monospace); font-family: var(--bs-font-monospace);
font-size: 1em; font-size: 1em;
} }
pre { pre {
display: block; display: block;
margin-top: 0; margin-top: 0;
margin-bottom: 1rem; margin-bottom: 1rem;
overflow: auto; overflow: auto;
font-size: 0.875em; font-size: 0.875em;
} }
pre code { pre code {
font-size: inherit; font-size: inherit;
color: inherit; color: inherit;
word-break: normal; word-break: normal;
} }
code { code {
font-size: 0.875em; font-size: 0.875em;
color: var(--bs-code-color); color: var(--bs-code-color);
word-wrap: break-word; word-wrap: break-word;
} }
a > code { a > code {
color: inherit; color: inherit;
} }
kbd { kbd {
padding: 0.1875rem 0.375rem; padding: 0.1875rem 0.375rem;
font-size: 0.875em; font-size: 0.875em;
color: var(--bs-body-bg); color: var(--bs-body-bg);
background-color: var(--bs-body-color); background-color: var(--bs-body-color);
border-radius: 0.25rem; border-radius: 0.25rem;
} }
kbd kbd { kbd kbd {
padding: 0; padding: 0;
font-size: 1em; font-size: 1em;
} }
figure { figure {
margin: 0 0 1rem; margin: 0 0 1rem;
} }
img, img,
svg { svg {
vertical-align: middle; vertical-align: middle;
} }
table { table {
caption-side: bottom; caption-side: bottom;
border-collapse: collapse; border-collapse: collapse;
} }
caption { caption {
padding-top: 0.5rem; padding-top: 0.5rem;
padding-bottom: 0.5rem; padding-bottom: 0.5rem;
color: var(--bs-secondary-color); color: var(--bs-secondary-color);
text-align: left; text-align: left;
} }
th { th {
text-align: inherit; text-align: inherit;
text-align: -webkit-match-parent; text-align: -webkit-match-parent;
} }
thead, thead,
@@ -434,21 +442,21 @@ tfoot,
tr, tr,
td, td,
th { th {
border-color: inherit; border-color: inherit;
border-style: solid; border-style: solid;
border-width: 0; border-width: 0;
} }
label { label {
display: inline-block; display: inline-block;
} }
button { button {
border-radius: 0; border-radius: 0;
} }
button:focus:not(:focus-visible) { button:focus:not(:focus-visible) {
outline: 0; outline: 0;
} }
input, input,
@@ -456,76 +464,80 @@ button,
select, select,
optgroup, optgroup,
textarea { textarea {
margin: 0; margin: 0;
font-family: inherit; font-family: inherit;
font-size: inherit; font-size: inherit;
line-height: inherit; line-height: inherit;
} }
button, button,
select { select {
text-transform: none; text-transform: none;
} }
[role=button] { [role=button] {
cursor: pointer; cursor: pointer;
} }
select { select {
word-wrap: normal; word-wrap: normal;
} }
select:disabled { 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 { [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, button,
[type=button], [type=button],
[type=reset], [type=reset],
[type=submit] { [type=submit] {
-webkit-appearance: button; -webkit-appearance: button;
} }
button:not(:disabled), button:not(:disabled),
[type=button]:not(:disabled), [type=button]:not(:disabled),
[type=reset]:not(:disabled), [type=reset]:not(:disabled),
[type=submit]:not(:disabled) { [type=submit]:not(:disabled) {
cursor: pointer; cursor: pointer;
} }
::-moz-focus-inner { ::-moz-focus-inner {
padding: 0; padding: 0;
border-style: none; border-style: none;
} }
textarea { textarea {
resize: vertical; resize: vertical;
} }
fieldset { fieldset {
min-width: 0; min-width: 0;
padding: 0; padding: 0;
margin: 0; margin: 0;
border: 0; border: 0;
} }
legend { legend {
float: left; float: left;
width: 100%; width: 100%;
padding: 0; padding: 0;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw); font-size: calc(1.275rem + 0.3vw);
line-height: inherit; line-height: inherit;
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
legend { legend {
font-size: 1.5rem; font-size: 1.5rem;
} }
} }
legend + * { legend + * {
clear: left; clear: left;
} }
::-webkit-datetime-edit-fields-wrapper, ::-webkit-datetime-edit-fields-wrapper,
@@ -535,16 +547,16 @@ legend + * {
::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field { ::-webkit-datetime-edit-year-field {
padding: 0; padding: 0;
} }
::-webkit-inner-spin-button { ::-webkit-inner-spin-button {
height: auto; height: auto;
} }
[type=search] { [type=search] {
-webkit-appearance: textfield; -webkit-appearance: textfield;
outline-offset: -2px; outline-offset: -2px;
} }
/* rtl:raw: /* rtl:raw:
@@ -556,42 +568,42 @@ legend + * {
} }
*/ */
::-webkit-search-decoration { ::-webkit-search-decoration {
-webkit-appearance: none; -webkit-appearance: none;
} }
::-webkit-color-swatch-wrapper { ::-webkit-color-swatch-wrapper {
padding: 0; padding: 0;
} }
::-webkit-file-upload-button { ::-webkit-file-upload-button {
font: inherit; font: inherit;
-webkit-appearance: button; -webkit-appearance: button;
} }
::file-selector-button { ::file-selector-button {
font: inherit; font: inherit;
-webkit-appearance: button; -webkit-appearance: button;
} }
output { output {
display: inline-block; display: inline-block;
} }
iframe { iframe {
border: 0; border: 0;
} }
summary { summary {
display: list-item; display: list-item;
cursor: pointer; cursor: pointer;
} }
progress { progress {
vertical-align: baseline; vertical-align: baseline;
} }
[hidden] { [hidden] {
display: none !important; display: none !important;
} }
/*# sourceMappingURL=bootstrap-reboot.css.map */ /*# sourceMappingURL=bootstrap-reboot.css.map */
+342 -328
View File
@@ -5,427 +5,435 @@
*/ */
:root, :root,
[data-bs-theme=light] { [data-bs-theme=light] {
--bs-blue: #0d6efd; --bs-blue: #0d6efd;
--bs-indigo: #6610f2; --bs-indigo: #6610f2;
--bs-purple: #6f42c1; --bs-purple: #6f42c1;
--bs-pink: #d63384; --bs-pink: #d63384;
--bs-red: #dc3545; --bs-red: #dc3545;
--bs-orange: #fd7e14; --bs-orange: #fd7e14;
--bs-yellow: #ffc107; --bs-yellow: #ffc107;
--bs-green: #198754; --bs-green: #198754;
--bs-teal: #20c997; --bs-teal: #20c997;
--bs-cyan: #0dcaf0; --bs-cyan: #0dcaf0;
--bs-black: #000; --bs-black: #000;
--bs-white: #fff; --bs-white: #fff;
--bs-gray: #6c757d; --bs-gray: #6c757d;
--bs-gray-dark: #343a40; --bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa; --bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef; --bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6; --bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da; --bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd; --bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d; --bs-gray-600: #6c757d;
--bs-gray-700: #495057; --bs-gray-700: #495057;
--bs-gray-800: #343a40; --bs-gray-800: #343a40;
--bs-gray-900: #212529; --bs-gray-900: #212529;
--bs-primary: #0d6efd; --bs-primary: #0d6efd;
--bs-secondary: #6c757d; --bs-secondary: #6c757d;
--bs-success: #198754; --bs-success: #198754;
--bs-info: #0dcaf0; --bs-info: #0dcaf0;
--bs-warning: #ffc107; --bs-warning: #ffc107;
--bs-danger: #dc3545; --bs-danger: #dc3545;
--bs-light: #f8f9fa; --bs-light: #f8f9fa;
--bs-dark: #212529; --bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253; --bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125; --bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84; --bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240; --bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7; --bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69; --bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250; --bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41; --bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65; --bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32; --bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622; --bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160; --bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03; --bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c; --bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057; --bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057; --bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff; --bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5; --bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd; --bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc; --bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd; --bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da; --bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd; --bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da; --bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe; --bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb; --bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb; --bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9; --bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c; --bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5; --bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef; --bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd; --bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255; --bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0; --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-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-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-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-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem; --bs-body-font-size: 1rem;
--bs-body-font-weight: 400; --bs-body-font-weight: 400;
--bs-body-line-height: 1.5; --bs-body-line-height: 1.5;
--bs-body-color: #212529; --bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41; --bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff; --bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255; --bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000; --bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0; --bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75); --bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41; --bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef; --bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239; --bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5); --bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41; --bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa; --bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250; --bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit; --bs-heading-color: inherit;
--bs-link-color: #0d6efd; --bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253; --bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline; --bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca; --bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202; --bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384; --bs-code-color: #d63384;
--bs-highlight-color: #212529; --bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd; --bs-highlight-bg: #fff3cd;
--bs-border-width: 1px; --bs-border-width: 1px;
--bs-border-style: solid; --bs-border-style: solid;
--bs-border-color: #dee2e6; --bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175); --bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem; --bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem; --bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem; --bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem; --bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem; --bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl); --bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem; --bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); --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-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-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-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem; --bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25; --bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25); --bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754; --bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754; --bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545; --bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545; --bs-form-invalid-border-color: #dc3545;
} }
[data-bs-theme=dark] { [data-bs-theme=dark] {
color-scheme: dark; color-scheme: dark;
--bs-body-color: #dee2e6; --bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230; --bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529; --bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41; --bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff; --bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255; --bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75); --bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230; --bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40; --bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64; --bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5); --bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230; --bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035; --bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53; --bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe; --bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1; --bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798; --bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6; --bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a; --bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f; --bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa; --bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6; --bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633; --bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719; --bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11; --bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830; --bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701; --bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e; --bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40; --bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20; --bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298; --bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b; --bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132; --bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990; --bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404; --bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029; --bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057; --bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40; --bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit; --bs-heading-color: inherit;
--bs-link-color: #6ea8fe; --bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe; --bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254; --bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254; --bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5; --bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6; --bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03; --bs-highlight-bg: #664d03;
--bs-border-color: #495057; --bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15); --bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798; --bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798; --bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f; --bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f; --bs-form-invalid-border-color: #ea868f;
} }
*, *,
*::before, *::before,
*::after { *::after {
box-sizing: border-box; box-sizing: border-box;
} }
@media (prefers-reduced-motion: no-preference) { @media (prefers-reduced-motion: no-preference) {
:root { :root {
scroll-behavior: smooth; scroll-behavior: smooth;
} }
} }
body { body {
margin: 0; margin: 0;
font-family: var(--bs-body-font-family); font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size); font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight); font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height); line-height: var(--bs-body-line-height);
color: var(--bs-body-color); color: var(--bs-body-color);
text-align: var(--bs-body-text-align); text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg); background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
} }
hr { hr {
margin: 1rem 0; margin: 1rem 0;
color: inherit; color: inherit;
border: 0; border: 0;
border-top: var(--bs-border-width) solid; border-top: var(--bs-border-width) solid;
opacity: 0.25; opacity: 0.25;
} }
h6, h5, h4, h3, h2, h1 { h6, h5, h4, h3, h2, h1 {
margin-top: 0; margin-top: 0;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-weight: 500; font-weight: 500;
line-height: 1.2; line-height: 1.2;
color: var(--bs-heading-color); color: var(--bs-heading-color);
} }
h1 { h1 {
font-size: calc(1.375rem + 1.5vw); font-size: calc(1.375rem + 1.5vw);
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
h1 { h1 {
font-size: 2.5rem; font-size: 2.5rem;
} }
} }
h2 { h2 {
font-size: calc(1.325rem + 0.9vw); font-size: calc(1.325rem + 0.9vw);
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
h2 { h2 {
font-size: 2rem; font-size: 2rem;
} }
} }
h3 { h3 {
font-size: calc(1.3rem + 0.6vw); font-size: calc(1.3rem + 0.6vw);
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
h3 { h3 {
font-size: 1.75rem; font-size: 1.75rem;
} }
} }
h4 { h4 {
font-size: calc(1.275rem + 0.3vw); font-size: calc(1.275rem + 0.3vw);
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
h4 { h4 {
font-size: 1.5rem; font-size: 1.5rem;
} }
} }
h5 { h5 {
font-size: 1.25rem; font-size: 1.25rem;
} }
h6 { h6 {
font-size: 1rem; font-size: 1rem;
} }
p { p {
margin-top: 0; margin-top: 0;
margin-bottom: 1rem; margin-bottom: 1rem;
} }
abbr[title] { abbr[title] {
-webkit-text-decoration: underline dotted; -webkit-text-decoration: underline dotted;
text-decoration: underline dotted; text-decoration: underline dotted;
cursor: help; cursor: help;
-webkit-text-decoration-skip-ink: none; -webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none; text-decoration-skip-ink: none;
} }
address { address {
margin-bottom: 1rem; margin-bottom: 1rem;
font-style: normal; font-style: normal;
line-height: inherit; line-height: inherit;
} }
ol, ol,
ul { ul {
padding-right: 2rem; padding-right: 2rem;
} }
ol, ol,
ul, ul,
dl { dl {
margin-top: 0; margin-top: 0;
margin-bottom: 1rem; margin-bottom: 1rem;
} }
ol ol, ol ol,
ul ul, ul ul,
ol ul, ol ul,
ul ol { ul ol {
margin-bottom: 0; margin-bottom: 0;
} }
dt { dt {
font-weight: 700; font-weight: 700;
} }
dd { dd {
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
margin-right: 0; margin-right: 0;
} }
blockquote { blockquote {
margin: 0 0 1rem; margin: 0 0 1rem;
} }
b, b,
strong { strong {
font-weight: bolder; font-weight: bolder;
} }
small { small {
font-size: 0.875em; font-size: 0.875em;
} }
mark { mark {
padding: 0.1875em; padding: 0.1875em;
color: var(--bs-highlight-color); color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg); background-color: var(--bs-highlight-bg);
} }
sub, sub,
sup { sup {
position: relative; position: relative;
font-size: 0.75em; font-size: 0.75em;
line-height: 0; line-height: 0;
vertical-align: baseline; vertical-align: baseline;
} }
sub { sub {
bottom: -0.25em; bottom: -0.25em;
} }
sup { sup {
top: -0.5em; top: -0.5em;
} }
a { a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline; text-decoration: underline;
} }
a:hover { 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 { a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit; color: inherit;
text-decoration: none; text-decoration: none;
} }
pre, pre,
code, code,
kbd, kbd,
samp { samp {
font-family: var(--bs-font-monospace); font-family: var(--bs-font-monospace);
font-size: 1em; font-size: 1em;
} }
pre { pre {
display: block; display: block;
margin-top: 0; margin-top: 0;
margin-bottom: 1rem; margin-bottom: 1rem;
overflow: auto; overflow: auto;
font-size: 0.875em; font-size: 0.875em;
} }
pre code { pre code {
font-size: inherit; font-size: inherit;
color: inherit; color: inherit;
word-break: normal; word-break: normal;
} }
code { code {
font-size: 0.875em; font-size: 0.875em;
color: var(--bs-code-color); color: var(--bs-code-color);
word-wrap: break-word; word-wrap: break-word;
} }
a > code { a > code {
color: inherit; color: inherit;
} }
kbd { kbd {
padding: 0.1875rem 0.375rem; padding: 0.1875rem 0.375rem;
font-size: 0.875em; font-size: 0.875em;
color: var(--bs-body-bg); color: var(--bs-body-bg);
background-color: var(--bs-body-color); background-color: var(--bs-body-color);
border-radius: 0.25rem; border-radius: 0.25rem;
} }
kbd kbd { kbd kbd {
padding: 0; padding: 0;
font-size: 1em; font-size: 1em;
} }
figure { figure {
margin: 0 0 1rem; margin: 0 0 1rem;
} }
img, img,
svg { svg {
vertical-align: middle; vertical-align: middle;
} }
table { table {
caption-side: bottom; caption-side: bottom;
border-collapse: collapse; border-collapse: collapse;
} }
caption { caption {
padding-top: 0.5rem; padding-top: 0.5rem;
padding-bottom: 0.5rem; padding-bottom: 0.5rem;
color: var(--bs-secondary-color); color: var(--bs-secondary-color);
text-align: right; text-align: right;
} }
th { th {
text-align: inherit; text-align: inherit;
text-align: -webkit-match-parent; text-align: -webkit-match-parent;
} }
thead, thead,
@@ -434,21 +442,21 @@ tfoot,
tr, tr,
td, td,
th { th {
border-color: inherit; border-color: inherit;
border-style: solid; border-style: solid;
border-width: 0; border-width: 0;
} }
label { label {
display: inline-block; display: inline-block;
} }
button { button {
border-radius: 0; border-radius: 0;
} }
button:focus:not(:focus-visible) { button:focus:not(:focus-visible) {
outline: 0; outline: 0;
} }
input, input,
@@ -456,76 +464,80 @@ button,
select, select,
optgroup, optgroup,
textarea { textarea {
margin: 0; margin: 0;
font-family: inherit; font-family: inherit;
font-size: inherit; font-size: inherit;
line-height: inherit; line-height: inherit;
} }
button, button,
select { select {
text-transform: none; text-transform: none;
} }
[role=button] { [role=button] {
cursor: pointer; cursor: pointer;
} }
select { select {
word-wrap: normal; word-wrap: normal;
} }
select:disabled { 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 { [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, button,
[type=button], [type=button],
[type=reset], [type=reset],
[type=submit] { [type=submit] {
-webkit-appearance: button; -webkit-appearance: button;
} }
button:not(:disabled), button:not(:disabled),
[type=button]:not(:disabled), [type=button]:not(:disabled),
[type=reset]:not(:disabled), [type=reset]:not(:disabled),
[type=submit]:not(:disabled) { [type=submit]:not(:disabled) {
cursor: pointer; cursor: pointer;
} }
::-moz-focus-inner { ::-moz-focus-inner {
padding: 0; padding: 0;
border-style: none; border-style: none;
} }
textarea { textarea {
resize: vertical; resize: vertical;
} }
fieldset { fieldset {
min-width: 0; min-width: 0;
padding: 0; padding: 0;
margin: 0; margin: 0;
border: 0; border: 0;
} }
legend { legend {
float: right; float: right;
width: 100%; width: 100%;
padding: 0; padding: 0;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw); font-size: calc(1.275rem + 0.3vw);
line-height: inherit; line-height: inherit;
} }
@media (min-width: 1200px) { @media (min-width: 1200px) {
legend { legend {
font-size: 1.5rem; font-size: 1.5rem;
} }
} }
legend + * { legend + * {
clear: right; clear: right;
} }
::-webkit-datetime-edit-fields-wrapper, ::-webkit-datetime-edit-fields-wrapper,
@@ -535,60 +547,62 @@ legend + * {
::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field { ::-webkit-datetime-edit-year-field {
padding: 0; padding: 0;
} }
::-webkit-inner-spin-button { ::-webkit-inner-spin-button {
height: auto; height: auto;
} }
[type=search] { [type=search] {
-webkit-appearance: textfield; -webkit-appearance: textfield;
outline-offset: -2px; outline-offset: -2px;
} }
[type="tel"], [type="tel"],
[type="url"], [type="url"],
[type="email"], [type="email"],
[type="number"] { [type="number"] {
direction: ltr; direction: ltr;
} }
::-webkit-search-decoration { ::-webkit-search-decoration {
-webkit-appearance: none; -webkit-appearance: none;
} }
::-webkit-color-swatch-wrapper { ::-webkit-color-swatch-wrapper {
padding: 0; padding: 0;
} }
::-webkit-file-upload-button { ::-webkit-file-upload-button {
font: inherit; font: inherit;
-webkit-appearance: button; -webkit-appearance: button;
} }
::file-selector-button { ::file-selector-button {
font: inherit; font: inherit;
-webkit-appearance: button; -webkit-appearance: button;
} }
output { output {
display: inline-block; display: inline-block;
} }
iframe { iframe {
border: 0; border: 0;
} }
summary { summary {
display: list-item; display: list-item;
cursor: pointer; cursor: pointer;
} }
progress { progress {
vertical-align: baseline; vertical-align: baseline;
} }
[hidden] { [hidden] {
display: none !important; display: none !important;
} }
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */ /*# 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
+12 -10
View File
@@ -99,15 +99,17 @@
} }
}, },
{ {
"id": "eb09ddd2e6309f90", "id": "69eee9d5e6de1fd6",
"type": "leaf", "type": "leaf",
"state": { "state": {
"type": "image", "type": "markdown",
"state": { "state": {
"file": "Images/Map.png" "file": "Overview.md",
"mode": "source",
"source": false
}, },
"icon": "lucide-image", "icon": "lucide-file",
"title": "Map" "title": "Overview"
} }
} }
], ],
@@ -275,20 +277,22 @@
}, },
"active": "e8ba8e9287dfab25", "active": "e8ba8e9287dfab25",
"lastOpenFiles": [ "lastOpenFiles": [
"Tasks.base",
"Overview.md",
"Bases/_Gear.base",
"Bases/Regions.base", "Bases/Regions.base",
"Images/Map.png",
"Notes/White Sky.md",
"Tasks/Generate a csharp script to do what you did.md", "Tasks/Generate a csharp script to do what you did.md",
"Tasks/Generate a Markdown Website.md", "Tasks/Generate a Markdown Website.md",
"_Tasks.base",
"Tasks/Generate a map of regions and how they connect.md", "Tasks/Generate a map of regions and how they connect.md",
"Bases/_Roles.base", "Bases/_Roles.base",
"_Overview.md",
"Untitled 2.md", "Untitled 2.md",
"Tasks", "Tasks",
"Notes/Artificer.md", "Notes/Artificer.md",
"Bases/Terrain.base", "Bases/Terrain.base",
"Notes/Contents.md", "Notes/Contents.md",
"Notes/Dolewood Canoe.md", "Notes/Dolewood Canoe.md",
"Bases/_Gear.base",
"Notes/Concoliator.md", "Notes/Concoliator.md",
"Notes/Explorer.md", "Notes/Explorer.md",
"Notes/Guide.md", "Notes/Guide.md",
@@ -307,13 +311,11 @@
"Notes/Scout.md", "Notes/Scout.md",
"Images/Pasted image 20260609211711.png", "Images/Pasted image 20260609211711.png",
"Images/Market Deck.png", "Images/Market Deck.png",
"Images/Map.png",
"Images/Event Card Example.png", "Images/Event Card Example.png",
"Images/Event Card Example 2.png", "Images/Event Card Example 2.png",
"Images/Pasted image 20260609163414.png", "Images/Pasted image 20260609163414.png",
"Images", "Images",
"Notes/Research Station.md", "Notes/Research Station.md",
"Notes/White Sky.md",
"Notes/Wasteland.md", "Notes/Wasteland.md",
"Notes/Wasteland 1.md", "Notes/Wasteland 1.md",
"Notes/Mountain 5.md", "Notes/Mountain 5.md",
+1 -1
View File
@@ -3,5 +3,5 @@ category: Gear
Cost: 4 Cost: 4
Gear Category: Tool Gear Category: Tool
Effect: "Boat. Travel: You need 1 less Progress to place trail markers in water regions." Effect: "Boat. Travel: You need 1 less Progress to place trail markers in water regions."
Location: White Sky Location: "[[White Sky]]"
--- ---
+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]]