diff --git a/Chrono/Web/Layout/MainLayout.razor b/Chrono/Web/Layout/MainLayout.razor
index c3bc89a..1bdc6e9 100644
--- a/Chrono/Web/Layout/MainLayout.razor
+++ b/Chrono/Web/Layout/MainLayout.razor
@@ -6,7 +6,9 @@
- @Body
+
+ @Body
+
\ No newline at end of file
diff --git a/Chrono/Web/Layout/NavMenu.razor b/Chrono/Web/Layout/NavMenu.razor
index f1ce1d6..5ae94bc 100644
--- a/Chrono/Web/Layout/NavMenu.razor
+++ b/Chrono/Web/Layout/NavMenu.razor
@@ -11,12 +11,17 @@
@@ -32,4 +37,4 @@
collapseNavMenu = !collapseNavMenu;
}
-}
\ No newline at end of file
+}
diff --git a/Chrono/Web/Layout/NavMenu.razor.css b/Chrono/Web/Layout/NavMenu.razor.css
index 617b89c..7d733ad 100644
--- a/Chrono/Web/Layout/NavMenu.razor.css
+++ b/Chrono/Web/Layout/NavMenu.razor.css
@@ -11,26 +11,11 @@
font-size: 1.1rem;
}
-.bi {
- display: inline-block;
- position: relative;
- width: 1.25rem;
- height: 1.25rem;
+.nav-icon {
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");
+ font-size: 1.05rem;
+ width: 1.25rem;
+ text-align: center;
}
.nav-item {
@@ -71,12 +56,10 @@
}
.collapse {
- /* Never collapse the sidebar for wide screens */
display: block;
}
.nav-scrollable {
- /* Allow sidebar to scroll for tall menus */
height: calc(100vh - 3.5rem);
overflow-y: auto;
}
diff --git a/Chrono/Web/Pages/Agents.razor b/Chrono/Web/Pages/Agents.razor
new file mode 100644
index 0000000..6e88b9e
--- /dev/null
+++ b/Chrono/Web/Pages/Agents.razor
@@ -0,0 +1,58 @@
+@page "/agents"
+@using Chrono.Model
+
+Agents
+
+
+
+
+
+
+
+
+ @if (((CardData)context).HasImmortalize)
+ {
+
+ }
+
+
+
+
+
+
context).ImagePath))
+
@(((CardData)context).Name)
+
+
+
+
+
+
+
+
+
+
+
+
+
+@code {
+ private List agents = [];
+
+ protected override void OnInitialized()
+ {
+ agents = CardDatabase.Cards
+ .Where(c => c.Category == "Agent")
+ .OrderBy(c => c.Cost)
+ .ThenBy(c => c.Name)
+ .ToList();
+ }
+}
diff --git a/Chrono/Web/Pages/Agents.razor.css b/Chrono/Web/Pages/Agents.razor.css
new file mode 100644
index 0000000..5342394
--- /dev/null
+++ b/Chrono/Web/Pages/Agents.razor.css
@@ -0,0 +1,113 @@
+.agents-page {
+ --kendo-color-app-surface: oklch(5.3% 0.013 270deg);
+ --kendo-color-subtle: oklch(64% 0.018 270deg);
+ --kendo-color-surface: oklch(10% 0.015 270deg);
+ --kendo-color-border: oklch(25% 0.025 270deg / 0.7);
+ --kendo-color-border-alt: oklch(30% 0.03 270deg / 0.5);
+ --kendo-color-base: oklch(16% 0.02 270deg);
+ --kendo-color-primary: oklch(55% 0.23 275deg);
+ --kendo-color-secondary: oklch(35% 0 0deg);
+ --kendo-color-tertiary: oklch(55% 0.15 240deg);
+ --kendo-color-info: oklch(65% 0.15 250deg);
+ --kendo-color-success: oklch(60% 0.15 140deg);
+ --kendo-color-warning: oklch(75% 0.14 85deg);
+ --kendo-color-error: oklch(55% 0.20 30deg);
+ --kendo-color-inverse: oklch(85% 0.01 270deg);
+ --kendo-color-series: oklch(55% 0.23 275deg);
+ max-width: 1400px;
+ margin: 0 auto;
+ padding: 1.5rem;
+}
+
+.agents-page ::deep .k-grid,
+.agents-page ::deep .k-grid-container,
+.agents-page ::deep .k-grid-content,
+.agents-page ::deep .k-grid-header-wrap {
+ background: transparent;
+ color: inherit;
+}
+
+.agents-page ::deep .k-grid-header,
+.agents-page ::deep .k-grid-footer,
+.agents-page ::deep .k-pager-wrap {
+ background: var(--bg-elevated);
+}
+
+.agents-page ::deep .k-grid-header .k-header,
+.agents-page ::deep .k-grid-header .k-column-title,
+.agents-page ::deep .k-grid-header .k-link,
+.agents-page ::deep .k-grid-header .k-grid-filter {
+ color: #e8e8f0;
+}
+
+.agents-page ::deep .k-grid-header .k-link:hover,
+.agents-page ::deep .k-grid-header .k-grid-filter:hover {
+ color: #ffffff;
+}
+
+.agents-page ::deep .k-grid td,
+.agents-page ::deep .k-grid-header th.k-header {
+ border-color: oklch(25% 0.025 270deg / 0.7);
+}
+
+.agents-page ::deep .k-grid tr.k-alt {
+ background: oklch(12% 0.015 270deg);
+}
+
+.agents-page ::deep .k-grid tr:hover {
+ background: oklch(20% 0.025 270deg);
+}
+
+.agents-page ::deep .k-grid-filter,
+.agents-page ::deep .k-grid-filter:hover {
+ color: var(--text-secondary);
+}
+
+.agents-page ::deep .k-input,
+.agents-page ::deep .k-picker {
+ color: var(--text-primary);
+ background: var(--bg-surface);
+ border-color: var(--border);
+}
+
+.agents-page ::deep .k-button-solid-base {
+ color: var(--text-secondary);
+ background: var(--bg-elevated);
+ border-color: var(--border);
+}
+
+.agents-page ::deep .k-button-solid-base:hover {
+ background: var(--bg-hover);
+ color: var(--text-primary);
+}
+
+.agents-page ::deep .k-pager-nav {
+ color: var(--text-secondary);
+}
+
+.agents-header {
+ margin-bottom: 1.5rem;
+}
+
+.agents-header h1 {
+ margin-bottom: 0.25rem;
+}
+
+.agents-header p {
+ font-size: 0.9rem;
+ margin: 0;
+}
+
+.agent-name-cell {
+ display: flex;
+ align-items: center;
+ gap: 0.6rem;
+}
+
+.agent-thumb {
+ width: 36px;
+ height: 50px;
+ object-fit: cover;
+ border-radius: 4px;
+ flex-shrink: 0;
+}
diff --git a/Chrono/Web/Program.cs b/Chrono/Web/Program.cs
index 66a967b..3506ebc 100644
--- a/Chrono/Web/Program.cs
+++ b/Chrono/Web/Program.cs
@@ -1,5 +1,6 @@
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
+using Telerik.Blazor;
using Web;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
@@ -7,5 +8,6 @@ builder.RootComponents.Add("#app");
builder.RootComponents.Add("head::after");
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
+builder.Services.AddTelerikBlazor();
await builder.Build().RunAsync();
\ No newline at end of file
diff --git a/Chrono/Web/Web.csproj b/Chrono/Web/Web.csproj
index 4316e38..4d53c6d 100644
--- a/Chrono/Web/Web.csproj
+++ b/Chrono/Web/Web.csproj
@@ -10,6 +10,7 @@
+
diff --git a/Chrono/Web/_Imports.razor b/Chrono/Web/_Imports.razor
index df57159..ac8f359 100644
--- a/Chrono/Web/_Imports.razor
+++ b/Chrono/Web/_Imports.razor
@@ -8,4 +8,6 @@
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using Web
-@using Web.Layout
\ No newline at end of file
+@using Web.Layout
+@using Telerik.Blazor
+@using Telerik.Blazor.Components
\ No newline at end of file
diff --git a/Chrono/Web/wwwroot/index.html b/Chrono/Web/wwwroot/index.html
index b92d16b..f578fc3 100644
--- a/Chrono/Web/wwwroot/index.html
+++ b/Chrono/Web/wwwroot/index.html
@@ -13,6 +13,7 @@
+