( "head::after" );
-
- builder.Services.AddScoped( sp => new HttpClient { BaseAddress = new Uri( builder.HostEnvironment.BaseAddress ) } );
- builder.Services.AddTailwindMerge();
-
- await builder.Build().RunAsync();
- }
-}
\ No newline at end of file
diff --git a/docs/LumexUI.Docs.Client/Properties/launchSettings.json b/docs/LumexUI.Docs.Client/Properties/launchSettings.json
deleted file mode 100644
index 47a653f6..00000000
--- a/docs/LumexUI.Docs.Client/Properties/launchSettings.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "iisSettings": {
- "windowsAuthentication": false,
- "anonymousAuthentication": true,
- "iisExpress": {
- "applicationUrl": "http://localhost:51561",
- "sslPort": 44341
- }
- },
- "profiles": {
- "LumexUI.Docs": {
- "commandName": "Project",
- "dotnetRunMessages": true,
- "launchBrowser": true,
- "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
- "applicationUrl": "https://localhost:7039;http://localhost:5015",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- },
- "IIS Express": {
- "commandName": "IISExpress",
- "launchBrowser": true,
- "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
- "environmentVariables": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- }
- }
- }
-}
diff --git a/docs/LumexUI.Docs.Client/wwwroot/index.html b/docs/LumexUI.Docs.Client/wwwroot/index.html
deleted file mode 100644
index 1c0497ea..00000000
--- a/docs/LumexUI.Docs.Client/wwwroot/index.html
+++ /dev/null
@@ -1,6 +0,0 @@
-You're in the wrong place.
-
-
- Don't try to run the webassembly project directly, because it needs a server to fetch data from.
- Instead, run the server project which hosts this webassembly application.
-
diff --git a/docs/LumexUI.Docs.Server/LumexUI.Docs.Server.csproj b/docs/LumexUI.Docs.Server/LumexUI.Docs.Server.csproj
deleted file mode 100644
index f5da2f3c..00000000
--- a/docs/LumexUI.Docs.Server/LumexUI.Docs.Server.csproj
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
- net8.0
- enable
- enable
- true
-
-
-
-
-
-
-
-
- $(DefineConstants);ENABLE_WASM_HOSTING
-
-
-
-
-
-
-
diff --git a/docs/LumexUI.Docs.Server/Pages/Index.cshtml b/docs/LumexUI.Docs.Server/Pages/Index.cshtml
deleted file mode 100644
index e2fd691d..00000000
--- a/docs/LumexUI.Docs.Server/Pages/Index.cshtml
+++ /dev/null
@@ -1,14 +0,0 @@
-@page
-
-Choose a hosting model:
-
-
-
-@{ #if !ENABLE_WASM_HOSTING }
-Note: To enable WebAssembly hosting, edit the project file and change EnableWebAssemblyHosting to true.
-@{ #endif }
diff --git a/docs/LumexUI.Docs.Server/Pages/_ServerHost.cshtml b/docs/LumexUI.Docs.Server/Pages/_ServerHost.cshtml
deleted file mode 100644
index f9dea7da..00000000
--- a/docs/LumexUI.Docs.Server/Pages/_ServerHost.cshtml
+++ /dev/null
@@ -1,8 +0,0 @@
-@page
-@namespace LumexUI.Docs.Server.Pages
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
-@{
- Layout = "_ServerLayout";
-}
-
-
diff --git a/docs/LumexUI.Docs.Server/Pages/_ServerLayout.cshtml b/docs/LumexUI.Docs.Server/Pages/_ServerLayout.cshtml
deleted file mode 100644
index e02cf92c..00000000
--- a/docs/LumexUI.Docs.Server/Pages/_ServerLayout.cshtml
+++ /dev/null
@@ -1,30 +0,0 @@
-@using Microsoft.AspNetCore.Components.Web
-@namespace LumexUI.Docs.Server.Pages
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
-
-
-
-
-
-
-
-
-
-
-
- @RenderBody()
-
-
-
- An error has occurred. This application may no longer respond until reloaded.
-
-
- An unhandled exception has occurred. See browser dev tools for details.
-
-
Reload
-
🗙
-
-
-
-
-
diff --git a/docs/LumexUI.Docs.Server/Pages/_WebAssemblyHost.cshtml b/docs/LumexUI.Docs.Server/Pages/_WebAssemblyHost.cshtml
deleted file mode 100644
index 4029616a..00000000
--- a/docs/LumexUI.Docs.Server/Pages/_WebAssemblyHost.cshtml
+++ /dev/null
@@ -1,25 +0,0 @@
-@page
-
-
-
-
-
-
- LumexUI - Blazor Components Library
-
-
-
-
-
- Loading...
-
-
- An unhandled error has occurred.
-
Reload
-
🗙
-
-
-
-
-
-
diff --git a/docs/LumexUI.Docs.Server/Program.cs b/docs/LumexUI.Docs.Server/Program.cs
deleted file mode 100644
index 81e089c3..00000000
--- a/docs/LumexUI.Docs.Server/Program.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (c) LumexUI 2024
-// LumexUI licenses this file to you under the MIT license
-// See the license here https://github.com/LumexUI/lumexui/blob/main/LICENSE
-
-using TailwindMerge.Extensions;
-
-var builder = WebApplication.CreateBuilder( args );
-
-// Add services to the container.
-
-builder.Services.AddControllersWithViews();
-builder.Services.AddRazorPages();
-builder.Services.AddServerSideBlazor();
-builder.Services.AddTailwindMerge();
-
-var app = builder.Build();
-
-// Configure the HTTP request pipeline.
-if( app.Environment.IsDevelopment() )
-{
-#if ENABLE_WASM_HOSTING
- app.UseWebAssemblyDebugging();
-#endif
-}
-else
-{
- app.UseExceptionHandler( "/Error" );
- // 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.UseHttpsRedirection();
-app.UseRouting();
-app.MapRazorPages();
-app.MapControllers();
-
-#if ENABLE_WASM_HOSTING
-ApplyHotReloadWorkaround( app );
-app.Map( "/webassembly", app =>
-{
- app.UseBlazorFrameworkFiles();
- app.UseStaticFiles();
- app.UseEndpoints( e => e.MapFallbackToPage( "webassembly/{*path:nonfile}", "/_WebAssemblyHost" ) );
-} );
-
-// This is a temporary workaround needed until the next patch release of ASP.NET Core
-// The underlying bug was fixed in https://github.com/dotnet/sdk/pull/25534 but that update hasn't shipped yet
-void ApplyHotReloadWorkaround( WebApplication app )
-{
- app.Use( ( ctx, next ) =>
- {
- if( ctx.Request.Path == "/webassembly/_framework/blazor-hotreload" )
- {
- ctx.Response.Redirect( "/_framework/blazor-hotreload" );
- return Task.CompletedTask;
- }
-
- return next( ctx );
- } );
-}
-#endif
-
-app.Map( "/server", app =>
-{
- app.UseStaticFiles();
- app.UseEndpoints( endpoints => endpoints.MapBlazorHub( "/server/_blazor" ) );
- app.UseEndpoints( e => e.MapFallbackToPage( "server/{*path:nonfile}", "/_ServerHost" ) );
-} );
-
-app.Run();
diff --git a/docs/LumexUI.Docs/App.razor b/docs/LumexUI.Docs/App.razor
deleted file mode 100644
index 032a3fb0..00000000
--- a/docs/LumexUI.Docs/App.razor
+++ /dev/null
@@ -1,14 +0,0 @@
-@namespace LumexUI.Docs
-
-
-
-
-
-
-
- Not found
-
- Sorry, there's nothing at this address.
-
-
-
diff --git a/docs/LumexUI.Docs/LumexUI.Docs.Client/LumexUI.Docs.Client.csproj b/docs/LumexUI.Docs/LumexUI.Docs.Client/LumexUI.Docs.Client.csproj
new file mode 100644
index 00000000..1bf3df35
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs.Client/LumexUI.Docs.Client.csproj
@@ -0,0 +1,15 @@
+
+
+
+ net8.0
+ enable
+ enable
+ true
+ Default
+
+
+
+
+
+
+
diff --git a/docs/LumexUI.Docs/LumexUI.Docs.Client/Pages/Counter.razor b/docs/LumexUI.Docs/LumexUI.Docs.Client/Pages/Counter.razor
new file mode 100644
index 00000000..e7d4f94e
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs.Client/Pages/Counter.razor
@@ -0,0 +1,19 @@
+@page "/counter"
+@rendermode InteractiveAuto
+
+Counter
+
+Counter
+
+Current count: @currentCount
+
+Click me
+
+@code {
+ private int currentCount = 0;
+
+ private void IncrementCount()
+ {
+ currentCount++;
+ }
+}
diff --git a/docs/LumexUI.Docs/LumexUI.Docs.Client/Program.cs b/docs/LumexUI.Docs/LumexUI.Docs.Client/Program.cs
new file mode 100644
index 00000000..a427b83d
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs.Client/Program.cs
@@ -0,0 +1,11 @@
+using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
+
+internal class Program
+{
+ private static async global::System.Threading.Tasks.Task Main( string[] args )
+ {
+ var builder = WebAssemblyHostBuilder.CreateDefault( args );
+
+ await builder.Build().RunAsync();
+ }
+}
\ No newline at end of file
diff --git a/docs/LumexUI.Docs/LumexUI.Docs.Client/_Imports.razor b/docs/LumexUI.Docs/LumexUI.Docs.Client/_Imports.razor
new file mode 100644
index 00000000..7698a6be
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs.Client/_Imports.razor
@@ -0,0 +1,11 @@
+@using System.Net.Http
+@using System.Net.Http.Json
+
+@using Microsoft.AspNetCore.Components.Forms
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.AspNetCore.Components.Web
+@using static Microsoft.AspNetCore.Components.Web.RenderMode
+@using Microsoft.AspNetCore.Components.Web.Virtualization
+@using Microsoft.JSInterop
+
+@using LumexUI.Docs.Client
diff --git a/docs/LumexUI.Docs.Server/appsettings.Development.json b/docs/LumexUI.Docs/LumexUI.Docs.Client/wwwroot/appsettings.Development.json
similarity index 100%
rename from docs/LumexUI.Docs.Server/appsettings.Development.json
rename to docs/LumexUI.Docs/LumexUI.Docs.Client/wwwroot/appsettings.Development.json
diff --git a/docs/LumexUI.Docs/LumexUI.Docs.Client/wwwroot/appsettings.json b/docs/LumexUI.Docs/LumexUI.Docs.Client/wwwroot/appsettings.json
new file mode 100644
index 00000000..0c208ae9
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs.Client/wwwroot/appsettings.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/docs/LumexUI.Docs/LumexUI.Docs.csproj b/docs/LumexUI.Docs/LumexUI.Docs.csproj
deleted file mode 100644
index 0ec99678..00000000
--- a/docs/LumexUI.Docs/LumexUI.Docs.csproj
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
- net8.0
- enable
- enable
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/App.razor b/docs/LumexUI.Docs/LumexUI.Docs/Components/App.razor
new file mode 100644
index 00000000..7d33ac53
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/App.razor
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/MainLayout.razor b/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/MainLayout.razor
new file mode 100644
index 00000000..5a24bb13
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/MainLayout.razor
@@ -0,0 +1,23 @@
+@inherits LayoutComponentBase
+
+
+
+
+
+
+
+
+ @Body
+
+
+
+
+
+ An unhandled error has occurred.
+
Reload
+
🗙
+
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/MainLayout.razor.css b/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/MainLayout.razor.css
new file mode 100644
index 00000000..038baf17
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/MainLayout.razor.css
@@ -0,0 +1,96 @@
+.page {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+}
+
+main {
+ flex: 1;
+}
+
+.sidebar {
+ background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
+}
+
+.top-row {
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #d6d5d5;
+ justify-content: flex-end;
+ height: 3.5rem;
+ display: flex;
+ align-items: center;
+}
+
+ .top-row ::deep a, .top-row ::deep .btn-link {
+ white-space: nowrap;
+ margin-left: 1.5rem;
+ text-decoration: none;
+ }
+
+ .top-row ::deep a:hover, .top-row ::deep .btn-link:hover {
+ text-decoration: underline;
+ }
+
+ .top-row ::deep a:first-child {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+
+@media (max-width: 640.98px) {
+ .top-row {
+ justify-content: space-between;
+ }
+
+ .top-row ::deep a, .top-row ::deep .btn-link {
+ margin-left: 0;
+ }
+}
+
+@media (min-width: 641px) {
+ .page {
+ flex-direction: row;
+ }
+
+ .sidebar {
+ width: 250px;
+ height: 100vh;
+ position: sticky;
+ top: 0;
+ }
+
+ .top-row {
+ position: sticky;
+ top: 0;
+ z-index: 1;
+ }
+
+ .top-row.auth ::deep a:first-child {
+ flex: 1;
+ text-align: right;
+ width: 0;
+ }
+
+ .top-row, article {
+ padding-left: 2rem !important;
+ padding-right: 1.5rem !important;
+ }
+}
+
+#blazor-error-ui {
+ background: lightyellow;
+ bottom: 0;
+ box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
+ display: none;
+ left: 0;
+ padding: 0.6rem 1.25rem 0.7rem 1.25rem;
+ position: fixed;
+ width: 100%;
+ z-index: 1000;
+}
+
+ #blazor-error-ui .dismiss {
+ cursor: pointer;
+ position: absolute;
+ right: 0.75rem;
+ top: 0.5rem;
+ }
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/NavMenu.razor b/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/NavMenu.razor
new file mode 100644
index 00000000..58217305
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/NavMenu.razor
@@ -0,0 +1,30 @@
+
+
+
+
+
+
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/NavMenu.razor.css b/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/NavMenu.razor.css
new file mode 100644
index 00000000..4e15395e
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/Layout/NavMenu.razor.css
@@ -0,0 +1,105 @@
+.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 {
+ 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;
+ }
+}
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/Pages/Error.razor b/docs/LumexUI.Docs/LumexUI.Docs/Components/Pages/Error.razor
new file mode 100644
index 00000000..576cc2d2
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/Pages/Error.razor
@@ -0,0 +1,36 @@
+@page "/Error"
+@using System.Diagnostics
+
+Error
+
+Error.
+An error occurred while processing your request.
+
+@if (ShowRequestId)
+{
+
+ Request ID: @RequestId
+
+}
+
+Development Mode
+
+ Swapping to Development environment will display more detailed information about the error that occurred.
+
+
+ The Development environment shouldn't be enabled for deployed applications.
+ It can result in displaying sensitive information from exceptions to end users.
+ For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development
+ and restarting the app.
+
+
+@code{
+ [CascadingParameter]
+ private HttpContext? HttpContext { get; set; }
+
+ private string? RequestId { get; set; }
+ private bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
+
+ protected override void OnInitialized() =>
+ RequestId = Activity.Current?.Id ?? HttpContext?.TraceIdentifier;
+}
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/Pages/Home.razor b/docs/LumexUI.Docs/LumexUI.Docs/Components/Pages/Home.razor
new file mode 100644
index 00000000..9001e0bd
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/Pages/Home.razor
@@ -0,0 +1,7 @@
+@page "/"
+
+Home
+
+Hello, world!
+
+Welcome to your new app.
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/Pages/Weather.razor b/docs/LumexUI.Docs/LumexUI.Docs/Components/Pages/Weather.razor
new file mode 100644
index 00000000..43a1ecbe
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/Pages/Weather.razor
@@ -0,0 +1,64 @@
+@page "/weather"
+@attribute [StreamRendering]
+
+Weather
+
+Weather
+
+This component demonstrates showing data.
+
+@if (forecasts == null)
+{
+ Loading...
+}
+else
+{
+
+
+
+ Date
+ Temp. (C)
+ Temp. (F)
+ Summary
+
+
+
+ @foreach (var forecast in forecasts)
+ {
+
+ @forecast.Date.ToShortDateString()
+ @forecast.TemperatureC
+ @forecast.TemperatureF
+ @forecast.Summary
+
+ }
+
+
+}
+
+@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);
+ }
+}
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/Routes.razor b/docs/LumexUI.Docs/LumexUI.Docs/Components/Routes.razor
new file mode 100644
index 00000000..d39c7e89
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/Routes.razor
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Components/_Imports.razor b/docs/LumexUI.Docs/LumexUI.Docs/Components/_Imports.razor
new file mode 100644
index 00000000..6fb638f4
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Components/_Imports.razor
@@ -0,0 +1,11 @@
+@using System.Net.Http
+@using System.Net.Http.Json
+@using Microsoft.AspNetCore.Components.Forms
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.AspNetCore.Components.Web
+@using static Microsoft.AspNetCore.Components.Web.RenderMode
+@using Microsoft.AspNetCore.Components.Web.Virtualization
+@using Microsoft.JSInterop
+@using LumexUI.Docs
+@using LumexUI.Docs.Client
+@using LumexUI.Docs.Components
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/LumexUI.Docs.csproj b/docs/LumexUI.Docs/LumexUI.Docs/LumexUI.Docs.csproj
new file mode 100644
index 00000000..6d9463eb
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/LumexUI.Docs.csproj
@@ -0,0 +1,14 @@
+
+
+
+ net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/Program.cs b/docs/LumexUI.Docs/LumexUI.Docs/Program.cs
new file mode 100644
index 00000000..d1684d4e
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Program.cs
@@ -0,0 +1,41 @@
+using LumexUI.Docs.Client.Pages;
+using LumexUI.Docs.Components;
+
+internal class Program
+{
+ private static void Main( string[] args )
+ {
+ var builder = WebApplication.CreateBuilder( args );
+
+ // Add services to the container.
+ builder.Services.AddRazorComponents()
+ .AddInteractiveServerComponents()
+ .AddInteractiveWebAssemblyComponents();
+
+ var app = builder.Build();
+
+ // Configure the HTTP request pipeline.
+ if( app.Environment.IsDevelopment() )
+ {
+ app.UseWebAssemblyDebugging();
+ }
+ else
+ {
+ app.UseExceptionHandler( "/Error", createScopeForErrors: true );
+ // 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.UseHttpsRedirection();
+
+ app.UseStaticFiles();
+ app.UseAntiforgery();
+
+ app.MapRazorComponents()
+ .AddInteractiveServerRenderMode()
+ .AddInteractiveWebAssemblyRenderMode()
+ .AddAdditionalAssemblies( typeof( LumexUI.Docs.Client._Imports ).Assembly );
+
+ app.Run();
+ }
+}
\ No newline at end of file
diff --git a/docs/LumexUI.Docs.Server/Properties/launchSettings.json b/docs/LumexUI.Docs/LumexUI.Docs/Properties/launchSettings.json
similarity index 56%
rename from docs/LumexUI.Docs.Server/Properties/launchSettings.json
rename to docs/LumexUI.Docs/LumexUI.Docs/Properties/launchSettings.json
index 55ed3cab..ded3d5c5 100644
--- a/docs/LumexUI.Docs.Server/Properties/launchSettings.json
+++ b/docs/LumexUI.Docs/LumexUI.Docs/Properties/launchSettings.json
@@ -1,19 +1,30 @@
{
+ "$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
- "applicationUrl": "http://localhost:51561",
- "sslPort": 44341
+ "applicationUrl": "http://localhost:8548",
+ "sslPort": 44335
}
},
"profiles": {
- "LumexUI.Docs.Server": {
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
- "applicationUrl": "https://localhost:7039;http://localhost:5015",
+ "applicationUrl": "http://localhost:5227",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "applicationUrl": "https://localhost:7062;http://localhost:5227",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/appsettings.Development.json b/docs/LumexUI.Docs/LumexUI.Docs/appsettings.Development.json
new file mode 100644
index 00000000..0c208ae9
--- /dev/null
+++ b/docs/LumexUI.Docs/LumexUI.Docs/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/docs/LumexUI.Docs.Server/appsettings.json b/docs/LumexUI.Docs/LumexUI.Docs/appsettings.json
similarity index 100%
rename from docs/LumexUI.Docs.Server/appsettings.json
rename to docs/LumexUI.Docs/LumexUI.Docs/appsettings.json
diff --git a/docs/LumexUI.Docs/Styles/globals.css b/docs/LumexUI.Docs/LumexUI.Docs/wwwroot/app.css
similarity index 73%
rename from docs/LumexUI.Docs/Styles/globals.css
rename to docs/LumexUI.Docs/LumexUI.Docs/wwwroot/app.css
index 33bfd8cd..2bd9b789 100644
--- a/docs/LumexUI.Docs/Styles/globals.css
+++ b/docs/LumexUI.Docs/LumexUI.Docs/wwwroot/app.css
@@ -1,25 +1,40 @@
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
-
-#blazor-error-ui {
- background: lightyellow;
- bottom: 0;
- box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
- display: none;
- left: 0;
- padding: 0.6rem 1.25rem 0.7rem 1.25rem;
- position: fixed;
- width: 100%;
- z-index: 1000;
-}
-
- #blazor-error-ui .dismiss {
- cursor: pointer;
- position: absolute;
- right: 0.75rem;
- top: 0.5rem;
- }
+html, body {
+ font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+}
+
+a, .btn-link {
+ color: #006bb7;
+}
+
+.btn-primary {
+ color: #fff;
+ background-color: #1b6ec2;
+ border-color: #1861ac;
+}
+
+.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;
+}
+
+.content {
+ padding-top: 1.1rem;
+}
+
+h1:focus {
+ outline: none;
+}
+
+.valid.modified:not([type=checkbox]) {
+ outline: 1px solid #26b050;
+}
+
+.invalid {
+ outline: 1px solid #e50000;
+}
+
+.validation-message {
+ color: #e50000;
+}
.blazor-error-boundary {
background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
@@ -30,3 +45,7 @@
.blazor-error-boundary::after {
content: "An error has occurred."
}
+
+.darker-border-checkbox.form-check-input {
+ border-color: #929292;
+}
diff --git a/docs/LumexUI.Docs/LumexUI.Docs/wwwroot/favicon.png b/docs/LumexUI.Docs/LumexUI.Docs/wwwroot/favicon.png
new file mode 100644
index 00000000..8422b596
Binary files /dev/null and b/docs/LumexUI.Docs/LumexUI.Docs/wwwroot/favicon.png differ
diff --git a/docs/LumexUI.Docs/Shared/MainLayout.razor b/docs/LumexUI.Docs/Shared/MainLayout.razor
deleted file mode 100644
index 0830b493..00000000
--- a/docs/LumexUI.Docs/Shared/MainLayout.razor
+++ /dev/null
@@ -1 +0,0 @@
-@inherits LayoutComponentBase
diff --git a/docs/LumexUI.Docs/_Imports.razor b/docs/LumexUI.Docs/_Imports.razor
deleted file mode 100644
index 3f9d344f..00000000
--- a/docs/LumexUI.Docs/_Imports.razor
+++ /dev/null
@@ -1,6 +0,0 @@
-@using Microsoft.AspNetCore.Components.Web
-@using Microsoft.AspNetCore.Components.Routing
-@using Microsoft.AspNetCore.Components.Rendering
-@using Microsoft.JSInterop
-
-@using LumexUI.Docs.Shared
diff --git a/docs/LumexUI.Docs/tailwind.config.js b/docs/LumexUI.Docs/tailwind.config.js
deleted file mode 100644
index d667bc2b..00000000
--- a/docs/LumexUI.Docs/tailwind.config.js
+++ /dev/null
@@ -1,174 +0,0 @@
-/** @type {import('tailwindcss').Config} */
-module.exports = {
- content: [
- "./Shared/**/*.razor",
- "../../src/LumexUI/Styles/*.cs"
- ],
- theme: {
- extend: {
- colors: {
- /** Base */
- background: {
- DEFAULT: "hsl(var(--lumex-background) / )"
- },
- foreground: {
- 50: "hsl(var(--lumex-foreground-50) / )",
- 100: "hsl(var(--lumex-foreground-100) / )",
- 200: "hsl(var(--lumex-foreground-200) / )",
- 300: "hsl(var(--lumex-foreground-300) / )",
- 400: "hsl(var(--lumex-foreground-400) / )",
- 500: "hsl(var(--lumex-foreground-500) / )",
- 600: "hsl(var(--lumex-foreground-600) / )",
- 700: "hsl(var(--lumex-foreground-700) / )",
- 800: "hsl(var(--lumex-foreground-800) / )",
- 900: "hsl(var(--lumex-foreground-900) / )",
- DEFAULT: "hsl(var(--lumex-foreground) / )"
- },
- focus: {
- DEFAULT: "hsl(var(--lumex-focus) / )"
- },
- overlay: {
- DEFAULT: "hsl(var(--lumex-overlay) / )"
- },
- divider: {
- DEFAULT: "hsl(var(--lumex-divider) / var(--lumex-divider-opacity ,))"
- },
-
- /** Default */
- default: {
- 50: "hsl(var(--lumex-default-50) / )",
- 100: "hsl(var(--lumex-default-100) / )",
- 200: "hsl(var(--lumex-default-200) / )",
- 300: "hsl(var(--lumex-default-300) / )",
- 400: "hsl(var(--lumex-default-400) / )",
- 500: "hsl(var(--lumex-default-500) / )",
- 600: "hsl(var(--lumex-default-600) / )",
- 700: "hsl(var(--lumex-default-700) / )",
- 800: "hsl(var(--lumex-default-800) / )",
- 900: "hsl(var(--lumex-default-900) / )",
- DEFAULT: "hsl(var(--lumex-default) / )",
- foreground: "hsl(var(--lumex-default-foreground) / )"
- },
-
- /** Primary */
- primary: {
- 50: "hsl(var(--lumex-primary-50) / )",
- 100: "hsl(var(--lumex-primary-100) / )",
- 200: "hsl(var(--lumex-primary-200) / )",
- 300: "hsl(var(--lumex-primary-300) / )",
- 400: "hsl(var(--lumex-primary-400) / )",
- 500: "hsl(var(--lumex-primary-500) / )",
- 600: "hsl(var(--lumex-primary-600) / )",
- 700: "hsl(var(--lumex-primary-700) / )",
- 800: "hsl(var(--lumex-primary-800) / )",
- 900: "hsl(var(--lumex-primary-900) / )",
- DEFAULT: "hsl(var(--lumex-primary) / )",
- foreground: "hsl(var(--lumex-primary-foreground) / )"
- },
-
- /** Secondary */
- secondary: {
- 50: "hsl(var(--lumex-secondary-50) / )",
- 100: "hsl(var(--lumex-secondary-100) / )",
- 200: "hsl(var(--lumex-secondary-200) / )",
- 300: "hsl(var(--lumex-secondary-300) / )",
- 400: "hsl(var(--lumex-secondary-400) / )",
- 500: "hsl(var(--lumex-secondary-500) / )",
- 600: "hsl(var(--lumex-secondary-600) / )",
- 700: "hsl(var(--lumex-secondary-700) / )",
- 800: "hsl(var(--lumex-secondary-800) / )",
- 900: "hsl(var(--lumex-secondary-900) / )",
- DEFAULT: "hsl(var(--lumex-secondary) / )",
- foreground: "hsl(var(--lumex-secondary-foreground) / )"
- },
-
- /** Success */
- success: {
- 50: "hsl(var(--lumex-success-50) / )",
- 100: "hsl(var(--lumex-success-100) / )",
- 200: "hsl(var(--lumex-success-200) / )",
- 300: "hsl(var(--lumex-success-300) / )",
- 400: "hsl(var(--lumex-success-400) / )",
- 500: "hsl(var(--lumex-success-500) / )",
- 600: "hsl(var(--lumex-success-600) / )",
- 700: "hsl(var(--lumex-success-700) / )",
- 800: "hsl(var(--lumex-success-800) / )",
- 900: "hsl(var(--lumex-success-900) / )",
- DEFAULT: "hsl(var(--lumex-success) / )",
- foreground: "hsl(var(--lumex-success-foreground) / )"
- },
-
- /** Warning */
- warning: {
- 50: "hsl(var(--lumex-warning-50) / )",
- 100: "hsl(var(--lumex-warning-100) / )",
- 200: "hsl(var(--lumex-warning-200) / )",
- 300: "hsl(var(--lumex-warning-300) / )",
- 400: "hsl(var(--lumex-warning-400) / )",
- 500: "hsl(var(--lumex-warning-500) / )",
- 600: "hsl(var(--lumex-warning-600) / )",
- 700: "hsl(var(--lumex-warning-700) / )",
- 800: "hsl(var(--lumex-warning-800) / )",
- 900: "hsl(var(--lumex-warning-900) / )",
- DEFAULT: "hsl(var(--lumex-warning) / )",
- foreground: "hsl(var(--lumex-warning-foreground) / )"
- },
-
- /** Danger */
- danger: {
- 50: "hsl(var(--lumex-danger-50) / )",
- 100: "hsl(var(--lumex-danger-100) / )",
- 200: "hsl(var(--lumex-danger-200) / )",
- 300: "hsl(var(--lumex-danger-300) / )",
- 400: "hsl(var(--lumex-danger-400) / )",
- 500: "hsl(var(--lumex-danger-500) / )",
- 600: "hsl(var(--lumex-danger-600) / )",
- 700: "hsl(var(--lumex-danger-700) / )",
- 800: "hsl(var(--lumex-danger-800) / )",
- 900: "hsl(var(--lumex-danger-900) / )",
- DEFAULT: "hsl(var(--lumex-danger) / )",
- foreground: "hsl(var(--lumex-danger-foreground) / )"
- },
-
- /** Info */
- info: {
- 50: "hsl(var(--lumex-info-50) / )",
- 100: "hsl(var(--lumex-info-100) / )",
- 200: "hsl(var(--lumex-info-200) / )",
- 300: "hsl(var(--lumex-info-300) / )",
- 400: "hsl(var(--lumex-info-400) / )",
- 500: "hsl(var(--lumex-info-500) / )",
- 600: "hsl(var(--lumex-info-600) / )",
- 700: "hsl(var(--lumex-info-700) / )",
- 800: "hsl(var(--lumex-info-800) / )",
- 900: "hsl(var(--lumex-info-900) / )",
- DEFAULT: "hsl(var(--lumex-info) / )",
- foreground: "hsl(var(--lumex-info-foreground) / )"
- }
- },
- fontSize: {
- tiny: ["var(--lumex-font-size-tiny)", "var(--lumex-line-height-tiny)"],
- small: ["var(--lumex-font-size-small)", "var(--lumex-line-height-small)"],
- medium: ["var(--lumex-font-size-medium)", "var(--lumex-line-height-medium)"],
- large: ["var(--lumex-font-size-large)", "var(--lumex-line-height-large)"]
- },
- borderRadius: {
- small: "var(--lumex-radius-small)",
- medium: "var(--lumex-radius-medium)",
- large: "var(--lumex-radius-large)"
- },
- boxShadow: {
- small: "var(--lumex-box-shadow-small)",
- medium: "var(--lumex-box-shadow-medium)",
- large: "var(--lumex-box-shadow-large)"
- },
- opacity: {
- divider: "var(--lumex-divider-opacity)",
- disabled: "var(--lumex-disabled-opacity)",
- focus: "var(--lumex-focus-opacity)",
- hover: "var(--lumex-hover-opacity)"
- },
- },
- },
- plugins: [],
-}
diff --git a/docs/LumexUI.Docs/wwwroot/assets/fonts/FiraCode-VariableFont_wght.ttf b/docs/LumexUI.Docs/wwwroot/assets/fonts/FiraCode-VariableFont_wght.ttf
deleted file mode 100644
index 5655ed51..00000000
Binary files a/docs/LumexUI.Docs/wwwroot/assets/fonts/FiraCode-VariableFont_wght.ttf and /dev/null differ
diff --git a/docs/LumexUI.Docs/wwwroot/assets/fonts/Inter-VariableFont_slnt,wght.ttf b/docs/LumexUI.Docs/wwwroot/assets/fonts/Inter-VariableFont_slnt,wght.ttf
deleted file mode 100644
index e7247087..00000000
Binary files a/docs/LumexUI.Docs/wwwroot/assets/fonts/Inter-VariableFont_slnt,wght.ttf and /dev/null differ