Compare commits

12 Commits

Author SHA1 Message Date
6a9c90ef4b Datenbank mit Test/Beispiel 2022-04-21 16:23:08 +02:00
07672d3463 Merge branch 'NackenNumberle' into main 2022-04-20 16:28:34 +02:00
64d18102be WordleKeyboard und viele andere Improvements 2022-04-20 16:27:55 +02:00
626b31a3ce Start of Numberle/Wordle Tastatur 2022-04-19 22:35:37 +02:00
f51bd2bb44 Start of Nacken Numberle 2022-04-19 17:41:26 +02:00
0d5961566b NackenDex Dummy 2022-04-15 14:56:10 +02:00
8cac6f0f2b Fix für deploy 2022-04-14 00:13:34 +02:00
3e162c84b3 Datenbank mit komischen Nomen von Wikipedia 2022-04-13 22:07:06 +02:00
d218b291aa Nacken Wordle fertig
Jetzt fehlt nur noch eine Datenbank mit wörtern
2022-04-13 18:52:44 +02:00
d9b40a6dcc .gitignore hinzugefügt und temporäre Dateien entfernt 2022-04-13 12:27:20 +02:00
db26149bc4 NackenWordle Design 2022-04-10 16:49:48 +02:00
1cdd8631bb Nacken Wordle Seite hinzugefügt 2022-03-25 21:51:02 +01:00
110 changed files with 1982 additions and 1946 deletions

398
.gitignore vendored Normal file
View File

@ -0,0 +1,398 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[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
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml

View File

@ -0,0 +1,12 @@
using DataAccess.Models;
namespace DataAccess.Data;
public interface IUserData
{
Task<IEnumerable<UserModel>> GetUsers();
Task<UserModel?> GetUser(int id);
Task InsertUser(UserModel user);
Task UpdateUser(UserModel user);
Task DeleteUser(int id);
}

View File

@ -0,0 +1,43 @@
using DataAccess.DbAccess;
using DataAccess.Models;
namespace DataAccess.Data;
public class UserData : IUserData
{
private readonly ISqlDataAccess _db;
public UserData(ISqlDataAccess db)
{
_db = db;
}
public Task<IEnumerable<UserModel>> GetUsers()
{
return _db.LoadData<UserModel, dynamic>("dbo.spUser_GetAll", new { });
}
public async Task<UserModel?> GetUser(int id)
{
IEnumerable<UserModel> results = await _db.LoadData<UserModel, dynamic>(
"dbo.spUser_Get",
new { Id = id });
return results.FirstOrDefault();
}
public Task InsertUser(UserModel user)
{
return _db.SaveData("dbo.spUser_Insert", new { user.FirstName, user.LastName });
}
public Task UpdateUser(UserModel user)
{
return _db.SaveData("dbo.spUser_Update", user);
}
public Task DeleteUser(int id)
{
return _db.SaveData("dbo.spUser_Delete", new { Id = id });
}
}

View File

@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.0.123" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,33 @@
namespace DataAccess.DbAccess;
/// <summary>
/// Stellt Methoden zur Ausführung von CRUD-Operationen bereit.
/// </summary>
public interface ISqlDataAccess
{
/// <summary>
/// Liest Daten aus der Datenbank (Read Operationen).
/// </summary>
/// <typeparam name="TData">Typ der Objekte die zurückgegeben werden.</typeparam>
/// <typeparam name="TParam">Typ des Objekts das die Parameter für die SQL-Query enthält.</typeparam>
/// <param name="storedProcedureName">Name der StoredProcedure die ausgeführt werden soll.</param>
/// <param name="parameters">Das Objekt das die Parameter enthält.</param>
/// <param name="connectionId">Der Name des ConnectionStrings der für die Verbindung verwendet werden soll.</param>
/// <returns>Die Ergebnisse der Anfrage.</returns>
Task<IEnumerable<TData>> LoadData<TData, TParam>(
string storedProcedureName,
TParam parameters,
string connectionId = "Default");
/// <summary>
/// Führt eine SQL-Anfrage aus, die keinen Rückgabewert hat (Create, Update und Delete Operationen).
/// </summary>
/// <typeparam name="TParam">Typ des Objekts das die Parameter für die SQL-Query enthält.</typeparam>
/// <param name="storedProcedureName">Name der StoredProcedure die ausgeführt werden soll.</param>
/// <param name="parameters">Das Objekt das die Parameter enthält.</param>
/// <param name="connectionId">Der Name des ConnectionStrings der für die Verbindung verwendet werden soll.</param>
Task SaveData<TParam>(
string storedProcedureName,
TParam parameters,
string connectionId = "Default");
}

View File

@ -0,0 +1,38 @@
using Dapper;
using Microsoft.Extensions.Configuration;
using System.Data;
using System.Data.SqlClient;
namespace DataAccess.DbAccess;
public class SqlDataAccess : ISqlDataAccess
{
private readonly IConfiguration _config;
public SqlDataAccess(IConfiguration config)
{
_config = config;
}
public async Task<IEnumerable<TData>> LoadData<TData, TParam>(
string storedProcedureName,
TParam parameters,
string connectionId = "Default")
{
using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId));
return await connection.QueryAsync<TData>(storedProcedureName, parameters,
commandType: CommandType.StoredProcedure);
}
public async Task SaveData<TParam>(
string storedProcedureName,
TParam parameters,
string connectionId = "Default")
{
using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId));
await connection.ExecuteAsync(storedProcedureName, parameters,
commandType: CommandType.StoredProcedure);
}
}

View File

@ -0,0 +1,8 @@
namespace DataAccess.Models;
public class UserModel
{
public int Id { get; set; }
public string FirstName { get; set; } = string.Empty;
public string LastName { get; set; } = string.Empty;
}

View File

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<Name>GottfriedsNackenDB</Name>
<SchemaVersion>2.0</SchemaVersion>
<ProjectVersion>4.1</ProjectVersion>
<ProjectGuid>{79f8ac31-e467-4f7c-ac3b-cfadc3290750}</ProjectGuid>
<DSP>Microsoft.Data.Tools.Schema.Sql.Sql130DatabaseSchemaProvider</DSP>
<OutputType>Database</OutputType>
<RootPath>
</RootPath>
<RootNamespace>GottfriedsNackenDB</RootNamespace>
<AssemblyName>GottfriedsNackenDB</AssemblyName>
<ModelCollation>1033, CI</ModelCollation>
<DefaultFileStructure>BySchemaAndSchemaType</DefaultFileStructure>
<DeployToDatabase>True</DeployToDatabase>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<TargetLanguage>CS</TargetLanguage>
<AppDesignerFolder>Properties</AppDesignerFolder>
<SqlServerVerification>False</SqlServerVerification>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseSet>True</TargetDatabaseSet>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<OutputPath>bin\Release\</OutputPath>
<BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName>
<TreatWarningsAsErrors>False</TreatWarningsAsErrors>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<DefineDebug>false</DefineDebug>
<DefineTrace>true</DefineTrace>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>bin\Debug\</OutputPath>
<BuildScriptName>$(MSBuildProjectName).sql</BuildScriptName>
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<DefineDebug>true</DefineDebug>
<DefineTrace>true</DefineTrace>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">11.0</VisualStudioVersion>
<!-- Default to the v11.0 targets path if the targets file for the current VS version is not found -->
<SSDTExists Condition="Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets')">True</SSDTExists>
<VisualStudioVersion Condition="'$(SSDTExists)' == ''">11.0</VisualStudioVersion>
</PropertyGroup>
<Import Condition="'$(SQLDBExtensionsRefPath)' != ''" Project="$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
<Import Condition="'$(SQLDBExtensionsRefPath)' == ''" Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.SqlTasks.targets" />
<ItemGroup>
<Folder Include="Properties" />
<Folder Include="dbo" />
<Folder Include="dbo\Tables" />
<Folder Include="dbo\StoredProcedures" />
</ItemGroup>
<ItemGroup>
<Build Include="dbo\Tables\User.sql" />
<Build Include="dbo\StoredProcedures\spUser_GetAll.sql" />
<Build Include="dbo\StoredProcedures\spUser_Get.sql" />
<Build Include="dbo\StoredProcedures\spUser_Delete.sql" />
<Build Include="dbo\StoredProcedures\spUser_Insert.sql" />
<Build Include="dbo\StoredProcedures\spUser_Update.sql" />
</ItemGroup>
<ItemGroup>
<None Include="GottfriedsNackenDB.publish.xml" />
</ItemGroup>
<ItemGroup>
<PostDeploy Include="Script.PostDeployment.sql" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,10 @@
/* Wird nur ausgeführt, wenn es keine Einträge in [dbo].[User] */
IF not exists (SELECT 1 FROM [dbo].[User])
BEGIN
INSERT INTO [dbo].[User] (FirstName, LastName)
VALUES
('Gottfried Wilhelm', 'Leibniz'),
('Albert', 'Einstein'),
('Curry', 'Wurst'),
('Brat', 'Wurst')
END

View File

@ -0,0 +1,8 @@
CREATE PROCEDURE [dbo].[spUser_Delete]
@Id int
AS
BEGIN
DELETE
FROM [dbo].[User]
WHERE Id = @Id;
END

View File

@ -0,0 +1,8 @@
CREATE PROCEDURE [dbo].[spUser_Get]
@Id int
AS
BEGIN
SELECT Id, FirstName, LastName
FROM [dbo].[User]
WHERE Id = @Id;
END

View File

@ -0,0 +1,6 @@
CREATE PROCEDURE [dbo].[spUser_GetAll]
AS
BEGIN
SELECT Id, FirstName, LastName
FROM [dbo].[User];
END

View File

@ -0,0 +1,8 @@
CREATE PROCEDURE [dbo].[spUser_Insert]
@FirstName nvarchar(50),
@LastName nvarchar(50)
AS
BEGIN
INSERT INTO [dbo].[User] (FirstName, LastName)
VALUES (@FirstName, @LastName);
END

View File

@ -0,0 +1,10 @@
CREATE PROCEDURE [dbo].[spUser_Update]
@Id int,
@FirstName nvarchar(50),
@LastName nvarchar(50)
AS
BEGIN
UPDATE [dbo].[User]
SET FirstName = @FirstName, LastName = @LastName
WHERE Id = @Id;
END

View File

@ -0,0 +1,6 @@
CREATE TABLE [dbo].[User]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
[FirstName] NVARCHAR(50) NOT NULL,
[LastName] NVARCHAR(50) NOT NULL
)

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,32 @@
using System.Numerics;
namespace GottfriedsNackenUtility;
/// <summary>
/// Bietet nütliche mathematische Funktionen.
/// </summary>
public static class MathHelper
{
/// <summary>
/// Enumeriert die Zahlen der Fibonacci-Folge.
/// </summary>
/// <remarks>
/// Der Datentyp ist <see cref="BigInteger"/>, da es ein paar Fibonacci-Zahlen gibt die nicht von <see cref="int"/> dargestellt werden können.
/// </remarks>
public static IEnumerable<BigInteger> Fibonacci()
{
BigInteger i = 0;
BigInteger j = 1;
while (true)
{
BigInteger fib = i + j;
i = j;
j = fib;
yield return fib;
}
}
}

View File

@ -0,0 +1,42 @@
using System.Numerics;
namespace GottfriedsNackenUtility;
/// <summary>
/// Hier sind suspiziöse Funktionen versteckt.
/// </summary>
public static class SusHelper
{
/// <summary>
/// Dies ist der ausgeklügelste fake-Fortschrittbalkensalgorithmus den die Welt je erblickt hat.
/// </summary>
/// <remarks>
/// Dieser Task läuft in einer Endlosschleife und MUSS mit Hilfe des Abbruchtokens abgebrochen werden!
/// </remarks>
/// <param name="progressChangedCallback">Das callback das aufgerufen wird, wenn der Fortschritt sich geändert hat.
/// Gibt einen Int zwischen 0 und 100 zurück oder -1, wenn der Fortschrittsbalken auf einen "indefinite" Zustand wechseln soll.</param>
/// <param name="cancellationToken">Ein Abbruchtoken, das beim Warten auf den Abschluss der Aufgabe überwacht werden soll.</param>
public static async Task UpdateDefinitelyNotFakeProgress(Action<int> progressChangedCallback, CancellationToken cancellationToken)
{
try
{
foreach (BigInteger fibonacci in MathHelper.Fibonacci())
{
await Task.Delay(250 + (int)(fibonacci % 420), cancellationToken);
if (cancellationToken.IsCancellationRequested)
break;
if (fibonacci.IsEven && (int)(fibonacci % 42) == 0)
{
progressChangedCallback(-1);
await Task.Delay(1337, cancellationToken);
continue;
}
progressChangedCallback((int)(fibonacci % 69));
}
}
catch (TaskCanceledException) { }
}
}

View File

@ -3,7 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.1.32210.238
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GottfriedsNackenWebseite", "GottfriedsNackenWebseite\GottfriedsNackenWebseite.csproj", "{464DD643-DAD9-4E16-BB24-36F789ED4C15}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GottfriedsNackenWebseite", "GottfriedsNackenWebseite\GottfriedsNackenWebseite.csproj", "{464DD643-DAD9-4E16-BB24-36F789ED4C15}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GottfriedsNackenUtility", "GottfriedsNackenUtility\GottfriedsNackenUtility.csproj", "{0122762F-9961-4D28-8AA9-0D6AE7630208}"
EndProject
Project("{00D1A9C2-B5F0-4AF3-8072-F6C62B433612}") = "GottfriedsNackenDB", "GottfriedsNackenDB\GottfriedsNackenDB.sqlproj", "{79F8AC31-E467-4F7C-AC3B-CFADC3290750}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataAccess", "DataAccess\DataAccess.csproj", "{023715EE-C9DB-417F-9B77-28BF48A30D41}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -15,6 +21,20 @@ Global
{464DD643-DAD9-4E16-BB24-36F789ED4C15}.Debug|Any CPU.Build.0 = Debug|Any CPU
{464DD643-DAD9-4E16-BB24-36F789ED4C15}.Release|Any CPU.ActiveCfg = Release|Any CPU
{464DD643-DAD9-4E16-BB24-36F789ED4C15}.Release|Any CPU.Build.0 = Release|Any CPU
{0122762F-9961-4D28-8AA9-0D6AE7630208}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0122762F-9961-4D28-8AA9-0D6AE7630208}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0122762F-9961-4D28-8AA9-0D6AE7630208}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0122762F-9961-4D28-8AA9-0D6AE7630208}.Release|Any CPU.Build.0 = Release|Any CPU
{79F8AC31-E467-4F7C-AC3B-CFADC3290750}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{79F8AC31-E467-4F7C-AC3B-CFADC3290750}.Debug|Any CPU.Build.0 = Debug|Any CPU
{79F8AC31-E467-4F7C-AC3B-CFADC3290750}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{79F8AC31-E467-4F7C-AC3B-CFADC3290750}.Release|Any CPU.ActiveCfg = Release|Any CPU
{79F8AC31-E467-4F7C-AC3B-CFADC3290750}.Release|Any CPU.Build.0 = Release|Any CPU
{79F8AC31-E467-4F7C-AC3B-CFADC3290750}.Release|Any CPU.Deploy.0 = Release|Any CPU
{023715EE-C9DB-417F-9B77-28BF48A30D41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{023715EE-C9DB-417F-9B77-28BF48A30D41}.Debug|Any CPU.Build.0 = Debug|Any CPU
{023715EE-C9DB-417F-9B77-28BF48A30D41}.Release|Any CPU.ActiveCfg = Release|Any CPU
{023715EE-C9DB-417F-9B77-28BF48A30D41}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -0,0 +1,60 @@
<MudContainer MaxWidth="MaxWidth.ExtraSmall">
<MudCard Elevation="4">
<MudCardHeader>
<CardHeaderAvatar>
<MudAvatar Image="images/leibniz_icon.jpg"></MudAvatar>
</CardHeaderAvatar>
<CardHeaderContent>
<MudText>Gottfried Wilhelm Leibniz</MudText>
</CardHeaderContent>
<CardHeaderActions>
<MudAvatar Rounded="true" Image="images/german.jpg"></MudAvatar>
</CardHeaderActions>
</MudCardHeader>
<MudCardMedia Image="images/leibniz.jpg" Height="250">
</MudCardMedia>
<MudCardContent>
<MudSimpleTable Style="overflow-x: auto;">
<tbody>
<tr>
<td>Intelligenzquotient</td>
<td>149</td>
</tr>
<tr>
<td>Wissenschaftliche Arbeiten</td>
<td>23</td>
</tr>
<tr>
<td>Alter</td>
<td>70</td>
</tr>
<tr>
<td>Google-Ergebnisse</td>
<td>6.760.000</td>
</tr>
<tr>
<td>Nackengröße</td>
<td>69</td>
</tr>
</tbody>
</MudSimpleTable>
<MudText Class="mt-1">
Gottfried Wilhelm Leibniz (* 21. Juni / 1. Juli 1646 in Leipzig; † 14. November 1716 in Hannover) war ein
deutscher Philosoph, Mathematiker, Jurist, Historiker und politischer Berater der frühen Aufklärung. Er gilt
als der universale Geist seiner Zeit und war einer der bedeutendsten Philosophen des ausgehenden 17. und
beginnenden 18. Jahrhunderts sowie einer der wichtigsten Vordenker der Aufklärung.
</MudText>
</MudCardContent>
<MudCardActions>
<MudIconButton Icon="@Icons.Material.Filled.Favorite" Color="Color.Default" />
<MudText>1337</MudText>
<MudIconButton Class="ml-2" Icon="@Icons.Material.Filled.Share" Color="Color.Default" />
</MudCardActions>
</MudCard>
</MudContainer>
@code {
}

View File

@ -0,0 +1,235 @@
@using System.Diagnostics
<!-- Hidden Alerts -->
<div hidden="@(_alert == AlertState.None)">
<MudContainer MaxWidth="MaxWidth.Small">
<MudGrid>
<MudItem xs="1"></MudItem>
<MudItem xs="8">
@if (_alert == AlertState.Correct)
{
<MudAlert Severity="Severity.Success">Korrekt!</MudAlert>
}
else if (_alert == AlertState.Invalid)
{
<MudAlert Severity="Severity.Error">Eingabe ungültig!</MudAlert>
}
</MudItem>
<MudItem xs="2">
@if (_alert == AlertState.Correct)
{
<MudIconButton Icon="@Icons.Filled.Replay" Color="Color.Primary" aria-label="nochmal spielen" OnClick="@PlayAgain" />
}
</MudItem>
<MudItem xs="1"></MudItem>
</MudGrid>
</MudContainer>
</div>
<!-- Matrix mit Buchstabenfeldern -->
<div class="d-flex justify-center mt-2 mb-2">
<div>
@foreach (CharData[] guess in _previousGuesses)
{
<div class="d-flex mb-2">
@foreach (CharData cd in guess)
{
if (cd.State == CharState.Correct)
{
<MudPaper Style="border-color: green; border-width: 4px;" Class="mr-2" Width="60px" Height="60px" Outlined="true">
<MudText Typo="Typo.h3" Align="Align.Center">@cd.Char</MudText>
</MudPaper>
}
else if (cd.State == CharState.Misplaced)
{
<MudPaper Style="border-color: yellow; border-width: 4px;" Class="mr-2" Width="60px" Height="60px" Outlined="true">
<MudText Typo="Typo.h3" Align="Align.Center">@cd.Char</MudText>
</MudPaper>
}
else
{
<MudPaper Style="border-width: 4px;" Class="mr-2" Width="60px" Height="60px" Outlined="true">
<MudText Typo="Typo.h3" Align="Align.Center">@cd.Char</MudText>
</MudPaper>
}
}
</div>
}
</div>
</div>
@*
<MudTextField T="string" FullWidth="true" Immediate="true" @bind-Value="Input" Label="Bla" Variant="Variant.Outlined" MaxLength="ColumnCount" Counter="ColumnCount" />
<MudTextField T="string" FullWidth="true" Immediate="true" @bind-Value="Input" Label="Blub" Variant="Variant.Outlined" MaxLength="ColumnCount" Counter="ColumnCount" />
*@
<!-- Input dialogue feld -->
<MudContainer MaxWidth="MaxWidth.Small">
<MudGrid Spacing="2">
<MudItem xs="1" />
<MudItem xs="8">
<MudTextField @ref="_textField" T="string" FullWidth="true" Immediate="true" @bind-Value="Input" Label="Dein Tipp:" Variant="Variant.Outlined" MaxLength="ColumnCount" Mask="@InputMask" Counter="ColumnCount" OnKeyDown="OnKeyDown" />
@*<input Type="text" value="@Input"/>*@
</MudItem>
<MudItem xs="2">
<MudButton style="height: 56px; margin-top: 6px;" Class="justify-center" Disabled="Input.Length != ColumnCount"
Size="Size.Large" Variant="Variant.Outlined" EndIcon="@Icons.Material.Filled.Send" Color="Color.Primary" OnClick=@OnEnterGuessClick>OK</MudButton>
</MudItem>
<MudItem xs="1" />
</MudGrid>
</MudContainer>
@code {
private enum AlertState
{
None,
Correct,
Invalid
}
public enum CharState
{
None,
Correct,
Misplaced,
Wrong
}
public struct CharData
{
public char Char;
public CharState State;
public CharData(char c, CharState state)
{
Char = c;
State = state;
}
}
private bool _found = false;
private AlertState _alert = AlertState.None;
private List<CharData[]> _previousGuesses = new();
private MudTextField<string> _textField = default!;
[Parameter]
public string Input { get; set; } = String.Empty;
[Parameter]
public int ColumnCount { get; set; }
public string? Secret { get; set; } = null;
[Parameter]
public IMask InputMask { get; set; } = new RegexMask("^.*$");
/// <summary>
/// Prüft ob die getätigte Eingabe eine mögliche Lösung ist.
/// </summary>
[Parameter]
public Func<string, bool> CheckInput { get; set; } = _ => true;
/// <summary>
/// Wird ausgelöst wenn eine Eingabe getätigt und validiert wurde.
/// </summary>
[Parameter]
public EventCallback<CharData[]> InputValidated { get; set; }
/// <summary>
/// Wird ausgelöst wenn ein neues Secret generiert werden muss.
/// </summary>
[Parameter]
public EventCallback GenerateSecret { get; set; }
public async Task OnKeyDown(KeyboardEventArgs e)
{
_alert = AlertState.None;
if (e.Code == "Enter" || e.Code == "NumpadEnter")
{
if(_found)
{
await PlayAgain();
}
else
{
await OnEnterGuessClick();
}
}
}
public async Task OnEnterGuessClick()
{
if (Input.Length != ColumnCount || _found) return;
if (!CheckInput(Input))
{
_alert = AlertState.Invalid;
StateHasChanged();
return;
}
if (Secret == null)
await GenerateSecret.InvokeAsync();
if(await TestInput(Input))
{
_found = true;
_alert = AlertState.Correct;
}
await _textField.Clear();
}
/// <summary>
/// Prüft ob die Eingabe korrekt ist.
/// </summary>
private async Task<bool> TestInput(string input)
{
CharData[] validatedInput = new CharData[ColumnCount];
bool correct = true;
for (int i = 0; i < ColumnCount; i++)
{
char guessedChar = char.ToUpper(input[i]);
CharState state;
if (guessedChar == char.ToUpper(Secret![i]))
{
state = CharState.Correct;
}
else if (Secret.Contains(guessedChar, StringComparison.InvariantCultureIgnoreCase))
{
state = CharState.Misplaced;
correct = false;
}
else
{
state = CharState.Wrong;
correct = false;
}
validatedInput[i] = new CharData(guessedChar, state);
}
_previousGuesses.Add(validatedInput);
await InputValidated.InvokeAsync(validatedInput);
return correct;
}
public async Task PlayAgain()
{
_previousGuesses.Clear();
_alert = AlertState.None;
_found = false;
await GenerateSecret.InvokeAsync();
}
}

View File

@ -0,0 +1,101 @@
<!-- Matrix mit Buchstabenfeldern -->
<div class="d-flex justify-center mt-2 mb-2">
<div>
@{
int index = 0;
for (int row = 0; row < Math.Ceiling((double)Keys.Length / KeysPerRow); row++)
{
<div class="d-flex mb-2">
@for (int i = 0; i < KeysPerRow && index < Keys.Length; i++, index++)
{
char key = Keys[index];
char upperKey = char.ToUpper(key);
_knownKeyStates.TryGetValue(upperKey, out var keyState);
if (keyState == WordleComponent.CharState.Correct)
{
<MudButton Variant="Variant.Outlined" Class="mr-2" Style="width: 5em; height: 5em" Color="Color.Success">
<MudText Typo="Typo.h5">@upperKey</MudText>
</MudButton>
}
else if (keyState == WordleComponent.CharState.Misplaced)
{
<MudButton Variant="Variant.Outlined" Class="mr-2" Style="width: 5em; height: 5em" Color="Color.Warning">
<MudText Typo="Typo.h5">@upperKey</MudText>
</MudButton>
}
else if (keyState == WordleComponent.CharState.Wrong)
{
<MudButton Disabled="true" Variant="Variant.Outlined" Class="mr-2" Style="width: 5em; height: 5em" Color="Color.Error">
<MudText Typo="Typo.h5">@upperKey</MudText>
</MudButton>
}
else
{
<MudButton Variant="Variant.Outlined" Class="mr-2" Style="width: 5em; height: 5em">
<MudText Typo="Typo.h5">@upperKey</MudText>
</MudButton>
}
}
</div>
}
}
</div>
</div>
@code {
[Parameter]
public char[] Keys { get; set; } = Array.Empty<char>();
private Dictionary<char, WordleComponent.CharState> _knownKeyStates = new();
[Parameter]
public int KeysPerRow { get; set; } = 10;
[Parameter]
public string Secret { get; set; } = string.Empty;
[Parameter]
public EventCallback<char> KeyPressed { get; set; }
private async Task ButtonPressed(char c)
{
await KeyPressed.InvokeAsync(c);
}
public void UpdateKeyInfo(WordleComponent.CharData cd)
{
_knownKeyStates.TryGetValue(cd.Char, out var oldState);
WordleComponent.CharState newState = WordleComponent.CharState.None;
switch (cd.State)
{
case WordleComponent.CharState.Correct:
newState = WordleComponent.CharState.Correct;
break;
case WordleComponent.CharState.Misplaced:
// Den besseren Zustand nicht durch schlechteren ersetzen
if (oldState != WordleComponent.CharState.Correct)
{
newState = WordleComponent.CharState.Misplaced;
}
break;
case WordleComponent.CharState.Wrong:
newState = WordleComponent.CharState.Wrong;
break;
}
_knownKeyStates[cd.Char] = newState;
}
public void ResetKeyInfo()
{
_knownKeyStates.Clear();
StateHasChanged();
}
}

View File

@ -8,9 +8,18 @@
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<ItemGroup>
<None Include="wwwroot\nomen.txt" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.15.0" />
<PackageReference Include="MudBlazor" Version="6.0.7" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DataAccess\DataAccess.csproj" />
<ProjectReference Include="..\GottfriedsNackenUtility\GottfriedsNackenUtility.csproj" />
</ItemGroup>
</Project>

View File

@ -2,6 +2,8 @@
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ActiveDebugProfile>GottfriedsNackenWebseite</ActiveDebugProfile>
<RazorPage_SelectedScaffolderID>RazorPageScaffolder</RazorPage_SelectedScaffolderID>
<RazorPage_SelectedScaffolderCategoryPath>root/Common/RazorPage</RazorPage_SelectedScaffolderCategoryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DebuggerFlavor>ProjectDebugger</DebuggerFlavor>

View File

@ -0,0 +1,31 @@
namespace GottfriedsNackenWebseite.Numberle;
public abstract class AstNode
{
}
public class AstBinaryExpression : AstNode
{
public AstNode Left;
public AstNode Right;
public string Operator;
public AstBinaryExpression(string @operator, AstNode left, AstNode right)
{
Operator = @operator;
Left = left;
Right = right;
}
}
public class AstNumericLiteral : AstNode
{
public int Value;
public AstNumericLiteral(int value)
{
Value = value;
}
}

View File

@ -0,0 +1,104 @@
namespace GottfriedsNackenWebseite.Numberle;
public class Parser
{
private string _input = string.Empty;
private readonly Tokenizer _tokenizer = new();
private Token _lookahead;
private TokenType NextTokenType => _lookahead.Type;
public AstNode Parse(string input)
{
_input = input;
_tokenizer.Init(_input);
// Prime the tokenizer to obtain the first token
// which is our lookahead. The lookahead is used
// for predictive parsing.
_lookahead = _tokenizer.GetNextToken();
// Parse recursively starting from the main entry point, the Program:
return ParseEqualityExpression();
}
private AstNode ParseBinaryExpression(Func<AstNode> builder, TokenType operatorType)
{
AstNode left = builder();
while (_lookahead.Type == operatorType)
{
string @operator = (string)Consume(operatorType).Value!;
AstNode right = builder();
left = new AstBinaryExpression(@operator, left, right);
}
return left;
}
/// <summary>
/// EqualityExpression
/// : AdditiveExpression
/// | AdditiveExpression '=' EqualityExpression
/// ;
/// </summary>
private AstNode ParseEqualityExpression()
{
return ParseBinaryExpression(ParseAdditiveExpression, TokenType.Equals);
}
/// <summary>
/// AdditiveExpression:
/// : MultiplicativeExpression
/// | MultiplicativeExpression ADDITIVE_OPERATOR AdditiveExpression
/// ;
/// </summary>
private AstNode ParseAdditiveExpression()
{
return ParseBinaryExpression(ParseMultiplicativeExpression, TokenType.AdditiveOperator);
}
/// <summary>
/// MultiplicativeExpression:
/// : NumericLiteral
/// | MultiplicativeExpression MULTIPLICATIVE_OPERATOR NumericLiteral
/// ;
/// </summary>
private AstNode ParseMultiplicativeExpression()
{
return ParseBinaryExpression(ParseNumericLiteral, TokenType.MultiplicativeOperator);
}
/// <summary>
/// AstNumericLiteral
/// : NumberLiteral
/// ;
/// </summary>
/// <returns></returns>
private AstNumericLiteral ParseNumericLiteral()
{
Token token = Consume(TokenType.NumberLiteral);
return new AstNumericLiteral((int)token.Value!);
}
private Token Consume(TokenType type)
{
Token token = _lookahead;
if (token.Type == TokenType.EndOfFile)
throw new Exception($"Unexpected end of input, expected \"{type}\"");
if (token.Type != type)
throw new Exception($"Unexpected token \"{token.Type}\", expected \"{type}\"");
_lookahead = _tokenizer.GetNextToken();
return token;
}
}

View File

@ -0,0 +1,116 @@
namespace GottfriedsNackenWebseite.Numberle;
public enum TokenType
{
Unknown,
EndOfFile,
AdditiveOperator,
MultiplicativeOperator,
Equals,
NumberLiteral
}
public struct Token
{
public TokenType Type;
public object? Value;
}
public class Tokenizer
{
private string _input = string.Empty;
private int _cursor = 0;
public void Init(string input)
{
_input = input;
_cursor = 0;
}
public bool HasMoreTokens => _cursor < _input.Length;
/// <summary>
/// Gibt das aktuelle Zeichen der Eingabe zurück oder das Null-Zeichen ('\0') wenn das Ende der Eingabe erreicht wurde.
/// </summary>
private char CurrentChar => HasMoreTokens ? _input[_cursor] : '\0';
public Token GetNextToken()
{
if (!HasMoreTokens)
{
return new Token
{
Type = TokenType.EndOfFile
};
}
Token token = new Token
{
Type = TokenType.Unknown,
Value = null
};
switch (CurrentChar)
{
case '+':
token.Type = TokenType.AdditiveOperator;
token.Value = "+";
_cursor++;
break;
case '-':
token.Type = TokenType.AdditiveOperator;
token.Value = "-";
_cursor++;
break;
case '*':
token.Type = TokenType.MultiplicativeOperator;
token.Value = "*";
_cursor++;
break;
case '/':
token.Type = TokenType.MultiplicativeOperator;
token.Value = "/";
_cursor++;
break;
case '=':
token.Type = TokenType.Equals;
token.Value = "=";
_cursor++;
break;
default:
if (char.IsDigit(CurrentChar))
{
token.Type = TokenType.NumberLiteral;
int value = 0;
while (true)
{
if (!HasMoreTokens)
break;
char c = CurrentChar;
if (char.IsDigit(c))
{
value *= 10;
value += c - '0';
_cursor++;
}
else
{
break;
}
}
token.Value = value;
}
break;
}
return token;
}
}

View File

@ -0,0 +1,96 @@
@page "/databasetest"
@using DataAccess.Data
@using DataAccess.Models
@inject IUserData _userData
<PageTitle>Database Test</PageTitle>
<MudContainer MaxWidth="MaxWidth.Small">
<MudTable Items="@_users" Hover="true" Breakpoint="Breakpoint.Sm" Loading="_loading">
<ToolBarContent>
<MudText Typo="Typo.h6">Nutzer</MudText>
<MudSpacer />
<MudIconButton Icon="@Icons.Material.Filled.Refresh" OnClick="RefreshUserList" />
</ToolBarContent>
<HeaderContent>
<MudTh>Id</MudTh>
<MudTh>First Name</MudTh>
<MudTh>Last Name</MudTh>
<MudTh/>
</HeaderContent>
<RowTemplate>
<MudTd DataLabel="Nr">@context.Id</MudTd>
<MudTd DataLabel="First Name">@context.FirstName</MudTd>
<MudTd DataLabel="Last Name">@context.LastName</MudTd>
<MudTd>
<MudIconButton Icon="@Icons.Material.Filled.Delete" OnClick="() => DeleteUser(context)" />
</MudTd>
</RowTemplate>
<PagerContent>
<MudTablePager/>
</PagerContent>
</MudTable>
<MudPaper Class="pa-4 mt-2">
<MudForm @bind-IsValid="_newUserValid" >
<MudText Typo="Typo.h4">Neuen Nutzer erstellen:</MudText>
<MudTextField T="string" Label="Vorname" @bind-Value="_newUser.FirstName" Immediate="true" Required="true" RequiredError="Vorname muss angegeben werden!"/>
<MudTextField T="string" Label="Nachname" @bind-Value="_newUser.LastName" Immediate="true" Required="true" RequiredError="Nachname muss angegeben werden!"/>
<MudButton Class="mt-2" Variant="Variant.Filled" Color="Color.Primary" Disabled="!_newUserValid" OnClick="AddUser">Hinzufügen</MudButton>
</MudForm>
</MudPaper>
</MudContainer>
@code {
private bool _newUserValid;
private UserModel _newUser = new();
private bool _loading;
private IEnumerable<UserModel> _users = Enumerable.Empty<UserModel>();
protected override async Task OnInitializedAsync()
{
await RefreshUserList();
await base.OnInitializedAsync();
}
private async Task RefreshUserList()
{
_loading = true;
try
{
_users = await _userData.GetUsers();
}
catch (Exception e)
{
Console.WriteLine($"Failed to load users. Exception: {e}");
}
_loading = false;
}
private async Task AddUser()
{
await _userData.InsertUser(_newUser);
await RefreshUserList();
_newUser = new UserModel();
}
private async Task DeleteUser(UserModel user)
{
await _userData.DeleteUser(user.Id);
await RefreshUserList();
}
}

View File

@ -0,0 +1,37 @@
@page "/nackendex"
<PageTitle>NackenDex</PageTitle>
<MudText Class="mt-2 mb-2" Align="Align.Center">Ihr NackenDex für die besten Quartettkarten</MudText>
<MudContainer>
<MudPaper Elevation="25" Class="m-1">
<MudGrid Spacing="2">
<MudItem Class="ml-2">
<MudAutocomplete T="string" Label="Suche..."></MudAutocomplete>
</MudItem>
<MudSpacer />
<MudItem Class="mr-2 mt-2">
<MudChipSet @bind-SelectedChips="selected" Filter="filter">
<MudChip Text="Deutsch"></MudChip>
<MudChip Text="Nacken"></MudChip>
<MudChip Text="Intelligenz"></MudChip>
<MudChip Text="Alter"></MudChip>
</MudChipSet>
</MudItem>
</MudGrid>
</MudPaper>
</MudContainer>
<MudGrid Justify="Justify.Center" Class="mt-8">
@for(int i = 0; i < 10; i++)
{
<MudItem>
<GottfriedsNackenWebseite.Components.NackenKarte></GottfriedsNackenWebseite.Components.NackenKarte>
</MudItem>
}
</MudGrid>
@code {
bool filter = true;
MudChip[] selected;
}

View File

@ -0,0 +1,218 @@
@page "/numberle"
@using GottfriedsNackenWebseite.Components
@using GottfriedsNackenWebseite.Numberle
@using GottfriedsNackenUtility
@using System.Diagnostics
@using System.Numerics
<PageTitle>Nacken Numberle</PageTitle>
<MudText Align="Align.Center" Class="mt-2 mb-2"> Gebe eine (korrekte) mathematische Gleichung ein:</MudText>
<WordleComponent ColumnCount="8" GenerateSecret="OnGenerateNewSecret" InputMask="@_inputMask" CheckInput="CheckInput" InputValidated="OnInputValidated" @ref="_wordle" />
<WordleKeyboardComponent @ref="_keyboard" KeyPressed="KeyboardKeyPressed" Keys="Chars" />
<MudOverlay @bind-Visible="_showLoadingOverlay" DarkBackground="true">
<MudCard>
<MudCardHeader>
<MudText Typo="Typo.h5">Bitte warten...</MudText>
</MudCardHeader>
<MudCardContent>
<MudText>Erzeuge eine unknackbare Formel mit roher Gewalt!</MudText>
<MudProgressLinear Color="Color.Secondary" Indeterminate="_progress < 0" Value="_progress" Class="my-7"/>
</MudCardContent>
</MudCard>
</MudOverlay>
@code
{
private static readonly IMask _inputMask = new RegexMask(@"^[0-9+\-*/=]{0,8}$");
private readonly Parser _parser = new();
private WordleComponent _wordle = default!;
private WordleKeyboardComponent _keyboard = default!;
private bool _showLoadingOverlay;
private int _progress;
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
}
/// <summary>
/// Prüft ob input eine gültige Gleichung ist.
/// </summary>
private bool CheckInput(string input)
{
try
{
AstNode ast = _parser.Parse(input);
// Äußerste Node muss '=' sein.
if (ast is not AstBinaryExpression binExp || binExp.Operator != "=")
return false;
(decimal value, int equalSigns) = CrunchyValidaty(ast);
// Wir akzeptieren nur, wenn es exakt ein Gleichheitszeichen gibt und die Gleichung erfüllt ist.
return value == 1 && equalSigns == 1;
}
catch
{
return false;
}
}
/// <summary>
/// Berechnet den Wert der gegebenen (Teil-)Gleichung und zählt wie viele Gleichheitszeichen darin vorkommen.
/// </summary>
/// <param name="node">Die zu berechnende Gleichung.</param>
/// <returns>Den Wert der Gleichung und die Anzahl Gleichheitszeichen</returns>
private (decimal Value, int equalSigns) CrunchyValidaty(AstNode node)
{
switch (node)
{
case AstNumericLiteral number:
return (number.Value, 0);
case AstBinaryExpression binary:
(decimal Value, int equalSigns) left = CrunchyValidaty(binary.Left);
(decimal Value, int equalSigns) right = CrunchyValidaty(binary.Right);
int equalsSigns = left.equalSigns + right.equalSigns;
switch (binary.Operator)
{
case "+":
return (left.Value + right.Value, equalsSigns);
case "-":
return (left.Value - right.Value, equalsSigns);
case "*":
return (left.Value * right.Value, equalsSigns);
case "/":
return (left.Value / right.Value, equalsSigns);
case "=":
return (left.Value == right.Value ? 1 : 0, equalsSigns + 1);
}
break;
default:
return (0, 0);
}
return (0, 0);
}
/// <summary>
/// Die Zeichen aus denen eine Antwort besteht.
/// </summary>
private static readonly char[] Chars = {
'=', '+', '-', '*', '/',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
};
/// <summary>
/// Generiert ein neues Geheimnis und zeigt während dessen den Ladebalken an.
/// </summary>
/// <returns></returns>
private async Task OnGenerateNewSecret()
{
_keyboard.ResetKeyInfo();
CancellationTokenSource cts = new CancellationTokenSource();
Task? amazingTask = null;
try
{
// Ladebalkenaktualisierer starten
amazingTask = SusHelper.UpdateDefinitelyNotFakeProgress(progress =>
{
_progress = progress;
StateHasChanged();
}, cts.Token);
_showLoadingOverlay = true;
_wordle.Secret = await Task.Run(GenerateFormula);
_showLoadingOverlay = false;
}
finally
{
// Ladebalkenaktualisierer stoppen
cts.Cancel();
if (amazingTask != null)
await amazingTask;
}
}
/// <summary>
/// Erzeugt eine neue (gültige) Formel.
/// </summary>
/// <returns>Die Formel</returns>
private string GenerateFormula()
{
int charCount = 8;
char[] formula = new char[charCount];
// Gleichzeichen plazieren
int equalsIndex = Random.Shared.Next(1, charCount - 1);
formula[equalsIndex] = '=';
// Ersetzt das Zeichen mit Index "index" durch einen Zufälligen wert.
// TODO: ein etwas gewiefterer Algorithmus würde nicht schaden.
void PlaceRandomChar(int index)
{
char left = (index > 0) ? formula[index - 1] : '\0';
char right = (index < charCount - 1) ? formula[index + 1] : '\0';
bool canPlaceOperator = char.IsDigit(left) && char.IsDigit(right);
if (canPlaceOperator)
formula[index] = Chars[Random.Shared.Next(1, Chars.Length)];
else
formula[index] = Chars[Random.Shared.Next(6, Chars.Length)];
}
// ROHE GEWALT!
while (true)
{
for (int i = 0; i < formula.Length; i++)
{
if (i == equalsIndex)
i++;
PlaceRandomChar(i);
string str = new string(formula);
Debug.WriteLine(str);
if (CheckInput(str))
{
return str;
}
}
}
}
private async Task KeyboardKeyPressed(char key)
{
// TODO: Virtuelles Keyboard
//await _wordle.SetText(_wordle.Input + key); //Input += key;
await Task.CompletedTask;
}
private void OnInputValidated(WordleComponent.CharData[] data)
{
// Auswertung in das Keyboard packen
foreach (WordleComponent.CharData cd in data)
{
_keyboard.UpdateKeyInfo(cd);
}
}
}

View File

@ -0,0 +1,155 @@
@page "/wordle"
<PageTitle>Nacken Wordle</PageTitle>
<MudText Align="Align.Center" Class="mt-2 mb-2"> Rate ein Wort mit 5 Buchstaben:</MudText>
<!-- Hidden Alerts -->
<div hidden="@hideAlert">
<MudContainer MaxWidth="MaxWidth.Small">
<MudGrid>
<MudItem xs="1"></MudItem>
<MudItem xs="8">
<MudAlert Severity="Severity.Success">Korrekt!</MudAlert>
</MudItem>
<MudItem xs="2">
<MudIconButton Icon="@Icons.Filled.Replay" Color="Color.Primary" aria-label="nochmal spielen" OnClick="@PlayAgain"></MudIconButton>
</MudItem>
<MudItem xs="1"></MudItem>
</MudGrid>
</MudContainer>
</div>
<!-- Matrix mit Buchstabenfeldern -->
<div class="d-flex justify-center mt-2 mb-2">
<div>
@foreach(var guess in PreviousGuesses)
{
<div class="d-flex mb-2">
@for(int i = 0; i < 5; i++)
{
char guessedChar = char.ToUpper(guess[i]);
if(guessedChar == char.ToUpper(secret[i]))
{
<MudPaper Style="border-color: green; border-width: 4px;" Class="mr-2" Width="60px" Height="60px" Outlined="true">
<MudText Typo="Typo.h3" Align="Align.Center">@guessedChar</MudText>
</MudPaper>
}
else if (secret.Contains(guessedChar, StringComparison.InvariantCultureIgnoreCase))
{
<MudPaper Style="border-color: yellow; border-width: 4px;" Class="mr-2" Width="60px" Height="60px" Outlined="true">
<MudText Typo="Typo.h3" Align="Align.Center">@guessedChar</MudText>
</MudPaper>
}
else
{
<MudPaper Style="border-width: 4px;" Class="mr-2" Width="60px" Height="60px" Outlined="true">
<MudText Typo="Typo.h3" Align="Align.Center">@guessedChar</MudText>
</MudPaper>
}
}
</div>
}
</div>
</div>
<!-- Input dialogue feld -->
<MudContainer MaxWidth="MaxWidth.Small" @onkeyup="@Check4Enter">
<MudGrid Spacing="2">
<MudItem xs="1"></MudItem>
<MudItem xs="8">
<MudTextField Class="" @ref="textField" T="string" FullWidth="true" @bind-Value="Input" Label="Dein Tipp:" Variant="Variant.Outlined" MaxLength="5" Mask="@_inputMask">Hi</MudTextField>
</MudItem>
<MudItem xs="2">
<MudButton style="height:56px; margin-top:6px;" Class="justify-center" Size="Size.Large" Variant="Variant.Outlined" EndIcon="@Icons.Material.Filled.Send" Color="Color.Primary" OnClick=@ButtonOnClick>OK</MudButton>
</MudItem>
<MudItem xs="1"></MudItem>
</MudGrid>
</MudContainer>
@code {
public string Input { get; set; }
public bool hideAlert = true;
public MudTextField<string> textField;
public List<string> PreviousGuesses = new List<string>();
public List<string> SecretList = new List<string>();
//Keine Ahnung wie das funktionert... Danke StackOverflow :)
/// <summary>
/// Eine Regexmaske die alle Strings matched die 0 bis 5 Buchstaben enthalten.
/// </summary>
private IMask _inputMask = new RegexMask(@"^[A-Za-z]{0,5}$");
public string secret = "penis";
private bool found = false;
protected override void OnInitialized()
{
try
{
string text = File.ReadAllText("./wwwroot/nomen.txt");
string[] splitArray = text.Split(",");
foreach(var w in splitArray)
{
SecretList.Add(w);
}
Random r = new Random();
secret = SecretList.ElementAt<string>(r.Next(SecretList.Count));
Console.WriteLine("[SECRET]: " + secret.ToLower());
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
public void Check4Enter(KeyboardEventArgs e)
{
if (e.Code == "Enter" || e.Code == "NumpadEnter")
{
if(found)
{
PlayAgain();
}
else
{
ButtonOnClick();
}
}
}
public void ButtonOnClick()
{
if(Input != null && Input.Length == 5 && !found)
{
PreviousGuesses.Add(Input);
if(secret.ToLower() == Input.ToLower())
{
found = true;
textField.Clear();
hideAlert = false;
}
else
{
textField.Clear();
}
}
}
public void PlayAgain()
{
PreviousGuesses.Clear();
hideAlert = true;
found = false;
Random r = new Random();
secret = SecretList.ElementAt<string>(r.Next(SecretList.Count));
Console.WriteLine("[SECRET]: " + secret.ToLower());
}
}

View File

@ -1,3 +1,5 @@
using DataAccess.Data;
using DataAccess.DbAccess;
using GottfriedsNackenWebseite.Data;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
@ -11,6 +13,9 @@ builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddMudServices();
builder.Services.AddSingleton<ISqlDataAccess, SqlDataAccess>();
builder.Services.AddSingleton<IUserData, UserData>();
var app = builder.Build();
// Configure the HTTP request pipeline.

View File

@ -14,6 +14,18 @@
<MudNavLink Href="fetchdata" Match=NavLinkMatch.Prefix>
Fetch data
</MudNavLink>
<MudNavLink Href="wordle" Match=NavLinkMatch.Prefix>
Nacken Wordle
</MudNavLink>
<MudNavLink Href="nackendex" Match=NavLinkMatch.Prefix>
NackenDex
</MudNavLink>
<MudNavLink Href="numberle" Match=NavLinkMatch.Prefix>
Nacken Numberle
</MudNavLink>
<MudNavLink Href="databasetest" Match=NavLinkMatch.Prefix>
Datenbank Test
</MudNavLink>
</MudNavMenu>
@*
<div class="top-row ps-3 navbar navbar-dark">

View File

@ -1,9 +1,9 @@
{
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
"DetailedErrors": true,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
}

View File

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

View File

@ -1,248 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v6.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v6.0": {
"GottfriedsNackenWebseite/1.0.0": {
"dependencies": {
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets": "1.15.0",
"MudBlazor": "6.0.7"
},
"runtime": {
"GottfriedsNackenWebseite.dll": {}
}
},
"Microsoft.AspNetCore.Authorization/6.0.2": {
"dependencies": {
"Microsoft.AspNetCore.Metadata": "6.0.2",
"Microsoft.Extensions.Logging.Abstractions": "6.0.0",
"Microsoft.Extensions.Options": "6.0.0"
},
"runtime": {
"lib/net6.0/Microsoft.AspNetCore.Authorization.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.222.6412"
}
}
},
"Microsoft.AspNetCore.Components/6.0.2": {
"dependencies": {
"Microsoft.AspNetCore.Authorization": "6.0.2",
"Microsoft.AspNetCore.Components.Analyzers": "6.0.2"
},
"runtime": {
"lib/net6.0/Microsoft.AspNetCore.Components.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.222.6412"
}
}
},
"Microsoft.AspNetCore.Components.Analyzers/6.0.2": {},
"Microsoft.AspNetCore.Components.Forms/6.0.2": {
"dependencies": {
"Microsoft.AspNetCore.Components": "6.0.2"
},
"runtime": {
"lib/net6.0/Microsoft.AspNetCore.Components.Forms.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.222.6412"
}
}
},
"Microsoft.AspNetCore.Components.Web/6.0.2": {
"dependencies": {
"Microsoft.AspNetCore.Components": "6.0.2",
"Microsoft.AspNetCore.Components.Forms": "6.0.2",
"Microsoft.Extensions.DependencyInjection": "6.0.0",
"Microsoft.JSInterop": "6.0.2",
"System.IO.Pipelines": "6.0.2"
},
"runtime": {
"lib/net6.0/Microsoft.AspNetCore.Components.Web.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.222.6412"
}
}
},
"Microsoft.AspNetCore.Metadata/6.0.2": {
"runtime": {
"lib/net6.0/Microsoft.AspNetCore.Metadata.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.222.6412"
}
}
},
"Microsoft.Extensions.DependencyInjection/6.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/6.0.0": {},
"Microsoft.Extensions.Logging.Abstractions/6.0.0": {},
"Microsoft.Extensions.Options/6.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0",
"Microsoft.Extensions.Primitives": "6.0.0"
}
},
"Microsoft.Extensions.Primitives/6.0.0": {
"dependencies": {
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
}
},
"Microsoft.JSInterop/6.0.2": {
"runtime": {
"lib/net6.0/Microsoft.JSInterop.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.222.6412"
}
}
},
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.15.0": {},
"MudBlazor/6.0.7": {
"dependencies": {
"Microsoft.AspNetCore.Components": "6.0.2",
"Microsoft.AspNetCore.Components.Web": "6.0.2"
},
"runtime": {
"lib/net6.0/MudBlazor.dll": {
"assemblyVersion": "6.0.7.0",
"fileVersion": "6.0.7.0"
}
}
},
"System.IO.Pipelines/6.0.2": {
"runtime": {
"lib/net6.0/System.IO.Pipelines.dll": {
"assemblyVersion": "6.0.0.0",
"fileVersion": "6.0.222.6406"
}
}
},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {}
}
},
"libraries": {
"GottfriedsNackenWebseite/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Microsoft.AspNetCore.Authorization/6.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-AjwO1PjN75weiC0KzznybEZh5rr+VjH3c2wvuRT6Qmd8cv2+/6hBn/peelGkZUzYBY0l7QA22jwmjKKeeNYsIQ==",
"path": "microsoft.aspnetcore.authorization/6.0.2",
"hashPath": "microsoft.aspnetcore.authorization.6.0.2.nupkg.sha512"
},
"Microsoft.AspNetCore.Components/6.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-UXojpKtmaJkGRUzGgGY2LcmAqWaubEJ0ewEm/wmchn89hQPuqMG/Zm+Matl1pSMCDIbxuGegYzUs9zIqbS1VNA==",
"path": "microsoft.aspnetcore.components/6.0.2",
"hashPath": "microsoft.aspnetcore.components.6.0.2.nupkg.sha512"
},
"Microsoft.AspNetCore.Components.Analyzers/6.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-jHMdjIrlqm1T6BqBzCpuMAdj1mSpmcEF0wNXIKh7xS6jKAdKOy8aWKTbFI022dW8ZgjC4UNpp9UTuMDVu9/T/w==",
"path": "microsoft.aspnetcore.components.analyzers/6.0.2",
"hashPath": "microsoft.aspnetcore.components.analyzers.6.0.2.nupkg.sha512"
},
"Microsoft.AspNetCore.Components.Forms/6.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-8cABkvHPvBhwMVzOl3ZzVPafDk/ZcUoCA8I7a9jcndpFYNztqtN6IP7i1KSJYk4EYG5nSEf3v1d4F6ufmTKwSA==",
"path": "microsoft.aspnetcore.components.forms/6.0.2",
"hashPath": "microsoft.aspnetcore.components.forms.6.0.2.nupkg.sha512"
},
"Microsoft.AspNetCore.Components.Web/6.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xtQB9yaO7Yki9qHWx48Xuk1/t3cGeOtog+ObSn64rK7knLICd9NpKZa5cw/0ttqzxCo0QHwtk/KAhY9qu4RX7w==",
"path": "microsoft.aspnetcore.components.web/6.0.2",
"hashPath": "microsoft.aspnetcore.components.web.6.0.2.nupkg.sha512"
},
"Microsoft.AspNetCore.Metadata/6.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-SE6xWyaY2n9LsfwNwppyqwVIRtS1RcYPaIFoqyTi8HA6l2Zze40lIvdTSTtDQC+EZpdDRmQY3CPQi9ZlCqOwTg==",
"path": "microsoft.aspnetcore.metadata/6.0.2",
"hashPath": "microsoft.aspnetcore.metadata.6.0.2.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==",
"path": "microsoft.extensions.dependencyinjection/6.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.6.0.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==",
"path": "microsoft.extensions.dependencyinjection.abstractions/6.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.6.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==",
"path": "microsoft.extensions.logging.abstractions/6.0.0",
"hashPath": "microsoft.extensions.logging.abstractions.6.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Options/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==",
"path": "microsoft.extensions.options/6.0.0",
"hashPath": "microsoft.extensions.options.6.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==",
"path": "microsoft.extensions.primitives/6.0.0",
"hashPath": "microsoft.extensions.primitives.6.0.0.nupkg.sha512"
},
"Microsoft.JSInterop/6.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0Fg5C5U+XNS5Mb5jYojUGaCDjQqV5IuzyETXt+9NA0QXRgedbm0uYjNpjbIOcOroPSIgo1E3VIg0EDNtE2CuYQ==",
"path": "microsoft.jsinterop/6.0.2",
"hashPath": "microsoft.jsinterop.6.0.2.nupkg.sha512"
},
"Microsoft.VisualStudio.Azure.Containers.Tools.Targets/1.15.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-63WC4TTNYIGp0pRf9yGrXVqVyPWTtY/r4tFBCOx5d14QVdQPIUqGzE9TWDO1/lOwg+aN0/S3DZTUw9kBSHT/Mg==",
"path": "microsoft.visualstudio.azure.containers.tools.targets/1.15.0",
"hashPath": "microsoft.visualstudio.azure.containers.tools.targets.1.15.0.nupkg.sha512"
},
"MudBlazor/6.0.7": {
"type": "package",
"serviceable": true,
"sha512": "sha512-7NYG50IAgGAmWEWBNzjEOjWmyk9PEkSTDnGMppXzoS1F4CBJe7KkyhDFFHPBpuTpNqJ4r7Xw36R+LPgw7mKoFA==",
"path": "mudblazor/6.0.7",
"hashPath": "mudblazor.6.0.7.nupkg.sha512"
},
"System.IO.Pipelines/6.0.2": {
"type": "package",
"serviceable": true,
"sha512": "sha512-cb5OfQjnz+zjpJJei+f3QYK7+wWZrDdNHf3DykO6QCacpNZ80tuNgq1DC2kqlrjfEu+cMUTvulxPIrCMbBkjqg==",
"path": "system.io.pipelines/6.0.2",
"hashPath": "system.io.pipelines.6.0.2.nupkg.sha512"
},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==",
"path": "system.runtime.compilerservices.unsafe/6.0.0",
"hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512"
}
}
}

View File

@ -1,19 +0,0 @@
{
"runtimeOptions": {
"tfm": "net6.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "6.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "6.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

View File

@ -1,77 +0,0 @@
{
"ContentRoots": [
"/src/GottfriedsNackenWebseite/wwwroot/",
"/root/.nuget/fallbackpackages/mudblazor/6.0.7/staticwebassets/",
"/src/GottfriedsNackenWebseite/obj/Debug/net6.0/scopedcss/bundle/"
],
"Root": {
"Children": {
"css": {
"Children": {
"site.css": {
"Children": null,
"Asset": {
"ContentRootIndex": 0,
"SubPath": "css/site.css"
},
"Patterns": null
}
},
"Asset": null,
"Patterns": null
},
"favicon.ico": {
"Children": null,
"Asset": {
"ContentRootIndex": 0,
"SubPath": "favicon.ico"
},
"Patterns": null
},
"_content": {
"Children": {
"MudBlazor": {
"Children": {
"MudBlazor.min.css": {
"Children": null,
"Asset": {
"ContentRootIndex": 1,
"SubPath": "MudBlazor.min.css"
},
"Patterns": null
},
"MudBlazor.min.js": {
"Children": null,
"Asset": {
"ContentRootIndex": 1,
"SubPath": "MudBlazor.min.js"
},
"Patterns": null
}
},
"Asset": null,
"Patterns": null
}
},
"Asset": null,
"Patterns": null
},
"GottfriedsNackenWebseite.styles.css": {
"Children": null,
"Asset": {
"ContentRootIndex": 2,
"SubPath": "GottfriedsNackenWebseite.styles.css"
},
"Patterns": null
}
},
"Asset": null,
"Patterns": [
{
"ContentRootIndex": 0,
"Pattern": "**",
"Depth": 0
}
]
}
}

View File

@ -1 +0,0 @@
{"ContentRoots":["D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\wwwroot\\","C:\\Users\\Simon\\.nuget\\packages\\mudblazor\\6.0.7\\staticwebassets\\","D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\obj\\Debug\\net6.0\\scopedcss\\bundle\\"],"Root":{"Children":{"css":{"Children":{"site.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"css/site.css"},"Patterns":null}},"Asset":null,"Patterns":null},"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"images":{"Children":{"gitea_icon.svg":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"images/gitea_icon.svg"},"Patterns":null}},"Asset":null,"Patterns":null},"_content":{"Children":{"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"MudBlazor.min.js"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"GottfriedsNackenWebseite.styles.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"GottfriedsNackenWebseite.styles.css"},"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}

View File

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

View File

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

View File

@ -1 +0,0 @@
/app/bin/Debug/net6.0/GottfriedsNackenWebseite.dll

View File

@ -1 +0,0 @@
--additionalProbingPath /root/.nuget/fallbackpackages

View File

@ -1 +0,0 @@
7e122aa9e8dde6f044f3f4f221027ed0ac5b750e9b43617c0c49dc1fd09ee07e

View File

@ -1 +0,0 @@
94H1R5Aep2wzd9q/3CrmWv6ZUzdlXB1CEk7WUwi5Bls=

View File

@ -1 +0,0 @@
zKJ/WZY3g220YHM5bNaYPMqmDLxCCVXZVlZsKhWnsZw=

View File

@ -1 +0,0 @@
sha256:75b6f8a6cd0551998773ec19750853913a5dffa3dc09b9e57be6f645fafd512f

View File

@ -1 +0,0 @@
{"D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite":"/src/","C:\\Users\\Simon\\.nuget\\packages\\":"/root/.nuget/fallbackpackages"}

View File

@ -1 +0,0 @@
ID=.; if [ -e /etc/os-release ]; then . /etc/os-release; fi; if [ $ID = alpine ] && [ -e /remote_debugger/linux-musl-x64/vsdbg ]; then VSDBGPATH=/remote_debugger/linux-musl-x64; else VSDBGPATH=/remote_debugger; fi; $VSDBGPATH/vsdbg --interpreter=vscode

View File

@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]

View File

@ -1,24 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: Microsoft.Extensions.Configuration.UserSecrets.UserSecretsIdAttribute("c5e2b492-e35a-40f7-a290-9076aa64b35e")]
[assembly: System.Reflection.AssemblyCompanyAttribute("GottfriedsNackenWebseite")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("GottfriedsNackenWebseite")]
[assembly: System.Reflection.AssemblyTitleAttribute("GottfriedsNackenWebseite")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@ -1,60 +0,0 @@
is_global = true
build_property.TargetFramework = net6.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb = true
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = GottfriedsNackenWebseite
build_property.RootNamespace = GottfriedsNackenWebseite
build_property.ProjectDir = D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\
build_property.RazorLangVersion = 6.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite
build_property._RazorSourceGeneratorDebug =
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/App.razor]
build_metadata.AdditionalFiles.TargetPath = QXBwLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/Counter.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcQ291bnRlci5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/FetchData.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcRmV0Y2hEYXRhLnJhem9y
build_metadata.AdditionalFiles.CssScope =
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/Index.razor]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcSW5kZXgucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Shared/SurveyPrompt.razor]
build_metadata.AdditionalFiles.TargetPath = U2hhcmVkXFN1cnZleVByb21wdC5yYXpvcg==
build_metadata.AdditionalFiles.CssScope =
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/_Imports.razor]
build_metadata.AdditionalFiles.TargetPath = X0ltcG9ydHMucmF6b3I=
build_metadata.AdditionalFiles.CssScope =
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Shared/MainLayout.razor]
build_metadata.AdditionalFiles.TargetPath = U2hhcmVkXE1haW5MYXlvdXQucmF6b3I=
build_metadata.AdditionalFiles.CssScope = b-gqdahrvza0
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Shared/NavMenu.razor]
build_metadata.AdditionalFiles.TargetPath = U2hhcmVkXE5hdk1lbnUucmF6b3I=
build_metadata.AdditionalFiles.CssScope = b-31q1khypux
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/Error.cshtml]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcRXJyb3IuY3NodG1s
build_metadata.AdditionalFiles.CssScope =
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/_Host.cshtml]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcX0hvc3QuY3NodG1s
build_metadata.AdditionalFiles.CssScope =
[D:/Development/Git/GottfriedsNackenWebseite/GottfriedsNackenWebseite/GottfriedsNackenWebseite/Pages/_Layout.cshtml]
build_metadata.AdditionalFiles.TargetPath = UGFnZXNcX0xheW91dC5jc2h0bWw=
build_metadata.AdditionalFiles.CssScope =

View File

@ -1,17 +0,0 @@
// <auto-generated/>
global using global::Microsoft.AspNetCore.Builder;
global using global::Microsoft.AspNetCore.Hosting;
global using global::Microsoft.AspNetCore.Http;
global using global::Microsoft.AspNetCore.Routing;
global using global::Microsoft.Extensions.Configuration;
global using global::Microsoft.Extensions.DependencyInjection;
global using global::Microsoft.Extensions.Hosting;
global using global::Microsoft.Extensions.Logging;
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Net.Http.Json;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@ -1,18 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ProvideApplicationPartFactoryAttribute("Microsoft.AspNetCore.Mvc.ApplicationParts.ConsolidatedAssemblyApplicationPartFact" +
"ory, Microsoft.AspNetCore.Mvc.Razor")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@ -1,36 +0,0 @@
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\appsettings.Development.json
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\appsettings.json
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\GottfriedsNackenWebseite.staticwebassets.runtime.json
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\GottfriedsNackenWebseite.exe
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\GottfriedsNackenWebseite.deps.json
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\GottfriedsNackenWebseite.runtimeconfig.json
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\GottfriedsNackenWebseite.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\GottfriedsNackenWebseite.pdb
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.csproj.AssemblyReference.cache
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.GeneratedMSBuildEditorConfig.editorconfig
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.AssemblyInfoInputs.cache
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.AssemblyInfo.cs
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.csproj.CoreCompileInputs.cache
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.MvcApplicationPartsAssemblyInfo.cache
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.RazorAssemblyInfo.cache
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.RazorAssemblyInfo.cs
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\staticwebassets.build.json
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\staticwebassets.development.json
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\scopedcss\Shared\MainLayout.razor.rz.scp.css
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\scopedcss\Shared\NavMenu.razor.rz.scp.css
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\scopedcss\bundle\GottfriedsNackenWebseite.styles.css
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\scopedcss\projectbundle\GottfriedsNackenWebseite.bundle.scp.css
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\refint\GottfriedsNackenWebseite.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.pdb
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.genruntimeconfig.cache
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\ref\GottfriedsNackenWebseite.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\Microsoft.AspNetCore.Authorization.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\Microsoft.AspNetCore.Components.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\Microsoft.AspNetCore.Components.Forms.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\Microsoft.AspNetCore.Components.Web.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\Microsoft.AspNetCore.Metadata.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\Microsoft.JSInterop.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\MudBlazor.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\bin\Debug\net6.0\System.IO.Pipelines.dll
D:\Development\Git\GottfriedsNackenWebseite\GottfriedsNackenWebseite\GottfriedsNackenWebseite\obj\Debug\net6.0\GottfriedsNackenWebseite.csproj.CopyComplete

File diff suppressed because one or more lines are too long

View File

@ -1,70 +0,0 @@
.page[b-gqdahrvza0] {
position: relative;
display: flex;
flex-direction: column;
}
main[b-gqdahrvza0] {
flex: 1;
}
.sidebar[b-gqdahrvza0] {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row[b-gqdahrvza0] {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row[b-gqdahrvza0] a, .top-row .btn-link[b-gqdahrvza0] {
white-space: nowrap;
margin-left: 1.5rem;
}
.top-row a:first-child[b-gqdahrvza0] {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row:not(.auth)[b-gqdahrvza0] {
display: none;
}
.top-row.auth[b-gqdahrvza0] {
justify-content: space-between;
}
.top-row a[b-gqdahrvza0], .top-row .btn-link[b-gqdahrvza0] {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page[b-gqdahrvza0] {
flex-direction: row;
}
.sidebar[b-gqdahrvza0] {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row[b-gqdahrvza0] {
position: sticky;
top: 0;
z-index: 1;
}
.top-row[b-gqdahrvza0], article[b-gqdahrvza0] {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}

View File

@ -1,62 +0,0 @@
.navbar-toggler[b-31q1khypux] {
background-color: rgba(255, 255, 255, 0.1);
}
.top-row[b-31q1khypux] {
height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand[b-31q1khypux] {
font-size: 1.1rem;
}
.oi[b-31q1khypux] {
width: 2rem;
font-size: 1.1rem;
vertical-align: text-top;
top: -2px;
}
.nav-item[b-31q1khypux] {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type[b-31q1khypux] {
padding-top: 1rem;
}
.nav-item:last-of-type[b-31q1khypux] {
padding-bottom: 1rem;
}
.nav-item[b-31q1khypux] a {
color: #d7d7d7;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
}
.nav-item[b-31q1khypux] a.active {
background-color: rgba(255,255,255,0.25);
color: white;
}
.nav-item[b-31q1khypux] a:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
@media (min-width: 641px) {
.navbar-toggler[b-31q1khypux] {
display: none;
}
.collapse[b-31q1khypux] {
/* Never collapse the sidebar for wide screens */
display: block;
}
}

View File

@ -1,134 +0,0 @@
/* _content/GottfriedsNackenWebseite/Shared/MainLayout.razor.rz.scp.css */
.page[b-gqdahrvza0] {
position: relative;
display: flex;
flex-direction: column;
}
main[b-gqdahrvza0] {
flex: 1;
}
.sidebar[b-gqdahrvza0] {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row[b-gqdahrvza0] {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row[b-gqdahrvza0] a, .top-row .btn-link[b-gqdahrvza0] {
white-space: nowrap;
margin-left: 1.5rem;
}
.top-row a:first-child[b-gqdahrvza0] {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row:not(.auth)[b-gqdahrvza0] {
display: none;
}
.top-row.auth[b-gqdahrvza0] {
justify-content: space-between;
}
.top-row a[b-gqdahrvza0], .top-row .btn-link[b-gqdahrvza0] {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page[b-gqdahrvza0] {
flex-direction: row;
}
.sidebar[b-gqdahrvza0] {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row[b-gqdahrvza0] {
position: sticky;
top: 0;
z-index: 1;
}
.top-row[b-gqdahrvza0], article[b-gqdahrvza0] {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
/* _content/GottfriedsNackenWebseite/Shared/NavMenu.razor.rz.scp.css */
.navbar-toggler[b-31q1khypux] {
background-color: rgba(255, 255, 255, 0.1);
}
.top-row[b-31q1khypux] {
height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand[b-31q1khypux] {
font-size: 1.1rem;
}
.oi[b-31q1khypux] {
width: 2rem;
font-size: 1.1rem;
vertical-align: text-top;
top: -2px;
}
.nav-item[b-31q1khypux] {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type[b-31q1khypux] {
padding-top: 1rem;
}
.nav-item:last-of-type[b-31q1khypux] {
padding-bottom: 1rem;
}
.nav-item[b-31q1khypux] a {
color: #d7d7d7;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
}
.nav-item[b-31q1khypux] a.active {
background-color: rgba(255,255,255,0.25);
color: white;
}
.nav-item[b-31q1khypux] a:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
@media (min-width: 641px) {
.navbar-toggler[b-31q1khypux] {
display: none;
}
.collapse[b-31q1khypux] {
/* Never collapse the sidebar for wide screens */
display: block;
}
}

View File

@ -1,134 +0,0 @@
/* _content/GottfriedsNackenWebseite/Shared/MainLayout.razor.rz.scp.css */
.page[b-gqdahrvza0] {
position: relative;
display: flex;
flex-direction: column;
}
main[b-gqdahrvza0] {
flex: 1;
}
.sidebar[b-gqdahrvza0] {
background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%);
}
.top-row[b-gqdahrvza0] {
background-color: #f7f7f7;
border-bottom: 1px solid #d6d5d5;
justify-content: flex-end;
height: 3.5rem;
display: flex;
align-items: center;
}
.top-row[b-gqdahrvza0] a, .top-row .btn-link[b-gqdahrvza0] {
white-space: nowrap;
margin-left: 1.5rem;
}
.top-row a:first-child[b-gqdahrvza0] {
overflow: hidden;
text-overflow: ellipsis;
}
@media (max-width: 640.98px) {
.top-row:not(.auth)[b-gqdahrvza0] {
display: none;
}
.top-row.auth[b-gqdahrvza0] {
justify-content: space-between;
}
.top-row a[b-gqdahrvza0], .top-row .btn-link[b-gqdahrvza0] {
margin-left: 0;
}
}
@media (min-width: 641px) {
.page[b-gqdahrvza0] {
flex-direction: row;
}
.sidebar[b-gqdahrvza0] {
width: 250px;
height: 100vh;
position: sticky;
top: 0;
}
.top-row[b-gqdahrvza0] {
position: sticky;
top: 0;
z-index: 1;
}
.top-row[b-gqdahrvza0], article[b-gqdahrvza0] {
padding-left: 2rem !important;
padding-right: 1.5rem !important;
}
}
/* _content/GottfriedsNackenWebseite/Shared/NavMenu.razor.rz.scp.css */
.navbar-toggler[b-31q1khypux] {
background-color: rgba(255, 255, 255, 0.1);
}
.top-row[b-31q1khypux] {
height: 3.5rem;
background-color: rgba(0,0,0,0.4);
}
.navbar-brand[b-31q1khypux] {
font-size: 1.1rem;
}
.oi[b-31q1khypux] {
width: 2rem;
font-size: 1.1rem;
vertical-align: text-top;
top: -2px;
}
.nav-item[b-31q1khypux] {
font-size: 0.9rem;
padding-bottom: 0.5rem;
}
.nav-item:first-of-type[b-31q1khypux] {
padding-top: 1rem;
}
.nav-item:last-of-type[b-31q1khypux] {
padding-bottom: 1rem;
}
.nav-item[b-31q1khypux] a {
color: #d7d7d7;
border-radius: 4px;
height: 3rem;
display: flex;
align-items: center;
line-height: 3rem;
}
.nav-item[b-31q1khypux] a.active {
background-color: rgba(255,255,255,0.25);
color: white;
}
.nav-item[b-31q1khypux] a:hover {
background-color: rgba(255,255,255,0.1);
color: white;
}
@media (min-width: 641px) {
.navbar-toggler[b-31q1khypux] {
display: none;
}
.collapse[b-31q1khypux] {
/* Never collapse the sidebar for wide screens */
display: block;
}
}

View File

@ -1,139 +0,0 @@
{
"Version": 1,
"Hash": "1YRPa6M3x7IGRU5VKhtwunHOBRGQ4hg23mVSW7w7LWo=",
"Source": "GottfriedsNackenWebseite",
"BasePath": "_content/GottfriedsNackenWebseite",
"Mode": "Default",
"ManifestType": "Build",
"ReferencedProjectsConfiguration": [],
"DiscoveryPatterns": [
{
"Name": "GottfriedsNackenWebseite\\wwwroot",
"Source": "GottfriedsNackenWebseite",
"ContentRoot": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\wwwroot\\",
"BasePath": "_content/GottfriedsNackenWebseite",
"Pattern": "**"
}
],
"Assets": [
{
"Identity": "C:\\Users\\Simon\\.nuget\\packages\\mudblazor\\6.0.7\\staticwebassets\\MudBlazor.min.css",
"SourceId": "MudBlazor",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\Simon\\.nuget\\packages\\mudblazor\\6.0.7\\staticwebassets\\",
"BasePath": "_content/MudBlazor",
"RelativePath": "MudBlazor.min.css",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\Simon\\.nuget\\packages\\mudblazor\\6.0.7\\staticwebassets\\MudBlazor.min.css"
},
{
"Identity": "C:\\Users\\Simon\\.nuget\\packages\\mudblazor\\6.0.7\\staticwebassets\\MudBlazor.min.js",
"SourceId": "MudBlazor",
"SourceType": "Package",
"ContentRoot": "C:\\Users\\Simon\\.nuget\\packages\\mudblazor\\6.0.7\\staticwebassets\\",
"BasePath": "_content/MudBlazor",
"RelativePath": "MudBlazor.min.js",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "C:\\Users\\Simon\\.nuget\\packages\\mudblazor\\6.0.7\\staticwebassets\\MudBlazor.min.js"
},
{
"Identity": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\obj\\Debug\\net6.0\\scopedcss\\bundle\\GottfriedsNackenWebseite.styles.css",
"SourceId": "GottfriedsNackenWebseite",
"SourceType": "Computed",
"ContentRoot": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\obj\\Debug\\net6.0\\scopedcss\\bundle\\",
"BasePath": "_content/GottfriedsNackenWebseite",
"RelativePath": "GottfriedsNackenWebseite.styles.css",
"AssetKind": "All",
"AssetMode": "CurrentProject",
"AssetRole": "Primary",
"RelatedAsset": "",
"AssetTraitName": "ScopedCss",
"AssetTraitValue": "ApplicationBundle",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\obj\\Debug\\net6.0\\scopedcss\\bundle\\GottfriedsNackenWebseite.styles.css"
},
{
"Identity": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\obj\\Debug\\net6.0\\scopedcss\\projectbundle\\GottfriedsNackenWebseite.bundle.scp.css",
"SourceId": "GottfriedsNackenWebseite",
"SourceType": "Computed",
"ContentRoot": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\obj\\Debug\\net6.0\\scopedcss\\projectbundle\\",
"BasePath": "_content/GottfriedsNackenWebseite",
"RelativePath": "GottfriedsNackenWebseite.bundle.scp.css",
"AssetKind": "All",
"AssetMode": "Reference",
"AssetRole": "Primary",
"RelatedAsset": "",
"AssetTraitName": "ScopedCss",
"AssetTraitValue": "ProjectBundle",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\obj\\Debug\\net6.0\\scopedcss\\projectbundle\\GottfriedsNackenWebseite.bundle.scp.css"
},
{
"Identity": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\wwwroot\\css\\site.css",
"SourceId": "GottfriedsNackenWebseite",
"SourceType": "Discovered",
"ContentRoot": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\wwwroot\\",
"BasePath": "_content/GottfriedsNackenWebseite",
"RelativePath": "css/site.css",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "wwwroot\\css\\site.css"
},
{
"Identity": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\wwwroot\\favicon.ico",
"SourceId": "GottfriedsNackenWebseite",
"SourceType": "Discovered",
"ContentRoot": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\wwwroot\\",
"BasePath": "_content/GottfriedsNackenWebseite",
"RelativePath": "favicon.ico",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "wwwroot\\favicon.ico"
},
{
"Identity": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\wwwroot\\images\\gitea_icon.svg",
"SourceId": "GottfriedsNackenWebseite",
"SourceType": "Discovered",
"ContentRoot": "D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\wwwroot\\",
"BasePath": "_content/GottfriedsNackenWebseite",
"RelativePath": "images/gitea_icon.svg",
"AssetKind": "All",
"AssetMode": "All",
"AssetRole": "Primary",
"RelatedAsset": "",
"AssetTraitName": "",
"AssetTraitValue": "",
"CopyToOutputDirectory": "Never",
"CopyToPublishDirectory": "PreserveNewest",
"OriginalItemSpec": "wwwroot\\images\\gitea_icon.svg"
}
]
}

View File

@ -1 +0,0 @@
{"ContentRoots":["D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\wwwroot\\","C:\\Users\\Simon\\.nuget\\packages\\mudblazor\\6.0.7\\staticwebassets\\","D:\\Development\\Git\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\GottfriedsNackenWebseite\\obj\\Debug\\net6.0\\scopedcss\\bundle\\"],"Root":{"Children":{"css":{"Children":{"site.css":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"css/site.css"},"Patterns":null}},"Asset":null,"Patterns":null},"favicon.ico":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"favicon.ico"},"Patterns":null},"images":{"Children":{"gitea_icon.svg":{"Children":null,"Asset":{"ContentRootIndex":0,"SubPath":"images/gitea_icon.svg"},"Patterns":null}},"Asset":null,"Patterns":null},"_content":{"Children":{"MudBlazor":{"Children":{"MudBlazor.min.css":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"MudBlazor.min.css"},"Patterns":null},"MudBlazor.min.js":{"Children":null,"Asset":{"ContentRootIndex":1,"SubPath":"MudBlazor.min.js"},"Patterns":null}},"Asset":null,"Patterns":null}},"Asset":null,"Patterns":null},"GottfriedsNackenWebseite.styles.css":{"Children":null,"Asset":{"ContentRootIndex":2,"SubPath":"GottfriedsNackenWebseite.styles.css"},"Patterns":null}},"Asset":null,"Patterns":[{"ContentRootIndex":0,"Pattern":"**","Depth":0}]}}

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