Code cleanup

This commit is contained in:
2026-05-27 10:51:19 -04:00
parent 5e486b0edb
commit 2423d232cf
48 changed files with 53731 additions and 46250 deletions
+11 -11
View File
@@ -1,16 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly"> <Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net10.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile> <NoDefaultLaunchSettingsFile>true</NoDefaultLaunchSettingsFile>
<StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode> <StaticWebAssetProjectMode>Default</StaticWebAssetProjectMode>
<BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException> <BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.8" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="10.0.8"/>
</ItemGroup> </ItemGroup>
</Project> </Project>
+2 -1
View File
@@ -10,10 +10,11 @@
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button> <button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code { @code {
private int currentCount = 0; private int currentCount;
private void IncrementCount() private void IncrementCount()
{ {
currentCount++; currentCount++;
} }
} }
+1 -1
View File
@@ -2,4 +2,4 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
var builder = WebAssemblyHostBuilder.CreateDefault(args); var builder = WebAssemblyHostBuilder.CreateDefault(args);
await builder.Build().RunAsync(); await builder.Build().RunAsync();
+13 -13
View File
@@ -1,18 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net10.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Selenium.WebDriver" Version="4.44.0" /> <PackageReference Include="Selenium.WebDriver" Version="4.44.0"/>
<PackageReference Include="Selenium.Support" Version="4.44.0" /> <PackageReference Include="Selenium.Support" Version="4.44.0"/>
<PackageReference Include="NUnit" Version="4.6.1" /> <PackageReference Include="NUnit" Version="4.6.1"/>
<PackageReference Include="NUnit3TestAdapter" Version="6.2.0" /> <PackageReference Include="NUnit3TestAdapter" Version="6.2.0"/>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.5.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.5.1"/>
</ItemGroup> </ItemGroup>
</Project> </Project>
+3 -5
View File
@@ -1,4 +1,3 @@
using System;
using OpenQA.Selenium; using OpenQA.Selenium;
using OpenQA.Selenium.Chrome; using OpenQA.Selenium.Chrome;
@@ -10,10 +9,9 @@ public static class DriverFactory
{ {
var options = new ChromeOptions(); var options = new ChromeOptions();
var headless = Environment.GetEnvironmentVariable("HEADLESS"); var headless = Environment.GetEnvironmentVariable("HEADLESS");
if (!string.IsNullOrEmpty(headless) && (headless == "1" || headless.Equals("true", StringComparison.OrdinalIgnoreCase))) if (!string.IsNullOrEmpty(headless) &&
{ (headless == "1" || headless.Equals("true", StringComparison.OrdinalIgnoreCase)))
options.AddArgument("--headless=new"); options.AddArgument("--headless=new");
}
options.AddArgument("--disable-gpu"); options.AddArgument("--disable-gpu");
options.AddArgument("--no-sandbox"); options.AddArgument("--no-sandbox");
@@ -24,4 +22,4 @@ public static class DriverFactory
return new ChromeDriver(service, options); return new ChromeDriver(service, options);
} }
} }
+7 -3
View File
@@ -5,11 +5,15 @@ namespace AOW4.SeleniumTests.Pages;
public class CounterPage public class CounterPage
{ {
private readonly IWebDriver _driver; private readonly IWebDriver _driver;
public CounterPage(IWebDriver driver) => _driver = driver;
public CounterPage(IWebDriver driver)
{
_driver = driver;
}
public bool IsAt() public bool IsAt()
{ {
var url = _driver.Url ?? string.Empty; var url = _driver.Url ?? string.Empty;
return url.Contains("counter", System.StringComparison.OrdinalIgnoreCase) || _driver.PageSource.Contains("Counter"); return url.Contains("counter", StringComparison.OrdinalIgnoreCase) || _driver.PageSource.Contains("Counter");
} }
} }
+8 -3
View File
@@ -5,11 +5,16 @@ namespace AOW4.SeleniumTests.Pages;
public class HomePage public class HomePage
{ {
private readonly IWebDriver _driver; private readonly IWebDriver _driver;
public HomePage(IWebDriver driver) => _driver = driver;
public HomePage(IWebDriver driver)
{
_driver = driver;
}
public bool IsAt() public bool IsAt()
{ {
var url = _driver.Url ?? string.Empty; var url = _driver.Url ?? string.Empty;
return url.EndsWith("/") || url.Contains("/index", System.StringComparison.OrdinalIgnoreCase) || _driver.PageSource.Contains("Home"); return url.EndsWith("/") || url.Contains("/index", StringComparison.OrdinalIgnoreCase) ||
_driver.PageSource.Contains("Home");
} }
} }
+5 -7
View File
@@ -1,4 +1,3 @@
using System.Linq;
using OpenQA.Selenium; using OpenQA.Selenium;
namespace AOW4.SeleniumTests.Pages; namespace AOW4.SeleniumTests.Pages;
@@ -15,13 +14,12 @@ public class NavMenuPage
public void ClickLinkByText(string linkText) public void ClickLinkByText(string linkText)
{ {
var link = _driver.FindElements(By.CssSelector("a[href]")) var link = _driver.FindElements(By.CssSelector("a[href]"))
.FirstOrDefault(e => !string.IsNullOrWhiteSpace(e.Text) && e.Text.Trim().Equals(linkText, System.StringComparison.OrdinalIgnoreCase)); .FirstOrDefault(e =>
!string.IsNullOrWhiteSpace(e.Text) &&
e.Text.Trim().Equals(linkText, StringComparison.OrdinalIgnoreCase));
if (link == null) if (link == null) throw new NoSuchElementException($"Link with text '{linkText}' not found in the page.");
{
throw new NoSuchElementException($"Link with text '{linkText}' not found in the page.");
}
link.Click(); link.Click();
} }
} }
-15
View File
@@ -1,15 +0,0 @@
using OpenQA.Selenium;
namespace AOW4.SeleniumTests.Pages;
public class WeatherPage
{
private readonly IWebDriver _driver;
public WeatherPage(IWebDriver driver) => _driver = driver;
public bool IsAt()
{
var url = _driver.Url ?? string.Empty;
return url.Contains("weather", System.StringComparison.OrdinalIgnoreCase) || _driver.PageSource.Contains("Weather");
}
}
+2
View File
@@ -1,6 +1,7 @@
# AOW4 Selenium Tests # AOW4 Selenium Tests
Requirements: Requirements:
- .NET 10 SDK - .NET 10 SDK
- Google Chrome installed (compatible with ChromeDriver package) - Google Chrome installed (compatible with ChromeDriver package)
- The AOW4 web app running locally (by default at `http://localhost:5000`) or set `BASE_URL` env var. - The AOW4 web app running locally (by default at `http://localhost:5000`) or set `BASE_URL` env var.
@@ -16,5 +17,6 @@ dotnet test AOW4.SeleniumTests\AOW4.SeleniumTests.csproj
``` ```
Notes: Notes:
- Navigation tests use the UI nav links — ensure the app is running before executing tests. - Navigation tests use the UI nav links — ensure the app is running before executing tests.
- Broken links scanner sends HTTP HEAD requests and falls back to GET if needed. - Broken links scanner sends HTTP HEAD requests and falls back to GET if needed.
+5 -5
View File
@@ -1,15 +1,12 @@
using AOW4.SeleniumTests.Driver;
using NUnit.Framework; using NUnit.Framework;
using OpenQA.Selenium; using OpenQA.Selenium;
using AOW4.SeleniumTests.Driver;
namespace AOW4.SeleniumTests.Tests; namespace AOW4.SeleniumTests.Tests;
[TestFixture] [TestFixture]
public abstract class BaseTest public abstract class BaseTest
{ {
protected IWebDriver Driver = null!;
protected string BaseUrl => "http://localhost:5212/";
[OneTimeSetUp] [OneTimeSetUp]
public void GlobalSetup() public void GlobalSetup()
{ {
@@ -29,8 +26,11 @@ public abstract class BaseTest
} }
} }
protected IWebDriver Driver = null!;
protected string BaseUrl => "http://localhost:5212/";
protected void GoHome() protected void GoHome()
{ {
Driver.Navigate().GoToUrl(BaseUrl); Driver.Navigate().GoToUrl(BaseUrl);
} }
} }
+9 -21
View File
@@ -1,7 +1,4 @@
using NUnit.Framework; using NUnit.Framework;
using System.Net.Http;
using System.Collections.Generic;
using System.Linq;
using OpenQA.Selenium; using OpenQA.Selenium;
namespace AOW4.SeleniumTests.Tests; namespace AOW4.SeleniumTests.Tests;
@@ -25,19 +22,16 @@ public class BrokenLinksTest : BaseTest
foreach (var raw in anchors) foreach (var raw in anchors)
{ {
if (raw.StartsWith("javascript:", System.StringComparison.OrdinalIgnoreCase)) if (raw.StartsWith("javascript:", StringComparison.OrdinalIgnoreCase))
continue; continue;
if (raw.StartsWith("mailto:", System.StringComparison.OrdinalIgnoreCase)) if (raw.StartsWith("mailto:", StringComparison.OrdinalIgnoreCase))
continue; continue;
System.Uri uri; Uri uri;
try try
{ {
uri = new System.Uri(raw, System.UriKind.RelativeOrAbsolute); uri = new Uri(raw, UriKind.RelativeOrAbsolute);
if (!uri.IsAbsoluteUri) if (!uri.IsAbsoluteUri) uri = new Uri(new Uri(BaseUrl), raw);
{
uri = new System.Uri(new System.Uri(BaseUrl), raw);
}
} }
catch catch
{ {
@@ -54,21 +48,15 @@ public class BrokenLinksTest : BaseTest
// try GET as fallback // try GET as fallback
using var greq = new HttpRequestMessage(HttpMethod.Get, uri); using var greq = new HttpRequestMessage(HttpMethod.Get, uri);
var gresp = client.Send(greq); var gresp = client.Send(greq);
if (!gresp.IsSuccessStatusCode) if (!gresp.IsSuccessStatusCode) failures.Add($"{(int)gresp.StatusCode} {uri}");
{
failures.Add($"{(int)gresp.StatusCode} {uri}");
}
} }
} }
catch (System.Exception ex) catch (Exception ex)
{ {
failures.Add($"Error checking {uri}: {ex.Message}"); failures.Add($"Error checking {uri}: {ex.Message}");
} }
} }
if (failures.Any()) if (failures.Any()) Assert.Fail("Broken links found:\n" + string.Join("\n", failures));
{
Assert.Fail("Broken links found:\n" + string.Join("\n", failures));
}
} }
} }
+4 -3
View File
@@ -1,5 +1,4 @@
using NUnit.Framework; using NUnit.Framework;
using AOW4.SeleniumTests.Pages;
namespace AOW4.SeleniumTests.Tests; namespace AOW4.SeleniumTests.Tests;
@@ -11,7 +10,9 @@ public class NavigationTests : BaseTest
{ {
GoHome(); GoHome();
Assert.IsTrue(Driver.Url.Contains(expectedPath, System.StringComparison.OrdinalIgnoreCase) || Driver.PageSource.Contains(linkText), Assert.IsTrue(
Driver.Url.Contains(expectedPath, StringComparison.OrdinalIgnoreCase) ||
Driver.PageSource.Contains(linkText),
$"Expected to be on route containing '{expectedPath}' after clicking '{linkText}', but was '{Driver.Url}'"); $"Expected to be on route containing '{expectedPath}' after clicking '{linkText}', but was '{Driver.Url}'");
} }
} }
+3 -3
View File
@@ -1,5 +1,5 @@
<Solution> <Solution>
<Project Path="AOW4.Client/AOW4.Client.csproj" /> <Project Path="AOW4.Client/AOW4.Client.csproj"/>
<Project Path="AOW4.SeleniumTests/AOW4.SeleniumTests.csproj" /> <Project Path="AOW4.SeleniumTests/AOW4.SeleniumTests.csproj"/>
<Project Path="AOW4/AOW4.csproj" /> <Project Path="AOW4/AOW4.csproj"/>
</Solution> </Solution>
+10 -10
View File
@@ -1,15 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net10.0</TargetFramework> <TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException> <BlazorDisableThrowNavigationException>true</BlazorDisableThrowNavigationException>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AOW4.Client\AOW4.Client.csproj" /> <ProjectReference Include="..\AOW4.Client\AOW4.Client.csproj"/>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.8" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="10.0.8"/>
</ItemGroup> </ItemGroup>
</Project> </Project>
+12 -12
View File
@@ -2,21 +2,21 @@
<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 name="viewport" content="width=device-width, initial-scale=1.0"/>
<base href="/" /> <base href="/"/>
<ResourcePreloader /> <ResourcePreloader/>
<link rel="stylesheet" href="@Assets["lib/bootstrap/dist/css/bootstrap.min.css"]" /> <link rel="stylesheet" href="@Assets["lib/bootstrap/dist/css/bootstrap.min.css"]"/>
<link rel="stylesheet" href="@Assets["app.css"]" /> <link rel="stylesheet" href="@Assets["app.css"]"/>
<link rel="stylesheet" href="@Assets["AOW4.styles.css"]" /> <link rel="stylesheet" href="@Assets["AOW4.styles.css"]"/>
<ImportMap /> <ImportMap/>
<link rel="icon" type="image/png" href="favicon.png" /> <link rel="icon" type="image/png" href="favicon.png"/>
<HeadOutlet /> <HeadOutlet/>
</head> </head>
<body> <body>
<Routes /> <Routes/>
<script src="@Assets["_framework/blazor.web.js"]"></script> <script src="@Assets["_framework/blazor.web.js"]"></script>
</body> </body>
</html> </html>
+18 -18
View File
@@ -21,20 +21,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 {
@@ -90,9 +90,9 @@ main {
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;
} }
-42
View File
@@ -1,42 +0,0 @@
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">AOW4</a>
</div>
</div>
<input type="checkbox" title="Navigation menu" class="navbar-toggler" />
<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
<nav class="nav flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="bi bi-house-door-fill-nav-menu" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> Counter
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="weather">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Weather
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="/references/magic-materials">
<span class="bi bi-book-fill-nav-menu" aria-hidden="true"></span> Magic Materials
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="/references/province-improvements">
<span class="bi bi-buildings-nav-menu" aria-hidden="true"></span> Province Improvements
</NavLink>
</div>
</nav>
</div>
-105
View File
@@ -1,105 +0,0 @@
.navbar-toggler {
appearance: none;
cursor: pointer;
width: 3.5rem;
height: 2.5rem;
color: white;
position: absolute;
top: 0.5rem;
right: 1rem;
border: 1px solid rgba(255, 255, 255, 0.1);
background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e") no-repeat center/1.75rem rgba(255, 255, 255, 0.1);
}
.navbar-toggler:checked {
background-color: rgba(255, 255, 255, 0.5);
}
.top-row {
min-height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand {
font-size: 1.1rem;
}
.bi {
display: inline-block;
position: relative;
width: 1.25rem;
height: 1.25rem;
margin-right: 0.75rem;
top: -1px;
background-size: cover;
}
.bi-house-door-fill-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-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E");
}
.bi-plus-square-fill-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-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E");
}
.bi-list-nested-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-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");
}
.nav-item {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type {
padding-top: 1rem;
}
.nav-item:last-of-type {
padding-bottom: 1rem;
}
.nav-item ::deep .nav-link {
color: #d7d7d7;
background: none;
border: none;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
width: 100%;
}
.nav-item ::deep a.active {
background-color: rgba(255,255,255,0.37);
color: white;
}
.nav-item ::deep .nav-link:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
.nav-scrollable {
display: none;
}
.navbar-toggler:checked ~ .nav-scrollable {
display: block;
}
@media (min-width: 641px) {
.navbar-toggler {
display: none;
}
.nav-scrollable {
/* Never collapse the sidebar for wide screens */
display: block;
/* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
}
+32 -31
View File
@@ -10,23 +10,23 @@
<h2>Build Order</h2> <h2>Build Order</h2>
<table class="calculator-table"> <table class="calculator-table">
<thead> <thead>
<tr> <tr>
<th>Turn Requested</th> <th>Turn Requested</th>
<th>Building</th> <th>Building</th>
<th>Finish Turn</th> <th>Finish Turn</th>
<th>Industry Remaining</th> <th>Industry Remaining</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var entry in Result.BuildOrder) @foreach (var entry in Result.BuildOrder)
{ {
<tr> <tr>
<td>@entry.RequestedTurn</td> <td>@entry.RequestedTurn</td>
<td>@entry.Name</td> <td>@entry.Name</td>
<td>@(entry.BuiltFinishTurn == 0 ? "Starting" : entry.BuiltFinishTurn.ToString())</td> <td>@(entry.BuiltFinishTurn == 0 ? "Starting" : entry.BuiltFinishTurn.ToString())</td>
<td>@entry.IndustryCostRemaining</td> <td>@entry.IndustryCostRemaining</td>
</tr> </tr>
} }
</tbody> </tbody>
</table> </table>
</section> </section>
@@ -35,23 +35,23 @@
<h2>Gold Over Time</h2> <h2>Gold Over Time</h2>
<table class="calculator-table"> <table class="calculator-table">
<thead> <thead>
<tr> <tr>
<th>Turn</th> <th>Turn</th>
<th>Stored Gold</th> <th>Stored Gold</th>
<th>Income</th> <th>Income</th>
<th>Upkeep</th> <th>Upkeep</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var snapshot in Result.ResourceHistory) @foreach (var snapshot in Result.ResourceHistory)
{ {
<tr> <tr>
<td>@snapshot.Turn</td> <td>@snapshot.Turn</td>
<td>@snapshot.Stored.Gold</td> <td>@snapshot.Stored.Gold</td>
<td>@snapshot.TotalIncome.Gold</td> <td>@snapshot.TotalIncome.Gold</td>
<td>@snapshot.TotalUpkeep.Gold</td> <td>@snapshot.TotalUpkeep.Gold</td>
</tr> </tr>
} }
</tbody> </tbody>
</table> </table>
</section> </section>
@@ -68,12 +68,13 @@
protected override void OnInitialized() protected override void OnInitialized()
{ {
Result = BuildingPlanCalculator.CreateSampleBuildPlan(60); Result = BuildingPlanCalculator.CreateSampleBuildPlan();
Json = JsonSerializer.Serialize(Result, new JsonSerializerOptions Json = JsonSerializer.Serialize(Result, new JsonSerializerOptions
{ {
WriteIndented = true WriteIndented = true
}); });
} }
} }
<style> <style>
+9 -5
View File
@@ -15,22 +15,26 @@
<h3>Development Mode</h3> <h3>Development Mode</h3>
<p> <p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred. Swapping to <strong>Development</strong> environment will display more detailed information about the error that
occurred.
</p> </p>
<p> <p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong> <strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users. It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong> For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong>
environment variable to <strong>Development</strong>
and restarting the app. and restarting the app.
</p> </p>
@code{ @code{
[CascadingParameter] [CascadingParameter] private HttpContext? HttpContext { get; set; }
private HttpContext? HttpContext { get; set; }
private string? RequestId { get; set; } private string? RequestId { get; set; }
private bool ShowRequestId => !string.IsNullOrEmpty(RequestId); private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
protected override void OnInitialized() => protected override void OnInitialized()
{
RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier; RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
}
} }
+1
View File
@@ -52,6 +52,7 @@
{ {
sections = SectionsData.GetAllSections(); sections = SectionsData.GetAllSections();
} }
} }
<style> <style>
@@ -8,35 +8,42 @@
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
<tr> <tr>
<th>Name</th> <th>Name</th>
<th>Category</th> <th>Category</th>
<th>Annex Resources</th> <th>Annex Resources</th>
<th>Global Bonus</th> <th>Global Bonus</th>
<th>Infusion 1</th> <th>Infusion 1</th>
<th>Infusion 2</th> <th>Infusion 2</th>
<th>Infusion 3</th> <th>Infusion 3</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var material in MagicMaterialsData.RawData) @foreach (var material in MagicMaterialsData.RawData)
{ {
<tr> <tr>
<td>@material.Name</td> <td>@material.Name</td>
<td>@material.Category</td> <td>@material.Category</td>
<td>@FormatAnnexResources(material)</td> <td>@FormatAnnexResources(material)</td>
<td>@material.GlobalBonus</td> <td>@material.GlobalBonus</td>
<td><div class="preformatted">@material.InfusionEffects1</div></td> <td>
<td><div class="preformatted">@material.InfusionEffects2</div></td> <div class="preformatted">@material.InfusionEffects1</div>
<td><div class="preformatted">@material.InfusionEffects3</div></td> </td>
</tr> <td>
} <div class="preformatted">@material.InfusionEffects2</div>
</td>
<td>
<div class="preformatted">@material.InfusionEffects3</div>
</td>
</tr>
}
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </div>
@code { @code {
private static string FormatAnnexResources(MagicMaterial material) private static string FormatAnnexResources(MagicMaterial material)
{ {
var parts = new List<string>(); var parts = new List<string>();
@@ -72,6 +79,7 @@
return parts.Count > 0 ? string.Join("; ", parts) : "—"; return parts.Count > 0 ? string.Join("; ", parts) : "—";
} }
} }
<style> <style>
@@ -3,32 +3,37 @@
<div class="page-container"> <div class="page-container">
<h1>Province Improvements Reference</h1> <h1>Province Improvements Reference</h1>
<p class="subtitle">A reference view of the `ProvinceImprovement` data loaded from `ProvinceImprovementsData.RawData`.</p> <p class="subtitle">A reference view of the `ProvinceImprovement` data loaded from
`ProvinceImprovementsData.RawData`.</p>
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped table-hover"> <table class="table table-striped table-hover">
<thead> <thead>
<tr> <tr>
<th>Name</th> <th>Name</th>
<th>Category</th> <th>Category</th>
<th>Source</th> <th>Source</th>
<th>Cost (Prod/Gold)</th> <th>Cost (Prod/Gold)</th>
<th>Effects</th> <th>Effects</th>
<th>Requirements</th> <th>Requirements</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@foreach (var improvement in ProvinceImprovementsData.RawData) @foreach (var improvement in ProvinceImprovementsData.RawData)
{ {
<tr> <tr>
<td>@improvement.Name</td> <td>@improvement.Name</td>
<td>@improvement.Category</td> <td>@improvement.Category</td>
<td>@improvement.Source</td> <td>@improvement.Source</td>
<td>@improvement.CostProduction / @improvement.CostGold</td> <td>@improvement.CostProduction / @improvement.CostGold</td>
<td><div class="preformatted">@improvement.Effects</div></td> <td>
<td><div class="preformatted">@improvement.Requirements</div></td> <div class="preformatted">@improvement.Effects</div>
</tr> </td>
} <td>
<div class="preformatted">@improvement.Requirements</div>
</td>
</tr>
}
</tbody> </tbody>
</table> </table>
</div> </div>
-64
View File
@@ -1,64 +0,0 @@
@page "/weather"
@attribute [StreamRendering]
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates showing data.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th aria-label="Temperature in Celsius">Temp. (C)</th>
<th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
// Simulate asynchronous loading to demonstrate streaming rendering
await Task.Delay(500);
var startDate = DateOnly.FromDateTime(DateTime.Now);
var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" };
forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = summaries[Random.Shared.Next(summaries.Length)]
}).ToArray();
}
private class WeatherForecast
{
public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
public string? Summary { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}
+5 -3
View File
@@ -1,6 +1,8 @@
<Router AppAssembly="typeof(Program).Assembly" AdditionalAssemblies="new[] { typeof(Client._Imports).Assembly }" NotFoundPage="typeof(Pages.NotFound)"> @using AOW4.Components.Pages
<Router AppAssembly="typeof(Program).Assembly" AdditionalAssemblies="new[] { typeof(Client._Imports).Assembly }"
NotFoundPage="typeof(NotFound)">
<Found Context="routeData"> <Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" /> <RouteView RouteData="routeData" DefaultLayout="typeof(MainLayout)"/>
<FocusOnNavigate RouteData="routeData" Selector="h1" /> <FocusOnNavigate RouteData="routeData" Selector="h1"/>
</Found> </Found>
</Router> </Router>
+17 -22
View File
@@ -14,7 +14,8 @@ public sealed class ResourceAmounts
public int Stability { get; set; } public int Stability { get; set; }
[JsonIgnore] [JsonIgnore]
public bool IsZero => Draft == 0 && Food == 0 && Knowledge == 0 && Industry == 0 && Magic == 0 && Gold == 0 && Imperial == 0 && Stability == 0; public bool IsZero => Draft == 0 && Food == 0 && Knowledge == 0 && Industry == 0 && Magic == 0 && Gold == 0 &&
Imperial == 0 && Stability == 0;
public void Add(ResourceAmounts other) public void Add(ResourceAmounts other)
{ {
@@ -41,7 +42,8 @@ public sealed class ResourceAmounts
} }
public static ResourceAmounts operator +(ResourceAmounts a, ResourceAmounts b) public static ResourceAmounts operator +(ResourceAmounts a, ResourceAmounts b)
=> new ResourceAmounts {
return new ResourceAmounts
{ {
Draft = a.Draft + b.Draft, Draft = a.Draft + b.Draft,
Food = a.Food + b.Food, Food = a.Food + b.Food,
@@ -52,9 +54,11 @@ public sealed class ResourceAmounts
Imperial = a.Imperial + b.Imperial, Imperial = a.Imperial + b.Imperial,
Stability = a.Stability + b.Stability Stability = a.Stability + b.Stability
}; };
}
public static ResourceAmounts operator -(ResourceAmounts a, ResourceAmounts b) public static ResourceAmounts operator -(ResourceAmounts a, ResourceAmounts b)
=> new ResourceAmounts {
return new ResourceAmounts
{ {
Draft = a.Draft - b.Draft, Draft = a.Draft - b.Draft,
Food = a.Food - b.Food, Food = a.Food - b.Food,
@@ -65,6 +69,7 @@ public sealed class ResourceAmounts
Imperial = a.Imperial - b.Imperial, Imperial = a.Imperial - b.Imperial,
Stability = a.Stability - b.Stability Stability = a.Stability - b.Stability
}; };
}
} }
public sealed class BuildingDefinition public sealed class BuildingDefinition
@@ -137,7 +142,6 @@ public static class BuildingPlanCalculator
var stored = new ResourceAmounts(); var stored = new ResourceAmounts();
if (startingResources is not null) if (startingResources is not null)
{
stored = new ResourceAmounts stored = new ResourceAmounts
{ {
Draft = startingResources.Draft, Draft = startingResources.Draft,
@@ -149,10 +153,8 @@ public static class BuildingPlanCalculator
Imperial = startingResources.Imperial, Imperial = startingResources.Imperial,
Stability = startingResources.Stability Stability = startingResources.Stability
}; };
}
if (startingBuildings is not null) if (startingBuildings is not null)
{
foreach (var startingBuilding in startingBuildings) foreach (var startingBuilding in startingBuildings)
{ {
var entry = new BuildOrderEntry var entry = new BuildOrderEntry
@@ -168,7 +170,6 @@ public static class BuildingPlanCalculator
activeBuildings.Add(entry); activeBuildings.Add(entry);
result.BuildOrder.Add(entry); result.BuildOrder.Add(entry);
} }
}
var requestsByTurn = buildRequests var requestsByTurn = buildRequests
.OrderBy(r => r.RequestedTurn) .OrderBy(r => r.RequestedTurn)
@@ -183,19 +184,16 @@ public static class BuildingPlanCalculator
var upkeepThisTurn = new ResourceAmounts(); var upkeepThisTurn = new ResourceAmounts();
foreach (var building in activeBuildings) foreach (var building in activeBuildings)
{
if (building.BuiltFinishTurn == 0 || turn > building.BuiltFinishTurn) if (building.BuiltFinishTurn == 0 || turn > building.BuiltFinishTurn)
{ {
incomeThisTurn.Add(building.Definition.Income); incomeThisTurn.Add(building.Definition.Income);
upkeepThisTurn.Add(building.Definition.Upkeep); upkeepThisTurn.Add(building.Definition.Upkeep);
} }
}
stored.Add(incomeThisTurn); stored.Add(incomeThisTurn);
stored.Subtract(upkeepThisTurn); stored.Subtract(upkeepThisTurn);
if (requestsByTurn.TryGetValue(turn, out var requests)) if (requestsByTurn.TryGetValue(turn, out var requests))
{
foreach (var request in requests) foreach (var request in requests)
{ {
var nextProject = new BuildOrderEntry var nextProject = new BuildOrderEntry
@@ -223,15 +221,11 @@ public static class BuildingPlanCalculator
projects.Add(nextProject); projects.Add(nextProject);
result.BuildOrder.Add(nextProject); result.BuildOrder.Add(nextProject);
} }
}
var availableIndustry = incomeThisTurn.Industry; var availableIndustry = incomeThisTurn.Industry;
foreach (var project in projects.Where(p => p.BuiltFinishTurn == 0).OrderBy(p => p.RequestedTurn)) foreach (var project in projects.Where(p => p.BuiltFinishTurn == 0).OrderBy(p => p.RequestedTurn))
{ {
if (availableIndustry <= 0 || project.IndustryCostRemaining <= 0) if (availableIndustry <= 0 || project.IndustryCostRemaining <= 0) continue;
{
continue;
}
var applied = Math.Min(availableIndustry, project.IndustryCostRemaining); var applied = Math.Min(availableIndustry, project.IndustryCostRemaining);
project.IndustryCostRemaining -= applied; project.IndustryCostRemaining -= applied;
@@ -271,7 +265,7 @@ public static class BuildingPlanCalculator
{ {
return new List<BuildingDefinition> return new List<BuildingDefinition>
{ {
new BuildingDefinition new()
{ {
Id = "town-hall-1", Id = "town-hall-1",
Name = "Town Hall I", Name = "Town Hall I",
@@ -288,7 +282,7 @@ public static class BuildingPlanCalculator
Upkeep = new ResourceAmounts(), Upkeep = new ResourceAmounts(),
Cost = new ResourceAmounts() Cost = new ResourceAmounts()
}, },
new BuildingDefinition new()
{ {
Id = "throne", Id = "throne",
Name = "Throne", Name = "Throne",
@@ -308,7 +302,7 @@ public static class BuildingPlanCalculator
{ {
var sampleRequests = new List<BuildOrderRequest> var sampleRequests = new List<BuildOrderRequest>
{ {
new BuildOrderRequest new()
{ {
ItemId = "farm-1", ItemId = "farm-1",
Definition = new BuildingDefinition Definition = new BuildingDefinition
@@ -323,7 +317,7 @@ public static class BuildingPlanCalculator
}, },
RequestedTurn = 2 RequestedTurn = 2
}, },
new BuildOrderRequest new()
{ {
ItemId = "workshop-1", ItemId = "workshop-1",
Definition = new BuildingDefinition Definition = new BuildingDefinition
@@ -338,7 +332,7 @@ public static class BuildingPlanCalculator
}, },
RequestedTurn = 5 RequestedTurn = 5
}, },
new BuildOrderRequest new()
{ {
ItemId = "market-1", ItemId = "market-1",
Definition = new BuildingDefinition Definition = new BuildingDefinition
@@ -355,6 +349,7 @@ public static class BuildingPlanCalculator
} }
}; };
return CalculateBuildPlan(totalTurns, sampleRequests, GetDefaultStartingBuildings(), new ResourceAmounts { Gold = 0 }); return CalculateBuildPlan(totalTurns, sampleRequests, GetDefaultStartingBuildings(),
new ResourceAmounts { Gold = 0 });
} }
} }
+2 -2
View File
@@ -19,7 +19,7 @@ public class MagicMaterial
public string? InfusionEffects2 { get; set; } public string? InfusionEffects2 { get; set; }
public string? InfusionEffects3 { get; set; } public string? InfusionEffects3 { get; set; }
public int? IncreaseProduction { get; set; } public int? IncreaseProduction { get; set; }
public int? IncreaseGold{ get; set; } public int? IncreaseGold { get; set; }
public int? IncreaseMana { get; set; } public int? IncreaseMana { get; set; }
public int? IncreaseDraft { get; set; } public int? IncreaseDraft { get; set; }
public int? IncreaseKnowledge { get; set; } public int? IncreaseKnowledge { get; set; }
@@ -38,4 +38,4 @@ public class MagicMaterial
public int? DecreaseRecruitmentCostPercent { get; set; } public int? DecreaseRecruitmentCostPercent { get; set; }
public int? DecreaseKnowledgeResearchCostPercent { get; set; } public int? DecreaseKnowledgeResearchCostPercent { get; set; }
public int? DecreaseTurnsTakenToFoundAbsorbMigrateCities { get; set; } public int? DecreaseTurnsTakenToFoundAbsorbMigrateCities { get; set; }
} }
+11 -10
View File
@@ -1,43 +1,44 @@
namespace AOW4.Data; namespace AOW4.Data;
/// <summary> /// <summary>
/// Represents a Province Improvement - a buildable enhancement that can be constructed in a province. /// Represents a Province Improvement - a buildable enhancement that can be constructed in a province.
/// Each Province Improvement decreases stability by -5. /// Each Province Improvement decreases stability by -5.
/// </summary> /// </summary>
public class ProvinceImprovement public class ProvinceImprovement
{ {
/// <summary> /// <summary>
/// The name of the province improvement. /// The name of the province improvement.
/// </summary> /// </summary>
public required string Name { get; set; } public required string Name { get; set; }
/// <summary> /// <summary>
/// The base category/type (Conduit, Farm, Forester, Mine, Quarry, Research Post, Teleporter, Monument, etc.). /// The base category/type (Conduit, Farm, Forester, Mine, Quarry, Research Post, Teleporter, Monument, etc.).
/// </summary> /// </summary>
public required string Category { get; set; } public required string Category { get; set; }
/// <summary> /// <summary>
/// A description of the effects this improvement provides (resource bonuses, adjacency bonuses, special mechanics, etc.). /// A description of the effects this improvement provides (resource bonuses, adjacency bonuses, special mechanics,
/// etc.).
/// </summary> /// </summary>
public required string Effects { get; set; } public required string Effects { get; set; }
/// <summary> /// <summary>
/// Any requirements to build this improvement (terrain, resource nodes, Town Hall tier, etc.). /// Any requirements to build this improvement (terrain, resource nodes, Town Hall tier, etc.).
/// </summary> /// </summary>
public required string Requirements { get; set; } public required string Requirements { get; set; }
/// <summary> /// <summary>
/// The source/culture/tome that grants this improvement (General, Barbarian, Feudal, High, Mystic, etc.). /// The source/culture/tome that grants this improvement (General, Barbarian, Feudal, High, Mystic, etc.).
/// </summary> /// </summary>
public required string Source { get; set; } public required string Source { get; set; }
/// <summary> /// <summary>
/// The production cost to build this improvement. /// The production cost to build this improvement.
/// </summary> /// </summary>
public int CostProduction { get; set; } public int CostProduction { get; set; }
/// <summary> /// <summary>
/// The gold cost to build this improvement. /// The gold cost to build this improvement.
/// </summary> /// </summary>
public int CostGold { get; set; } public int CostGold { get; set; }
} }
+57 -56
View File
@@ -1,7 +1,7 @@
namespace AOW4.Data; namespace AOW4.Data;
/// <summary> /// <summary>
/// Static raw data provider for Province Improvements. /// Static raw data provider for Province Improvements.
/// </summary> /// </summary>
public static class ProvinceImprovementsData public static class ProvinceImprovementsData
{ {
@@ -85,10 +85,10 @@ public static class ProvinceImprovementsData
Name = "Spell Jammer", Name = "Spell Jammer",
Category = "Conduit", Category = "Conduit",
Effects = """ Effects = """
Enemies cannot target World Map Spells in this Domain. Enemies cannot target World Map Spells in this Domain.
Enemy Spells cost +100% Combat Casting Points in Combat in Domain. Enemy Spells cost +100% Combat Casting Points in Combat in Domain.
-10 Mana. -10 Mana.
""", """,
Requirements = "Must be built on an acquired province.\nRequires Town Hall III", Requirements = "Must be built on an acquired province.\nRequires Town Hall III",
Source = "General", Source = "General",
CostProduction = 250, CostProduction = 250,
@@ -99,9 +99,9 @@ public static class ProvinceImprovementsData
Name = "Teleporter", Name = "Teleporter",
Category = "Teleporter", Category = "Teleporter",
Effects = """ Effects = """
A Province Improvement which enables an Army to teleport from one teleporter to another. A Province Improvement which enables an Army to teleport from one teleporter to another.
-10 Mana. -10 Mana.
""", """,
Requirements = "Must be built on an acquired province", Requirements = "Must be built on an acquired province",
Source = "General", Source = "General",
CostProduction = 250, CostProduction = 250,
@@ -114,11 +114,11 @@ public static class ProvinceImprovementsData
Name = "Forest of Stakes", Name = "Forest of Stakes",
Category = "Forester", Category = "Forester",
Effects = """ Effects = """
+7 Food income. +7 Food income.
+7 Production income. +7 Production income.
+7 Draft per adjacent Forester. +7 Draft per adjacent Forester.
Enemy Units in this Domain get Demoralized. Enemy Units in this Domain get Demoralized.
""", """,
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Communal Tent", Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Communal Tent",
Source = "Barbarian", Source = "Barbarian",
CostProduction = 130, CostProduction = 130,
@@ -131,9 +131,9 @@ public static class ProvinceImprovementsData
Name = "Masoleum", Name = "Masoleum",
Category = "Research Post", Category = "Research Post",
Effects = """ Effects = """
+10 Knowledge income. +10 Knowledge income.
+3 Knowledge Production per adjacent Conduit. +3 Knowledge Production per adjacent Conduit.
""", """,
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Dread Spire", Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Dread Spire",
Source = "Dark - Cult of Death", Source = "Dark - Cult of Death",
CostProduction = 130, CostProduction = 130,
@@ -146,9 +146,9 @@ public static class ProvinceImprovementsData
Name = "Dark Forge", Name = "Dark Forge",
Category = "Mine", Category = "Mine",
Effects = """ Effects = """
+10 Gold income. +10 Gold income.
+5 Production per adjacent Quarry, Mine, or Forester. +5 Production per adjacent Quarry, Mine, or Forester.
""", """,
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Dread Spire", Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Dread Spire",
Source = "Dark - Cult of Tyranny", Source = "Dark - Cult of Tyranny",
CostProduction = 130, CostProduction = 130,
@@ -161,9 +161,9 @@ public static class ProvinceImprovementsData
Name = "Farmstead", Name = "Farmstead",
Category = "Farm", Category = "Farm",
Effects = """ Effects = """
+15 Food income. +15 Food income.
+5 Food per adjacent Farm. +5 Food per adjacent Farm.
""", """,
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Castle", Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Castle",
Source = "Feudal", Source = "Feudal",
CostProduction = 130, CostProduction = 130,
@@ -176,10 +176,10 @@ public static class ProvinceImprovementsData
Name = "Sunshrine", Name = "Sunshrine",
Category = "Research Post", Category = "Research Post",
Effects = """ Effects = """
+10 Knowledge income. +10 Knowledge income.
+3 Knowledge per adjacent Research Post. +3 Knowledge per adjacent Research Post.
Friendly Units in this Domain are Encouraged. Friendly Units in this Domain are Encouraged.
""", """,
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Atrium of Light", Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Atrium of Light",
Source = "High", Source = "High",
CostProduction = 130, CostProduction = 130,
@@ -192,9 +192,9 @@ public static class ProvinceImprovementsData
Name = "Builder's Quarters", Name = "Builder's Quarters",
Category = "Quarry", Category = "Quarry",
Effects = """ Effects = """
+15 Production income. +15 Production income.
+5 Production per adjacent Quarry. +5 Production per adjacent Quarry.
""", """,
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Bulwark", Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Bulwark",
Source = "Industrious", Source = "Industrious",
CostProduction = 130, CostProduction = 130,
@@ -207,9 +207,9 @@ public static class ProvinceImprovementsData
Name = "Mystic Abbey", Name = "Mystic Abbey",
Category = "Conduit", Category = "Conduit",
Effects = """ Effects = """
+10 Mana income. +10 Mana income.
+3 Knowledge per adjacent Conduit or Research Post. +3 Knowledge per adjacent Conduit or Research Post.
""", """,
Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Mage's Plaza", Requirements = "Must be built on an acquired province.\nRequires Town Hall II: Mage's Plaza",
Source = "Mystic - School of Attunement", Source = "Mystic - School of Attunement",
CostProduction = 130, CostProduction = 130,
@@ -222,10 +222,11 @@ public static class ProvinceImprovementsData
Name = "Astral Manalith", Name = "Astral Manalith",
Category = "Conduit", Category = "Conduit",
Effects = """ Effects = """
+10 Mana income. +10 Mana income.
+5 Mana per adjacent Conduit or Research Post. +5 Mana per adjacent Conduit or Research Post.
""", """,
Requirements = "Must be built on an acquired Province.\nRequires City Tier 2.\nRequires Town Hall II: Mage's Plaza", Requirements =
"Must be built on an acquired Province.\nRequires City Tier 2.\nRequires Town Hall II: Mage's Plaza",
Source = "Mystic - School of Summoning", Source = "Mystic - School of Summoning",
CostProduction = 130, CostProduction = 130,
CostGold = 60 CostGold = 60
@@ -237,10 +238,10 @@ public static class ProvinceImprovementsData
Name = "Warcamp", Name = "Warcamp",
Category = "Forester", Category = "Forester",
Effects = """ Effects = """
+15 Draft. +15 Draft.
Pillaging adjacent provinces takes -1 Turn. Pillaging adjacent provinces takes -1 Turn.
Friendly units in this and adjacent provinces gain +15 Hit Point regeneration per World Map Turn. Friendly units in this and adjacent provinces gain +15 Hit Point regeneration per World Map Turn.
""", """,
Requirements = "Must be built on an annexed Province.\nRequires Town Hall II: Council Deck", Requirements = "Must be built on an annexed Province.\nRequires Town Hall II: Council Deck",
Source = "Nomad - Conquerors", Source = "Nomad - Conquerors",
CostProduction = 130, CostProduction = 130,
@@ -253,9 +254,9 @@ public static class ProvinceImprovementsData
Name = "Scavenging Camp", Name = "Scavenging Camp",
Category = "Mine", Category = "Mine",
Effects = """ Effects = """
+10 Gold. +10 Gold.
+10 Gold for this and each adjacent province containing a Resource Node. +10 Gold for this and each adjacent province containing a Resource Node.
""", """,
Requirements = "Must be built on an annexed Province.\nRequires Town Hall II: Council Deck", Requirements = "Must be built on an annexed Province.\nRequires Town Hall II: Council Deck",
Source = "Nomad - Scavengers", Source = "Nomad - Scavengers",
CostProduction = 130, CostProduction = 130,
@@ -300,10 +301,10 @@ public static class ProvinceImprovementsData
Name = "School of Contemplation", Name = "School of Contemplation",
Category = "Conduit", Category = "Conduit",
Effects = """ Effects = """
+7 Mana. +7 Mana.
+7 Knowledge. +7 Knowledge.
+3 Knowledge per adjacent Conduit or Research Post. +3 Knowledge per adjacent Conduit or Research Post.
""", """,
Requirements = "Must be built on an acquired Province.\nRequires Town Hall II: Oath Square", Requirements = "Must be built on an acquired Province.\nRequires Town Hall II: Oath Square",
Source = "Oathsworn - Oath of Harmony", Source = "Oathsworn - Oath of Harmony",
CostProduction = 250, CostProduction = 250,
@@ -314,10 +315,10 @@ public static class ProvinceImprovementsData
Name = "School of Discipline", Name = "School of Discipline",
Category = "Conduit", Category = "Conduit",
Effects = """ Effects = """
+7 Mana. +7 Mana.
+7 Draft. +7 Draft.
+5 Draft per adjacent Quarry. +5 Draft per adjacent Quarry.
""", """,
Requirements = "Must be built on an acquired Province.\nRequires Town Hall II: Oath Square", Requirements = "Must be built on an acquired Province.\nRequires Town Hall II: Oath Square",
Source = "Oathsworn - Oath of Righteousness", Source = "Oathsworn - Oath of Righteousness",
CostProduction = 250, CostProduction = 250,
@@ -328,14 +329,14 @@ public static class ProvinceImprovementsData
Name = "School of Mastery", Name = "School of Mastery",
Category = "Conduit", Category = "Conduit",
Effects = """ Effects = """
+7 Mana. +7 Mana.
+7 Draft. +7 Draft.
Units produced in this city start with +1 Starting Rank. Units produced in this city start with +1 Starting Rank.
""", """,
Requirements = "Must be built on an acquired Province.\nRequires Town Hall II: Oath Square", Requirements = "Must be built on an acquired Province.\nRequires Town Hall II: Oath Square",
Source = "Oathsworn - Oath of Strife", Source = "Oathsworn - Oath of Strife",
CostProduction = 250, CostProduction = 250,
CostGold = 100 CostGold = 100
} }
}; };
} }
+1 -1
View File
@@ -15,4 +15,4 @@ public class ResourceNode
public bool ForceEnableConduit { get; set; } public bool ForceEnableConduit { get; set; }
public bool ForceEnableResearchPost { get; set; } public bool ForceEnableResearchPost { get; set; }
public bool ForceEnableForester { get; set; } public bool ForceEnableForester { get; set; }
} }
+11 -13
View File
@@ -1,25 +1,23 @@
using System.Collections.Generic;
namespace AOW4.Data; namespace AOW4.Data;
public static class ResourceNodesData public static class ResourceNodesData
{ {
public static readonly IReadOnlyList<ResourceNode> RawData = new List<ResourceNode> public static readonly IReadOnlyList<ResourceNode> RawData = new List<ResourceNode>
{ {
new ResourceNode new()
{ {
Name = "Pastures", Name = "Pastures",
Description = "Roaming herds on lush fields.", Description = "Roaming herds on lush fields.",
IncreaseFood = 10, IncreaseFood = 10,
ForceEnableFarm = true ForceEnableFarm = true
}, },
new ResourceNode new()
{ {
Name = "Oasis", Name = "Oasis",
Description = "A lush oasis full of nutritious food.", Description = "A lush oasis full of nutritious food.",
IncreaseFood = 10 IncreaseFood = 10
}, },
new ResourceNode new()
{ {
Name = "Iron Deposit", Name = "Iron Deposit",
Description = "A rich vein full of ore.", Description = "A rich vein full of ore.",
@@ -27,14 +25,14 @@ public static class ResourceNodesData
ForceEnableMine = true, ForceEnableMine = true,
ForceEnableQuarry = true ForceEnableQuarry = true
}, },
new ResourceNode new()
{ {
Name = "Gold Vein", Name = "Gold Vein",
Description = "A large vein of valuable gold.", Description = "A large vein of valuable gold.",
IncreaseGold = 10, IncreaseGold = 10,
ForceEnableMine = true ForceEnableMine = true
}, },
new ResourceNode new()
{ {
Name = "Mana Node", Name = "Mana Node",
Description = "Magical currents converge at this location.", Description = "Magical currents converge at this location.",
@@ -42,13 +40,13 @@ public static class ResourceNodesData
ForceEnableConduit = true, ForceEnableConduit = true,
ForceEnableResearchPost = true ForceEnableResearchPost = true
}, },
new ResourceNode new()
{ {
Name = "Fishing Ground", Name = "Fishing Ground",
Description = "A plentiful source of fish.", Description = "A plentiful source of fish.",
IncreaseFood = 15 IncreaseFood = 15
}, },
new ResourceNode new()
{ {
Name = "Pearl Reef", Name = "Pearl Reef",
Description = "A bloom of valuable pearls.", Description = "A bloom of valuable pearls.",
@@ -57,19 +55,19 @@ public static class ResourceNodesData
ForceEnableMine = true, ForceEnableMine = true,
ForceEnableConduit = true ForceEnableConduit = true
}, },
new ResourceNode new()
{ {
Name = "Chitinous Growths", Name = "Chitinous Growths",
Description = "These grotesque growths deposit valuable liquid and ore at unnatural speed.", Description = "These grotesque growths deposit valuable liquid and ore at unnatural speed.",
IncreaseGold = 30 IncreaseGold = 30
}, },
new ResourceNode new()
{ {
Name = "Monoliths", Name = "Monoliths",
Description = "There is writing in an unknown language on these obsidian giants.", Description = "There is writing in an unknown language on these obsidian giants.",
IncreaseKnowledge = 30 IncreaseKnowledge = 30
}, },
new ResourceNode new()
{ {
Name = "Blossom Orchard", Name = "Blossom Orchard",
Description = "Eternally blooming trees offering bounty of fruit and wood.", Description = "Eternally blooming trees offering bounty of fruit and wood.",
@@ -78,4 +76,4 @@ public static class ResourceNodesData
ForceEnableForester = true ForceEnableForester = true
} }
}; };
} }
+9 -8
View File
@@ -6,13 +6,13 @@ public static class SectionsData
{ {
return new List<Section> return new List<Section>
{ {
new Section new()
{ {
Name = "Calculators", Name = "Calculators",
Description = "Useful calculator tools for various computations", Description = "Useful calculator tools for various computations",
Links = new List<SectionLink> Links = new List<SectionLink>
{ {
new SectionLink new()
{ {
Title = "Building Plan Calculator", Title = "Building Plan Calculator",
Url = "/building-calculator", Url = "/building-calculator",
@@ -20,27 +20,28 @@ public static class SectionsData
} }
} }
}, },
new Section new()
{ {
Name = "References", Name = "References",
Description = "Reference materials and documentation", Description = "Reference materials and documentation",
Links = new List<SectionLink> Links = new List<SectionLink>
{ {
new SectionLink new()
{ {
Title = "Magic Materials Reference", Title = "Magic Materials Reference",
Url = "/references/magic-materials", Url = "/references/magic-materials",
Description = "View the magic material dataset and bonuses in a reference table." Description = "View the magic material dataset and bonuses in a reference table."
}, },
new SectionLink new()
{ {
Title = "Province Improvements Reference", Title = "Province Improvements Reference",
Url = "/references/province-improvements", Url = "/references/province-improvements",
Description = "View the province improvements dataset including costs, effects, and requirements." Description =
"View the province improvements dataset including costs, effects, and requirements."
} }
} }
}, },
new Section new()
{ {
Name = "Learning", Name = "Learning",
Description = "Educational resources and learning materials", Description = "Educational resources and learning materials",
@@ -51,4 +52,4 @@ public static class SectionsData
} }
}; };
} }
} }
+1 -1
View File
@@ -12,4 +12,4 @@ public class Section
public string Name { get; set; } = string.Empty; public string Name { get; set; } = string.Empty;
public string? Description { get; set; } public string? Description { get; set; }
public List<SectionLink> Links { get; set; } = new(); public List<SectionLink> Links { get; set; } = new();
} }
+7 -5
View File
@@ -1,5 +1,5 @@
using AOW4.Client.Pages;
using AOW4.Components; using AOW4.Components;
using _Imports = AOW4.Client._Imports;
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
@@ -13,12 +13,14 @@ var app = builder.Build();
if (app.Environment.IsDevelopment()) if (app.Environment.IsDevelopment())
{ {
app.UseWebAssemblyDebugging(); app.UseWebAssemblyDebugging();
} else }
else
{ {
app.UseExceptionHandler("/Error", createScopeForErrors: true); app.UseExceptionHandler("/Error", true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts(); app.UseHsts();
} }
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true); app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
app.UseHttpsRedirection(); app.UseHttpsRedirection();
@@ -27,6 +29,6 @@ app.UseAntiforgery();
app.MapStaticAssets(); app.MapStaticAssets();
app.MapRazorComponents<App>() app.MapRazorComponents<App>()
.AddInteractiveWebAssemblyRenderMode() .AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(typeof(AOW4.Client._Imports).Assembly); .AddAdditionalAssemblies(typeof(_Imports).Assembly);
app.Run(); app.Run();
+20 -20
View File
@@ -1,25 +1,25 @@
{ {
"$schema": "https://json.schemastore.org/launchsettings.json", "$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": { "profiles": {
"http": { "http": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true, "dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "http://localhost:5212", "applicationUrl": "http://localhost:5212",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} }
}, },
"https": { "https": {
"commandName": "Project", "commandName": "Project",
"dotnetRunMessages": true, "dotnetRunMessages": true,
"launchBrowser": true, "launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "https://localhost:7027;http://localhost:5212", "applicationUrl": "https://localhost:7027;http://localhost:5212",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
}
} }
} }
} }
}
+4 -4
View File
@@ -13,7 +13,7 @@ a, .btn-link {
} }
.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 {
@@ -42,9 +42,9 @@ h1:focus {
color: white; color: white;
} }
.blazor-error-boundary::after { .blazor-error-boundary::after {
content: "An error has occurred." content: "An error has occurred."
} }
.darker-border-checkbox.form-check-input { .darker-border-checkbox.form-check-input {
border-color: #929292; border-color: #929292;
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