Initial Commit

This commit is contained in:
2026-06-17 12:59:31 -04:00
commit 3ec2f67103
95 changed files with 66244 additions and 0 deletions
+18
View File
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Model\Model.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Markdig" Version="0.40.0" />
</ItemGroup>
</Project>
+110
View File
@@ -0,0 +1,110 @@
using System.Text;
using Markdig;
using Model;
var docsDir = Path.GetFullPath(args.Length > 0 ? args[0] : Path.Combine("..", "..", "gsr.docs"));
var outputDir = Path.GetFullPath(args.Length > 1 ? args[1] : Path.Combine("..", "Model"));
var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();
var games = new List<GameDoc>();
string? overviewHtml = null;
foreach (var file in Directory.EnumerateFiles(docsDir, "*.md"))
{
var text = File.ReadAllText(file);
var title = Path.GetFileNameWithoutExtension(file);
string body;
var category = string.Empty;
string? link = null;
string? git = null;
if (text.StartsWith("---"))
{
var endIdx = text.IndexOf("---", 3, StringComparison.Ordinal);
if (endIdx > 0)
{
var yaml = text[3..endIdx].Trim();
body = text[(endIdx + 3)..].Trim();
foreach (var line in yaml.Split('\n', StringSplitOptions.RemoveEmptyEntries))
{
var colonIdx = line.IndexOf(':');
if (colonIdx < 0) continue;
var key = line[..colonIdx].Trim();
var val = line[(colonIdx + 1)..].Trim();
if (val.Length == 0) continue;
switch (key)
{
case "category": category = val; break;
case "link": link = val; break;
case "git": git = val; break;
}
}
}
else
{
body = text;
}
}
else
{
body = text;
}
var html = Markdown.ToHtml(body, pipeline);
if (title == "Overview")
{
overviewHtml = html;
}
else
{
games.Add(new GameDoc
{
Title = title,
Category = category,
Link = link,
Git = git,
ContentHtml = html
});
}
}
static string VStr(string? s) =>
s is null ? "null" : "@\"" + s.Replace("\"", "\"\"") + "\"";
var sb = new StringBuilder();
sb.AppendLine("// <auto-generated/>");
sb.AppendLine("#nullable enable");
sb.AppendLine("namespace Model;");
sb.AppendLine();
sb.AppendLine("public static class GeneratedData");
sb.AppendLine("{");
sb.AppendLine($" public static string? OverviewHtml => {VStr(overviewHtml)};");
sb.AppendLine();
sb.AppendLine(" public static List<GameDoc> Games => new()");
sb.AppendLine(" {");
foreach (var g in games)
{
sb.AppendLine(" new GameDoc");
sb.AppendLine(" {");
sb.AppendLine($" Title = {VStr(g.Title)},");
sb.AppendLine($" Category = {VStr(g.Category)},");
sb.AppendLine($" Link = {VStr(g.Link)},");
sb.AppendLine($" Git = {VStr(g.Git)},");
sb.AppendLine($" ContentHtml = {VStr(g.ContentHtml)}");
sb.AppendLine(" },");
}
sb.AppendLine(" };");
sb.AppendLine("}");
File.WriteAllText(Path.Combine(outputDir, "GeneratedData.cs"), sb.ToString());
Console.WriteLine($"Generated GeneratedData.cs: {games.Count} games, overview: {overviewHtml != null}");
+10
View File
@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
+32
View File
@@ -0,0 +1,32 @@
using System.Diagnostics;
var deployDir = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", ".."));
var webDir = Path.GetFullPath(Path.Combine(deployDir, "..", "Web"));
var webProject = Path.Combine(webDir, "Web.csproj");
var publishDir = Path.Combine(Path.GetTempPath(), "gsr-deploy", Guid.NewGuid().ToString());
var deploymentToken = Environment.GetEnvironmentVariable("GSR_DeployToken") ?? throw new InvalidOperationException("GSR_DeployToken environment variable not set.");
// 1. Publish
Console.WriteLine("Publishing Web project...");
Run("dotnet", $"publish \"{webProject}\" -c Release -o \"{publishDir}\"");
var wwwroot = Path.Combine(publishDir, "wwwroot");
if (!Directory.Exists(wwwroot))
{
Console.Error.WriteLine("wwwroot not found in publish output.");
return 1;
}
// 2. Deploy
Console.WriteLine("Deploying to Azure Static Web Apps...");
Run("swa.cmd", $"deploy \"{wwwroot}\" --deployment-token \"{deploymentToken}\" --app-location \"{webDir}\"");
Console.WriteLine("Deploy successful!");
return 0;
static void Run(string fileName, string arguments)
{
var process = Process.Start(new ProcessStartInfo(fileName, arguments) { UseShellExecute = false })!;
process.WaitForExit();
if (process.ExitCode != 0) { Environment.Exit(process.ExitCode); }
}
+34
View File
@@ -0,0 +1,34 @@
Microsoft Visual Studio Solution File, Format Version 12.00
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Web", "Web\Web.csproj", "{27D1ADFE-1168-410E-825D-9433C4EF6FF3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Build", "Build\Build.csproj", "{C7F0C017-1E94-4FBC-9DAE-B600DAF9B239}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Model", "Model\Model.csproj", "{266A239E-171E-4F0B-93B0-9907FE3D429F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Deploy", "Deploy\Deploy.csproj", "{D83CBFDE-A551-42FB-9AF0-CAE1BD8E81F0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{27D1ADFE-1168-410E-825D-9433C4EF6FF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{27D1ADFE-1168-410E-825D-9433C4EF6FF3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{27D1ADFE-1168-410E-825D-9433C4EF6FF3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27D1ADFE-1168-410E-825D-9433C4EF6FF3}.Release|Any CPU.Build.0 = Release|Any CPU
{C7F0C017-1E94-4FBC-9DAE-B600DAF9B239}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C7F0C017-1E94-4FBC-9DAE-B600DAF9B239}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C7F0C017-1E94-4FBC-9DAE-B600DAF9B239}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C7F0C017-1E94-4FBC-9DAE-B600DAF9B239}.Release|Any CPU.Build.0 = Release|Any CPU
{266A239E-171E-4F0B-93B0-9907FE3D429F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{266A239E-171E-4F0B-93B0-9907FE3D429F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{266A239E-171E-4F0B-93B0-9907FE3D429F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{266A239E-171E-4F0B-93B0-9907FE3D429F}.Release|Any CPU.Build.0 = Release|Any CPU
{D83CBFDE-A551-42FB-9AF0-CAE1BD8E81F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D83CBFDE-A551-42FB-9AF0-CAE1BD8E81F0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D83CBFDE-A551-42FB-9AF0-CAE1BD8E81F0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D83CBFDE-A551-42FB-9AF0-CAE1BD8E81F0}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
+10
View File
@@ -0,0 +1,10 @@
namespace Model;
public class GameDoc
{
public string Title { get; set; } = string.Empty;
public string Category { get; set; } = string.Empty;
public string? Link { get; set; }
public string? Git { get; set; }
public string ContentHtml { get; set; } = string.Empty;
}
+72
View File
@@ -0,0 +1,72 @@
// <auto-generated/>
#nullable enable
namespace Model;
public static class GeneratedData
{
public static string? OverviewHtml => @"<p>The reason of these tools come back to playing Star Craft 2, and not feeling like I get why I win or lose. Was my unit comp bad? Was I too greedy? Should I make defenses? Should I harass? Was my build order efficent? This is true of many games, where some elements can be a bit vague, like damage scaling or the like. So the purpose of this website is to host my own tooling, references, opinions, and learnings on the hobbies I partake it, to better understand and improve on gameplay.</p>
<p>The website is called Game Slop Reference, to make the scope clear. These are game reference materials, and the slop refers to two things. One, the obviousness of AI generation in the development of these tools, are more commonly referred to in 2026 as AI slop. But also the indication of quality one can expect from these websites, given the lack of plans to monetize, and my desire to quickly develop with low quality control, and to make tools for my own purposes then would perhaps be most beneficial to the general public.</p>
<p>Perhaps in the future, you can catch me on Twitch working on this slop: <a href=""https://www.twitch.tv/jonathanmccaffrey"">JonathanMcCaffrey - Twitch</a>.</p>
";
public static List<GameDoc> Games => new()
{
new GameDoc
{
Title = @"Ashes Reborn",
Category = @"Game",
Link = null,
Git = null,
ContentHtml = @"<p>My plans are to make a rules reference, so I can easily search for rules of the game. Also obvious card gallery and ability to take notes on each card and chimera.</p>
"
},
new GameDoc
{
Title = @"Chrono CCG",
Category = @"Game",
Link = null,
Git = @"https://git.jonathanmccaffrey.ca/JonathanMcCaffrey/ChronoCCG",
ContentHtml = @"<p>Simple card gallery. For future plans, being able to create my own decks would be clear feature addition. But more importantly for my usages, being able to write notes on each card and favourite them. I'll be saving these notes on PostgreSQL and storing them on a local machine, so I can reference the cards and save notes from anywhere.</p>
"
},
new GameDoc
{
Title = @"Earthborne Trailblazers",
Category = @"Game",
Link = @"https://et.gameslopreference.ca/",
Git = @"https://git.jonathanmccaffrey.ca/JonathanMcCaffrey/EarthborneTrailerblazer",
ContentHtml = @"<p>Basic rule reference, card reference, and simulator of game states to understand meeple spread over time.</p>
"
},
new GameDoc
{
Title = @"IMMORTAL Gates of Pyre",
Category = @"Game",
Link = null,
Git = null,
ContentHtml = @"<p><a href=""https://igpfanreference.ca/"">IGP Fan Reference</a> was made before the AI agents, however I plan on using agents to update the site and add new features.</p>
<p>Such as adding tech trees, glossaries, and new UI. Generated code needs more work to prevent problems, such as hallucinated game terms, or styling issues.</p>
<p>However, simple things like playwright tests and minor UI feedback for improved UX experience has been added to the Build Calculator.</p>
"
},
new GameDoc
{
Title = @"Path of Exile 2",
Category = @"Game",
Link = null,
Git = null,
ContentHtml = @"<p>I have collected many notes on Path of Exile 2, and wrote utility tools, like generating hideout ground and new character names. So my plan would be to remake these tools in a unified location, and I would want to add new basic tools that sample my characters damage and defenses, and inform me when they are too low or too high for the content I am doing.</p>
"
},
new GameDoc
{
Title = @"ZeroSpace",
Category = @"Game",
Link = null,
Git = null,
ContentHtml = @"<p>Not much work has been done in this area. Mostly note taking and playing the game to get a good understanding of the game and features I would want to implement.</p>
<p>One obvious feature is a unit reference, knowing the amount of production buildings I should have based on my income to maximize production, and build calculators and such.</p>
"
},
};
}
+14
View File
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<Compile Remove="GeneratedData.cs" />
<Compile Include="GeneratedData.cs" Condition="Exists('GeneratedData.cs')" />
</ItemGroup>
</Project>
+6
View File
@@ -0,0 +1,6 @@
<Router AppAssembly="@typeof(App).Assembly" NotFoundPage="typeof(Pages.NotFound)">
<Found Context="routeData">
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)"/>
<FocusOnNavigate RouteData="@routeData" Selector="h1"/>
</Found>
</Router>
+13
View File
@@ -0,0 +1,13 @@
@inherits LayoutComponentBase
<div class="layout">
<aside class="sidebar">
<NavMenu />
</aside>
<div class="main-area">
<main>
<article class="content">
@Body
</article>
</main>
</div>
</div>
+43
View File
@@ -0,0 +1,43 @@
.layout {
display: flex;
min-height: 100vh;
}
.sidebar {
width: 240px;
flex-shrink: 0;
background: var(--bg-secondary);
border-right: 1px solid var(--border);
position: sticky;
top: 0;
height: 100vh;
overflow-y: auto;
}
.main-area {
flex: 1;
min-width: 0;
}
.content {
padding: 2rem;
max-width: 960px;
}
@media (max-width: 768px) {
.layout {
flex-direction: column;
}
.sidebar {
width: 100%;
height: auto;
position: static;
border-right: none;
border-bottom: 1px solid var(--border);
}
.content {
padding: 1.25rem;
}
}
+16
View File
@@ -0,0 +1,16 @@
<div class="nav-header">
<a class="nav-brand" href="">
<span class="brand-icon">&#9670;</span>
<span class="brand-text">Game Slop Reference</span>
</a>
</div>
<nav class="nav-links">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
Home
</NavLink>
<NavLink class="nav-link" href="games">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="6" x2="6" y2="18"/><line x1="10" y1="6" x2="10" y2="18"/><path d="M14 6h4a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2h-4"/></svg>
Games
</NavLink>
</nav>
+78
View File
@@ -0,0 +1,78 @@
.nav-header {
padding: 1.25rem 1rem;
border-bottom: 1px solid var(--border);
}
.nav-brand {
display: flex;
align-items: center;
gap: 0.6rem;
text-decoration: none;
color: var(--text);
}
.brand-icon {
font-size: 1.3rem;
color: var(--accent);
}
.brand-text {
font-size: 0.95rem;
font-weight: 600;
}
.nav-links {
padding: 0.75rem 0.5rem;
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.nav-link {
display: flex;
align-items: center;
gap: 0.6rem;
padding: 0.6rem 0.75rem;
border-radius: 6px;
color: var(--text-muted);
text-decoration: none;
font-size: 0.9rem;
font-weight: 500;
transition: background 0.15s, color 0.15s;
}
.nav-link:hover {
background: var(--bg-hover);
color: var(--text);
}
.nav-link.active {
background: rgba(0, 212, 255, 0.08);
color: var(--accent);
}
.nav-icon {
width: 1.1rem;
height: 1.1rem;
flex-shrink: 0;
}
@media (max-width: 768px) {
.nav-header {
padding: 0.75rem 1rem;
}
.nav-links {
flex-direction: row;
padding: 0.5rem;
gap: 0.25rem;
}
.nav-link {
flex: 1;
justify-content: center;
padding: 0.5rem;
font-size: 0.8rem;
}
.brand-text {
font-size: 0.85rem;
}
}
+55
View File
@@ -0,0 +1,55 @@
@page "/games"
@inject GameService Service
<PageTitle>Games</PageTitle>
<h1>Games</h1>
<div class="game-cards">
@foreach (var game in Service.Games)
{
<div class="game-card" @onclick="() => ShowDetail(game)">
<h3>@game.Title</h3>
@if (!string.IsNullOrEmpty(game.Link) || !string.IsNullOrEmpty(game.Git))
{
<div class="links">
@if (!string.IsNullOrEmpty(game.Link))
{
<a href="@game.Link" target="_blank" @onclick:stopPropagation>
<span class="label">link</span> @game.Link
</a>
}
@if (!string.IsNullOrEmpty(game.Git))
{
<a href="@game.Git" target="_blank" @onclick:stopPropagation>
<span class="label">git</span> @game.Git
</a>
}
</div>
}
</div>
}
</div>
@if (_selected is not null)
{
<div class="dialog-overlay" @onclick="CloseDetail">
<div class="dialog" @onclick:stopPropagation>
<div class="dialog-header">
<h2>@_selected.Title</h2>
<button class="dialog-close" @onclick="CloseDetail">&times;</button>
</div>
<div class="dialog-body">
@((MarkupString)_selected.ContentHtml)
</div>
</div>
</div>
}
@code {
private GameDoc? _selected;
private void ShowDetail(GameDoc game) => _selected = game;
private void CloseDetail() => _selected = null;
}
+11
View File
@@ -0,0 +1,11 @@
@page "/"
@inject GameService Service
<PageTitle>Game Slop Reference</PageTitle>
<h1>Game Slop Reference</h1>
@if (Service.OverviewHtml is { } html)
{
<div class="overview-content">@((MarkupString)html)</div>
}
+11
View File
@@ -0,0 +1,11 @@
@page "/not-found"
@layout MainLayout
<div class="not-found">
<h1>404</h1>
<p>Sorry, the page you're looking for doesn't exist.</p>
<a href="">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg>
Back to Home
</a>
</div>
+12
View File
@@ -0,0 +1,12 @@
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using Web;
using Web.Services;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");
builder.Services.AddScoped<GameService>();
await builder.Build().RunAsync();
+25
View File
@@ -0,0 +1,25 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "http://localhost:5221",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "https://localhost:7220;http://localhost:5221",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
+9
View File
@@ -0,0 +1,9 @@
using Model;
namespace Web.Services;
public class GameService
{
public string? OverviewHtml => GeneratedData.OverviewHtml;
public List<GameDoc> Games => GeneratedData.Games;
}
+24
View File
@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<OverrideHtmlAssetPlaceholders>true</OverrideHtmlAssetPlaceholders>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.9"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="10.0.9" PrivateAssets="all"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Model\Model.csproj" />
</ItemGroup>
<Target Name="GenerateGameData" BeforeTargets="BeforeBuild">
<Exec Command="dotnet run --project &quot;$(MSBuildThisFileDirectory)..\Build\Build.csproj&quot; -- &quot;$(MSBuildThisFileDirectory)..\..\gsr.docs&quot; &quot;$(MSBuildThisFileDirectory)..\Model&quot;" />
<Exec Command="dotnet build &quot;$(MSBuildThisFileDirectory)..\Model\Model.csproj&quot;" />
</Target>
</Project>
+12
View File
@@ -0,0 +1,12 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using Web
@using Web.Layout
@using Web.Services
@using Model
+357
View File
@@ -0,0 +1,357 @@
:root {
--bg-primary: #0a0a14;
--bg-secondary: #12121e;
--bg-surface: #1a1a2e;
--bg-hover: #22223a;
--accent: #00d4ff;
--accent-dim: #0088aa;
--purple: #7c3aed;
--text: #e0e0e0;
--text-muted: #8a8aa0;
--border: #2a2a3e;
--radius: 10px;
}
*, *::before, *::after {
box-sizing: border-box;
}
html, body {
font-family: 'Inter', 'Helvetica Neue', Arial, sans-serif;
background: var(--bg-primary);
color: var(--text);
margin: 0;
min-height: 100vh;
line-height: 1.6;
-webkit-font-smoothing: antialiased;
}
h1:focus { outline: none; }
a { color: var(--accent); text-decoration: none; transition: color 0.2s; }
a:hover { color: #66e5ff; }
h1 {
font-size: 1.75rem;
font-weight: 700;
margin: 0 0 1rem;
background: linear-gradient(135deg, var(--accent), var(--purple));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
h2 {
font-size: 1.25rem;
font-weight: 600;
margin: 0 0 0.75rem;
color: var(--text);
}
h3 {
font-size: 1.1rem;
font-weight: 600;
margin: 0 0 0.5rem;
}
#blazor-error-ui {
color-scheme: light only;
background: #3a1a1a;
color: #ff6b6b;
bottom: 0;
box-shadow: 0 -1px 2px rgba(0,0,0,0.2);
box-sizing: border-box;
display: none;
left: 0;
padding: 0.6rem 1.25rem 0.7rem;
position: fixed;
width: 100%;
z-index: 1000;
font-size: 0.875rem;
}
#blazor-error-ui .dismiss {
cursor: pointer;
position: absolute;
right: 0.75rem;
top: 0.5rem;
color: #ff6b6b;
}
.blazor-error-boundary {
background: #3a1a1a;
padding: 1rem 1rem 1rem 3.7rem;
color: #ff6b6b;
border-radius: var(--radius);
border: 1px solid #5a2a2a;
}
.blazor-error-boundary::after { content: "An error has occurred."; }
.loading-progress {
position: absolute;
display: block;
width: 5rem;
height: 5rem;
inset: 30vh 0 auto 0;
margin: 0 auto;
}
.loading-progress circle {
fill: none;
stroke: #2a2a3e;
stroke-width: 6;
transform-origin: 50% 50%;
transform: rotate(-90deg);
}
.loading-progress circle:last-child {
stroke: var(--accent);
stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
transition: stroke-dasharray 0.05s ease-in-out;
filter: drop-shadow(0 0 4px var(--accent-dim));
}
.loading-progress-text {
position: absolute;
text-align: center;
font-weight: 500;
font-size: 0.875rem;
color: var(--text-muted);
inset: calc(30vh + 5.5rem) 0 auto 0.2rem;
}
.loading-progress-text:after {
content: var(--blazor-load-percentage-text, "Loading");
}
code { color: var(--accent); font-size: 0.875em; }
.overview-content p {
margin: 0 0 1rem;
line-height: 1.7;
color: #c0c0d0;
}
.overview-content a {
color: var(--accent);
border-bottom: 1px solid transparent;
transition: border-color 0.2s;
}
.overview-content a:hover {
border-bottom-color: var(--accent);
}
.game-cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1rem;
margin-top: 1.5rem;
}
.game-card {
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 1.25rem;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
position: relative;
overflow: hidden;
}
.game-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(90deg, var(--accent), var(--purple));
opacity: 0;
transition: opacity 0.2s;
}
.game-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 20px rgba(0, 212, 255, 0.1);
border-color: var(--accent-dim);
}
.game-card:hover::before {
opacity: 1;
}
.game-card h3 {
color: var(--text);
margin: 0 0 0.75rem;
font-size: 1.1rem;
}
.game-card .links {
display: flex;
flex-direction: column;
gap: 0.35rem;
}
.game-card .links a {
font-size: 0.85rem;
color: var(--text-muted);
display: inline-flex;
align-items: center;
gap: 0.35rem;
word-break: break-all;
transition: color 0.2s;
}
.game-card .links a:hover {
color: var(--accent);
}
.game-card .links a .label {
color: var(--text-muted);
font-weight: 500;
min-width: 2rem;
}
.dialog-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(4px);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
animation: fadeIn 0.15s ease-out;
}
.dialog {
background: var(--bg-secondary);
border: 1px solid var(--border);
border-radius: 12px;
padding: 1.5rem;
max-width: 640px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
animation: slideUp 0.2s ease-out;
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.4);
}
.dialog-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: 1rem;
gap: 1rem;
}
.dialog-header h2 {
margin: 0;
background: linear-gradient(135deg, var(--accent), var(--purple));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
font-size: 1.35rem;
}
.dialog-close {
background: none;
border: 1px solid var(--border);
color: var(--text-muted);
font-size: 1.25rem;
cursor: pointer;
width: 2rem;
height: 2rem;
border-radius: 6px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: background 0.2s, color 0.2s, border-color 0.2s;
}
.dialog-close:hover {
background: var(--bg-hover);
color: var(--text);
border-color: var(--accent-dim);
}
.dialog-body {
color: #c0c0d0;
line-height: 1.7;
}
.dialog-body p {
margin: 0 0 1rem;
}
.dialog-body a {
color: var(--accent);
border-bottom: 1px solid transparent;
transition: border-color 0.2s;
}
.dialog-body a:hover {
border-bottom-color: var(--accent);
}
.not-found {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 50vh;
text-align: center;
}
.not-found h1 {
font-size: 4rem;
margin-bottom: 0.5rem;
background: linear-gradient(135deg, var(--accent), var(--purple));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.not-found p {
color: var(--text-muted);
margin-bottom: 1.5rem;
}
.not-found a {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.6rem 1.25rem;
background: var(--bg-surface);
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--text);
font-weight: 500;
transition: border-color 0.2s, background 0.2s;
}
.not-found a:hover {
border-color: var(--accent-dim);
background: var(--bg-hover);
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes slideUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: var(--bg-primary);
}
::-webkit-scrollbar-thumb {
background: var(--border);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #3a3a4e;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

+36
View File
@@ -0,0 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Game Slop Reference</title>
<base href="/" />
<link rel="preload" id="webassembly" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/app.css" />
<link rel="icon" type="image/png" href="favicon.png" />
<link href="Web.styles.css" rel="stylesheet" />
<script type="importmap"></script>
</head>
<body>
<div id="app">
<svg class="loading-progress" viewBox="0 0 100 100">
<circle r="40%" cx="50%" cy="50%" />
<circle r="40%" cx="50%" cy="50%" />
</svg>
<div class="loading-progress-text"></div>
</div>
<div id="blazor-error-ui">
An unhandled error has occurred.
<a href="." class="reload">Reload</a>
<span class="dismiss">&times;</span>
</div>
<script src="_framework/blazor.webassembly#[.{fingerprint}].js"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,597 @@
/*!
* Bootstrap Reboot v5.3.3 (https://getbootstrap.com/)
* Copyright 2011-2024 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-left: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
}
a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: var(--bs-font-monospace);
font-size: 1em;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: left;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: left;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
::file-selector-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,594 @@
/*!
* Bootstrap Reboot v5.3.3 (https://getbootstrap.com/)
* Copyright 2011-2024 The Bootstrap Authors
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*/
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: var(--bs-body-font-family);
font-size: var(--bs-body-font-size);
font-weight: var(--bs-body-font-weight);
line-height: var(--bs-body-line-height);
color: var(--bs-body-color);
text-align: var(--bs-body-text-align);
background-color: var(--bs-body-bg);
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-right: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-right: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: underline;
}
a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: var(--bs-font-monospace);
font-size: 1em;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: var(--bs-secondary-color);
text-align: right;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: right;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: right;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
-webkit-appearance: textfield;
outline-offset: -2px;
}
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
::file-selector-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+27
View File
@@ -0,0 +1,27 @@
[
{
"date": "2022-01-06",
"temperatureC": 1,
"summary": "Freezing"
},
{
"date": "2022-01-07",
"temperatureC": 14,
"summary": "Bracing"
},
{
"date": "2022-01-08",
"temperatureC": -13,
"summary": "Freezing"
},
{
"date": "2022-01-09",
"temperatureC": -16,
"summary": "Balmy"
},
{
"date": "2022-01-10",
"temperatureC": -2,
"summary": "Chilly"
}
]