Compare commits

...

10 Commits

Author SHA1 Message Date
Christopher Meinhold
1f44071010 Merge branch 'main' of https://dev.azure.com/HenryLambertz/Entwicklung_BLAZOR/_git/Entwicklung_BLAZOR 2026-03-13 11:17:22 +01:00
Christopher Meinhold
abd137e395 WerksverkaufScanner: KeepAlive eingebaut 2026-03-13 11:17:08 +01:00
Rüdiger Vossel
a09bcdfc66 Entwicklung BALZOR: DevExpress 25.2 2026-02-19 08:51:04 +01:00
Rüdiger Vossel
f9ffb2689a ScannerPilot: <script src="js/bootstrap.bundle.min.js"
crossorigin="anonymous"></script>
2025-12-23 14:54:00 +01:00
Rüdiger Vossel
916077d7d5 . 2025-12-23 12:33:39 +01:00
Rüdiger Vossel
f4c9843959 .gitignore: packages werden jetzt mit synchronisiert 2025-12-19 17:08:47 +01:00
Christopher Meinhold
7866658a43 WerksverkaufScanner: OnFocusBarcode Feld leeren 2025-12-19 08:47:37 +01:00
Christopher Meinhold
2c2e9b40b2 WerksverkaufScanner: Artikelnummer/EAN nach Scannen im Feld stehen lassen, außer bei Fehler 2025-12-19 08:41:45 +01:00
Christopher Meinhold
14a8b6e6f6 Blazor: WerksverkaufScanner auf Echtsystem eingestellt, TestRibbon init 2025-12-18 11:23:39 +01:00
Christopher Meinhold
08aa9bf7f3 WerksverkaufScanner: ClientIP im Release hart verdrahtet 2025-12-09 15:52:39 +01:00
246 changed files with 18211 additions and 157 deletions

2
.gitignore vendored
View File

@ -197,7 +197,7 @@ PublishScripts/
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
#**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36915.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambertzPortal", "LambertzPortal\LambertzPortal.csproj", "{9D60011D-2360-4DDC-AF43-7DF73D9FD56B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9D60011D-2360-4DDC-AF43-7DF73D9FD56B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9D60011D-2360-4DDC-AF43-7DF73D9FD56B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9D60011D-2360-4DDC-AF43-7DF73D9FD56B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9D60011D-2360-4DDC-AF43-7DF73D9FD56B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {EDE6A789-B03B-4ECC-8537-71244B497B07}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,38 @@
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@inject IFileVersionProvider FileVersionProvider
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/" />
@DxResourceManager.RegisterTheme(ActiveTheme)
@DxResourceManager.RegisterScripts()
<link href=@AppendVersion("css/site.css") rel="stylesheet" />
<link href=@AppendVersion("LambertzPortal.styles.css") rel="stylesheet" />
<HeadOutlet @rendermode="InteractiveServer" />
</head>
<body>
<Routes @rendermode="InteractiveServer" />
<script src="_framework/blazor.web.js"></script>
</body>
</html>
@code {
static readonly ITheme ActiveTheme = Themes.Fluent.Clone(properties =>
{
properties.Mode = ThemeMode.Light;
});
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
private string AppendVersion(string path)
=> FileVersionProvider.AddFileVersionToPath(
HttpContext.Request.PathBase.HasValue
? HttpContext.Request.PathBase.Value
: "/",
path);
}

View File

@ -0,0 +1,38 @@
@inherits DrawerStateComponentBase
<div class="drawer-container">
<DxDrawer PanelWidth="@PanelWidth"
CssClass="@(CssClass + " mobile")"
Mode="DrawerMode.Overlap"
IsOpen="@ToggledDrawer"
BodyTemplate="BodyTemplate"
HeaderTemplate="HeaderTemplate"
FooterTemplate="FooterTemplate"
ApplyBackgroundShading="false"
ClosedCssClass="panel-closed">
<TargetContent>
<DxDrawer PanelWidth="@PanelWidth"
CssClass="@CssClass"
Mode="DrawerMode.Shrink"
IsOpen="@(!ToggledDrawer)"
BodyTemplate="BodyTemplate"
HeaderTemplate="HeaderTemplate"
FooterTemplate="FooterTemplate"
OpenCssClass="panel-open">
<TargetContent>
<div class="navigation-drawer-shading"></div>
@TargetContent
</TargetContent>
</DxDrawer>
</TargetContent>
</DxDrawer>
</div>
@code {
[Parameter] public string? CssClass { get; set; }
[Parameter] public string? PanelWidth { get; set; }
[Parameter] public RenderFragment? TargetContent { get; set; }
[Parameter] public RenderFragment? BodyTemplate { get; set; }
[Parameter] public RenderFragment? HeaderTemplate { get; set; }
[Parameter] public RenderFragment? FooterTemplate { get; set; }
}

View File

@ -0,0 +1,53 @@
.drawer-container {
height: 100%;
}
.navigation-drawer-shading {
height: 100%;
position: absolute;
transition: ease 300ms;
transition-property: opacity, visibility;
visibility: visible;
width: 100%;
z-index: 99;
background-color: var(--dxds-color-surface-backdrop-default-rest);
}
.navigation-drawer.mobile.panel-closed .navigation-drawer-shading {
opacity: 0;
visibility: hidden;
}
::deep .navigation-drawer > .dxbl-drawer-panel {
display: flex;
}
::deep .navigation-drawer.mobile > .dxbl-drawer-panel {
display: none;
}
.navigation-drawer-shading {
display: none;
}
::deep .panel-open:not(.mobile) .nav-buttons-container .menu-button {
display: none;
}
@media (max-width: 768px) {
::deep .navigation-drawer > .dxbl-drawer-panel {
display: none;
}
::deep .navigation-drawer.mobile > .dxbl-drawer-panel {
display: flex;
}
.navigation-drawer-shading {
display: block;
}
::deep .panel-open:not(.mobile) .nav-buttons-container .menu-button {
display: flex;
}
}

View File

@ -0,0 +1,53 @@
@inherits DrawerStateLayoutComponentBase
@inject NavigationManager NavigationManager
<div class="page">
<Drawer CssClass="navigation-drawer" PanelWidth="240px">
<HeaderTemplate>
<div class="navigation-drawer-header">
<NavLink href="@AddDrawerStateToUrl("/")">
<img class="logo" src="images/logo.svg" alt="DevExpress logo" />
</NavLink>
<NavLink aria-label="Close menu" href="@AddDrawerStateToUrlToggled(LocalPath)">
<DxButton aria-label="Close menu" RenderStyle="ButtonRenderStyle.Light" RenderStyleMode="ButtonRenderStyleMode.Text" CssClass="btn-icon-only" IconCssClass="@(ToggledDrawer ? "icon icon-close" : "icon icon-menu")"></DxButton>
</NavLink>
</div>
</HeaderTemplate>
<BodyTemplate>
<div class="w-100">
<NavMenu></NavMenu>
</div>
</BodyTemplate>
<FooterTemplate>
<div class="navigation-drawer-footer">
<NavLink href="https://docs.devexpress.com/Blazor/400725/blazor-components" class="button-link">
<DxButton Text="Docs" RenderStyle="ButtonRenderStyle.Light" RenderStyleMode="ButtonRenderStyleMode.Text" IconCssClass="icon icon-docs"></DxButton>
</NavLink>
<NavLink href="https://demos.devexpress.com/blazor/" class="button-link">
<DxButton Text="Demos" RenderStyle="ButtonRenderStyle.Light" RenderStyleMode="ButtonRenderStyleMode.Text" IconCssClass="icon icon-demos"></DxButton>
</NavLink>
</div>
</FooterTemplate>
<TargetContent>
<div class="drawer-content">
<div class="nav-buttons-container">
<NavLink aria-label="Open menu" href="@AddDrawerStateToUrlToggled(LocalPath)" class="menu-button">
<DxButton aria-label="Open menu" RenderStyle="ButtonRenderStyle.Secondary" RenderStyleMode="ButtonRenderStyleMode.Text" CssClass="btn-icon-only" IconCssClass="icon icon-menu"></DxButton>
</NavLink>
@if (LocalPath != "/") {
<NavLink href="@AddDrawerStateToUrl("/")" class="button-link">
<DxButton Text="Back to Home" RenderStyle="ButtonRenderStyle.Secondary" RenderStyleMode="ButtonRenderStyleMode.Text" CssClass="back-button" IconCssClass="icon icon-back"></DxButton>
</NavLink>
}
</div>
<div class="page-content-container">
@Body
</div>
</div>
</TargetContent>
</Drawer>
</div>
@code {
string LocalPath => new Uri(NavigationManager.Uri).LocalPath;
}

View File

@ -0,0 +1,67 @@
.page {
height: 100%;
min-height: 0;
}
::deep .navigation-drawer {
--dxbl-drawer-panel-body-padding-x: 0;
--dxbl-drawer-panel-body-padding-y: 1rem;
--dxbl-drawer-panel-footer-bg: none;
--dxbl-drawer-panel-header-bg: none;
--dxbl-drawer-separator-border-width: 0;
}
::deep .navigation-drawer > .dxbl-drawer-panel {
background-image: linear-gradient(180deg, var(--dxds-color-surface-primary-default-rest) 0%, var(--dxds-primary-170) 150%);
}
.navigation-drawer-header {
align-items: center;
display: flex;
justify-content: space-between;
padding: 1.375rem 0.375rem;
width: 100%;
}
.navigation-drawer-header .logo {
height: 1.5rem;
width: 9rem;
}
.navigation-drawer-footer {
display: flex;
justify-content: space-evenly;
padding-bottom: 0.875rem;
width: 100%;
}
.drawer-content {
display: flex;
flex-direction: column;
height: 100%;
overflow: auto;
padding: 2rem 1.5rem 1.5rem 1.5rem;
}
.nav-buttons-container {
align-items: center;
display: flex;
gap: 0.625rem;
min-height: 2rem;
}
::deep .nav-buttons-container > a {
color: inherit;
}
::deep .nav-buttons-container .back-button {
padding-left: 0;
padding-right: 0.25rem;
}
.page-content-container {
display: flex;
flex-direction: column;
flex-grow: 1;
min-height: 0;
}

View File

@ -0,0 +1,34 @@
@inject NavigationManager NavigationManager
@implements IDisposable
<div>
<DxMenu Orientation="@Orientation.Vertical" CssClass="menu">
<Items>
<DxMenuItem NavigateUrl="/" Text="Home" CssClass="@MenuItemCssClass("/")" IconCssClass="icon icon-home"></DxMenuItem>
<DxMenuItem NavigateUrl="/pvk" Text="Personalverkauf" Target="_blank" CssClass="@MenuItemCssClass("/pvk")" IconCssClass="icon icon-counter"></DxMenuItem>
<DxMenuItem NavigateUrl="/controlling" Text="Controlling" Target="_blank" CssClass="@MenuItemCssClass("/controlling")" IconCssClass="icon icon-weather"></DxMenuItem>
</Items>
</DxMenu>
</div>
@code {
private string? currentLocalPath;
protected override void OnInitialized() {
currentLocalPath = new Uri(NavigationManager.Uri).LocalPath;
NavigationManager.LocationChanged += OnLocationChanged;
}
private void OnLocationChanged(object? sender, LocationChangedEventArgs e) {
currentLocalPath = new Uri(NavigationManager.Uri).LocalPath;
InvokeAsync(StateHasChanged);
}
private string? MenuItemCssClass(string itemPath) {
return string.Equals(currentLocalPath, itemPath, StringComparison.OrdinalIgnoreCase) ? "menu-item-active" : null;
}
public void Dispose() {
NavigationManager.LocationChanged -= OnLocationChanged;
}
}

View File

@ -0,0 +1,23 @@
::deep .menu {
--dxbl-menu-bottom-left-border-radius: 0;
--dxbl-menu-bottom-right-border-radius: 0;
--dxbl-menu-top-left-border-radius: 0;
--dxbl-menu-top-right-border-radius: 0;
--dxbl-menu-item-padding-x: 1.125rem;
--dxbl-menu-item-padding-y: 0.5rem;
--dxbl-menu-item-color: var(--dxds-color-content-neutral-default-static-dark-rest);
--dxbl-menu-item-image-color: var(--dxds-color-content-neutral-default-static-dark-rest);
--dxbl-menu-item-hover-bg: rgb(from var(--dxds-color-surface-neutral-default-static-light-rest) r g b / 0.15);
--dxbl-menu-item-hover-color: var(--dxds-color-content-neutral-default-static-dark-hovered);
--dxbl-menu-item-hover-image-color: var(--dxds-color-content-neutral-default-static-dark-hovered);
background: none;
}
::deep .menu.display-mobile {
margin-bottom: 2rem;
}
::deep .menu-item-active {
background-color: rgb(from var(--dxds-color-surface-neutral-default-static-light-rest) r g b / 0.05);
}

View File

@ -0,0 +1,24 @@
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<div class="counter-block">
<div class="counter-content">
<div class="counter-count">
@currentCount
</div>
current count
</div>
<DxButton Click="IncrementCount">Click me</DxButton>
</div>
@code {
private int currentCount;
private void IncrementCount()
{
currentCount++;
}
}

View File

@ -0,0 +1,25 @@
.counter-block {
align-items: center;
border-radius: 1rem;
display: flex;
flex-direction: column;
gap: 1.5rem;
height: 17rem;
justify-content: center;
padding: 2.5rem 1.5rem 1.5rem;
width: 16.875rem;
border: 1px solid var(--dxds-color-border-neutral-default-rest);
}
.counter-block .counter-content {
align-items: center;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.counter-block .counter-count {
font-size: 7.5rem;
font-weight: 400;
line-height: 7.75rem;
}

View File

@ -0,0 +1,36 @@
@page "/Error"
@using System.Diagnostics
<PageTitle>Error</PageTitle>
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
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>
and restarting the app.
</p>
@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;
}

View File

@ -0,0 +1,26 @@
@page "/"
<PageTitle>Welcome</PageTitle>
<div class="main-content">
<DxGridLayout CssClass="index-gridlayout">
<Rows>
<DxGridLayoutRow Height="auto" Areas="header"></DxGridLayoutRow>
<DxGridLayoutRow Height="auto" Areas="tiles"></DxGridLayoutRow>
</Rows>
<Items>
<DxGridLayoutItem Area="header" CssClass="title">
<Template>
<div class="title-header-text">Hello World!</div>
<div class="title-content-text">Welcome to your new DevExpress Blazor Application</div>
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="tiles" CssClass="tiles">
<Template>
<IndexTile NavigateUrl="/pvk" Title="Personalverkauf" OpenInNewTab="true" Description="PVK Programme" IconCssClass="icon-counter" />
<IndexTile NavigateUrl="/controlling" Title="Controlling" OpenInNewTab="true" Description="Controlling Programme" IconCssClass="icon-weather" />
</Template>
</DxGridLayoutItem>
</Items>
</DxGridLayout>
</div>

View File

@ -0,0 +1,31 @@
::deep .index-gridlayout {
container-type: inline-size;
height: auto;
margin-top: auto;
margin-bottom: auto;
padding-bottom: 9rem;
}
::deep .title {
padding-bottom: 3rem;
text-align: center;
}
::deep .tiles {
--tile-column-count: 4;
display: grid;
gap: 1rem;
grid-template-columns: repeat(var(--tile-column-count), max-content);
justify-content: center;
@container (max-width: 60.5rem) {
--tile-column-count: 3;
}
@container (max-width: 45.125rem) {
--tile-column-count: 2;
}
@container (max-width: 29.75rem) {
--tile-column-count: 1;
}
}

View File

@ -0,0 +1,119 @@
@* @inherits DrawerStateComponentBase
<div class="tile">
<NavLink href="@AddDrawerStateToUrl(NavigateUrl)">
<DxGridLayout CssClass="tile-content" ColumnSpacing="0.75rem" RowSpacing="0.75rem">
<Rows>
<DxGridLayoutRow Areas="icon title" Height="auto" />
<DxGridLayoutRow Areas="description description" Height="auto" />
</Rows>
<Columns>
<DxGridLayoutColumn Width="auto" />
<DxGridLayoutColumn />
</Columns>
<Items>
<DxGridLayoutItem Area="icon" CssClass="tile-icon">
<Template>
<div class="@("icon " + IconCssClass)" aria-hidden="true"></div>
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="title" CssClass="tile-title">
<Template>
@Title
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="description" CssClass="tile-description">
<Template>
@Description
</Template>
</DxGridLayoutItem>
</Items>
</DxGridLayout>
</NavLink>
</div>
@code {
[Parameter] public string NavigateUrl { get; set; } = string.Empty;
[Parameter] public string? Title { get; set; }
[Parameter] public string? Description { get; set; }
[Parameter] public string? IconCssClass { get; set; }
} *@
@inherits DrawerStateComponentBase
<div class="tile">
@if (OpenInNewTab)
{
<a href="@AddDrawerStateToUrl(NavigateUrl)" target="_blank" rel="noopener noreferrer">
<DxGridLayout CssClass="tile-content" ColumnSpacing="0.75rem" RowSpacing="0.75rem">
<Rows>
<DxGridLayoutRow Areas="icon title" Height="auto" />
<DxGridLayoutRow Areas="description description" Height="auto" />
</Rows>
<Columns>
<DxGridLayoutColumn Width="auto" />
<DxGridLayoutColumn />
</Columns>
<Items>
<DxGridLayoutItem Area="icon" CssClass="tile-icon">
<Template>
<div class="@("icon " + IconCssClass)" aria-hidden="true"></div>
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="title" CssClass="tile-title">
<Template>
@Title
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="description" CssClass="tile-description">
<Template>
@Description
</Template>
</DxGridLayoutItem>
</Items>
</DxGridLayout>
</a>
}
else
{
<NavLink href="@AddDrawerStateToUrl(NavigateUrl)">
<DxGridLayout CssClass="tile-content" ColumnSpacing="0.75rem" RowSpacing="0.75rem">
<Rows>
<DxGridLayoutRow Areas="icon title" Height="auto" />
<DxGridLayoutRow Areas="description description" Height="auto" />
</Rows>
<Columns>
<DxGridLayoutColumn Width="auto" />
<DxGridLayoutColumn />
</Columns>
<Items>
<DxGridLayoutItem Area="icon" CssClass="tile-icon">
<Template>
<div class="@("icon " + IconCssClass)" aria-hidden="true"></div>
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="title" CssClass="tile-title">
<Template>
@Title
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="description" CssClass="tile-description">
<Template>
@Description
</Template>
</DxGridLayoutItem>
</Items>
</DxGridLayout>
</NavLink>
}
</div>
@code {
[Parameter] public string NavigateUrl { get; set; } = string.Empty;
[Parameter] public string? Title { get; set; }
[Parameter] public string? Description { get; set; }
[Parameter] public string? IconCssClass { get; set; }
[Parameter] public bool OpenInNewTab { get; set; }
}

View File

@ -0,0 +1,44 @@
.tile {
border-radius: 0.75rem;
height: 7.5rem;
transition: box-shadow 0.2s;
width: 14.375rem;
border: 1px solid var(--dxds-color-border-neutral-default-rest);
}
.tile:hover {
box-shadow: 0 4px 8px 0 rgba(170, 170, 170, 0.24), 0 0 2px 0 rgba(170, 170, 170, 0.2);
}
.tile ::deep > a {
text-decoration: none;
}
::deep .tile-content {
padding: 1rem;
}
::deep .tile-icon {
border-radius: 0.375rem;
height: 2.75rem;
padding: 0.75rem;
width: 2.75rem;
border: 1px solid var(--dxds-color-border-neutral-default-rest);
}
::deep .tile-title {
align-self: center;
color: var(--dxds-color-content-neutral-default-rest);
font-size: var(--dxds-font-size-base-md);
font-weight: var(--dxds-font-weight-base-strong);
letter-spacing: var(--dxds-letter-spacing-base-md);
line-height: var(--dxds-line-height-base-md);
}
::deep .tile-description {
color: var(--dxds-color-content-neutral-subdued-rest);
font-size: var(--dxds-font-size-base-sm);
font-weight: var(--dxds-font-weight-base-default);
letter-spacing: var(--dxds-letter-spacing-base-sm);
line-height: var(--dxds-line-height-base-sm);
}

View File

@ -0,0 +1,68 @@
@page "/login"
@rendermode InteractiveServer
@using System.ComponentModel.DataAnnotations
@using DevExpress.Blazor
<h3>Login</h3>
<EditForm Model="_model" OnValidSubmit="OnLogin">
<ChildContent Context="formCtx">
<DataAnnotationsValidator />
<DxFormLayout>
<DxFormLayoutItem Caption="Benutzername">
<ChildContent Context="itemCtx">
<DxTextBox @bind-Text="_model.Benutzername" />
</ChildContent>
</DxFormLayoutItem>
<DxFormLayoutItem Caption="Passwort">
<ChildContent Context="itemCtx">
<DxTextBox @bind-Text="_model.Passwort" Password="true" />
</ChildContent>
</DxFormLayoutItem>
<DxFormLayoutItem>
<ChildContent Context="itemCtx">
<DxButton Text="Login"
SubmitFormOnClick="true"
RenderStyle="ButtonRenderStyle.Primary" />
</ChildContent>
</DxFormLayoutItem>
</DxFormLayout>
@if (!string.IsNullOrEmpty(_error))
{
<div style="color:red;margin-top:10px;">@_error</div>
}
@if (_success)
{
<div style="color:green;margin-top:10px;">Login erfolgreich!</div>
}
</ChildContent>
</EditForm>
@code {
private LoginModel _model = new();
private string? _error;
private bool _success;
private async Task OnLogin()
{
}
private class LoginModel
{
[Required]
public string? Benutzername { get; set; }
[Required]
public string? Passwort { get; set; }
}
}

View File

@ -0,0 +1,32 @@
@page "/weather"
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<DxGrid Data="@forecasts">
<Columns>
<DxGridDataColumn Caption="Date" FieldName="Date" />
<DxGridDataColumn Caption="Temperature (C)" FieldName="TemperatureC" />
<DxGridDataColumn Caption="Temperature (F)" FieldName="TemperatureF" />
<DxGridDataColumn Caption="Summary" FieldName="Summary" />
</Columns>
</DxGrid>
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync() {
DateOnly startDate = DateOnly.FromDateTime(DateTime.Now);
string[] summaries = ["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 record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) {
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}

View File

@ -0,0 +1,10 @@
<Router AppAssembly="typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>

View File

@ -0,0 +1,77 @@
using Microsoft.AspNetCore.Components;
namespace LambertzPortal.Components.Shared
{
public abstract class DrawerStateComponentBase : ComponentBase
{
[SupplyParameterFromQuery(Name = DrawerStateUrlBuilder.DrawerStateQueryParameterName)]
public bool ToggledDrawer { get; set; }
[Inject] NavigationManager NavigationManager { get; set; } = null!;
protected string AddDrawerStateToUrl(string baseUrl)
{
return DrawerStateUrlBuilder.AddStateToUrl(baseUrl, ToggledDrawer, NavigationManager);
}
protected string AddDrawerStateToUrlToggled(string baseUrl)
{
return DrawerStateUrlBuilder.AddStateToUrl(baseUrl, !ToggledDrawer, NavigationManager);
}
protected string RemoveDrawerStateFromUrl(string baseUrl)
{
return DrawerStateUrlBuilder.RemoveStateFromUrl(baseUrl, NavigationManager);
}
}
public abstract class DrawerStateLayoutComponentBase : LayoutComponentBase
{
[SupplyParameterFromQuery(Name = DrawerStateUrlBuilder.DrawerStateQueryParameterName)]
public bool ToggledDrawer { get; set; }
[Inject] NavigationManager NavigationManager { get; set; } = null!;
protected string AddDrawerStateToUrl(string baseUrl)
{
return DrawerStateUrlBuilder.AddStateToUrl(baseUrl, ToggledDrawer, NavigationManager);
}
protected string AddDrawerStateToUrlToggled(string baseUrl)
{
return DrawerStateUrlBuilder.AddStateToUrl(baseUrl, !ToggledDrawer, NavigationManager);
}
protected string RemoveDrawerStateFromUrl(string baseUrl)
{
return DrawerStateUrlBuilder.RemoveStateFromUrl(baseUrl, NavigationManager);
}
}
internal static class DrawerStateUrlBuilder
{
public const string DrawerStateQueryParameterName = "toggledSidebar";
public static string AddStateToUrl(string baseUrl, bool toggledDrawer, NavigationManager navigationManager)
{
return navigationManager.GetUriWithQueryParameters(
baseUrl,
new Dictionary<string, object?>
{
[DrawerStateQueryParameterName] = toggledDrawer ? true : null
}
);
}
public static string RemoveStateFromUrl(string baseUrl, NavigationManager navigationManager)
{
return navigationManager.GetUriWithQueryParameters(
baseUrl,
new Dictionary<string, object?>
{
[DrawerStateQueryParameterName] = null
}
);
}
}
}

View File

@ -0,0 +1,14 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using LambertzPortal
@using LambertzPortal.Components
@using LambertzPortal.Components.Layout
@using LambertzPortal.Components.Shared
@using DevExpress.Blazor

View File

@ -0,0 +1,54 @@
using LambertzPortal.Data;
using Microsoft.EntityFrameworkCore;
namespace LambertzPortal.Services
{
public class AuthService
{
private readonly LambertzDbContext _db;
public AuthService(LambertzDbContext db)
{
_db = db;
}
public async Task<(bool ok, int userId, string userName, List<string> rechte)> ValidateAsync(string benutzername, string passwort)
{
benutzername = benutzername.Trim();
var user = await _db.BlazorUser
.Include(u => u.BenutzerBerechtigungen)
.ThenInclude(ub => ub.Berechtigung)
.SingleOrDefaultAsync(u => u.Benutzername == benutzername && u.Aktiv);
if (user is null)
{
Console.WriteLine($"[LOGIN] ❌ Benutzer '{benutzername}' nicht gefunden oder inaktiv");
return (false, 0, "", new List<string>());
}
// Klartext-Vergleich (nur Test!)
if (!string.Equals(user.PasswortHash, passwort, StringComparison.Ordinal))
{
Console.WriteLine($"[LOGIN] ❌ Passwort falsch für '{benutzername}'");
return (false, 0, "", new List<string>());
}
// Rechte sammeln
var rechte = user.BenutzerBerechtigungen
.Select(x => x.Berechtigung.Name)
.Where(x => !string.IsNullOrWhiteSpace(x))
.Distinct()
.ToList();
Console.WriteLine($"[LOGIN] ✅ OK: {user.Benutzername} (ID {user.BenutzerId})");
Console.WriteLine($"[LOGIN] ✅ Rechte: {string.Join(", ", rechte)}");
// Optional: LetzterLogin speichern
user.LetzterLogin = DateTime.Now;
await _db.SaveChangesAsync();
return (true, user.BenutzerId, user.Benutzername, rechte);
}
}
}

View File

@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DevExpress.Blazor" Version="25.2.*-*" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.23" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.23" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.23">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
</Project>

View File

@ -0,0 +1,11 @@
namespace LambertzPortal.Models
{
public class BlazorBerechtigung
{
public int BerechtigungId { get; set; }
public string Name { get; set; } = "";
public string? Beschreibung { get; set; }
public ICollection<BlazorUserBerechtigung> BenutzerBerechtigungen { get; set; } = new List<BlazorUserBerechtigung>();
}
}

View File

@ -0,0 +1,25 @@
namespace LambertzPortal.Models
{
public class BlazorUser
{
public int BenutzerId { get; set; }
public string Benutzername { get; set; } = "";
public string PasswortHash { get; set; } = "";
public string Vorname { get; set; } = "";
public string Nachname { get; set; } = "";
public string? Anrede { get; set; }
public string? Email { get; set; }
public int Firmennummer { get; set; }
public string? Abteilung { get; set; }
public bool Aktiv { get; set; } = true;
public DateTime? LetzterLogin { get; set; }
public DateTime ErstelltAm { get; set; }
public string? ErstelltVon { get; set; }
public ICollection<BlazorUserBerechtigung> BenutzerBerechtigungen { get; set; } = new List<BlazorUserBerechtigung>();
}
}

View File

@ -0,0 +1,11 @@
namespace LambertzPortal.Models
{
public class BlazorUserBerechtigung
{
public int BenutzerId { get; set; }
public BlazorUser Benutzer { get; set; } = default!;
public int BerechtigungId { get; set; }
public BlazorBerechtigung Berechtigung { get; set; } = default!;
}
}

View File

@ -0,0 +1,57 @@
using LambertzPortal.Components;
using LambertzPortal.Data;
using LambertzPortal.Services;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.EntityFrameworkCore;
using System.Security.Claims;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddDevExpressBlazor(options =>
{
options.SizeMode = DevExpress.Blazor.SizeMode.Medium;
});
builder.Services.AddMvc();
builder.Services.AddDbContext<LambertzDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("LambertzDb")));
builder.Services.AddAuthorization();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddScoped<AuthService>();
builder.Services.AddHttpContextAccessor();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
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.UseAuthentication();
app.UseAuthorization();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode()
.AllowAnonymous();
app.Run();

View File

@ -0,0 +1,23 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -0,0 +1,55 @@
using LambertzPortal.Models;
using Microsoft.EntityFrameworkCore;
namespace LambertzPortal.Data
{
public class LambertzDbContext : DbContext
{
public LambertzDbContext(DbContextOptions<LambertzDbContext> options)
: base(options)
{
}
public DbSet<BlazorUser> BlazorUser => Set<BlazorUser>();
public DbSet<BlazorBerechtigung> BlazorBerechtigung => Set<BlazorBerechtigung>();
public DbSet<BlazorUserBerechtigung> BlazorUserBerechtigung => Set<BlazorUserBerechtigung>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// Tabellen & Schema
modelBuilder.Entity<BlazorUser>()
.ToTable("BlazorUser", "LA");
modelBuilder.Entity<BlazorBerechtigung>()
.ToTable("BlazorBerechtigung", "LA");
modelBuilder.Entity<BlazorUserBerechtigung>()
.ToTable("BlazorUserBerechtigung", "LA");
// Benutzername eindeutig
modelBuilder.Entity<BlazorUser>()
.HasIndex(x => x.Benutzername)
.IsUnique();
// Zusammengesetzter Primärschlüssel
modelBuilder.Entity<BlazorUserBerechtigung>()
.HasKey(x => new { x.BenutzerId, x.BerechtigungId });
// Relation: User → UserBerechtigungen
modelBuilder.Entity<BlazorUserBerechtigung>()
.HasOne(x => x.Benutzer)
.WithMany(x => x.BenutzerBerechtigungen)
.HasForeignKey(x => x.BenutzerId)
.OnDelete(DeleteBehavior.Cascade);
// Relation: Berechtigung → UserBerechtigungen
modelBuilder.Entity<BlazorUserBerechtigung>()
.HasOne(x => x.Berechtigung)
.WithMany(x => x.BenutzerBerechtigungen)
.HasForeignKey(x => x.BerechtigungId)
.OnDelete(DeleteBehavior.Cascade);
base.OnModelCreating(modelBuilder);
}
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,13 @@
{
"ConnectionStrings": {
"LambertzDb": "Server=app03ac;Database=Lambertz;User ID=LA;Password=la;TrustServerCertificate=True;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@ -0,0 +1,35 @@
.icon {
width: 1.25rem;
height: 1.25rem;
background-color: currentcolor;
mask-image: var(--icon-mask-image);
mask-position: center;
mask-repeat: no-repeat;
}
.icon-back {
--icon-mask-image: url("/images/back.svg");
}
.icon-close {
--icon-mask-image: url("/images/close.svg");
}
.icon-demos {
--icon-mask-image: url("/images/demos.svg");
}
.icon-docs {
--icon-mask-image: url("/images/doc.svg");
}
.icon-menu {
--icon-mask-image: url("/images/menu.svg");
}
/* pages */
.icon-counter {
--icon-mask-image: url("/images/pages/counter.svg");
}
.icon-home {
--icon-mask-image: url("/images/pages/home.svg");
}
.icon-weather {
--icon-mask-image: url("/images/pages/weather.svg");
}

View File

@ -0,0 +1,79 @@
@import url('./icons.css');
html, body {
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
margin: 0;
}
.w-100 {
width: 100% !important;
}
.h-100 {
height: 100% !important;
}
.h-auto {
height: auto !important;
}
.overflow-hidden {
overflow: hidden !important;
}
.text-danger {
color: var(--dxds-color-content-danger-default-rest);
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid var(--dxds-color-border-success-default-rest);
}
.invalid {
outline: 1px solid var(--dxds-color-border-danger-default-rest);
}
.validation-message {
color: var(--dxds-color-content-danger-default-rest);
}
.button-link {
text-decoration: unset;
}
.title {
display: flex;
flex-direction: column;
gap: 0.5rem;
padding: 1rem 0;
}
.title.title-secondary {
padding: 0.313rem 0 0;
color: var(--dxds-color-content-secondary-default-rest);
}
.title-header-text {
font-size: var(--dxds-font-size-headline-lg);
font-weight: var(--dxds-font-weight-headline-default);
letter-spacing: var(--dxds-letter-spacing-headline-lg);
line-height: var(--dxds-line-height-headline-lg);
}
.title-content-text {
font-size: var(--dxds-font-size-base-lg);
font-weight: var(--dxds-font-weight-base-default);
letter-spacing: var(--dxds-letter-spacing-base-lg);
line-height: var(--dxds-line-height-base-lg);
}
.main-content {
align-items: center;
display: flex;
height: 100%;
justify-content: center;
width: 100%;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M12.3544 15.8529C12.1594 16.0485 11.8429 16.0491 11.6472 15.8542L6.16276 10.3892C5.94705 10.1743 5.94705 9.82495 6.16276 9.61L11.6472 4.14502C11.8429 3.95011 12.1594 3.95067 12.3544 4.14628C12.5493 4.34189 12.5487 4.65848 12.3531 4.85339L7.18851 9.99961L12.3531 15.1458C12.5487 15.3407 12.5493 15.6573 12.3544 15.8529Z"/>
</svg>

After

Width:  |  Height:  |  Size: 399 B

View File

@ -0,0 +1,43 @@
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="counter" viewBox="0 0 104 104">
<path d="M8 54H96V88C96 91.3137 93.3137 94 90 94H14C10.6863 94 8 91.3137 8 88V54Z" fill="#8E9195"/>
<rect x="8" y="12" width="88" height="80" rx="6" fill="#E1E2E4"/>
<path d="M8 18C8 14.6863 10.6863 12 14 12H90C93.3137 12 96 14.6863 96 18V28H8V18Z" fill="white"/>
<rect x="66" y="18" width="24" height="4" rx="2" fill="#8E9195"/>
<rect x="44" y="18" width="4" height="4" rx="2" fill="#8E9195"/>
<rect x="50" y="18" width="4" height="4" rx="2" fill="#8E9195"/>
<rect x="56" y="18" width="4" height="4" rx="2" fill="#8E9195"/>
<rect x="12" y="16" width="8" height="8" rx="4" fill="var(--bs-primary, var(--dxds-primary-90))" />
<path d="M35 44C35 41.7909 36.7909 40 39 40H65C67.2091 40 69 41.7909 69 44V76C69 78.2091 67.2091 80 65 80H39C36.7909 80 35 78.2091 35 76V44Z" fill="white"/>
<path d="M52.4983 72.77C54.2039 72.77 55.7046 72.471 57.0004 71.8729C58.3073 71.2748 59.3317 70.4442 60.0738 69.3809C60.8158 68.3177 61.1869 67.105 61.1869 65.7427V65.7095C61.1869 64.026 60.6497 62.6748 59.5754 61.6559C58.5011 60.637 57.0834 60.0555 55.3225 59.9115V59.8285C56.2971 59.6291 57.161 59.2802 57.9141 58.7818C58.6783 58.2724 59.2764 57.6411 59.7083 56.888C60.1513 56.1238 60.3728 55.2433 60.3728 54.2465V54.2133C60.3728 52.9839 60.0461 51.9041 59.3927 50.9737C58.7392 50.0434 57.82 49.318 56.6349 48.7974C55.4498 48.2658 54.0599 48 52.465 48C50.9034 48 49.5245 48.2769 48.3284 48.8307C47.1433 49.3733 46.1908 50.1431 45.471 51.1399C44.7621 52.1366 44.3413 53.3051 44.2084 54.6452L44.1917 54.8279H47.7137L47.7303 54.6618C47.8078 53.9198 48.0515 53.2774 48.4613 52.7347C48.8711 52.192 49.4193 51.7767 50.106 51.4887C50.7927 51.2008 51.579 51.0568 52.465 51.0568C53.3732 51.0568 54.1429 51.2008 54.7742 51.4887C55.4166 51.7656 55.8984 52.1754 56.2196 52.7181C56.5518 53.2608 56.718 53.9198 56.718 54.695V54.7283C56.718 55.4703 56.5241 56.1293 56.1365 56.7052C55.7599 57.2811 55.2228 57.7352 54.525 58.0675C53.8384 58.3887 53.0409 58.5493 52.1328 58.5493H49.3252V61.4732H52.2491C53.8439 61.4732 55.101 61.8386 56.0202 62.5696C56.9395 63.2895 57.3991 64.3251 57.3991 65.6762V65.7095C57.3991 66.4737 57.1942 67.1548 56.7844 67.7529C56.3746 68.3509 55.7987 68.8216 55.0567 69.165C54.3257 69.4972 53.4729 69.6634 52.4983 69.6634C51.5015 69.6634 50.6265 69.5083 49.8734 69.1982C49.1314 68.8881 48.5333 68.4617 48.0792 67.919C47.6362 67.3652 47.3759 66.7395 47.2984 66.0417L47.2818 65.859H43.6934L43.71 66.0583C43.8207 67.3652 44.2471 68.5281 44.9892 69.5471C45.7312 70.5549 46.7391 71.3468 48.0127 71.9227C49.2975 72.4876 50.7927 72.77 52.4983 72.77Z" fill="#2E3134"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M81.9999 52C86.4183 52 90 55.5817 90 60C90 64.4183 86.4183 68 81.9999 68C77.5817 68 74 64.4183 74 60C74 55.5817 77.5817 52 81.9999 52Z" fill="var(--bs-primary, var(--dxds-primary-90))" />
<path fill-rule="evenodd" clip-rule="evenodd" d="M83 56C83 55.4477 82.5523 55 82 55C81.4477 55 81 55.4477 81 56V59H78C77.4477 59 77 59.4477 77 60C77 60.5523 77.4477 61 78 61H81V64C81 64.5523 81.4477 65 82 65C82.5523 65 83 64.5523 83 64V61H86C86.5523 61 87 60.5523 87 60C87 59.4477 86.5523 59 86 59H83V56Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.9999 52C26.4183 52 30 55.5817 30 60C30 64.4183 26.4183 68 21.9999 68C17.5817 68 14 64.4183 14 60C14 55.5817 17.5817 52 21.9999 52Z" fill="#C5C7C9"/>
<path d="M17 60C17 59.4477 17.4477 59 18 59H26C26.5523 59 27 59.4477 27 60C27 60.5523 26.5523 61 26 61H18C17.4477 61 17 60.5523 17 60Z" fill="white"/>
</symbol>
<symbol id="weather" viewBox="0 0 104 104">
<path d="M74.5994 18.1863L72 12L69.4006 18.1863C70.2494 18.0635 71.1173 18 72 18C72.8827 18 73.7506 18.0635 74.5994 18.1863Z" fill="#FFDA6A"/>
<path d="M76.4171 18.546C78.1282 18.9776 79.7418 19.6543 81.2185 20.5365L81.1844 13.8269L76.4171 18.546Z" fill="#FFDA6A"/>
<path d="M82.7568 21.5663C84.1524 22.6081 85.3919 23.8476 86.4337 25.2432L88.9706 19.0294L82.7568 21.5663Z" fill="#FFDA6A"/>
<path d="M87.4635 26.7815C88.3457 28.2582 89.0224 29.8718 89.454 31.5829L94.1731 26.8156L87.4635 26.7815Z" fill="#FFDA6A"/>
<path d="M89.8137 33.4006C89.9365 34.2494 90 35.1173 90 36C90 36.8827 89.9365 37.7506 89.8137 38.5994L96 36L89.8137 33.4006Z" fill="#FFDA6A"/>
<path d="M89.454 40.4171C89.0224 42.1282 88.3457 43.7418 87.4635 45.2185L94.1731 45.1844L89.454 40.4171Z" fill="#FFDA6A"/>
<path d="M86.4337 46.7568C85.3919 48.1524 84.1524 49.3919 82.7568 50.4337L88.9706 52.9706L86.4337 46.7568Z" fill="#FFDA6A"/>
<path d="M81.2185 51.4635C79.7418 52.3457 78.1282 53.0224 76.4171 53.454L81.1844 58.1731L81.2185 51.4635Z" fill="#FFDA6A"/>
<path d="M74.5994 53.8137C73.7506 53.9365 72.8827 54 72 54C71.1173 54 70.2494 53.9365 69.4006 53.8137L72 60L74.5994 53.8137Z" fill="#FFDA6A"/>
<path d="M67.5829 53.454C65.8718 53.0224 64.2582 52.3457 62.7815 51.4635L62.8156 58.1731L67.5829 53.454Z" fill="#FFDA6A"/>
<path d="M61.2432 50.4337C59.8476 49.3919 58.6081 48.1524 57.5663 46.7568L55.0294 52.9706L61.2432 50.4337Z" fill="#FFDA6A"/>
<path d="M56.5365 45.2185C55.6543 43.7418 54.9776 42.1282 54.546 40.4171L49.8269 45.1844L56.5365 45.2185Z" fill="#FFDA6A"/>
<path d="M54.1863 38.5994C54.0635 37.7506 54 36.8827 54 36C54 35.1173 54.0635 34.2494 54.1863 33.4006L48 36L54.1863 38.5994Z" fill="#FFDA6A"/>
<path d="M54.546 31.5829C54.9776 29.8718 55.6543 28.2582 56.5365 26.7815L49.8269 26.8156L54.546 31.5829Z" fill="#FFDA6A"/>
<path d="M57.5663 25.2432C58.6081 23.8476 59.8476 22.6081 61.2432 21.5663L55.0294 19.0294L57.5663 25.2432Z" fill="#FFDA6A"/>
<path d="M62.7815 20.5365L62.8156 13.8269L67.5829 18.546C65.8718 18.9776 64.2582 19.6543 62.7815 20.5365Z" fill="#FFDA6A"/>
<circle cx="72" cy="36" r="15" fill="#E8B249"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27 54C27 66.7025 37.2975 77 50 77H80C88.8366 77 96 69.8366 96 61C96 52.1634 88.8366 45 80 45C77.0716 45 74.327 45.7867 71.9659 47.1603C69.0538 37.7978 60.3207 31 50 31C37.2975 31 27 41.2975 27 54Z" fill="#8E9195"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27 52C27 64.7025 37.2975 75 50 75H80C88.8366 75 96 67.8366 96 59C96 50.1634 88.8366 43 80 43C77.0716 43 74.327 43.7867 71.9659 45.1603C69.0538 35.7978 60.3207 29 50 29C37.2975 29 27 39.2975 27 52Z" fill="#C5C7C9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M56 88H21C13.8203 88 8 82.1797 8 75C8 67.8203 13.8203 62 21 62C21.1487 62 21.2968 62.0025 21.4443 62.0075C23.2605 53.9878 30.431 48 39 48C48.2764 48 55.9138 55.0171 56.8937 64.0328C63.1038 64.49 68 69.6732 68 76C68 82.6274 62.6274 88 56 88Z" fill="#8E9195"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M56 86H21C13.8203 86 8 80.1797 8 73C8 65.8203 13.8203 60 21 60C21.1487 60 21.2968 60.0025 21.4443 60.0075C23.2605 51.9878 30.431 46 39 46C48.2764 46 55.9138 53.0171 56.8937 62.0328C63.1038 62.49 68 67.6732 68 74C68 80.6274 62.6274 86 56 86Z" fill="#E1E2E4"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M78 76C78 67.1634 70.8366 60 62 60C54.4554 60 48.1304 65.2219 46.4422 72.2487C45.6537 72.0857 44.8368 72 44 72C37.3726 72 32 77.3726 32 84C32 90.6274 37.3726 96 44 96H78C83.5228 96 88 91.5228 88 86C88 80.4772 83.5228 76 78 76Z" fill="#8E9195"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M78 74C78 65.1634 70.8366 58 62 58C54.4554 58 48.1304 63.2219 46.4422 70.2487C45.6537 70.0857 44.8368 70 44 70C37.3726 70 32 75.3726 32 82C32 88.6274 37.3726 94 44 94H78C83.5229 94 88 89.5229 88 84C88 78.4771 83.5229 74 78 74Z" fill="white"/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M4.08859 4.21569L4.14645 4.14645C4.32001 3.97288 4.58944 3.9536 4.78431 4.08859L4.85355 4.14645L10 9.293L15.1464 4.14645C15.32 3.97288 15.5894 3.9536 15.7843 4.08859L15.8536 4.14645C16.0271 4.32001 16.0464 4.58944 15.9114 4.78431L15.8536 4.85355L10.707 10L15.8536 15.1464C16.0271 15.32 16.0464 15.5894 15.9114 15.7843L15.8536 15.8536C15.68 16.0271 15.4106 16.0464 15.2157 15.9114L15.1464 15.8536L10 10.707L4.85355 15.8536C4.67999 16.0271 4.41056 16.0464 4.21569 15.9114L4.14645 15.8536C3.97288 15.68 3.9536 15.4106 4.08859 15.2157L4.14645 15.1464L9.293 10L4.14645 4.85355C3.97288 4.67999 3.9536 4.41056 4.08859 4.21569Z"/>
</svg>

After

Width:  |  Height:  |  Size: 700 B

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M7.5 2C7.77614 2 8 2.22386 8 2.5V4.5C8 4.77614 7.77614 5 7.5 5C7.22386 5 7 4.77614 7 4.5V2.5C7 2.22386 7.22386 2 7.5 2ZM3.61091 3.61091C3.80618 3.41565 4.12276 3.41565 4.31802 3.61091L5.73223 5.02513C5.9275 5.22039 5.9275 5.53697 5.73223 5.73223C5.53697 5.92749 5.22039 5.92749 5.02513 5.73223L3.61091 4.31802C3.41565 4.12276 3.41565 3.80617 3.61091 3.61091ZM11.3891 3.61091C11.5843 3.80617 11.5843 4.12276 11.3891 4.31802L9.97487 5.73223C9.77961 5.9275 9.46303 5.9275 9.26777 5.73223C9.0725 5.53697 9.0725 5.22039 9.26777 5.02513L10.682 3.61091C10.8772 3.41565 11.1938 3.41565 11.3891 3.61091ZM2 7.5C2 7.22386 2.22386 7 2.5 7H4.5C4.77614 7 5 7.22386 5 7.5C5 7.77614 4.77614 8 4.5 8H2.5C2.22386 8 2 7.77614 2 7.5ZM8.64019 7.2993C7.98886 6.75653 7 7.21968 7 8.06752V17.1693C7 18.0926 8.14454 18.5227 8.75258 17.8278L10.7787 15.5122C11.0635 15.1867 11.475 15 11.9075 15H15.119C16.0543 15 16.4777 13.8305 15.7592 13.2318L8.64019 7.2993ZM8 17.1693L8 8.06752L15.119 14H11.9075C11.1866 14 10.5008 14.3112 10.0261 14.8537L8 17.1693Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M5.5 5C5.22386 5 5 5.22386 5 5.5V7.5C5 7.77614 5.22386 8 5.5 8H12.5C12.7761 8 13 7.77614 13 7.5V5.5C13 5.22386 12.7761 5 12.5 5H5.5ZM6 7V6H12V7H6ZM3 4C3 2.89543 3.89543 2 5 2H13C14.1046 2 15 2.89543 15 4V16C15 17.1046 14.1046 18 13 18H5C3.89543 18 3 17.1046 3 16V4ZM5 3C4.44772 3 4 3.44772 4 4V16C4 16.5523 4.44772 17 5 17H13C13.5523 17 14 16.5523 14 16V4C14 3.44772 13.5523 3 13 3H5ZM16 6H16.5C16.7761 6 17 6.22386 17 6.5V8C17 8.27614 16.7761 8.5 16.5 8.5H16V6ZM16.5 9.5H16V12H16.5C16.7761 12 17 11.7761 17 11.5V10C17 9.72386 16.7761 9.5 16.5 9.5ZM16 13H16.5C16.7761 13 17 13.2239 17 13.5V15C17 15.2761 16.7761 15.5 16.5 15.5H16V13Z"/>
</svg>

After

Width:  |  Height:  |  Size: 714 B

View File

@ -0,0 +1,16 @@
<svg viewBox="0 0 144 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M34.6184 3.1643C33.0578 3.1643 31.5947 3.31034 30.4731 3.50507V19.2779C31.3021 19.3753 32.4726 19.4726 33.9844 19.4726C36.7643 19.4726 39.0077 18.8398 40.4707 17.5254C41.69 16.4057 42.9092 14.4097 42.9092 10.9533C42.9092 8.03246 42.0313 6.08519 40.4707 4.81947C39.1052 3.74848 37.3007 3.1643 34.6184 3.1643ZM34.716 17.0385C34.2771 17.0385 33.8381 17.0385 33.5455 16.9899V5.74442C33.8869 5.69574 34.3746 5.59838 35.0086 5.59838C37.886 5.59838 39.6417 7.39959 39.6417 11.002C39.6417 15.2373 37.6421 17.0385 34.716 17.0385Z" fill="white"/>
<path d="M49.7369 7.49696C46.323 7.49696 44.421 10.3692 44.421 13.7282C44.421 17.3306 46.4693 19.57 50.0783 19.57C51.5413 19.57 52.8581 19.3266 53.8335 18.8884L53.3946 16.7465C52.6143 17.0385 51.6876 17.2333 50.566 17.2333C48.9078 17.2333 47.4935 16.4544 47.396 14.4584H54.37C54.4187 14.1176 54.4675 13.6795 54.4675 13.2414C54.4187 9.4929 52.5655 7.49696 49.7369 7.49696ZM47.3472 12.3164C47.4447 11.1481 48.0787 9.63895 49.5418 9.63895C51.0536 9.63895 51.5413 11.0994 51.5413 12.3164H47.3472Z" fill="white"/>
<path d="M63.0509 7.74037L61.5878 13.3874C61.3439 14.4097 61.1489 15.3347 60.9538 16.357H60.905C60.7099 15.3347 60.5149 14.4097 60.271 13.3874L58.7592 7.74037H55.4429L59.3444 19.3753H62.3193L66.2696 7.74037H63.0509Z" fill="white"/>
<path d="M2.04062 18.2556C1.45539 18.9858 1.01647 19.6673 0.723857 20.2515C0.626318 20.3976 0.480011 20.8357 0.480011 21.1278V21.5659C0.480011 22.2961 1.06524 22.8803 1.79678 22.8803H22.0848C22.8163 22.8803 23.4015 22.2961 23.4015 21.5659V5.98783C12.2822 7.93509 5.552 13.9229 2.04062 18.2556Z" fill="white"/>
<path d="M71.0978 12.3164H76.3649V9.78499H71.0978V5.89047H76.6575V3.31034H68.0253V19.3266H76.9989V16.7465H71.0978V12.3164Z" fill="white"/>
<path d="M88.6547 7.74037H85.3872L84.363 9.83367C84.0704 10.4179 83.7778 11.0507 83.4851 11.6836H83.4364C83.1438 11.0994 82.8512 10.5152 82.5585 9.83367L81.4368 7.74037H78.023L81.4856 13.4848L77.9742 19.3753H81.2905L82.3635 17.1359C82.6561 16.5517 82.9487 15.9189 83.2413 15.286H83.2901C83.5827 15.9189 83.8753 16.503 84.1679 17.1359L85.3384 19.3753H88.801L85.2896 13.3874L88.6547 7.74037Z" fill="white"/>
<path d="M96.5065 7.49696C94.9947 7.49696 93.8242 8.12982 93.0439 9.34686H92.9951L92.8488 7.74037H90.1665C90.2153 8.81136 90.2641 10.0284 90.2641 11.5375V24H93.3365V18.2069H93.3853C93.873 18.9858 94.8484 19.57 96.1164 19.57C98.4573 19.57 100.896 17.6714 100.896 13.4361C100.945 9.83367 99.0425 7.49696 96.5065 7.49696ZM95.4336 17.1359C94.4094 17.1359 93.3853 16.3083 93.3853 14.6531V12.4625C93.3853 11.0507 94.3119 9.93103 95.5311 9.93103C97.043 9.93103 97.8721 11.4402 97.8721 13.4848C97.8233 15.6268 96.9942 17.1359 95.4336 17.1359Z" fill="white"/>
<path d="M105.919 9.73631H105.821L105.675 7.69168H103.042C103.09 8.714 103.139 9.88235 103.139 11.3428V19.3266H106.212V13.3387C106.212 11.3428 107.285 10.4179 108.65 10.4179C108.943 10.4179 109.235 10.4179 109.43 10.4665V7.54564C109.235 7.49696 109.04 7.49696 108.748 7.49696C107.675 7.49696 106.455 8.22718 105.919 9.73631Z" fill="white"/>
<path d="M115.868 7.49696C112.454 7.49696 110.552 10.3692 110.552 13.7282C110.552 17.3306 112.6 19.57 116.209 19.57C117.672 19.57 118.989 19.3266 119.965 18.8884L119.526 16.7465C118.745 17.0385 117.819 17.2333 116.697 17.2333C115.039 17.2333 113.625 16.4544 113.527 14.4584H120.452C120.501 14.1176 120.55 13.6795 120.55 13.2414C120.55 9.4929 118.697 7.49696 115.868 7.49696ZM113.478 12.3164C113.576 11.1481 114.21 9.63894 115.673 9.63894C117.185 9.63894 117.672 11.0994 117.672 12.3164H113.478Z" fill="white"/>
<path d="M126.938 12.3164C125.622 11.7323 125.183 11.4402 125.183 10.7586C125.183 10.1258 125.67 9.63894 126.646 9.63894C127.524 9.63894 128.353 9.97972 128.84 10.2231L129.426 8.03245C128.743 7.69168 127.719 7.39959 126.548 7.39959C123.964 7.39959 122.305 9.00609 122.305 11.0507C122.305 12.3164 123.086 13.5335 125.28 14.4097C126.548 14.9452 126.938 15.3347 126.938 16.0162C126.938 16.7465 126.402 17.1846 125.329 17.1846C124.354 17.1846 123.232 16.7465 122.598 16.4057L122.013 18.645C122.793 19.0832 124.012 19.4239 125.28 19.4239C128.206 19.4239 129.865 17.9635 129.865 15.7728C129.816 14.2637 128.938 13.144 126.938 12.3164Z" fill="white"/>
<path d="M136.205 12.3164C134.888 11.7323 134.449 11.4402 134.449 10.7586C134.449 10.1258 134.937 9.63894 135.912 9.63894C136.79 9.63894 137.619 9.97972 138.107 10.2231L138.692 8.03245C138.009 7.69168 136.985 7.39959 135.814 7.39959C133.23 7.39959 131.572 9.00609 131.572 11.0507C131.572 12.3164 132.352 13.5335 134.546 14.4097C135.814 14.9452 136.205 15.3347 136.205 16.0162C136.205 16.7465 135.668 17.1846 134.595 17.1846C133.62 17.1846 132.498 16.7465 131.864 16.4057L131.279 18.645C132.059 19.0832 133.278 19.4239 134.546 19.4239C137.473 19.4239 139.131 17.9635 139.131 15.7728C139.082 14.2637 138.155 13.144 136.205 12.3164Z" fill="white"/>
<path d="M22.0848 0H1.79678C1.06524 0 0.480011 0.584179 0.480011 1.3144V13.4361C4.47908 9.24949 11.6482 4.62475 22.5237 3.35903C22.8163 3.35903 23.4015 3.21298 23.4015 2.43408V1.3144C23.4015 0.584179 22.8163 0 22.0848 0Z" fill="white"/>
<path d="M142.057 7.05882C142.398 6.96146 142.593 6.76674 142.593 6.47465C142.593 6.27992 142.545 6.13387 142.398 6.03651C142.252 5.93915 142.057 5.89047 141.764 5.89047H141.082V8.03246H141.52V7.15619H141.716C141.862 7.15619 141.959 7.25355 142.008 7.44828L142.203 7.98377H142.691L142.447 7.39959C142.301 7.20487 142.203 7.05882 142.057 7.05882ZM141.764 6.81542H141.472V6.18256H141.716C142.008 6.18256 142.106 6.27992 142.106 6.47465C142.106 6.57201 142.057 6.62069 142.008 6.71805C141.959 6.81542 141.911 6.81542 141.764 6.81542Z" fill="white"/>
<path d="M143.032 5.74442C142.691 5.40365 142.301 5.25761 141.813 5.25761C141.325 5.25761 140.886 5.40365 140.594 5.74442C140.252 6.08519 140.106 6.47465 140.106 6.96146C140.106 7.44828 140.252 7.83773 140.594 8.1785C140.935 8.47059 141.325 8.66531 141.813 8.66531C142.301 8.66531 142.691 8.51927 143.032 8.1785C143.374 7.83773 143.52 7.44828 143.52 6.96146C143.52 6.47465 143.374 6.08519 143.032 5.74442ZM142.837 7.98377C142.545 8.27586 142.203 8.42191 141.813 8.42191C141.423 8.42191 141.082 8.27586 140.789 8.03245C140.496 7.74037 140.35 7.39959 140.35 7.01014C140.35 6.62069 140.496 6.27992 140.789 5.98783C141.082 5.69574 141.423 5.5497 141.813 5.5497C142.203 5.5497 142.593 5.69574 142.837 5.98783C143.13 6.27992 143.276 6.62069 143.276 7.01014C143.227 7.35091 143.081 7.69168 142.837 7.98377Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M2 4.5C2 4.22386 2.22386 4 2.5 4H17.5C17.7761 4 18 4.22386 18 4.5C18 4.77614 17.7761 5 17.5 5H2.5C2.22386 5 2 4.77614 2 4.5ZM2 9.5C2 9.22386 2.22386 9 2.5 9H17.5C17.7761 9 18 9.22386 18 9.5C18 9.77614 17.7761 10 17.5 10H2.5C2.22386 10 2 9.77614 2 9.5ZM2.5 14C2.22386 14 2 14.2239 2 14.5C2 14.7761 2.22386 15 2.5 15H17.5C17.7761 15 18 14.7761 18 14.5C18 14.2239 17.7761 14 17.5 14H2.5Z"/>
</svg>

After

Width:  |  Height:  |  Size: 465 B

View File

@ -0,0 +1,4 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M12 7C12.2761 7 12.4999 7.22394 12.5 7.5C12.5 7.77614 12.2761 8 12 8H9.24805L9.05859 9.74023C9.1367 9.73932 9.2198 9.73775 9.30469 9.7373C9.72449 9.73511 10.2541 9.74019 10.5254 9.77832C12.0975 9.99951 13.1926 11.4532 12.9717 13.0254C12.7506 14.5976 11.2969 15.6926 9.72461 15.4717C8.75136 15.3348 7.96091 14.7255 7.55273 13.9102C7.42918 13.6632 7.52946 13.3629 7.77637 13.2393C8.02327 13.1158 8.32368 13.216 8.44727 13.4629C8.71464 13.9967 9.23033 14.3924 9.86426 14.4814C10.8896 14.6254 11.8373 13.9111 11.9814 12.8857C12.1255 11.8604 11.4111 10.9127 10.3857 10.7686C10.2017 10.7427 9.75352 10.735 9.30957 10.7373C9.09662 10.7384 8.89716 10.7423 8.75098 10.7451C8.67802 10.7465 8.61837 10.7471 8.57715 10.748L8.53027 10.75H8.51367C8.36935 10.754 8.2307 10.695 8.13281 10.5889C8.03499 10.4828 7.98738 10.3398 8.00293 10.1963L8.30273 7.44629C8.3304 7.1927 8.54473 7.00009 8.7998 7H12Z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.7559 2.0127C15.0164 2.14082 16 3.20566 16 4.5V15.5C16 16.8807 14.8807 18 13.5 18H6.5C5.11929 18 4 16.8807 4 15.5V4.5C4 3.11929 5.11929 2 6.5 2H13.5L13.7559 2.0127ZM6.5 3C5.67157 3 5 3.67157 5 4.5V15.5C5 16.3284 5.67157 17 6.5 17H13.5C14.3284 17 15 16.3284 15 15.5V4.5C15 3.67157 14.3284 3 13.5 3H12.8369C12.4546 4.15802 11.4097 5 10 5C9.13757 5 8.24072 4.71025 7.56543 3.95996C7.32396 3.69166 7.12023 3.37196 6.95605 3H6.5ZM8.27148 3C8.61688 3.59728 9.26022 4 10 4C10.8124 4 11.4337 3.60128 11.7549 3H8.27148Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M8.9975 2.38811C9.56767 1.87584 10.4323 1.87584 11.0025 2.38811L16.5025 7.32965C16.8191 7.61414 17 8.01977 17 8.44544V15.4996C17 16.328 16.3284 16.9996 15.5 16.9996H13C12.1716 16.9996 11.5 16.328 11.5 15.4996V11.9996C11.5 11.7234 11.2761 11.4996 11 11.4996H9C8.72386 11.4996 8.5 11.7234 8.5 11.9996V15.4996C8.5 16.328 7.82843 16.9996 7 16.9996H4.5C3.67157 16.9996 3 16.328 3 15.4996V8.44544C3 8.01977 3.18086 7.61414 3.4975 7.32965L8.9975 2.38811ZM10.3342 3.13197C10.1441 2.96122 9.85589 2.96122 9.66583 3.13197L4.16583 8.07351C4.06029 8.16834 4 8.30355 4 8.44544V15.4996C4 15.7757 4.22386 15.9996 4.5 15.9996H7C7.27614 15.9996 7.5 15.7757 7.5 15.4996V11.9996C7.5 11.1711 8.17157 10.4996 9 10.4996H11C11.8284 10.4996 12.5 11.1711 12.5 11.9996V15.4996C12.5 15.7757 12.7239 15.9996 13 15.9996H15.5C15.7761 15.9996 16 15.7757 16 15.4996V8.44544C16 8.30355 15.9397 8.16834 15.8342 8.07351L10.3342 3.13197Z"/>
</svg>

After

Width:  |  Height:  |  Size: 982 B

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M11 7C13.4646 7 14.8627 8.5736 15.066 10.474L15.1282 10.474C16.7143 10.474 18 11.711 18 13.237C18 14.763 16.7143 16 15.1282 16H6.8718C5.28575 16 4.00001 14.763 4.00001 13.237C4.00001 11.711 5.28575 10.474 6.87182 10.474L6.934 10.474C7.13852 8.56111 8.53544 7 11 7ZM11 8C9.35057 8 7.9129 9.27029 7.9129 11.0249C7.9129 11.303 7.65892 11.5211 7.36809 11.5211L6.81819 11.5211C5.81403 11.5211 5.00001 12.2999 5.00001 13.2605C5.00001 14.2212 5.81403 15 6.81819 15H15.1818C16.186 15 17 14.2212 17 13.2605C17 12.2999 16.186 11.5211 15.1818 11.5211L14.6319 11.5211C14.3411 11.5211 14.0871 11.303 14.0871 11.0249C14.0871 9.24779 12.6494 8 11 8ZM3.80323 9.70081C3.88315 9.9329 3.78237 10.1835 3.57561 10.2995L3.49326 10.3364L2.69185 10.6123C2.43075 10.7022 2.14621 10.5634 2.05631 10.3023C1.97639 10.0702 2.07717 9.81963 2.28393 9.70366L2.36628 9.66678L3.16769 9.39083C3.42879 9.30093 3.71333 9.43971 3.80323 9.70081ZM8.91929 5.50023C9.25181 5.66241 9.54462 5.87337 9.79331 6.12029C9.38698 6.20342 9.00724 6.33003 8.65692 6.4951C8.60128 6.46105 8.54207 6.42885 8.48091 6.39902C7.34909 5.84699 5.98405 6.31701 5.43202 7.44884C5.04721 8.23783 5.15904 9.14013 5.6455 9.80137C5.31553 9.89962 5.00518 10.0425 4.72106 10.2221C4.124 9.29064 4.01237 8.07839 4.53323 7.01047C5.32736 5.38225 7.29107 4.70609 8.91929 5.50023ZM2.91582 5.66976L3.00013 5.70192L3.76194 6.07348C4.01013 6.19453 4.1132 6.49387 3.99215 6.74206C3.88455 6.96268 3.63608 7.06863 3.40788 7.00443L3.32357 6.97227L2.56176 6.60072C2.31357 6.47966 2.2105 6.18033 2.33155 5.93214C2.43915 5.71152 2.68762 5.60557 2.91582 5.66976ZM9.98918 3.2954C10.2098 3.403 10.3157 3.65147 10.2515 3.87967L10.2194 3.96398L9.84783 4.72579C9.72678 4.97398 9.42745 5.07705 9.17925 4.956C8.95863 4.8484 8.85268 4.59993 8.91688 4.37173L8.94904 4.28742L9.3206 3.52561C9.44165 3.27742 9.74098 3.17435 9.98918 3.2954ZM6.19931 3.26298L6.23619 3.34533L6.51213 4.14674C6.60204 4.40784 6.46326 4.69238 6.20216 4.78228C5.97007 4.8622 5.71946 4.76142 5.60349 4.55466L5.56662 4.47231L5.29067 3.6709C5.20077 3.4098 5.33955 3.12526 5.60064 3.03536C5.83273 2.95544 6.08334 3.05622 6.19931 3.26298Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36915.13 d17.14
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambertzPortalControlling", "LambertzPortalControlling\LambertzPortalControlling.csproj", "{1CF4CA23-F9E0-49F4-A0AF-5CA26EE95486}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1CF4CA23-F9E0-49F4-A0AF-5CA26EE95486}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1CF4CA23-F9E0-49F4-A0AF-5CA26EE95486}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CF4CA23-F9E0-49F4-A0AF-5CA26EE95486}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1CF4CA23-F9E0-49F4-A0AF-5CA26EE95486}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5122DC25-1170-47BD-A077-E824192DAA2D}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,13 @@
{
"version": 1,
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "10.0.2",
"commands": [
"dotnet-ef"
],
"rollForward": false
}
}
}

View File

@ -0,0 +1,37 @@
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@inject IFileVersionProvider FileVersionProvider
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/controlling/" />
@DxResourceManager.RegisterTheme(ActiveTheme)
@DxResourceManager.RegisterScripts()
<link href=@AppendVersion("css/site.css") rel="stylesheet" />
<link href=@AppendVersion("LambertzPortalControlling.styles.css") rel="stylesheet" />
<HeadOutlet @rendermode="InteractiveServer" />
</head>
<body>
<Routes @rendermode="InteractiveServer" />
<script src="_framework/blazor.web.js"></script>
</body>
</html>
@code {
static readonly ITheme ActiveTheme = Themes.Fluent.Clone(properties => {
properties.Mode = ThemeMode.Light;
});
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
private string AppendVersion(string path)
=> FileVersionProvider.AddFileVersionToPath(
HttpContext.Request.PathBase.HasValue
? HttpContext.Request.PathBase.Value
: "/",
path);
}

View File

@ -0,0 +1,38 @@
@inherits DrawerStateComponentBase
<div class="drawer-container">
<DxDrawer PanelWidth="@PanelWidth"
CssClass="@(CssClass + " mobile")"
Mode="DrawerMode.Overlap"
IsOpen="@ToggledDrawer"
BodyTemplate="BodyTemplate"
HeaderTemplate="HeaderTemplate"
FooterTemplate="FooterTemplate"
ApplyBackgroundShading="false"
ClosedCssClass="panel-closed">
<TargetContent>
<DxDrawer PanelWidth="@PanelWidth"
CssClass="@CssClass"
Mode="DrawerMode.Shrink"
IsOpen="@(!ToggledDrawer)"
BodyTemplate="BodyTemplate"
HeaderTemplate="HeaderTemplate"
FooterTemplate="FooterTemplate"
OpenCssClass="panel-open">
<TargetContent>
<div class="navigation-drawer-shading"></div>
@TargetContent
</TargetContent>
</DxDrawer>
</TargetContent>
</DxDrawer>
</div>
@code {
[Parameter] public string? CssClass { get; set; }
[Parameter] public string? PanelWidth { get; set; }
[Parameter] public RenderFragment? TargetContent { get; set; }
[Parameter] public RenderFragment? BodyTemplate { get; set; }
[Parameter] public RenderFragment? HeaderTemplate { get; set; }
[Parameter] public RenderFragment? FooterTemplate { get; set; }
}

View File

@ -0,0 +1,53 @@
.drawer-container {
height: 100%;
}
.navigation-drawer-shading {
height: 100%;
position: absolute;
transition: ease 300ms;
transition-property: opacity, visibility;
visibility: visible;
width: 100%;
z-index: 99;
background-color: var(--dxds-color-surface-backdrop-default-rest);
}
.navigation-drawer.mobile.panel-closed .navigation-drawer-shading {
opacity: 0;
visibility: hidden;
}
::deep .navigation-drawer > .dxbl-drawer-panel {
display: flex;
}
::deep .navigation-drawer.mobile > .dxbl-drawer-panel {
display: none;
}
.navigation-drawer-shading {
display: none;
}
::deep .panel-open:not(.mobile) .nav-buttons-container .menu-button {
display: none;
}
@media (max-width: 768px) {
::deep .navigation-drawer > .dxbl-drawer-panel {
display: none;
}
::deep .navigation-drawer.mobile > .dxbl-drawer-panel {
display: flex;
}
.navigation-drawer-shading {
display: block;
}
::deep .panel-open:not(.mobile) .nav-buttons-container .menu-button {
display: flex;
}
}

View File

@ -0,0 +1,53 @@
@inherits DrawerStateLayoutComponentBase
@inject NavigationManager NavigationManager
<div class="page">
<Drawer CssClass="navigation-drawer" PanelWidth="240px">
<HeaderTemplate>
<div class="navigation-drawer-header">
<NavLink href="@AddDrawerStateToUrl("/")">
<img class="logo" src="images/logo.svg" alt="DevExpress logo" />
</NavLink>
<NavLink aria-label="Close menu" href="@AddDrawerStateToUrlToggled(LocalPath)">
<DxButton aria-label="Close menu" RenderStyle="ButtonRenderStyle.Light" RenderStyleMode="ButtonRenderStyleMode.Text" CssClass="btn-icon-only" IconCssClass="@(ToggledDrawer ? "icon icon-close" : "icon icon-menu")"></DxButton>
</NavLink>
</div>
</HeaderTemplate>
<BodyTemplate>
<div class="w-100">
<NavMenu></NavMenu>
</div>
</BodyTemplate>
<FooterTemplate>
<div class="navigation-drawer-footer">
<NavLink href="https://docs.devexpress.com/Blazor/400725/blazor-components" class="button-link">
<DxButton Text="Docs" RenderStyle="ButtonRenderStyle.Light" RenderStyleMode="ButtonRenderStyleMode.Text" IconCssClass="icon icon-docs"></DxButton>
</NavLink>
<NavLink href="https://demos.devexpress.com/blazor/" class="button-link">
<DxButton Text="Demos" RenderStyle="ButtonRenderStyle.Light" RenderStyleMode="ButtonRenderStyleMode.Text" IconCssClass="icon icon-demos"></DxButton>
</NavLink>
</div>
</FooterTemplate>
<TargetContent>
<div class="drawer-content">
<div class="nav-buttons-container">
<NavLink aria-label="Open menu" href="@AddDrawerStateToUrlToggled(LocalPath)" class="menu-button">
<DxButton aria-label="Open menu" RenderStyle="ButtonRenderStyle.Secondary" RenderStyleMode="ButtonRenderStyleMode.Text" CssClass="btn-icon-only" IconCssClass="icon icon-menu"></DxButton>
</NavLink>
@if (LocalPath != "/") {
<NavLink href="@AddDrawerStateToUrl("/")" class="button-link">
<DxButton Text="Back to Home" RenderStyle="ButtonRenderStyle.Secondary" RenderStyleMode="ButtonRenderStyleMode.Text" CssClass="back-button" IconCssClass="icon icon-back"></DxButton>
</NavLink>
}
</div>
<div class="page-content-container">
@Body
</div>
</div>
</TargetContent>
</Drawer>
</div>
@code {
string LocalPath => new Uri(NavigationManager.Uri).LocalPath;
}

View File

@ -0,0 +1,67 @@
.page {
height: 100%;
min-height: 0;
}
::deep .navigation-drawer {
--dxbl-drawer-panel-body-padding-x: 0;
--dxbl-drawer-panel-body-padding-y: 1rem;
--dxbl-drawer-panel-footer-bg: none;
--dxbl-drawer-panel-header-bg: none;
--dxbl-drawer-separator-border-width: 0;
}
::deep .navigation-drawer > .dxbl-drawer-panel {
background-image: linear-gradient(180deg, var(--dxds-color-surface-primary-default-rest) 0%, var(--dxds-primary-170) 150%);
}
.navigation-drawer-header {
align-items: center;
display: flex;
justify-content: space-between;
padding: 1.375rem 0.375rem;
width: 100%;
}
.navigation-drawer-header .logo {
height: 1.5rem;
width: 9rem;
}
.navigation-drawer-footer {
display: flex;
justify-content: space-evenly;
padding-bottom: 0.875rem;
width: 100%;
}
.drawer-content {
display: flex;
flex-direction: column;
height: 100%;
overflow: auto;
padding: 2rem 1.5rem 1.5rem 1.5rem;
}
.nav-buttons-container {
align-items: center;
display: flex;
gap: 0.625rem;
min-height: 2rem;
}
::deep .nav-buttons-container > a {
color: inherit;
}
::deep .nav-buttons-container .back-button {
padding-left: 0;
padding-right: 0.25rem;
}
.page-content-container {
display: flex;
flex-direction: column;
flex-grow: 1;
min-height: 0;
}

View File

@ -0,0 +1,33 @@
@inject NavigationManager NavigationManager
@implements IDisposable
<div>
<DxMenu Orientation="@Orientation.Vertical" CssClass="menu">
<Items>
<DxMenuItem NavigateUrl="/" Text="Startseite" CssClass="@MenuItemCssClass("/")" IconCssClass="icon icon-home"></DxMenuItem>
<DxMenuItem NavigateUrl="/controlling" Text="Startseite Controlling" CssClass="@MenuItemCssClass("/controlling")" IconCssClass="icon icon-counter"></DxMenuItem>
</Items>
</DxMenu>
</div>
@code {
private string? currentLocalPath;
protected override void OnInitialized() {
currentLocalPath = new Uri(NavigationManager.Uri).LocalPath;
NavigationManager.LocationChanged += OnLocationChanged;
}
private void OnLocationChanged(object? sender, LocationChangedEventArgs e) {
currentLocalPath = new Uri(NavigationManager.Uri).LocalPath;
InvokeAsync(StateHasChanged);
}
private string? MenuItemCssClass(string itemPath) {
return string.Equals(currentLocalPath, itemPath, StringComparison.OrdinalIgnoreCase) ? "menu-item-active" : null;
}
public void Dispose() {
NavigationManager.LocationChanged -= OnLocationChanged;
}
}

View File

@ -0,0 +1,23 @@
::deep .menu {
--dxbl-menu-bottom-left-border-radius: 0;
--dxbl-menu-bottom-right-border-radius: 0;
--dxbl-menu-top-left-border-radius: 0;
--dxbl-menu-top-right-border-radius: 0;
--dxbl-menu-item-padding-x: 1.125rem;
--dxbl-menu-item-padding-y: 0.5rem;
--dxbl-menu-item-color: var(--dxds-color-content-neutral-default-static-dark-rest);
--dxbl-menu-item-image-color: var(--dxds-color-content-neutral-default-static-dark-rest);
--dxbl-menu-item-hover-bg: rgb(from var(--dxds-color-surface-neutral-default-static-light-rest) r g b / 0.15);
--dxbl-menu-item-hover-color: var(--dxds-color-content-neutral-default-static-dark-hovered);
--dxbl-menu-item-hover-image-color: var(--dxds-color-content-neutral-default-static-dark-hovered);
background: none;
}
::deep .menu.display-mobile {
margin-bottom: 2rem;
}
::deep .menu-item-active {
background-color: rgb(from var(--dxds-color-surface-neutral-default-static-light-rest) r g b / 0.05);
}

View File

@ -0,0 +1,24 @@
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<div class="counter-block">
<div class="counter-content">
<div class="counter-count">
@currentCount
</div>
current count
</div>
<DxButton Click="IncrementCount">Click me</DxButton>
</div>
@code {
private int currentCount;
private void IncrementCount()
{
currentCount++;
}
}

View File

@ -0,0 +1,25 @@
.counter-block {
align-items: center;
border-radius: 1rem;
display: flex;
flex-direction: column;
gap: 1.5rem;
height: 17rem;
justify-content: center;
padding: 2.5rem 1.5rem 1.5rem;
width: 16.875rem;
border: 1px solid var(--dxds-color-border-neutral-default-rest);
}
.counter-block .counter-content {
align-items: center;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.counter-block .counter-count {
font-size: 7.5rem;
font-weight: 400;
line-height: 7.75rem;
}

View File

@ -0,0 +1,36 @@
@page "/Error"
@using System.Diagnostics
<PageTitle>Error</PageTitle>
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
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>
and restarting the app.
</p>
@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;
}

View File

@ -0,0 +1,26 @@
@page "/"
<PageTitle>Controlling</PageTitle>
<div class="main-content">
<DxGridLayout CssClass="index-gridlayout">
<Rows>
<DxGridLayoutRow Height="auto" Areas="header"></DxGridLayoutRow>
<DxGridLayoutRow Height="auto" Areas="tiles"></DxGridLayoutRow>
</Rows>
<Items>
<DxGridLayoutItem Area="header" CssClass="title">
<Template>
<div class="title-header-text">Controlling-App</div>
<div class="title-content-text">Controlling-Application</div>
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="tiles" CssClass="tiles">
<Template>
<IndexTile NavigateUrl="counter" Title="Counter" Description="Count mouse clicks and track the total." IconCssClass="icon-counter" />
<IndexTile NavigateUrl="weather" Title="Weather" Description="See a 5-day temperature and weather conditions forecast." IconCssClass="icon-weather" />
</Template>
</DxGridLayoutItem>
</Items>
</DxGridLayout>
</div>

View File

@ -0,0 +1,31 @@
::deep .index-gridlayout {
container-type: inline-size;
height: auto;
margin-top: auto;
margin-bottom: auto;
padding-bottom: 9rem;
}
::deep .title {
padding-bottom: 3rem;
text-align: center;
}
::deep .tiles {
--tile-column-count: 4;
display: grid;
gap: 1rem;
grid-template-columns: repeat(var(--tile-column-count), max-content);
justify-content: center;
@container (max-width: 60.5rem) {
--tile-column-count: 3;
}
@container (max-width: 45.125rem) {
--tile-column-count: 2;
}
@container (max-width: 29.75rem) {
--tile-column-count: 1;
}
}

View File

@ -0,0 +1,40 @@
@inherits DrawerStateComponentBase
<div class="tile">
<NavLink href="@AddDrawerStateToUrl(NavigateUrl)">
<DxGridLayout CssClass="tile-content" ColumnSpacing="0.75rem" RowSpacing="0.75rem">
<Rows>
<DxGridLayoutRow Areas="icon title" Height="auto" />
<DxGridLayoutRow Areas="description description" Height="auto" />
</Rows>
<Columns>
<DxGridLayoutColumn Width="auto" />
<DxGridLayoutColumn />
</Columns>
<Items>
<DxGridLayoutItem Area="icon" CssClass="tile-icon">
<Template>
<div class="@("icon " + IconCssClass)" aria-hidden="true"></div>
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="title" CssClass="tile-title">
<Template>
@Title
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="description" CssClass="tile-description">
<Template>
@Description
</Template>
</DxGridLayoutItem>
</Items>
</DxGridLayout>
</NavLink>
</div>
@code {
[Parameter] public string NavigateUrl { get; set; } = string.Empty;
[Parameter] public string? Title { get; set; }
[Parameter] public string? Description { get; set; }
[Parameter] public string? IconCssClass { get; set; }
}

View File

@ -0,0 +1,44 @@
.tile {
border-radius: 0.75rem;
height: 7.5rem;
transition: box-shadow 0.2s;
width: 14.375rem;
border: 1px solid var(--dxds-color-border-neutral-default-rest);
}
.tile:hover {
box-shadow: 0 4px 8px 0 rgba(170, 170, 170, 0.24), 0 0 2px 0 rgba(170, 170, 170, 0.2);
}
.tile ::deep > a {
text-decoration: none;
}
::deep .tile-content {
padding: 1rem;
}
::deep .tile-icon {
border-radius: 0.375rem;
height: 2.75rem;
padding: 0.75rem;
width: 2.75rem;
border: 1px solid var(--dxds-color-border-neutral-default-rest);
}
::deep .tile-title {
align-self: center;
color: var(--dxds-color-content-neutral-default-rest);
font-size: var(--dxds-font-size-base-md);
font-weight: var(--dxds-font-weight-base-strong);
letter-spacing: var(--dxds-letter-spacing-base-md);
line-height: var(--dxds-line-height-base-md);
}
::deep .tile-description {
color: var(--dxds-color-content-neutral-subdued-rest);
font-size: var(--dxds-font-size-base-sm);
font-weight: var(--dxds-font-weight-base-default);
letter-spacing: var(--dxds-letter-spacing-base-sm);
line-height: var(--dxds-line-height-base-sm);
}

View File

@ -0,0 +1,32 @@
@page "/weather"
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<DxGrid Data="@forecasts">
<Columns>
<DxGridDataColumn Caption="Date" FieldName="Date" />
<DxGridDataColumn Caption="Temperature (C)" FieldName="TemperatureC" />
<DxGridDataColumn Caption="Temperature (F)" FieldName="TemperatureF" />
<DxGridDataColumn Caption="Summary" FieldName="Summary" />
</Columns>
</DxGrid>
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync() {
DateOnly startDate = DateOnly.FromDateTime(DateTime.Now);
string[] summaries = ["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 record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) {
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}

View File

@ -0,0 +1,10 @@
<Router AppAssembly="typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>

View File

@ -0,0 +1,77 @@
using Microsoft.AspNetCore.Components;
namespace LambertzPortalControlling.Components.Shared
{
public abstract class DrawerStateComponentBase : ComponentBase
{
[SupplyParameterFromQuery(Name = DrawerStateUrlBuilder.DrawerStateQueryParameterName)]
public bool ToggledDrawer { get; set; }
[Inject] NavigationManager NavigationManager { get; set; } = null!;
protected string AddDrawerStateToUrl(string baseUrl)
{
return DrawerStateUrlBuilder.AddStateToUrl(baseUrl, ToggledDrawer, NavigationManager);
}
protected string AddDrawerStateToUrlToggled(string baseUrl)
{
return DrawerStateUrlBuilder.AddStateToUrl(baseUrl, !ToggledDrawer, NavigationManager);
}
protected string RemoveDrawerStateFromUrl(string baseUrl)
{
return DrawerStateUrlBuilder.RemoveStateFromUrl(baseUrl, NavigationManager);
}
}
public abstract class DrawerStateLayoutComponentBase : LayoutComponentBase
{
[SupplyParameterFromQuery(Name = DrawerStateUrlBuilder.DrawerStateQueryParameterName)]
public bool ToggledDrawer { get; set; }
[Inject] NavigationManager NavigationManager { get; set; } = null!;
protected string AddDrawerStateToUrl(string baseUrl)
{
return DrawerStateUrlBuilder.AddStateToUrl(baseUrl, ToggledDrawer, NavigationManager);
}
protected string AddDrawerStateToUrlToggled(string baseUrl)
{
return DrawerStateUrlBuilder.AddStateToUrl(baseUrl, !ToggledDrawer, NavigationManager);
}
protected string RemoveDrawerStateFromUrl(string baseUrl)
{
return DrawerStateUrlBuilder.RemoveStateFromUrl(baseUrl, NavigationManager);
}
}
internal static class DrawerStateUrlBuilder
{
public const string DrawerStateQueryParameterName = "toggledSidebar";
public static string AddStateToUrl(string baseUrl, bool toggledDrawer, NavigationManager navigationManager)
{
return navigationManager.GetUriWithQueryParameters(
baseUrl,
new Dictionary<string, object?>
{
[DrawerStateQueryParameterName] = toggledDrawer ? true : null
}
);
}
public static string RemoveStateFromUrl(string baseUrl, NavigationManager navigationManager)
{
return navigationManager.GetUriWithQueryParameters(
baseUrl,
new Dictionary<string, object?>
{
[DrawerStateQueryParameterName] = null
}
);
}
}
}

View File

@ -0,0 +1,14 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.JSInterop
@using static Microsoft.AspNetCore.Components.Web.RenderMode
@using LambertzPortalControlling
@using LambertzPortalControlling.Components
@using LambertzPortalControlling.Components.Layout
@using LambertzPortalControlling.Components.Shared
@using DevExpress.Blazor

View File

@ -0,0 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DevExpress.Blazor" Version="25.2.*-*" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,33 @@
using LambertzPortalControlling.Components;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddDevExpressBlazor(options =>
{
options.SizeMode = DevExpress.Blazor.SizeMode.Medium;
});
builder.Services.AddMvc();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
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.UsePathBase("/controlling");
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode()
.AllowAnonymous();
app.Run();

View File

@ -0,0 +1,23 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@ -0,0 +1,35 @@
.icon {
width: 1.25rem;
height: 1.25rem;
background-color: currentcolor;
mask-image: var(--icon-mask-image);
mask-position: center;
mask-repeat: no-repeat;
}
.icon-back {
--icon-mask-image: url("/images/back.svg");
}
.icon-close {
--icon-mask-image: url("/images/close.svg");
}
.icon-demos {
--icon-mask-image: url("/images/demos.svg");
}
.icon-docs {
--icon-mask-image: url("/images/doc.svg");
}
.icon-menu {
--icon-mask-image: url("/images/menu.svg");
}
/* pages */
.icon-counter {
--icon-mask-image: url("/images/pages/counter.svg");
}
.icon-home {
--icon-mask-image: url("/images/pages/home.svg");
}
.icon-weather {
--icon-mask-image: url("/images/pages/weather.svg");
}

View File

@ -0,0 +1,79 @@
@import url('./icons.css');
html, body {
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
margin: 0;
}
.w-100 {
width: 100% !important;
}
.h-100 {
height: 100% !important;
}
.h-auto {
height: auto !important;
}
.overflow-hidden {
overflow: hidden !important;
}
.text-danger {
color: var(--dxds-color-content-danger-default-rest);
}
.valid.modified:not([type=checkbox]) {
outline: 1px solid var(--dxds-color-border-success-default-rest);
}
.invalid {
outline: 1px solid var(--dxds-color-border-danger-default-rest);
}
.validation-message {
color: var(--dxds-color-content-danger-default-rest);
}
.button-link {
text-decoration: unset;
}
.title {
display: flex;
flex-direction: column;
gap: 0.5rem;
padding: 1rem 0;
}
.title.title-secondary {
padding: 0.313rem 0 0;
color: var(--dxds-color-content-secondary-default-rest);
}
.title-header-text {
font-size: var(--dxds-font-size-headline-lg);
font-weight: var(--dxds-font-weight-headline-default);
letter-spacing: var(--dxds-letter-spacing-headline-lg);
line-height: var(--dxds-line-height-headline-lg);
}
.title-content-text {
font-size: var(--dxds-font-size-base-lg);
font-weight: var(--dxds-font-weight-base-default);
letter-spacing: var(--dxds-letter-spacing-base-lg);
line-height: var(--dxds-line-height-base-lg);
}
.main-content {
align-items: center;
display: flex;
height: 100%;
justify-content: center;
width: 100%;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M12.3544 15.8529C12.1594 16.0485 11.8429 16.0491 11.6472 15.8542L6.16276 10.3892C5.94705 10.1743 5.94705 9.82495 6.16276 9.61L11.6472 4.14502C11.8429 3.95011 12.1594 3.95067 12.3544 4.14628C12.5493 4.34189 12.5487 4.65848 12.3531 4.85339L7.18851 9.99961L12.3531 15.1458C12.5487 15.3407 12.5493 15.6573 12.3544 15.8529Z"/>
</svg>

After

Width:  |  Height:  |  Size: 399 B

View File

@ -0,0 +1,43 @@
<svg xmlns="http://www.w3.org/2000/svg">
<symbol id="counter" viewBox="0 0 104 104">
<path d="M8 54H96V88C96 91.3137 93.3137 94 90 94H14C10.6863 94 8 91.3137 8 88V54Z" fill="#8E9195"/>
<rect x="8" y="12" width="88" height="80" rx="6" fill="#E1E2E4"/>
<path d="M8 18C8 14.6863 10.6863 12 14 12H90C93.3137 12 96 14.6863 96 18V28H8V18Z" fill="white"/>
<rect x="66" y="18" width="24" height="4" rx="2" fill="#8E9195"/>
<rect x="44" y="18" width="4" height="4" rx="2" fill="#8E9195"/>
<rect x="50" y="18" width="4" height="4" rx="2" fill="#8E9195"/>
<rect x="56" y="18" width="4" height="4" rx="2" fill="#8E9195"/>
<rect x="12" y="16" width="8" height="8" rx="4" fill="var(--bs-primary, var(--dxds-primary-90))" />
<path d="M35 44C35 41.7909 36.7909 40 39 40H65C67.2091 40 69 41.7909 69 44V76C69 78.2091 67.2091 80 65 80H39C36.7909 80 35 78.2091 35 76V44Z" fill="white"/>
<path d="M52.4983 72.77C54.2039 72.77 55.7046 72.471 57.0004 71.8729C58.3073 71.2748 59.3317 70.4442 60.0738 69.3809C60.8158 68.3177 61.1869 67.105 61.1869 65.7427V65.7095C61.1869 64.026 60.6497 62.6748 59.5754 61.6559C58.5011 60.637 57.0834 60.0555 55.3225 59.9115V59.8285C56.2971 59.6291 57.161 59.2802 57.9141 58.7818C58.6783 58.2724 59.2764 57.6411 59.7083 56.888C60.1513 56.1238 60.3728 55.2433 60.3728 54.2465V54.2133C60.3728 52.9839 60.0461 51.9041 59.3927 50.9737C58.7392 50.0434 57.82 49.318 56.6349 48.7974C55.4498 48.2658 54.0599 48 52.465 48C50.9034 48 49.5245 48.2769 48.3284 48.8307C47.1433 49.3733 46.1908 50.1431 45.471 51.1399C44.7621 52.1366 44.3413 53.3051 44.2084 54.6452L44.1917 54.8279H47.7137L47.7303 54.6618C47.8078 53.9198 48.0515 53.2774 48.4613 52.7347C48.8711 52.192 49.4193 51.7767 50.106 51.4887C50.7927 51.2008 51.579 51.0568 52.465 51.0568C53.3732 51.0568 54.1429 51.2008 54.7742 51.4887C55.4166 51.7656 55.8984 52.1754 56.2196 52.7181C56.5518 53.2608 56.718 53.9198 56.718 54.695V54.7283C56.718 55.4703 56.5241 56.1293 56.1365 56.7052C55.7599 57.2811 55.2228 57.7352 54.525 58.0675C53.8384 58.3887 53.0409 58.5493 52.1328 58.5493H49.3252V61.4732H52.2491C53.8439 61.4732 55.101 61.8386 56.0202 62.5696C56.9395 63.2895 57.3991 64.3251 57.3991 65.6762V65.7095C57.3991 66.4737 57.1942 67.1548 56.7844 67.7529C56.3746 68.3509 55.7987 68.8216 55.0567 69.165C54.3257 69.4972 53.4729 69.6634 52.4983 69.6634C51.5015 69.6634 50.6265 69.5083 49.8734 69.1982C49.1314 68.8881 48.5333 68.4617 48.0792 67.919C47.6362 67.3652 47.3759 66.7395 47.2984 66.0417L47.2818 65.859H43.6934L43.71 66.0583C43.8207 67.3652 44.2471 68.5281 44.9892 69.5471C45.7312 70.5549 46.7391 71.3468 48.0127 71.9227C49.2975 72.4876 50.7927 72.77 52.4983 72.77Z" fill="#2E3134"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M81.9999 52C86.4183 52 90 55.5817 90 60C90 64.4183 86.4183 68 81.9999 68C77.5817 68 74 64.4183 74 60C74 55.5817 77.5817 52 81.9999 52Z" fill="var(--bs-primary, var(--dxds-primary-90))" />
<path fill-rule="evenodd" clip-rule="evenodd" d="M83 56C83 55.4477 82.5523 55 82 55C81.4477 55 81 55.4477 81 56V59H78C77.4477 59 77 59.4477 77 60C77 60.5523 77.4477 61 78 61H81V64C81 64.5523 81.4477 65 82 65C82.5523 65 83 64.5523 83 64V61H86C86.5523 61 87 60.5523 87 60C87 59.4477 86.5523 59 86 59H83V56Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M21.9999 52C26.4183 52 30 55.5817 30 60C30 64.4183 26.4183 68 21.9999 68C17.5817 68 14 64.4183 14 60C14 55.5817 17.5817 52 21.9999 52Z" fill="#C5C7C9"/>
<path d="M17 60C17 59.4477 17.4477 59 18 59H26C26.5523 59 27 59.4477 27 60C27 60.5523 26.5523 61 26 61H18C17.4477 61 17 60.5523 17 60Z" fill="white"/>
</symbol>
<symbol id="weather" viewBox="0 0 104 104">
<path d="M74.5994 18.1863L72 12L69.4006 18.1863C70.2494 18.0635 71.1173 18 72 18C72.8827 18 73.7506 18.0635 74.5994 18.1863Z" fill="#FFDA6A"/>
<path d="M76.4171 18.546C78.1282 18.9776 79.7418 19.6543 81.2185 20.5365L81.1844 13.8269L76.4171 18.546Z" fill="#FFDA6A"/>
<path d="M82.7568 21.5663C84.1524 22.6081 85.3919 23.8476 86.4337 25.2432L88.9706 19.0294L82.7568 21.5663Z" fill="#FFDA6A"/>
<path d="M87.4635 26.7815C88.3457 28.2582 89.0224 29.8718 89.454 31.5829L94.1731 26.8156L87.4635 26.7815Z" fill="#FFDA6A"/>
<path d="M89.8137 33.4006C89.9365 34.2494 90 35.1173 90 36C90 36.8827 89.9365 37.7506 89.8137 38.5994L96 36L89.8137 33.4006Z" fill="#FFDA6A"/>
<path d="M89.454 40.4171C89.0224 42.1282 88.3457 43.7418 87.4635 45.2185L94.1731 45.1844L89.454 40.4171Z" fill="#FFDA6A"/>
<path d="M86.4337 46.7568C85.3919 48.1524 84.1524 49.3919 82.7568 50.4337L88.9706 52.9706L86.4337 46.7568Z" fill="#FFDA6A"/>
<path d="M81.2185 51.4635C79.7418 52.3457 78.1282 53.0224 76.4171 53.454L81.1844 58.1731L81.2185 51.4635Z" fill="#FFDA6A"/>
<path d="M74.5994 53.8137C73.7506 53.9365 72.8827 54 72 54C71.1173 54 70.2494 53.9365 69.4006 53.8137L72 60L74.5994 53.8137Z" fill="#FFDA6A"/>
<path d="M67.5829 53.454C65.8718 53.0224 64.2582 52.3457 62.7815 51.4635L62.8156 58.1731L67.5829 53.454Z" fill="#FFDA6A"/>
<path d="M61.2432 50.4337C59.8476 49.3919 58.6081 48.1524 57.5663 46.7568L55.0294 52.9706L61.2432 50.4337Z" fill="#FFDA6A"/>
<path d="M56.5365 45.2185C55.6543 43.7418 54.9776 42.1282 54.546 40.4171L49.8269 45.1844L56.5365 45.2185Z" fill="#FFDA6A"/>
<path d="M54.1863 38.5994C54.0635 37.7506 54 36.8827 54 36C54 35.1173 54.0635 34.2494 54.1863 33.4006L48 36L54.1863 38.5994Z" fill="#FFDA6A"/>
<path d="M54.546 31.5829C54.9776 29.8718 55.6543 28.2582 56.5365 26.7815L49.8269 26.8156L54.546 31.5829Z" fill="#FFDA6A"/>
<path d="M57.5663 25.2432C58.6081 23.8476 59.8476 22.6081 61.2432 21.5663L55.0294 19.0294L57.5663 25.2432Z" fill="#FFDA6A"/>
<path d="M62.7815 20.5365L62.8156 13.8269L67.5829 18.546C65.8718 18.9776 64.2582 19.6543 62.7815 20.5365Z" fill="#FFDA6A"/>
<circle cx="72" cy="36" r="15" fill="#E8B249"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27 54C27 66.7025 37.2975 77 50 77H80C88.8366 77 96 69.8366 96 61C96 52.1634 88.8366 45 80 45C77.0716 45 74.327 45.7867 71.9659 47.1603C69.0538 37.7978 60.3207 31 50 31C37.2975 31 27 41.2975 27 54Z" fill="#8E9195"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M27 52C27 64.7025 37.2975 75 50 75H80C88.8366 75 96 67.8366 96 59C96 50.1634 88.8366 43 80 43C77.0716 43 74.327 43.7867 71.9659 45.1603C69.0538 35.7978 60.3207 29 50 29C37.2975 29 27 39.2975 27 52Z" fill="#C5C7C9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M56 88H21C13.8203 88 8 82.1797 8 75C8 67.8203 13.8203 62 21 62C21.1487 62 21.2968 62.0025 21.4443 62.0075C23.2605 53.9878 30.431 48 39 48C48.2764 48 55.9138 55.0171 56.8937 64.0328C63.1038 64.49 68 69.6732 68 76C68 82.6274 62.6274 88 56 88Z" fill="#8E9195"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M56 86H21C13.8203 86 8 80.1797 8 73C8 65.8203 13.8203 60 21 60C21.1487 60 21.2968 60.0025 21.4443 60.0075C23.2605 51.9878 30.431 46 39 46C48.2764 46 55.9138 53.0171 56.8937 62.0328C63.1038 62.49 68 67.6732 68 74C68 80.6274 62.6274 86 56 86Z" fill="#E1E2E4"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M78 76C78 67.1634 70.8366 60 62 60C54.4554 60 48.1304 65.2219 46.4422 72.2487C45.6537 72.0857 44.8368 72 44 72C37.3726 72 32 77.3726 32 84C32 90.6274 37.3726 96 44 96H78C83.5228 96 88 91.5228 88 86C88 80.4772 83.5228 76 78 76Z" fill="#8E9195"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M78 74C78 65.1634 70.8366 58 62 58C54.4554 58 48.1304 63.2219 46.4422 70.2487C45.6537 70.0857 44.8368 70 44 70C37.3726 70 32 75.3726 32 82C32 88.6274 37.3726 94 44 94H78C83.5229 94 88 89.5229 88 84C88 78.4771 83.5229 74 78 74Z" fill="white"/>
</symbol>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M4.08859 4.21569L4.14645 4.14645C4.32001 3.97288 4.58944 3.9536 4.78431 4.08859L4.85355 4.14645L10 9.293L15.1464 4.14645C15.32 3.97288 15.5894 3.9536 15.7843 4.08859L15.8536 4.14645C16.0271 4.32001 16.0464 4.58944 15.9114 4.78431L15.8536 4.85355L10.707 10L15.8536 15.1464C16.0271 15.32 16.0464 15.5894 15.9114 15.7843L15.8536 15.8536C15.68 16.0271 15.4106 16.0464 15.2157 15.9114L15.1464 15.8536L10 10.707L4.85355 15.8536C4.67999 16.0271 4.41056 16.0464 4.21569 15.9114L4.14645 15.8536C3.97288 15.68 3.9536 15.4106 4.08859 15.2157L4.14645 15.1464L9.293 10L4.14645 4.85355C3.97288 4.67999 3.9536 4.41056 4.08859 4.21569Z"/>
</svg>

After

Width:  |  Height:  |  Size: 700 B

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M7.5 2C7.77614 2 8 2.22386 8 2.5V4.5C8 4.77614 7.77614 5 7.5 5C7.22386 5 7 4.77614 7 4.5V2.5C7 2.22386 7.22386 2 7.5 2ZM3.61091 3.61091C3.80618 3.41565 4.12276 3.41565 4.31802 3.61091L5.73223 5.02513C5.9275 5.22039 5.9275 5.53697 5.73223 5.73223C5.53697 5.92749 5.22039 5.92749 5.02513 5.73223L3.61091 4.31802C3.41565 4.12276 3.41565 3.80617 3.61091 3.61091ZM11.3891 3.61091C11.5843 3.80617 11.5843 4.12276 11.3891 4.31802L9.97487 5.73223C9.77961 5.9275 9.46303 5.9275 9.26777 5.73223C9.0725 5.53697 9.0725 5.22039 9.26777 5.02513L10.682 3.61091C10.8772 3.41565 11.1938 3.41565 11.3891 3.61091ZM2 7.5C2 7.22386 2.22386 7 2.5 7H4.5C4.77614 7 5 7.22386 5 7.5C5 7.77614 4.77614 8 4.5 8H2.5C2.22386 8 2 7.77614 2 7.5ZM8.64019 7.2993C7.98886 6.75653 7 7.21968 7 8.06752V17.1693C7 18.0926 8.14454 18.5227 8.75258 17.8278L10.7787 15.5122C11.0635 15.1867 11.475 15 11.9075 15H15.119C16.0543 15 16.4777 13.8305 15.7592 13.2318L8.64019 7.2993ZM8 17.1693L8 8.06752L15.119 14H11.9075C11.1866 14 10.5008 14.3112 10.0261 14.8537L8 17.1693Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M5.5 5C5.22386 5 5 5.22386 5 5.5V7.5C5 7.77614 5.22386 8 5.5 8H12.5C12.7761 8 13 7.77614 13 7.5V5.5C13 5.22386 12.7761 5 12.5 5H5.5ZM6 7V6H12V7H6ZM3 4C3 2.89543 3.89543 2 5 2H13C14.1046 2 15 2.89543 15 4V16C15 17.1046 14.1046 18 13 18H5C3.89543 18 3 17.1046 3 16V4ZM5 3C4.44772 3 4 3.44772 4 4V16C4 16.5523 4.44772 17 5 17H13C13.5523 17 14 16.5523 14 16V4C14 3.44772 13.5523 3 13 3H5ZM16 6H16.5C16.7761 6 17 6.22386 17 6.5V8C17 8.27614 16.7761 8.5 16.5 8.5H16V6ZM16.5 9.5H16V12H16.5C16.7761 12 17 11.7761 17 11.5V10C17 9.72386 16.7761 9.5 16.5 9.5ZM16 13H16.5C16.7761 13 17 13.2239 17 13.5V15C17 15.2761 16.7761 15.5 16.5 15.5H16V13Z"/>
</svg>

After

Width:  |  Height:  |  Size: 714 B

View File

@ -0,0 +1,16 @@
<svg viewBox="0 0 144 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M34.6184 3.1643C33.0578 3.1643 31.5947 3.31034 30.4731 3.50507V19.2779C31.3021 19.3753 32.4726 19.4726 33.9844 19.4726C36.7643 19.4726 39.0077 18.8398 40.4707 17.5254C41.69 16.4057 42.9092 14.4097 42.9092 10.9533C42.9092 8.03246 42.0313 6.08519 40.4707 4.81947C39.1052 3.74848 37.3007 3.1643 34.6184 3.1643ZM34.716 17.0385C34.2771 17.0385 33.8381 17.0385 33.5455 16.9899V5.74442C33.8869 5.69574 34.3746 5.59838 35.0086 5.59838C37.886 5.59838 39.6417 7.39959 39.6417 11.002C39.6417 15.2373 37.6421 17.0385 34.716 17.0385Z" fill="white"/>
<path d="M49.7369 7.49696C46.323 7.49696 44.421 10.3692 44.421 13.7282C44.421 17.3306 46.4693 19.57 50.0783 19.57C51.5413 19.57 52.8581 19.3266 53.8335 18.8884L53.3946 16.7465C52.6143 17.0385 51.6876 17.2333 50.566 17.2333C48.9078 17.2333 47.4935 16.4544 47.396 14.4584H54.37C54.4187 14.1176 54.4675 13.6795 54.4675 13.2414C54.4187 9.4929 52.5655 7.49696 49.7369 7.49696ZM47.3472 12.3164C47.4447 11.1481 48.0787 9.63895 49.5418 9.63895C51.0536 9.63895 51.5413 11.0994 51.5413 12.3164H47.3472Z" fill="white"/>
<path d="M63.0509 7.74037L61.5878 13.3874C61.3439 14.4097 61.1489 15.3347 60.9538 16.357H60.905C60.7099 15.3347 60.5149 14.4097 60.271 13.3874L58.7592 7.74037H55.4429L59.3444 19.3753H62.3193L66.2696 7.74037H63.0509Z" fill="white"/>
<path d="M2.04062 18.2556C1.45539 18.9858 1.01647 19.6673 0.723857 20.2515C0.626318 20.3976 0.480011 20.8357 0.480011 21.1278V21.5659C0.480011 22.2961 1.06524 22.8803 1.79678 22.8803H22.0848C22.8163 22.8803 23.4015 22.2961 23.4015 21.5659V5.98783C12.2822 7.93509 5.552 13.9229 2.04062 18.2556Z" fill="white"/>
<path d="M71.0978 12.3164H76.3649V9.78499H71.0978V5.89047H76.6575V3.31034H68.0253V19.3266H76.9989V16.7465H71.0978V12.3164Z" fill="white"/>
<path d="M88.6547 7.74037H85.3872L84.363 9.83367C84.0704 10.4179 83.7778 11.0507 83.4851 11.6836H83.4364C83.1438 11.0994 82.8512 10.5152 82.5585 9.83367L81.4368 7.74037H78.023L81.4856 13.4848L77.9742 19.3753H81.2905L82.3635 17.1359C82.6561 16.5517 82.9487 15.9189 83.2413 15.286H83.2901C83.5827 15.9189 83.8753 16.503 84.1679 17.1359L85.3384 19.3753H88.801L85.2896 13.3874L88.6547 7.74037Z" fill="white"/>
<path d="M96.5065 7.49696C94.9947 7.49696 93.8242 8.12982 93.0439 9.34686H92.9951L92.8488 7.74037H90.1665C90.2153 8.81136 90.2641 10.0284 90.2641 11.5375V24H93.3365V18.2069H93.3853C93.873 18.9858 94.8484 19.57 96.1164 19.57C98.4573 19.57 100.896 17.6714 100.896 13.4361C100.945 9.83367 99.0425 7.49696 96.5065 7.49696ZM95.4336 17.1359C94.4094 17.1359 93.3853 16.3083 93.3853 14.6531V12.4625C93.3853 11.0507 94.3119 9.93103 95.5311 9.93103C97.043 9.93103 97.8721 11.4402 97.8721 13.4848C97.8233 15.6268 96.9942 17.1359 95.4336 17.1359Z" fill="white"/>
<path d="M105.919 9.73631H105.821L105.675 7.69168H103.042C103.09 8.714 103.139 9.88235 103.139 11.3428V19.3266H106.212V13.3387C106.212 11.3428 107.285 10.4179 108.65 10.4179C108.943 10.4179 109.235 10.4179 109.43 10.4665V7.54564C109.235 7.49696 109.04 7.49696 108.748 7.49696C107.675 7.49696 106.455 8.22718 105.919 9.73631Z" fill="white"/>
<path d="M115.868 7.49696C112.454 7.49696 110.552 10.3692 110.552 13.7282C110.552 17.3306 112.6 19.57 116.209 19.57C117.672 19.57 118.989 19.3266 119.965 18.8884L119.526 16.7465C118.745 17.0385 117.819 17.2333 116.697 17.2333C115.039 17.2333 113.625 16.4544 113.527 14.4584H120.452C120.501 14.1176 120.55 13.6795 120.55 13.2414C120.55 9.4929 118.697 7.49696 115.868 7.49696ZM113.478 12.3164C113.576 11.1481 114.21 9.63894 115.673 9.63894C117.185 9.63894 117.672 11.0994 117.672 12.3164H113.478Z" fill="white"/>
<path d="M126.938 12.3164C125.622 11.7323 125.183 11.4402 125.183 10.7586C125.183 10.1258 125.67 9.63894 126.646 9.63894C127.524 9.63894 128.353 9.97972 128.84 10.2231L129.426 8.03245C128.743 7.69168 127.719 7.39959 126.548 7.39959C123.964 7.39959 122.305 9.00609 122.305 11.0507C122.305 12.3164 123.086 13.5335 125.28 14.4097C126.548 14.9452 126.938 15.3347 126.938 16.0162C126.938 16.7465 126.402 17.1846 125.329 17.1846C124.354 17.1846 123.232 16.7465 122.598 16.4057L122.013 18.645C122.793 19.0832 124.012 19.4239 125.28 19.4239C128.206 19.4239 129.865 17.9635 129.865 15.7728C129.816 14.2637 128.938 13.144 126.938 12.3164Z" fill="white"/>
<path d="M136.205 12.3164C134.888 11.7323 134.449 11.4402 134.449 10.7586C134.449 10.1258 134.937 9.63894 135.912 9.63894C136.79 9.63894 137.619 9.97972 138.107 10.2231L138.692 8.03245C138.009 7.69168 136.985 7.39959 135.814 7.39959C133.23 7.39959 131.572 9.00609 131.572 11.0507C131.572 12.3164 132.352 13.5335 134.546 14.4097C135.814 14.9452 136.205 15.3347 136.205 16.0162C136.205 16.7465 135.668 17.1846 134.595 17.1846C133.62 17.1846 132.498 16.7465 131.864 16.4057L131.279 18.645C132.059 19.0832 133.278 19.4239 134.546 19.4239C137.473 19.4239 139.131 17.9635 139.131 15.7728C139.082 14.2637 138.155 13.144 136.205 12.3164Z" fill="white"/>
<path d="M22.0848 0H1.79678C1.06524 0 0.480011 0.584179 0.480011 1.3144V13.4361C4.47908 9.24949 11.6482 4.62475 22.5237 3.35903C22.8163 3.35903 23.4015 3.21298 23.4015 2.43408V1.3144C23.4015 0.584179 22.8163 0 22.0848 0Z" fill="white"/>
<path d="M142.057 7.05882C142.398 6.96146 142.593 6.76674 142.593 6.47465C142.593 6.27992 142.545 6.13387 142.398 6.03651C142.252 5.93915 142.057 5.89047 141.764 5.89047H141.082V8.03246H141.52V7.15619H141.716C141.862 7.15619 141.959 7.25355 142.008 7.44828L142.203 7.98377H142.691L142.447 7.39959C142.301 7.20487 142.203 7.05882 142.057 7.05882ZM141.764 6.81542H141.472V6.18256H141.716C142.008 6.18256 142.106 6.27992 142.106 6.47465C142.106 6.57201 142.057 6.62069 142.008 6.71805C141.959 6.81542 141.911 6.81542 141.764 6.81542Z" fill="white"/>
<path d="M143.032 5.74442C142.691 5.40365 142.301 5.25761 141.813 5.25761C141.325 5.25761 140.886 5.40365 140.594 5.74442C140.252 6.08519 140.106 6.47465 140.106 6.96146C140.106 7.44828 140.252 7.83773 140.594 8.1785C140.935 8.47059 141.325 8.66531 141.813 8.66531C142.301 8.66531 142.691 8.51927 143.032 8.1785C143.374 7.83773 143.52 7.44828 143.52 6.96146C143.52 6.47465 143.374 6.08519 143.032 5.74442ZM142.837 7.98377C142.545 8.27586 142.203 8.42191 141.813 8.42191C141.423 8.42191 141.082 8.27586 140.789 8.03245C140.496 7.74037 140.35 7.39959 140.35 7.01014C140.35 6.62069 140.496 6.27992 140.789 5.98783C141.082 5.69574 141.423 5.5497 141.813 5.5497C142.203 5.5497 142.593 5.69574 142.837 5.98783C143.13 6.27992 143.276 6.62069 143.276 7.01014C143.227 7.35091 143.081 7.69168 142.837 7.98377Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M2 4.5C2 4.22386 2.22386 4 2.5 4H17.5C17.7761 4 18 4.22386 18 4.5C18 4.77614 17.7761 5 17.5 5H2.5C2.22386 5 2 4.77614 2 4.5ZM2 9.5C2 9.22386 2.22386 9 2.5 9H17.5C17.7761 9 18 9.22386 18 9.5C18 9.77614 17.7761 10 17.5 10H2.5C2.22386 10 2 9.77614 2 9.5ZM2.5 14C2.22386 14 2 14.2239 2 14.5C2 14.7761 2.22386 15 2.5 15H17.5C17.7761 15 18 14.7761 18 14.5C18 14.2239 17.7761 14 17.5 14H2.5Z"/>
</svg>

After

Width:  |  Height:  |  Size: 465 B

View File

@ -0,0 +1,4 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M12 7C12.2761 7 12.4999 7.22394 12.5 7.5C12.5 7.77614 12.2761 8 12 8H9.24805L9.05859 9.74023C9.1367 9.73932 9.2198 9.73775 9.30469 9.7373C9.72449 9.73511 10.2541 9.74019 10.5254 9.77832C12.0975 9.99951 13.1926 11.4532 12.9717 13.0254C12.7506 14.5976 11.2969 15.6926 9.72461 15.4717C8.75136 15.3348 7.96091 14.7255 7.55273 13.9102C7.42918 13.6632 7.52946 13.3629 7.77637 13.2393C8.02327 13.1158 8.32368 13.216 8.44727 13.4629C8.71464 13.9967 9.23033 14.3924 9.86426 14.4814C10.8896 14.6254 11.8373 13.9111 11.9814 12.8857C12.1255 11.8604 11.4111 10.9127 10.3857 10.7686C10.2017 10.7427 9.75352 10.735 9.30957 10.7373C9.09662 10.7384 8.89716 10.7423 8.75098 10.7451C8.67802 10.7465 8.61837 10.7471 8.57715 10.748L8.53027 10.75H8.51367C8.36935 10.754 8.2307 10.695 8.13281 10.5889C8.03499 10.4828 7.98738 10.3398 8.00293 10.1963L8.30273 7.44629C8.3304 7.1927 8.54473 7.00009 8.7998 7H12Z"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.7559 2.0127C15.0164 2.14082 16 3.20566 16 4.5V15.5C16 16.8807 14.8807 18 13.5 18H6.5C5.11929 18 4 16.8807 4 15.5V4.5C4 3.11929 5.11929 2 6.5 2H13.5L13.7559 2.0127ZM6.5 3C5.67157 3 5 3.67157 5 4.5V15.5C5 16.3284 5.67157 17 6.5 17H13.5C14.3284 17 15 16.3284 15 15.5V4.5C15 3.67157 14.3284 3 13.5 3H12.8369C12.4546 4.15802 11.4097 5 10 5C9.13757 5 8.24072 4.71025 7.56543 3.95996C7.32396 3.69166 7.12023 3.37196 6.95605 3H6.5ZM8.27148 3C8.61688 3.59728 9.26022 4 10 4C10.8124 4 11.4337 3.60128 11.7549 3H8.27148Z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M8.9975 2.38811C9.56767 1.87584 10.4323 1.87584 11.0025 2.38811L16.5025 7.32965C16.8191 7.61414 17 8.01977 17 8.44544V15.4996C17 16.328 16.3284 16.9996 15.5 16.9996H13C12.1716 16.9996 11.5 16.328 11.5 15.4996V11.9996C11.5 11.7234 11.2761 11.4996 11 11.4996H9C8.72386 11.4996 8.5 11.7234 8.5 11.9996V15.4996C8.5 16.328 7.82843 16.9996 7 16.9996H4.5C3.67157 16.9996 3 16.328 3 15.4996V8.44544C3 8.01977 3.18086 7.61414 3.4975 7.32965L8.9975 2.38811ZM10.3342 3.13197C10.1441 2.96122 9.85589 2.96122 9.66583 3.13197L4.16583 8.07351C4.06029 8.16834 4 8.30355 4 8.44544V15.4996C4 15.7757 4.22386 15.9996 4.5 15.9996H7C7.27614 15.9996 7.5 15.7757 7.5 15.4996V11.9996C7.5 11.1711 8.17157 10.4996 9 10.4996H11C11.8284 10.4996 12.5 11.1711 12.5 11.9996V15.4996C12.5 15.7757 12.7239 15.9996 13 15.9996H15.5C15.7761 15.9996 16 15.7757 16 15.4996V8.44544C16 8.30355 15.9397 8.16834 15.8342 8.07351L10.3342 3.13197Z"/>
</svg>

After

Width:  |  Height:  |  Size: 982 B

View File

@ -0,0 +1,3 @@
<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path d="M11 7C13.4646 7 14.8627 8.5736 15.066 10.474L15.1282 10.474C16.7143 10.474 18 11.711 18 13.237C18 14.763 16.7143 16 15.1282 16H6.8718C5.28575 16 4.00001 14.763 4.00001 13.237C4.00001 11.711 5.28575 10.474 6.87182 10.474L6.934 10.474C7.13852 8.56111 8.53544 7 11 7ZM11 8C9.35057 8 7.9129 9.27029 7.9129 11.0249C7.9129 11.303 7.65892 11.5211 7.36809 11.5211L6.81819 11.5211C5.81403 11.5211 5.00001 12.2999 5.00001 13.2605C5.00001 14.2212 5.81403 15 6.81819 15H15.1818C16.186 15 17 14.2212 17 13.2605C17 12.2999 16.186 11.5211 15.1818 11.5211L14.6319 11.5211C14.3411 11.5211 14.0871 11.303 14.0871 11.0249C14.0871 9.24779 12.6494 8 11 8ZM3.80323 9.70081C3.88315 9.9329 3.78237 10.1835 3.57561 10.2995L3.49326 10.3364L2.69185 10.6123C2.43075 10.7022 2.14621 10.5634 2.05631 10.3023C1.97639 10.0702 2.07717 9.81963 2.28393 9.70366L2.36628 9.66678L3.16769 9.39083C3.42879 9.30093 3.71333 9.43971 3.80323 9.70081ZM8.91929 5.50023C9.25181 5.66241 9.54462 5.87337 9.79331 6.12029C9.38698 6.20342 9.00724 6.33003 8.65692 6.4951C8.60128 6.46105 8.54207 6.42885 8.48091 6.39902C7.34909 5.84699 5.98405 6.31701 5.43202 7.44884C5.04721 8.23783 5.15904 9.14013 5.6455 9.80137C5.31553 9.89962 5.00518 10.0425 4.72106 10.2221C4.124 9.29064 4.01237 8.07839 4.53323 7.01047C5.32736 5.38225 7.29107 4.70609 8.91929 5.50023ZM2.91582 5.66976L3.00013 5.70192L3.76194 6.07348C4.01013 6.19453 4.1132 6.49387 3.99215 6.74206C3.88455 6.96268 3.63608 7.06863 3.40788 7.00443L3.32357 6.97227L2.56176 6.60072C2.31357 6.47966 2.2105 6.18033 2.33155 5.93214C2.43915 5.71152 2.68762 5.60557 2.91582 5.66976ZM9.98918 3.2954C10.2098 3.403 10.3157 3.65147 10.2515 3.87967L10.2194 3.96398L9.84783 4.72579C9.72678 4.97398 9.42745 5.07705 9.17925 4.956C8.95863 4.8484 8.85268 4.59993 8.91688 4.37173L8.94904 4.28742L9.3206 3.52561C9.44165 3.27742 9.74098 3.17435 9.98918 3.2954ZM6.19931 3.26298L6.23619 3.34533L6.51213 4.14674C6.60204 4.40784 6.46326 4.69238 6.20216 4.78228C5.97007 4.8622 5.71946 4.76142 5.60349 4.55466L5.56662 4.47231L5.29067 3.6709C5.20077 3.4098 5.33955 3.12526 5.60064 3.03536C5.83273 2.95544 6.08334 3.05622 6.19931 3.26298Z"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36915.13
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LambertzPortalPersonalverkauf", "LambertzPortalPersonalverkauf\LambertzPortalPersonalverkauf.csproj", "{5A65F5C1-6C5C-4896-98D7-37D78E826C7B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{5A65F5C1-6C5C-4896-98D7-37D78E826C7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5A65F5C1-6C5C-4896-98D7-37D78E826C7B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5A65F5C1-6C5C-4896-98D7-37D78E826C7B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5A65F5C1-6C5C-4896-98D7-37D78E826C7B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3E23F239-E222-403B-B2A8-9F322505F12C}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,49 @@
@using Microsoft.AspNetCore.Mvc.ViewFeatures
@inject IFileVersionProvider FileVersionProvider
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<base href="/pvk/" />
@DxResourceManager.RegisterTheme(ActiveTheme)
@DxResourceManager.RegisterScripts()
<link href=@AppendVersion("css/site.css") rel="stylesheet" />
<link href=@AppendVersion("LambertzPortalPersonalverkauf.styles.css") rel="stylesheet" />
<HeadOutlet @rendermode="InteractiveServer" />
</head>
<body>
<Routes @rendermode="InteractiveServer" />
<script src="_framework/blazor.web.js"></script>
</body>
</html>
@code {
static readonly ITheme ActiveTheme = Themes.Fluent.Clone(properties =>
{
properties.Mode = ThemeMode.Light;
});
[CascadingParameter]
private HttpContext HttpContext { get; set; } = default!;
private string AppendVersion(string path)
=> FileVersionProvider.AddFileVersionToPath(
HttpContext.Request.PathBase.HasValue
? HttpContext.Request.PathBase.Value
: "/",
path);
}
@* @code {
static readonly ITheme ActiveTheme = Themes.Fluent.Clone(properties => {
properties.Mode = ThemeMode.Light;
});
private string AppendVersion(string path) => FileVersionProvider.AddFileVersionToPath("/", path);
} *@

View File

@ -0,0 +1,38 @@
@inherits DrawerStateComponentBase
<div class="drawer-container">
<DxDrawer PanelWidth="@PanelWidth"
CssClass="@(CssClass + " mobile")"
Mode="DrawerMode.Overlap"
IsOpen="@ToggledDrawer"
BodyTemplate="BodyTemplate"
HeaderTemplate="HeaderTemplate"
FooterTemplate="FooterTemplate"
ApplyBackgroundShading="false"
ClosedCssClass="panel-closed">
<TargetContent>
<DxDrawer PanelWidth="@PanelWidth"
CssClass="@CssClass"
Mode="DrawerMode.Shrink"
IsOpen="@(!ToggledDrawer)"
BodyTemplate="BodyTemplate"
HeaderTemplate="HeaderTemplate"
FooterTemplate="FooterTemplate"
OpenCssClass="panel-open">
<TargetContent>
<div class="navigation-drawer-shading"></div>
@TargetContent
</TargetContent>
</DxDrawer>
</TargetContent>
</DxDrawer>
</div>
@code {
[Parameter] public string? CssClass { get; set; }
[Parameter] public string? PanelWidth { get; set; }
[Parameter] public RenderFragment? TargetContent { get; set; }
[Parameter] public RenderFragment? BodyTemplate { get; set; }
[Parameter] public RenderFragment? HeaderTemplate { get; set; }
[Parameter] public RenderFragment? FooterTemplate { get; set; }
}

View File

@ -0,0 +1,53 @@
.drawer-container {
height: 100%;
}
.navigation-drawer-shading {
height: 100%;
position: absolute;
transition: ease 300ms;
transition-property: opacity, visibility;
visibility: visible;
width: 100%;
z-index: 99;
background-color: var(--dxds-color-surface-backdrop-default-rest);
}
.navigation-drawer.mobile.panel-closed .navigation-drawer-shading {
opacity: 0;
visibility: hidden;
}
::deep .navigation-drawer > .dxbl-drawer-panel {
display: flex;
}
::deep .navigation-drawer.mobile > .dxbl-drawer-panel {
display: none;
}
.navigation-drawer-shading {
display: none;
}
::deep .panel-open:not(.mobile) .nav-buttons-container .menu-button {
display: none;
}
@media (max-width: 768px) {
::deep .navigation-drawer > .dxbl-drawer-panel {
display: none;
}
::deep .navigation-drawer.mobile > .dxbl-drawer-panel {
display: flex;
}
.navigation-drawer-shading {
display: block;
}
::deep .panel-open:not(.mobile) .nav-buttons-container .menu-button {
display: flex;
}
}

View File

@ -0,0 +1,53 @@
@inherits DrawerStateLayoutComponentBase
@inject NavigationManager NavigationManager
<div class="page">
<Drawer CssClass="navigation-drawer" PanelWidth="240px">
<HeaderTemplate>
<div class="navigation-drawer-header">
<NavLink href="@AddDrawerStateToUrl("/")">
<img class="logo" src="images/logo.svg" alt="DevExpress logo" />
</NavLink>
<NavLink aria-label="Close menu" href="@AddDrawerStateToUrlToggled(LocalPath)">
<DxButton aria-label="Close menu" RenderStyle="ButtonRenderStyle.Light" RenderStyleMode="ButtonRenderStyleMode.Text" CssClass="btn-icon-only" IconCssClass="@(ToggledDrawer ? "icon icon-close" : "icon icon-menu")"></DxButton>
</NavLink>
</div>
</HeaderTemplate>
<BodyTemplate>
<div class="w-100">
<NavMenu></NavMenu>
</div>
</BodyTemplate>
<FooterTemplate>
<div class="navigation-drawer-footer">
<NavLink href="https://docs.devexpress.com/Blazor/400725/blazor-components" class="button-link">
<DxButton Text="Docs" RenderStyle="ButtonRenderStyle.Light" RenderStyleMode="ButtonRenderStyleMode.Text" IconCssClass="icon icon-docs"></DxButton>
</NavLink>
<NavLink href="https://demos.devexpress.com/blazor/" class="button-link">
<DxButton Text="Demos" RenderStyle="ButtonRenderStyle.Light" RenderStyleMode="ButtonRenderStyleMode.Text" IconCssClass="icon icon-demos"></DxButton>
</NavLink>
</div>
</FooterTemplate>
<TargetContent>
<div class="drawer-content">
<div class="nav-buttons-container">
<NavLink aria-label="Open menu" href="@AddDrawerStateToUrlToggled(LocalPath)" class="menu-button">
<DxButton aria-label="Open menu" RenderStyle="ButtonRenderStyle.Secondary" RenderStyleMode="ButtonRenderStyleMode.Text" CssClass="btn-icon-only" IconCssClass="icon icon-menu"></DxButton>
</NavLink>
@if (LocalPath != "/") {
<NavLink href="@AddDrawerStateToUrl("/")" class="button-link">
<DxButton Text="Back to Home" RenderStyle="ButtonRenderStyle.Secondary" RenderStyleMode="ButtonRenderStyleMode.Text" CssClass="back-button" IconCssClass="icon icon-back"></DxButton>
</NavLink>
}
</div>
<div class="page-content-container">
@Body
</div>
</div>
</TargetContent>
</Drawer>
</div>
@code {
string LocalPath => new Uri(NavigationManager.Uri).LocalPath;
}

View File

@ -0,0 +1,67 @@
.page {
height: 100%;
min-height: 0;
}
::deep .navigation-drawer {
--dxbl-drawer-panel-body-padding-x: 0;
--dxbl-drawer-panel-body-padding-y: 1rem;
--dxbl-drawer-panel-footer-bg: none;
--dxbl-drawer-panel-header-bg: none;
--dxbl-drawer-separator-border-width: 0;
}
::deep .navigation-drawer > .dxbl-drawer-panel {
background-image: linear-gradient(180deg, var(--dxds-color-surface-primary-default-rest) 0%, var(--dxds-primary-170) 150%);
}
.navigation-drawer-header {
align-items: center;
display: flex;
justify-content: space-between;
padding: 1.375rem 0.375rem;
width: 100%;
}
.navigation-drawer-header .logo {
height: 1.5rem;
width: 9rem;
}
.navigation-drawer-footer {
display: flex;
justify-content: space-evenly;
padding-bottom: 0.875rem;
width: 100%;
}
.drawer-content {
display: flex;
flex-direction: column;
height: 100%;
overflow: auto;
padding: 2rem 1.5rem 1.5rem 1.5rem;
}
.nav-buttons-container {
align-items: center;
display: flex;
gap: 0.625rem;
min-height: 2rem;
}
::deep .nav-buttons-container > a {
color: inherit;
}
::deep .nav-buttons-container .back-button {
padding-left: 0;
padding-right: 0.25rem;
}
.page-content-container {
display: flex;
flex-direction: column;
flex-grow: 1;
min-height: 0;
}

View File

@ -0,0 +1,34 @@
@inject NavigationManager NavigationManager
@implements IDisposable
<div>
<DxMenu Orientation="@Orientation.Vertical" CssClass="menu">
<Items>
<DxMenuItem NavigateUrl="/" Text="Startseite" CssClass="@MenuItemCssClass("/")" IconCssClass="icon icon-home"></DxMenuItem>
<DxMenuItem NavigateUrl="/pvk" Text="Startseite PVK" CssClass="@MenuItemCssClass("/pvk")" IconCssClass="icon icon-home"></DxMenuItem>
<DxMenuItem NavigateUrl="cookiecheck" Text="Cookie Checker" CssClass="@MenuItemCssClass("cookiecheck")" IconCssClass="icon icon-counter"></DxMenuItem>
</Items>
</DxMenu>
</div>
@code {
private string? currentLocalPath;
protected override void OnInitialized() {
currentLocalPath = new Uri(NavigationManager.Uri).LocalPath;
NavigationManager.LocationChanged += OnLocationChanged;
}
private void OnLocationChanged(object? sender, LocationChangedEventArgs e) {
currentLocalPath = new Uri(NavigationManager.Uri).LocalPath;
InvokeAsync(StateHasChanged);
}
private string? MenuItemCssClass(string itemPath) {
return string.Equals(currentLocalPath, itemPath, StringComparison.OrdinalIgnoreCase) ? "menu-item-active" : null;
}
public void Dispose() {
NavigationManager.LocationChanged -= OnLocationChanged;
}
}

View File

@ -0,0 +1,23 @@
::deep .menu {
--dxbl-menu-bottom-left-border-radius: 0;
--dxbl-menu-bottom-right-border-radius: 0;
--dxbl-menu-top-left-border-radius: 0;
--dxbl-menu-top-right-border-radius: 0;
--dxbl-menu-item-padding-x: 1.125rem;
--dxbl-menu-item-padding-y: 0.5rem;
--dxbl-menu-item-color: var(--dxds-color-content-neutral-default-static-dark-rest);
--dxbl-menu-item-image-color: var(--dxds-color-content-neutral-default-static-dark-rest);
--dxbl-menu-item-hover-bg: rgb(from var(--dxds-color-surface-neutral-default-static-light-rest) r g b / 0.15);
--dxbl-menu-item-hover-color: var(--dxds-color-content-neutral-default-static-dark-hovered);
--dxbl-menu-item-hover-image-color: var(--dxds-color-content-neutral-default-static-dark-hovered);
background: none;
}
::deep .menu.display-mobile {
margin-bottom: 2rem;
}
::deep .menu-item-active {
background-color: rgb(from var(--dxds-color-surface-neutral-default-static-light-rest) r g b / 0.05);
}

View File

@ -0,0 +1,16 @@
@page "/cookiecheck"
@using Microsoft.AspNetCore.Http
<h3>CookieCheck</h3>
<p><b>LambertzTest:</b> @_cookie</p>
@code {
[CascadingParameter] public HttpContext HttpContext { get; set; } = default!;
private string? _cookie;
protected override void OnInitialized()
{
HttpContext.Request.Cookies.TryGetValue("LambertzTest", out _cookie);
}
}

View File

@ -0,0 +1,24 @@
@page "/counter"
<PageTitle>Counter</PageTitle>
<h1>Counter</h1>
<div class="counter-block">
<div class="counter-content">
<div class="counter-count">
@currentCount
</div>
current count
</div>
<DxButton Click="IncrementCount">Click me</DxButton>
</div>
@code {
private int currentCount;
private void IncrementCount()
{
currentCount++;
}
}

View File

@ -0,0 +1,25 @@
.counter-block {
align-items: center;
border-radius: 1rem;
display: flex;
flex-direction: column;
gap: 1.5rem;
height: 17rem;
justify-content: center;
padding: 2.5rem 1.5rem 1.5rem;
width: 16.875rem;
border: 1px solid var(--dxds-color-border-neutral-default-rest);
}
.counter-block .counter-content {
align-items: center;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.counter-block .counter-count {
font-size: 7.5rem;
font-weight: 400;
line-height: 7.75rem;
}

View File

@ -0,0 +1,36 @@
@page "/Error"
@using System.Diagnostics
<PageTitle>Error</PageTitle>
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
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>
and restarting the app.
</p>
@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;
}

View File

@ -0,0 +1,25 @@
@page "/"
<PageTitle>Welcome</PageTitle>
<div class="main-content">
<DxGridLayout CssClass="index-gridlayout">
<Rows>
<DxGridLayoutRow Height="auto" Areas="header"></DxGridLayoutRow>
<DxGridLayoutRow Height="auto" Areas="tiles"></DxGridLayoutRow>
</Rows>
<Items>
<DxGridLayoutItem Area="header" CssClass="title">
<Template>
<div class="title-header-text">Hello World!</div>
<div class="title-content-text">Welcome to your new DevExpress Blazor Application</div>
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="tiles" CssClass="tiles">
<Template>
<IndexTile NavigateUrl="cookiecheck" Title="cookiecheck" Description="Cookie Checker" IconCssClass="icon-counter" />
</Template>
</DxGridLayoutItem>
</Items>
</DxGridLayout>
</div>

View File

@ -0,0 +1,31 @@
::deep .index-gridlayout {
container-type: inline-size;
height: auto;
margin-top: auto;
margin-bottom: auto;
padding-bottom: 9rem;
}
::deep .title {
padding-bottom: 3rem;
text-align: center;
}
::deep .tiles {
--tile-column-count: 4;
display: grid;
gap: 1rem;
grid-template-columns: repeat(var(--tile-column-count), max-content);
justify-content: center;
@container (max-width: 60.5rem) {
--tile-column-count: 3;
}
@container (max-width: 45.125rem) {
--tile-column-count: 2;
}
@container (max-width: 29.75rem) {
--tile-column-count: 1;
}
}

View File

@ -0,0 +1,40 @@
@inherits DrawerStateComponentBase
<div class="tile">
<NavLink href="@AddDrawerStateToUrl(NavigateUrl)">
<DxGridLayout CssClass="tile-content" ColumnSpacing="0.75rem" RowSpacing="0.75rem">
<Rows>
<DxGridLayoutRow Areas="icon title" Height="auto" />
<DxGridLayoutRow Areas="description description" Height="auto" />
</Rows>
<Columns>
<DxGridLayoutColumn Width="auto" />
<DxGridLayoutColumn />
</Columns>
<Items>
<DxGridLayoutItem Area="icon" CssClass="tile-icon">
<Template>
<div class="@("icon " + IconCssClass)" aria-hidden="true"></div>
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="title" CssClass="tile-title">
<Template>
@Title
</Template>
</DxGridLayoutItem>
<DxGridLayoutItem Area="description" CssClass="tile-description">
<Template>
@Description
</Template>
</DxGridLayoutItem>
</Items>
</DxGridLayout>
</NavLink>
</div>
@code {
[Parameter] public string NavigateUrl { get; set; } = string.Empty;
[Parameter] public string? Title { get; set; }
[Parameter] public string? Description { get; set; }
[Parameter] public string? IconCssClass { get; set; }
}

View File

@ -0,0 +1,44 @@
.tile {
border-radius: 0.75rem;
height: 7.5rem;
transition: box-shadow 0.2s;
width: 14.375rem;
border: 1px solid var(--dxds-color-border-neutral-default-rest);
}
.tile:hover {
box-shadow: 0 4px 8px 0 rgba(170, 170, 170, 0.24), 0 0 2px 0 rgba(170, 170, 170, 0.2);
}
.tile ::deep > a {
text-decoration: none;
}
::deep .tile-content {
padding: 1rem;
}
::deep .tile-icon {
border-radius: 0.375rem;
height: 2.75rem;
padding: 0.75rem;
width: 2.75rem;
border: 1px solid var(--dxds-color-border-neutral-default-rest);
}
::deep .tile-title {
align-self: center;
color: var(--dxds-color-content-neutral-default-rest);
font-size: var(--dxds-font-size-base-md);
font-weight: var(--dxds-font-weight-base-strong);
letter-spacing: var(--dxds-letter-spacing-base-md);
line-height: var(--dxds-line-height-base-md);
}
::deep .tile-description {
color: var(--dxds-color-content-neutral-subdued-rest);
font-size: var(--dxds-font-size-base-sm);
font-weight: var(--dxds-font-weight-base-default);
letter-spacing: var(--dxds-letter-spacing-base-sm);
line-height: var(--dxds-line-height-base-sm);
}

View File

@ -0,0 +1,32 @@
@page "/weather"
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<DxGrid Data="@forecasts">
<Columns>
<DxGridDataColumn Caption="Date" FieldName="Date" />
<DxGridDataColumn Caption="Temperature (C)" FieldName="TemperatureC" />
<DxGridDataColumn Caption="Temperature (F)" FieldName="TemperatureF" />
<DxGridDataColumn Caption="Summary" FieldName="Summary" />
</Columns>
</DxGrid>
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync() {
DateOnly startDate = DateOnly.FromDateTime(DateTime.Now);
string[] summaries = ["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 record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary) {
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
}

View File

@ -0,0 +1,10 @@
<Router AppAssembly="typeof(Program).Assembly">
<Found Context="routeData">
<RouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>

Some files were not shown because too many files have changed in this diff Show More