diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..11a68c1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +frontend/node_modules/ +frontend/dist/ +frontend/.vite/ diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..774efb7 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,10 @@ +{ + "ExpandedNodes": [ + "", + "\\frontend", + "\\ShopAPI", + "\\ShopAPI\\ShopAPI" + ], + "SelectedNode": "\\frontend\\.env.example", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/WebShop_Fluxon/CopilotIndices/17.14.1584.41681/CodeChunks.db b/.vs/WebShop_Fluxon/CopilotIndices/17.14.1584.41681/CodeChunks.db new file mode 100644 index 0000000..c175bf8 Binary files /dev/null and b/.vs/WebShop_Fluxon/CopilotIndices/17.14.1584.41681/CodeChunks.db differ diff --git a/.vs/WebShop_Fluxon/CopilotIndices/17.14.1584.41681/SemanticSymbols.db b/.vs/WebShop_Fluxon/CopilotIndices/17.14.1584.41681/SemanticSymbols.db new file mode 100644 index 0000000..ee65844 Binary files /dev/null and b/.vs/WebShop_Fluxon/CopilotIndices/17.14.1584.41681/SemanticSymbols.db differ diff --git a/.vs/WebShop_Fluxon/FileContentIndex/06b2619c-d245-497e-834c-4d419b1e86f4.vsidx b/.vs/WebShop_Fluxon/FileContentIndex/06b2619c-d245-497e-834c-4d419b1e86f4.vsidx new file mode 100644 index 0000000..86ade18 Binary files /dev/null and b/.vs/WebShop_Fluxon/FileContentIndex/06b2619c-d245-497e-834c-4d419b1e86f4.vsidx differ diff --git a/.vs/WebShop_Fluxon/FileContentIndex/144a512d-eda3-4256-a349-0a08394d73f6.vsidx b/.vs/WebShop_Fluxon/FileContentIndex/144a512d-eda3-4256-a349-0a08394d73f6.vsidx new file mode 100644 index 0000000..0d82fdb Binary files /dev/null and b/.vs/WebShop_Fluxon/FileContentIndex/144a512d-eda3-4256-a349-0a08394d73f6.vsidx differ diff --git a/.vs/WebShop_Fluxon/FileContentIndex/38e654a5-c7de-426f-af87-05c2306b1f10.vsidx b/.vs/WebShop_Fluxon/FileContentIndex/38e654a5-c7de-426f-af87-05c2306b1f10.vsidx new file mode 100644 index 0000000..82621ef Binary files /dev/null and b/.vs/WebShop_Fluxon/FileContentIndex/38e654a5-c7de-426f-af87-05c2306b1f10.vsidx differ diff --git a/.vs/WebShop_Fluxon/FileContentIndex/cfd7f47c-7723-4099-8b97-40b70ea4423a.vsidx b/.vs/WebShop_Fluxon/FileContentIndex/cfd7f47c-7723-4099-8b97-40b70ea4423a.vsidx new file mode 100644 index 0000000..654aeed Binary files /dev/null and b/.vs/WebShop_Fluxon/FileContentIndex/cfd7f47c-7723-4099-8b97-40b70ea4423a.vsidx differ diff --git a/.vs/WebShop_Fluxon/FileContentIndex/da4b53c9-28a2-4425-99e7-d666b74a6892.vsidx b/.vs/WebShop_Fluxon/FileContentIndex/da4b53c9-28a2-4425-99e7-d666b74a6892.vsidx new file mode 100644 index 0000000..623bf44 Binary files /dev/null and b/.vs/WebShop_Fluxon/FileContentIndex/da4b53c9-28a2-4425-99e7-d666b74a6892.vsidx differ diff --git a/.vs/WebShop_Fluxon/v17/.wsuo b/.vs/WebShop_Fluxon/v17/.wsuo new file mode 100644 index 0000000..ca63d7e Binary files /dev/null and b/.vs/WebShop_Fluxon/v17/.wsuo differ diff --git a/.vs/WebShop_Fluxon/v17/DocumentLayout.json b/.vs/WebShop_Fluxon/v17/DocumentLayout.json new file mode 100644 index 0000000..c87bd76 --- /dev/null +++ b/.vs/WebShop_Fluxon/v17/DocumentLayout.json @@ -0,0 +1,53 @@ +{ + "Version": 1, + "WorkspaceRootPath": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\frontend\\.env.example||{8B382828-6202-11D1-8870-0000F87579D2}", + "RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:frontend\\.env.example||{8B382828-6202-11D1-8870-0000F87579D2}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 4, + "Children": [ + { + "$type": "Bookmark", + "Name": "ST:0:0:{3ae79031-e1bc-11d0-8f78-00a0c9110057}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{26341fe2-71dd-46fd-bb1b-2e51a92a0d64}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{40ea2e6b-2121-4bb8-a43e-c83c04b51041}" + }, + { + "$type": "Bookmark", + "Name": "ST:0:0:{b1e99781-ab81-11d0-b683-00aa00a3ee26}" + }, + { + "$type": "Document", + "DocumentIndex": 0, + "Title": ".env.example", + "DocumentMoniker": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\frontend\\.env.example", + "RelativeDocumentMoniker": "frontend\\.env.example", + "ToolTip": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\frontend\\.env.example", + "RelativeToolTip": "frontend\\.env.example", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|", + "WhenOpened": "2026-03-17T13:32:24.987Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000..ef9534a Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/BCrypt.Net-Next.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/BCrypt.Net-Next.dll new file mode 100644 index 0000000..326511b Binary files /dev/null and b/ShopAPI/ShopAPI/bin/Debug/net8.0/BCrypt.Net-Next.dll differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll new file mode 100644 index 0000000..12a5a68 Binary files /dev/null and b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Abstractions.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Abstractions.dll new file mode 100644 index 0000000..039dd11 Binary files /dev/null and b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Abstractions.dll differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll new file mode 100644 index 0000000..ca8622a Binary files /dev/null and b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Logging.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Logging.dll new file mode 100644 index 0000000..a97f632 Binary files /dev/null and b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Logging.dll differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll new file mode 100644 index 0000000..fed943a Binary files /dev/null and b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.dll new file mode 100644 index 0000000..da9cab0 Binary files /dev/null and b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.dll differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Tokens.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Tokens.dll new file mode 100644 index 0000000..b18d1a7 Binary files /dev/null and b/ShopAPI/ShopAPI/bin/Debug/net8.0/Microsoft.IdentityModel.Tokens.dll differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.deps.json b/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.deps.json index 1432d19..9644fed 100644 --- a/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.deps.json +++ b/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.deps.json @@ -8,16 +8,27 @@ ".NETCoreApp,Version=v8.0": { "ShopAPI/1.0.0": { "dependencies": { + "BCrypt.Net-Next": "4.1.0", + "Microsoft.AspNetCore.Authentication.JwtBearer": "8.0.25", "Microsoft.EntityFrameworkCore": "9.0.0", "Microsoft.EntityFrameworkCore.Tools": "9.0.0", "Microsoft.VisualStudio.Azure.Containers.Tools.Targets": "1.22.1", "Pomelo.EntityFrameworkCore.MySql": "9.0.0", - "Swashbuckle.AspNetCore": "6.6.2" + "Swashbuckle.AspNetCore": "6.6.2", + "System.IdentityModel.Tokens.Jwt": "8.16.0" }, "runtime": { "ShopAPI.dll": {} } }, + "BCrypt.Net-Next/4.1.0": { + "runtime": { + "lib/netstandard2.1/BCrypt.Net-Next.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.1.0.0" + } + } + }, "Humanizer.Core/2.14.1": { "runtime": { "lib/net6.0/Humanizer.dll": { @@ -26,6 +37,17 @@ } } }, + "Microsoft.AspNetCore.Authentication.JwtBearer/8.0.25": { + "dependencies": { + "Microsoft.IdentityModel.Protocols.OpenIdConnect": "7.1.2" + }, + "runtime": { + "lib/net8.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": { + "assemblyVersion": "8.0.25.0", + "fileVersion": "8.0.2526.11225" + } + } + }, "Microsoft.Bcl.AsyncInterfaces/7.0.0": { "runtime": { "lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": { @@ -501,6 +523,72 @@ } } }, + "Microsoft.IdentityModel.Abstractions/8.16.0": { + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.Abstractions.dll": { + "assemblyVersion": "8.16.0.0", + "fileVersion": "8.16.0.26043" + } + } + }, + "Microsoft.IdentityModel.JsonWebTokens/8.16.0": { + "dependencies": { + "Microsoft.IdentityModel.Tokens": "8.16.0" + }, + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll": { + "assemblyVersion": "8.16.0.0", + "fileVersion": "8.16.0.26043" + } + } + }, + "Microsoft.IdentityModel.Logging/8.16.0": { + "dependencies": { + "Microsoft.IdentityModel.Abstractions": "8.16.0" + }, + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.Logging.dll": { + "assemblyVersion": "8.16.0.0", + "fileVersion": "8.16.0.26043" + } + } + }, + "Microsoft.IdentityModel.Protocols/7.1.2": { + "dependencies": { + "Microsoft.IdentityModel.Logging": "8.16.0", + "Microsoft.IdentityModel.Tokens": "8.16.0" + }, + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.Protocols.dll": { + "assemblyVersion": "7.1.2.0", + "fileVersion": "7.1.2.41121" + } + } + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/7.1.2": { + "dependencies": { + "Microsoft.IdentityModel.Protocols": "7.1.2", + "System.IdentityModel.Tokens.Jwt": "8.16.0" + }, + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": { + "assemblyVersion": "7.1.2.0", + "fileVersion": "7.1.2.41121" + } + } + }, + "Microsoft.IdentityModel.Tokens/8.16.0": { + "dependencies": { + "Microsoft.Extensions.Logging.Abstractions": "9.0.0", + "Microsoft.IdentityModel.Logging": "8.16.0" + }, + "runtime": { + "lib/net8.0/Microsoft.IdentityModel.Tokens.dll": { + "assemblyVersion": "8.16.0.0", + "fileVersion": "8.16.0.26043" + } + } + }, "Microsoft.OpenApi/1.6.14": { "runtime": { "lib/netstandard2.0/Microsoft.OpenApi.dll": { @@ -660,6 +748,18 @@ } } }, + "System.IdentityModel.Tokens.Jwt/8.16.0": { + "dependencies": { + "Microsoft.IdentityModel.JsonWebTokens": "8.16.0", + "Microsoft.IdentityModel.Tokens": "8.16.0" + }, + "runtime": { + "lib/net8.0/System.IdentityModel.Tokens.Jwt.dll": { + "assemblyVersion": "8.16.0.0", + "fileVersion": "8.16.0.26043" + } + } + }, "System.IO.Pipelines/9.0.0": { "runtime": { "lib/net8.0/System.IO.Pipelines.dll": { @@ -711,6 +811,13 @@ "serviceable": false, "sha512": "" }, + "BCrypt.Net-Next/4.1.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5YT3DKllmtkyW68PjURu/V1TOe4MKiByKwsRNVcfYE1S5KuFTeozdmKzyNzolKiQF391OXCaQtINvYT3j1ERzQ==", + "path": "bcrypt.net-next/4.1.0", + "hashPath": "bcrypt.net-next.4.1.0.nupkg.sha512" + }, "Humanizer.Core/2.14.1": { "type": "package", "serviceable": true, @@ -718,6 +825,13 @@ "path": "humanizer.core/2.14.1", "hashPath": "humanizer.core.2.14.1.nupkg.sha512" }, + "Microsoft.AspNetCore.Authentication.JwtBearer/8.0.25": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nb6jCyxh5eP9bsXkHmGcDxUiVIl5wJSombl3LN2L+sjGEVXzcMKbdRe0fp8LQtuBM2hKXcXFxMAYdnohdYJF8Q==", + "path": "microsoft.aspnetcore.authentication.jwtbearer/8.0.25", + "hashPath": "microsoft.aspnetcore.authentication.jwtbearer.8.0.25.nupkg.sha512" + }, "Microsoft.Bcl.AsyncInterfaces/7.0.0": { "type": "package", "serviceable": true, @@ -900,6 +1014,48 @@ "path": "microsoft.extensions.primitives/9.0.0", "hashPath": "microsoft.extensions.primitives.9.0.0.nupkg.sha512" }, + "Microsoft.IdentityModel.Abstractions/8.16.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-gSxKLWRZzBpIsEoeUPkxfywNCCvRvl7hkq146XHPk5vOQc9izSf1I+uL1vh4y2U19QPxd9Z8K/8AdWyxYz2lSg==", + "path": "microsoft.identitymodel.abstractions/8.16.0", + "hashPath": "microsoft.identitymodel.abstractions.8.16.0.nupkg.sha512" + }, + "Microsoft.IdentityModel.JsonWebTokens/8.16.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-prBU72cIP4V8E9fhN+o/YdskTsLeIcnKPbhZf0X6mD7fdxoZqnS/NdEkSr+9Zp+2q7OZBOMfNBKGbTbhXODO4w==", + "path": "microsoft.identitymodel.jsonwebtokens/8.16.0", + "hashPath": "microsoft.identitymodel.jsonwebtokens.8.16.0.nupkg.sha512" + }, + "Microsoft.IdentityModel.Logging/8.16.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-MTzXmETkNQPACR7/XCXM1OGM6oU9RkyibqeJRtO9Ndew2LnGjMf9Atqj2VSf4XC27X0FQycUAlzxxEgQMWn2xQ==", + "path": "microsoft.identitymodel.logging/8.16.0", + "hashPath": "microsoft.identitymodel.logging.8.16.0.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols/7.1.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SydLwMRFx6EHPWJ+N6+MVaoArN1Htt92b935O3RUWPY1yUF63zEjvd3lBu79eWdZUwedP8TN2I5V9T3nackvIQ==", + "path": "microsoft.identitymodel.protocols/7.1.2", + "hashPath": "microsoft.identitymodel.protocols.7.1.2.nupkg.sha512" + }, + "Microsoft.IdentityModel.Protocols.OpenIdConnect/7.1.2": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6lHQoLXhnMQ42mGrfDkzbIOR3rzKM1W1tgTeMPLgLCqwwGw0d96xFi/UiX/fYsu7d6cD5MJiL3+4HuI8VU+sVQ==", + "path": "microsoft.identitymodel.protocols.openidconnect/7.1.2", + "hashPath": "microsoft.identitymodel.protocols.openidconnect.7.1.2.nupkg.sha512" + }, + "Microsoft.IdentityModel.Tokens/8.16.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rtViGJcGsN7WcfUNErwNeQgjuU5cJNl6FDQsfi9TncwO+Epzn0FTfBsg3YuFW1Q0Ch/KPxaVdjLw3/+5Z5ceFQ==", + "path": "microsoft.identitymodel.tokens/8.16.0", + "hashPath": "microsoft.identitymodel.tokens.8.16.0.nupkg.sha512" + }, "Microsoft.OpenApi/1.6.14": { "type": "package", "serviceable": true, @@ -1026,6 +1182,13 @@ "path": "system.diagnostics.diagnosticsource/9.0.0", "hashPath": "system.diagnostics.diagnosticsource.9.0.0.nupkg.sha512" }, + "System.IdentityModel.Tokens.Jwt/8.16.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rrs2u7DRMXQG2yh0oVyF/vLwosfRv20Ld2iEpYcKwQWXHjfV+gFXNQsQ9p008kR9Ou4pxBs68Q6/9zC8Gi1wjg==", + "path": "system.identitymodel.tokens.jwt/8.16.0", + "hashPath": "system.identitymodel.tokens.jwt.8.16.0.nupkg.sha512" + }, "System.IO.Pipelines/9.0.0": { "type": "package", "serviceable": true, diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.dll index d4a3b1f..069f5cd 100644 Binary files a/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.dll and b/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.dll differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.exe b/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.exe index c1e439e..7ec6098 100644 Binary files a/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.exe and b/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.exe differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.pdb b/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.pdb index 5f2564c..ff8dc3f 100644 Binary files a/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.pdb and b/ShopAPI/ShopAPI/bin/Debug/net8.0/ShopAPI.pdb differ diff --git a/ShopAPI/ShopAPI/bin/Debug/net8.0/System.IdentityModel.Tokens.Jwt.dll b/ShopAPI/ShopAPI/bin/Debug/net8.0/System.IdentityModel.Tokens.Jwt.dll new file mode 100644 index 0000000..cdaeb50 Binary files /dev/null and b/ShopAPI/ShopAPI/bin/Debug/net8.0/System.IdentityModel.Tokens.Jwt.dll differ diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.AssemblyInfo.cs b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.AssemblyInfo.cs index b53f554..7e39eaf 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.AssemblyInfo.cs +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.AssemblyInfo.cs @@ -15,7 +15,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("ShopAPI")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+91ee7a14bf0bcb73d7d98089c76ebea2f2fe7f63")] [assembly: System.Reflection.AssemblyProductAttribute("ShopAPI")] [assembly: System.Reflection.AssemblyTitleAttribute("ShopAPI")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.AssemblyInfoInputs.cache b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.AssemblyInfoInputs.cache index a9ab633..83ad296 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.AssemblyInfoInputs.cache +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.AssemblyInfoInputs.cache @@ -1 +1 @@ -be52108e965d99112d5251b6f56629d05a000587350c277aca31d5ba1f416964 +68325b9d62d9605c3967e910dbbaf739f50cf6103123311d26ac71b61bb3e3af diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.GeneratedMSBuildEditorConfig.editorconfig b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.GeneratedMSBuildEditorConfig.editorconfig index e094bcd..ca32bb1 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.GeneratedMSBuildEditorConfig.editorconfig +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.GeneratedMSBuildEditorConfig.editorconfig @@ -17,13 +17,13 @@ build_property._SupportedPlatformList = Linux,macOS,Windows build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = ShopAPI build_property.RootNamespace = ShopAPI -build_property.ProjectDir = C:\Users\bib\Desktop\Projekt-Fluxon\website_Fluxon\ShopAPI\ShopAPI\ +build_property.ProjectDir = C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.RazorLangVersion = 8.0 build_property.SupportLocalizedComponentNames = build_property.GenerateRazorMetadataSourceChecksumAttributes = -build_property.MSBuildProjectDirectory = C:\Users\bib\Desktop\Projekt-Fluxon\website_Fluxon\ShopAPI\ShopAPI +build_property.MSBuildProjectDirectory = C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI build_property._RazorSourceGeneratorDebug = build_property.EffectiveAnalysisLevelStyle = 8.0 build_property.EnableCodeStyleSeverity = diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.MvcApplicationPartsAssemblyInfo.cs b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.MvcApplicationPartsAssemblyInfo.cs index fb25a17..c3c8c13 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.MvcApplicationPartsAssemblyInfo.cs +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.MvcApplicationPartsAssemblyInfo.cs @@ -1,10 +1,9 @@ //------------------------------------------------------------------------------ // -// Dieser Code wurde von einem Tool generiert. -// Laufzeitversion:4.0.30319.42000 +// This code was generated by a tool. // -// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn -// der Code erneut generiert wird. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. // //------------------------------------------------------------------------------ diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.assets.cache b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.assets.cache index dd51ceb..aeddcfc 100644 Binary files a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.assets.cache and b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.assets.cache differ diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.AssemblyReference.cache b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.AssemblyReference.cache index 271138e..b4194a2 100644 Binary files a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.AssemblyReference.cache and b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.AssemblyReference.cache differ diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.CoreCompileInputs.cache b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.CoreCompileInputs.cache index 35b645a..8dbad58 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.CoreCompileInputs.cache +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -af378ad7e60f8f4f8f66d7100fe853bfd8622963c6af9a14946e4724352cf619 +b576f6f2fa93412c5a3d2af54787d83dab30afa4b61df58637d064e044907b77 diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.FileListAbsolute.txt b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.FileListAbsolute.txt index 658c188..45c804b 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.FileListAbsolute.txt +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.csproj.FileListAbsolute.txt @@ -135,3 +135,148 @@ C:\Users\bib\Desktop\Projekt-Fluxon\website_Fluxon\ShopAPI\ShopAPI\obj\Debug\net C:\Users\bib\Desktop\Projekt-Fluxon\website_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.pdb C:\Users\bib\Desktop\Projekt-Fluxon\website_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.genruntimeconfig.cache C:\Users\bib\Desktop\Projekt-Fluxon\website_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ref\ShopAPI.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\appsettings.Development.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\appsettings.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ShopAPI.staticwebassets.endpoints.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ShopAPI.exe +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ShopAPI.deps.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ShopAPI.runtimeconfig.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ShopAPI.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ShopAPI.pdb +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\BCrypt.Net-Next.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Humanizer.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.AspNetCore.Authentication.JwtBearer.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Bcl.AsyncInterfaces.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Build.Locator.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.CodeAnalysis.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.CodeAnalysis.CSharp.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.CodeAnalysis.CSharp.Workspaces.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.CodeAnalysis.Workspaces.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.CodeAnalysis.Workspaces.MSBuild.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.EntityFrameworkCore.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.EntityFrameworkCore.Abstractions.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.EntityFrameworkCore.Design.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.EntityFrameworkCore.Relational.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.Caching.Abstractions.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.Caching.Memory.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.Configuration.Abstractions.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.DependencyModel.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.Logging.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.Logging.Abstractions.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.Options.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.Extensions.Primitives.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.IdentityModel.Abstractions.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.IdentityModel.JsonWebTokens.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.IdentityModel.Logging.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.IdentityModel.Protocols.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.IdentityModel.Tokens.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Microsoft.OpenApi.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Mono.TextTemplating.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\MySqlConnector.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Pomelo.EntityFrameworkCore.MySql.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Swashbuckle.AspNetCore.Swagger.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Swashbuckle.AspNetCore.SwaggerGen.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\Swashbuckle.AspNetCore.SwaggerUI.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.CodeDom.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.Composition.AttributedModel.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.Composition.Convention.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.Composition.Hosting.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.Composition.Runtime.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.Composition.TypedParts.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.Diagnostics.DiagnosticSource.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.IdentityModel.Tokens.Jwt.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.IO.Pipelines.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.Text.Encodings.Web.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\System.Text.Json.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\cs\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\de\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\es\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\fr\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\it\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ja\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ko\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pl\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pt-BR\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ru\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\tr\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hans\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hant\Microsoft.CodeAnalysis.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\cs\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\de\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\es\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\fr\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\it\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ja\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ko\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pl\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pt-BR\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ru\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\tr\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\cs\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\de\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\es\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\fr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\it\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ja\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ko\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pl\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pt-BR\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ru\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\tr\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hans\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hant\Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\cs\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\de\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\es\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\fr\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\it\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ja\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ko\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pl\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ru\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\tr\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\cs\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\de\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\es\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\fr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\it\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ja\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ko\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pl\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\pt-BR\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\ru\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\tr\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hans\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\zh-Hant\Microsoft.CodeAnalysis.Workspaces.MSBuild.BuildHost.resources.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\bin\Debug\net8.0\runtimes\browser\lib\net8.0\System.Text.Encodings.Web.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.csproj.AssemblyReference.cache +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\rpswa.dswa.cache.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.AssemblyInfoInputs.cache +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.AssemblyInfo.cs +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.csproj.CoreCompileInputs.cache +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.MvcApplicationPartsAssemblyInfo.cs +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.MvcApplicationPartsAssemblyInfo.cache +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\rjimswa.dswa.cache.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\rjsmrazor.dswa.cache.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\rjsmcshtml.dswa.cache.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\scopedcss\bundle\ShopAPI.styles.css +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\staticwebassets.build.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\staticwebassets.build.json.cache +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\staticwebassets.development.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\staticwebassets.build.endpoints.json +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.csproj.Up2Date +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\refint\ShopAPI.dll +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.pdb +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ShopAPI.genruntimeconfig.cache +C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\obj\Debug\net8.0\ref\ShopAPI.dll diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.dll b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.dll index d4a3b1f..069f5cd 100644 Binary files a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.dll and b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.dll differ diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.genruntimeconfig.cache b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.genruntimeconfig.cache index 5c24a48..6d90471 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.genruntimeconfig.cache +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.genruntimeconfig.cache @@ -1 +1 @@ -b94a5596d89b54f7504b98ef7116ca86018e94a94b8eedb238b7c9fddaf1c409 +6b3390096d439ba0d6e4de6a407fa36021954eae649a7b730c75b378bef2731e diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.pdb b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.pdb index 5f2564c..ff8dc3f 100644 Binary files a/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.pdb and b/ShopAPI/ShopAPI/obj/Debug/net8.0/ShopAPI.pdb differ diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/apphost.exe b/ShopAPI/ShopAPI/obj/Debug/net8.0/apphost.exe index c1e439e..7ec6098 100644 Binary files a/ShopAPI/ShopAPI/obj/Debug/net8.0/apphost.exe and b/ShopAPI/ShopAPI/obj/Debug/net8.0/apphost.exe differ diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/ref/ShopAPI.dll b/ShopAPI/ShopAPI/obj/Debug/net8.0/ref/ShopAPI.dll index dd69f46..f6034bb 100644 Binary files a/ShopAPI/ShopAPI/obj/Debug/net8.0/ref/ShopAPI.dll and b/ShopAPI/ShopAPI/obj/Debug/net8.0/ref/ShopAPI.dll differ diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/refint/ShopAPI.dll b/ShopAPI/ShopAPI/obj/Debug/net8.0/refint/ShopAPI.dll index dd69f46..f6034bb 100644 Binary files a/ShopAPI/ShopAPI/obj/Debug/net8.0/refint/ShopAPI.dll and b/ShopAPI/ShopAPI/obj/Debug/net8.0/refint/ShopAPI.dll differ diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/rjsmcshtml.dswa.cache.json b/ShopAPI/ShopAPI/obj/Debug/net8.0/rjsmcshtml.dswa.cache.json index 215aa7f..6048975 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/rjsmcshtml.dswa.cache.json +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/rjsmcshtml.dswa.cache.json @@ -1 +1 @@ -{"GlobalPropertiesHash":"2SiV7x3vjV8ZFi0sgmWSSTGHCwHAp08jCG9AL/ERQ/Q=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["mSjvBL27zG1kSzjpaqc9iI0QRpH2\u002BnmIxzsYeoyiZ8k=","5\u002BRipzB3qq6oLG1hzpoNvnzpM95KVvzJdVIXKGR5Nps=","k4J\u002BX/9OfyQ\u002Bvg6DNSgPmdorYBHAlUCx2XqrIUvSzvM=","P9s2CLfWnGJ3BuLhrowTd7paEsc\u002BFPTVz6iCnwAyWDY=","cZjb5kG3xkbxY4SEseWX7ClUw/XN02dd37xJoHYSocs=","k2ZK2MXYMG89By4JV3rT0m6IHy183usaiKwTwNY8md4=","7INOJdHgqe/nqyYYieTHW8/FPUSM7kVKuqZEiBTlsOE="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file +{"GlobalPropertiesHash":"jjFS3ypc+SFFIJoabqxBcUwQp4+BH7vO9y9aDuWO8Ig=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["oM\u002B92zWtRWs1ZZHQG5F\u002BZt\u002BmUwKFCmEHXl6yhJyDB9E=","m4ORQ/F\u002BR\u002BZG7hKB0ZiSTgsXFT54fbrxurDLZfuPLtU=","/26wWziwS0KH/O896xGXBSLufvhay7wSjV2zdTxws18=","WyWGi43zm6PntQI/ucnnU3lxt5XudSMI/Un84LZNCNI=","pzhO73lOLr0aoNbQo3AXbJ7qsA2VDRY9Il7vtsfu6/g=","\u002BmYXsDWUwEv8MDDi5d\u002BdcyyfamgV9HnHNS18DvTVT8g=","VCMjbsGvZwkzIwBPIxYVkJGNjdVrL8NLULTnwkheTNo="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/rjsmrazor.dswa.cache.json b/ShopAPI/ShopAPI/obj/Debug/net8.0/rjsmrazor.dswa.cache.json index d44c1e4..06e3fde 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/rjsmrazor.dswa.cache.json +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/rjsmrazor.dswa.cache.json @@ -1 +1 @@ -{"GlobalPropertiesHash":"g/T3BUSjVMK8fsoOmXvbmTfW2MVL2VJoCyrZtQ0or0o=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["mSjvBL27zG1kSzjpaqc9iI0QRpH2\u002BnmIxzsYeoyiZ8k=","5\u002BRipzB3qq6oLG1hzpoNvnzpM95KVvzJdVIXKGR5Nps=","k4J\u002BX/9OfyQ\u002Bvg6DNSgPmdorYBHAlUCx2XqrIUvSzvM=","P9s2CLfWnGJ3BuLhrowTd7paEsc\u002BFPTVz6iCnwAyWDY=","cZjb5kG3xkbxY4SEseWX7ClUw/XN02dd37xJoHYSocs=","k2ZK2MXYMG89By4JV3rT0m6IHy183usaiKwTwNY8md4=","7INOJdHgqe/nqyYYieTHW8/FPUSM7kVKuqZEiBTlsOE="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file +{"GlobalPropertiesHash":"tbgf6NkZHDHq5Bwz13FNLNq2Biw7YSKbQETYkFTRirw=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["oM\u002B92zWtRWs1ZZHQG5F\u002BZt\u002BmUwKFCmEHXl6yhJyDB9E=","m4ORQ/F\u002BR\u002BZG7hKB0ZiSTgsXFT54fbrxurDLZfuPLtU=","/26wWziwS0KH/O896xGXBSLufvhay7wSjV2zdTxws18=","WyWGi43zm6PntQI/ucnnU3lxt5XudSMI/Un84LZNCNI=","pzhO73lOLr0aoNbQo3AXbJ7qsA2VDRY9Il7vtsfu6/g=","\u002BmYXsDWUwEv8MDDi5d\u002BdcyyfamgV9HnHNS18DvTVT8g=","VCMjbsGvZwkzIwBPIxYVkJGNjdVrL8NLULTnwkheTNo="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/ShopAPI/ShopAPI/obj/Debug/net8.0/rpswa.dswa.cache.json b/ShopAPI/ShopAPI/obj/Debug/net8.0/rpswa.dswa.cache.json index 9002a6f..de433b8 100644 --- a/ShopAPI/ShopAPI/obj/Debug/net8.0/rpswa.dswa.cache.json +++ b/ShopAPI/ShopAPI/obj/Debug/net8.0/rpswa.dswa.cache.json @@ -1 +1 @@ -{"GlobalPropertiesHash":"Jr8OaCL0xTfG0mf5QmD9ofeLsJvV3IBK9E7sPFxRjbU=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["mSjvBL27zG1kSzjpaqc9iI0QRpH2\u002BnmIxzsYeoyiZ8k=","5\u002BRipzB3qq6oLG1hzpoNvnzpM95KVvzJdVIXKGR5Nps="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file +{"GlobalPropertiesHash":"XJKffwBiP1Gt5f0UmbU2Us8/L7oX34bUNWnspz6E28M=","FingerprintPatternsHash":"gq3WsqcKBUGTSNle7RKKyXRIwh7M8ccEqOqYvIzoM04=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["oM\u002B92zWtRWs1ZZHQG5F\u002BZt\u002BmUwKFCmEHXl6yhJyDB9E=","m4ORQ/F\u002BR\u002BZG7hKB0ZiSTgsXFT54fbrxurDLZfuPLtU="],"CachedAssets":{},"CachedCopyCandidates":{}} \ No newline at end of file diff --git a/ShopAPI/ShopAPI/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs b/ShopAPI/ShopAPI/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs new file mode 100644 index 0000000..2217181 --- /dev/null +++ b/ShopAPI/ShopAPI/obj/Release/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")] diff --git a/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.AssemblyInfo.cs b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.AssemblyInfo.cs new file mode 100644 index 0000000..8f34a5d --- /dev/null +++ b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: Microsoft.Extensions.Configuration.UserSecrets.UserSecretsIdAttribute("33e8cb0c-ba59-4213-842e-10895258ce75")] +[assembly: System.Reflection.AssemblyCompanyAttribute("ShopAPI")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+91ee7a14bf0bcb73d7d98089c76ebea2f2fe7f63")] +[assembly: System.Reflection.AssemblyProductAttribute("ShopAPI")] +[assembly: System.Reflection.AssemblyTitleAttribute("ShopAPI")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] + +// Von der MSBuild WriteCodeFragment-Klasse generiert. + diff --git a/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.AssemblyInfoInputs.cache b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.AssemblyInfoInputs.cache new file mode 100644 index 0000000..561f0c6 --- /dev/null +++ b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +1744c178d2610e44f397698f39e437e9c2a0dfa624dd70d434483ad467a6d847 diff --git a/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.GeneratedMSBuildEditorConfig.editorconfig b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 0000000..ca32bb1 --- /dev/null +++ b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,29 @@ +is_global = true +build_property.TargetFramework = net8.0 +build_property.TargetFramework = net8.0 +build_property.TargetPlatformMinVersion = +build_property.TargetPlatformMinVersion = +build_property.UsingMicrosoftNETSdkWeb = true +build_property.UsingMicrosoftNETSdkWeb = true +build_property.ProjectTypeGuids = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = ShopAPI +build_property.RootNamespace = ShopAPI +build_property.ProjectDir = C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.RazorLangVersion = 8.0 +build_property.SupportLocalizedComponentNames = +build_property.GenerateRazorMetadataSourceChecksumAttributes = +build_property.MSBuildProjectDirectory = C:\Users\bib\Documents\LEA2\WebShop_Fluxon\ShopAPI\ShopAPI +build_property._RazorSourceGeneratorDebug = +build_property.EffectiveAnalysisLevelStyle = 8.0 +build_property.EnableCodeStyleSeverity = diff --git a/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.GlobalUsings.g.cs b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.GlobalUsings.g.cs new file mode 100644 index 0000000..025530a --- /dev/null +++ b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.GlobalUsings.g.cs @@ -0,0 +1,17 @@ +// +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; diff --git a/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.assets.cache b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.assets.cache new file mode 100644 index 0000000..5e474d5 Binary files /dev/null and b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.assets.cache differ diff --git a/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.csproj.AssemblyReference.cache b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.csproj.AssemblyReference.cache new file mode 100644 index 0000000..b4194a2 Binary files /dev/null and b/ShopAPI/ShopAPI/obj/Release/net8.0/ShopAPI.csproj.AssemblyReference.cache differ diff --git a/ShopAPI/ShopAPI/obj/ShopAPI.csproj.nuget.dgspec.json b/ShopAPI/ShopAPI/obj/ShopAPI.csproj.nuget.dgspec.json index fdbb46a..dcf7c7b 100644 --- a/ShopAPI/ShopAPI/obj/ShopAPI.csproj.nuget.dgspec.json +++ b/ShopAPI/ShopAPI/obj/ShopAPI.csproj.nuget.dgspec.json @@ -1,17 +1,17 @@ { "format": 1, "restore": { - "C:\\Users\\bib\\Desktop\\Projekt-Fluxon\\website_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj": {} + "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj": {} }, "projects": { - "C:\\Users\\bib\\Desktop\\Projekt-Fluxon\\website_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj": { + "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\bib\\Desktop\\Projekt-Fluxon\\website_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", + "projectUniqueName": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", "projectName": "ShopAPI", - "projectPath": "C:\\Users\\bib\\Desktop\\Projekt-Fluxon\\website_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", + "projectPath": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", "packagesPath": "C:\\Users\\bib\\.nuget\\packages\\", - "outputPath": "C:\\Users\\bib\\Desktop\\Projekt-Fluxon\\website_Fluxon\\ShopAPI\\ShopAPI\\obj\\", + "outputPath": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\ShopAPI\\ShopAPI\\obj\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" @@ -26,7 +26,9 @@ ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {}, + "https://packagesource1": {} }, "frameworks": { "net8.0": { @@ -104,7 +106,7 @@ "privateAssets": "all" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.312/PortableRuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.311/PortableRuntimeIdentifierGraph.json" } } } diff --git a/ShopAPI/ShopAPI/obj/ShopAPI.csproj.nuget.g.props b/ShopAPI/ShopAPI/obj/ShopAPI.csproj.nuget.g.props index 772bfde..0314a93 100644 --- a/ShopAPI/ShopAPI/obj/ShopAPI.csproj.nuget.g.props +++ b/ShopAPI/ShopAPI/obj/ShopAPI.csproj.nuget.g.props @@ -7,7 +7,7 @@ $(UserProfile)\.nuget\packages\ C:\Users\bib\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference - 6.14.2 + 6.14.0 diff --git a/ShopAPI/ShopAPI/obj/project.assets.json b/ShopAPI/ShopAPI/obj/project.assets.json index 2126560..6c551c7 100644 --- a/ShopAPI/ShopAPI/obj/project.assets.json +++ b/ShopAPI/ShopAPI/obj/project.assets.json @@ -3843,11 +3843,11 @@ "project": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\bib\\Desktop\\Projekt-Fluxon\\website_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", + "projectUniqueName": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", "projectName": "ShopAPI", - "projectPath": "C:\\Users\\bib\\Desktop\\Projekt-Fluxon\\website_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", + "projectPath": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", "packagesPath": "C:\\Users\\bib\\.nuget\\packages\\", - "outputPath": "C:\\Users\\bib\\Desktop\\Projekt-Fluxon\\website_Fluxon\\ShopAPI\\ShopAPI\\obj\\", + "outputPath": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\ShopAPI\\ShopAPI\\obj\\", "projectStyle": "PackageReference", "fallbackFolders": [ "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" @@ -3862,7 +3862,9 @@ ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, - "https://api.nuget.org/v3/index.json": {} + "C:\\Program Files\\dotnet\\library-packs": {}, + "https://api.nuget.org/v3/index.json": {}, + "https://packagesource1": {} }, "frameworks": { "net8.0": { @@ -3940,7 +3942,7 @@ "privateAssets": "all" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.312/PortableRuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.311/PortableRuntimeIdentifierGraph.json" } } } diff --git a/ShopAPI/ShopAPI/obj/project.nuget.cache b/ShopAPI/ShopAPI/obj/project.nuget.cache index 41c13a6..c482081 100644 --- a/ShopAPI/ShopAPI/obj/project.nuget.cache +++ b/ShopAPI/ShopAPI/obj/project.nuget.cache @@ -1,8 +1,8 @@ { "version": 2, - "dgSpecHash": "spizpp0kT/Q=", + "dgSpecHash": "NZxEHR2RpcI=", "success": true, - "projectFilePath": "C:\\Users\\bib\\Desktop\\Projekt-Fluxon\\website_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", + "projectFilePath": "C:\\Users\\bib\\Documents\\LEA2\\WebShop_Fluxon\\ShopAPI\\ShopAPI\\ShopAPI.csproj", "expectedPackageFiles": [ "C:\\Users\\bib\\.nuget\\packages\\bcrypt.net-next\\4.1.0\\bcrypt.net-next.4.1.0.nupkg.sha512", "C:\\Users\\bib\\.nuget\\packages\\humanizer.core\\2.14.1\\humanizer.core.2.14.1.nupkg.sha512", diff --git a/frontend/.env.example b/frontend/.env.example new file mode 100644 index 0000000..c1deb34 --- /dev/null +++ b/frontend/.env.example @@ -0,0 +1,2 @@ +VITE_API_BASE_URL=http://localhost:5276 +VITE_USE_MOCK_API=true diff --git a/frontend/INTEGRATION_CHECKLIST.md b/frontend/INTEGRATION_CHECKLIST.md new file mode 100644 index 0000000..ceb88a2 --- /dev/null +++ b/frontend/INTEGRATION_CHECKLIST.md @@ -0,0 +1,39 @@ +# Fluxon Frontend Integration Checklist + +Use this with the backend teammate before switching any feature from mock mode to real API. + +## Product endpoints +- Route: `GET /api/product` +- Route: `GET /api/product/{id}` +- Response fields: `id`, `name`, `description`, `price`, `stock`, `categoryId` +- Nice to have: nested `category` + +## Category endpoint +- Route: `GET /api/category` +- Response fields: `id`, `name` + +## Auth endpoints +- Route: `POST /api/auth/login` +- Route: `POST /api/auth/register` +- Request body: + - Login: `email`, `password` + - Register: `name`, `email`, `password` +- Response: token plus customer identity fields + +## Order endpoint +- Route: `GET /api/order` +- Route: `POST /api/order` +- Request body should accept: + - customer/shipping data + - `items[]` with `productId`, `quantity`, `unitPrice` +- Response should include: + - order id + - created date + - total + - status + - payment status + +## Frontend env switch +- Mock mode default: `VITE_USE_MOCK_API=true` +- Real API mode: set `VITE_USE_MOCK_API=false` +- API base URL: `VITE_API_BASE_URL=http://localhost:5276` diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..9ca1638 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,28 @@ +# Fluxon Frontend + +React + Vite storefront for the Fluxon project. + +## What is included +- Home page, product listing, product details, cart, login, register, checkout, confirmation, and account pages +- Cart and auth state stored in `localStorage` +- Hybrid API layer that can use real backend endpoints or fall back to mock data +- Responsive visual design meant for demos and presentations + +## Run locally +1. Install Node.js if it is not already available on your machine. +2. Open `C:\Users\bib\Documents\LEA2\WebShop_Fluxon\frontend` +3. Copy `.env.example` to `.env` +4. Run `npm install` +5. Run `npm run dev` + +## API mode +- Default is mock mode: `VITE_USE_MOCK_API=true` +- To use the backend, set `VITE_USE_MOCK_API=false` +- Backend base URL is controlled by `VITE_API_BASE_URL` + +## Important files +- `src/services/api.ts`: real API calls plus fallback behavior +- `src/services/mockApi.ts`: mock implementations used for demos +- `src/state/AuthContext.tsx`: login/register session state +- `src/state/CartContext.tsx`: cart state and totals +- `INTEGRATION_CHECKLIST.md`: quick contract checklist for backend coordination diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..8d60791 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,12 @@ + + + + + + Fluxon Shop + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..8001efe --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,1771 @@ +{ + "name": "fluxon-frontend", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "fluxon-frontend", + "version": "0.1.0", + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.30.1" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.7.2", + "vite": "^5.4.11" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.8", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001780", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.313", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.313.tgz", + "integrity": "sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..8145718 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,23 @@ +{ + "name": "fluxon-frontend", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.30.1" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.7.2", + "vite": "^5.4.11" + } +} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 0000000..b983a28 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,54 @@ +import { Navigate, Route, Routes } from "react-router-dom"; +import { Layout } from "./ui/Layout"; +import { HomePage } from "./pages/HomePage"; +import { ProductsPage } from "./pages/ProductsPage"; +import { ProductDetailsPage } from "./pages/ProductDetailsPage"; +import { CartPage } from "./pages/CartPage"; +import { LoginPage } from "./pages/LoginPage"; +import { RegisterPage } from "./pages/RegisterPage"; +import { CheckoutPage } from "./pages/CheckoutPage"; +import { OrderConfirmationPage } from "./pages/OrderConfirmationPage"; +import { AccountPage } from "./pages/AccountPage"; +import { NotFoundPage } from "./pages/NotFoundPage"; +import { RequireAuth } from "./ui/RequireAuth"; + +export default function App() { + return ( + + + } /> + } /> + } /> + } /> + } /> + } /> + + + + } + /> + + + + } + /> + + + + } + /> + } /> + } /> + + + ); +} diff --git a/frontend/src/config.ts b/frontend/src/config.ts new file mode 100644 index 0000000..ddfc55d --- /dev/null +++ b/frontend/src/config.ts @@ -0,0 +1,6 @@ +const env = import.meta.env; + +export const config = { + apiBaseUrl: env.VITE_API_BASE_URL ?? "http://localhost:5276", + useMockApi: env.VITE_USE_MOCK_API !== "false" +}; diff --git a/frontend/src/data/mockData.ts b/frontend/src/data/mockData.ts new file mode 100644 index 0000000..4e18b9e --- /dev/null +++ b/frontend/src/data/mockData.ts @@ -0,0 +1,110 @@ +import type { AuthUser, Category, Order, Product } from "../types"; + +export const mockCategories: Category[] = [ + { id: 1, name: "Tech Essentials" }, + { id: 2, name: "Studio Setup" }, + { id: 3, name: "Smart Living" }, + { id: 4, name: "Travel Picks" } +]; + +export const mockProducts: Product[] = [ + { + id: 1, + name: "Flux One Headphones", + description: + "Wireless over-ear headphones tuned for deep focus sessions, clear calls, and long battery life.", + price: 179.9, + stock: 14, + categoryId: 1, + image: "linear-gradient(135deg, #ff8a5b 0%, #ffd166 100%)", + featured: true + }, + { + id: 2, + name: "Nova Desk Lamp", + description: + "A sculptural LED lamp with warm-to-cool temperature control for late-night work and clean desk aesthetics.", + price: 69, + stock: 22, + categoryId: 2, + image: "linear-gradient(135deg, #0f4c81 0%, #9bd1e5 100%)", + featured: true + }, + { + id: 3, + name: "Orbit Speaker Mini", + description: + "Portable speaker with punchy sound, matte finish, and enough battery to last through weekend trips.", + price: 95.5, + stock: 8, + categoryId: 4, + image: "linear-gradient(135deg, #23395d 0%, #b6c9f0 100%)", + featured: true + }, + { + id: 4, + name: "Aero Bottle", + description: + "Insulated stainless steel bottle designed for city commutes, travel, and everyday carry.", + price: 32, + stock: 40, + categoryId: 4, + image: "linear-gradient(135deg, #2a6f97 0%, #61c0bf 100%)" + }, + { + id: 5, + name: "Canvas Keyboard", + description: + "Compact mechanical keyboard with low-profile switches and a clean, minimalist layout.", + price: 124, + stock: 16, + categoryId: 1, + image: "linear-gradient(135deg, #5f0f40 0%, #fb8b24 100%)" + }, + { + id: 6, + name: "Pulse Air Purifier", + description: + "Smart purifier with quiet mode, room-quality indicator, and app-ready control concept.", + price: 210, + stock: 11, + categoryId: 3, + image: "linear-gradient(135deg, #355070 0%, #b56576 100%)" + } +]; + +export const mockDemoUser: AuthUser = { + name: "Demo Customer", + email: "demo@fluxon.shop", + token: "mock-jwt-token" +}; + +export const mockOrders: Order[] = [ + { + id: "FX-2026-1001", + createdAt: "2026-03-16T10:30:00.000Z", + status: "Confirmed", + total: 248.9, + items: [ + { + productId: 1, + productName: "Flux One Headphones", + quantity: 1, + unitPrice: 179.9 + }, + { + productId: 4, + productName: "Aero Bottle", + quantity: 2, + unitPrice: 32 + } + ], + payment: { + method: "PayPal", + amount: 248.9, + status: "Paid" + }, + customerEmail: "demo@fluxon.shop", + shippingAddress: "18 Vision Street, Berlin" + } +]; diff --git a/frontend/src/hooks/useCatalog.ts b/frontend/src/hooks/useCatalog.ts new file mode 100644 index 0000000..e715ca5 --- /dev/null +++ b/frontend/src/hooks/useCatalog.ts @@ -0,0 +1,44 @@ +import { useEffect, useState } from "react"; +import { api } from "../services/api"; +import type { Category, Product } from "../types"; + +export function useCatalog() { + const [products, setProducts] = useState([]); + const [categories, setCategories] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + let active = true; + + async function load() { + try { + const [nextProducts, nextCategories] = await Promise.all([api.getProducts(), api.getCategories()]); + if (!active) { + return; + } + + setProducts(nextProducts); + setCategories(nextCategories); + } catch (loadError) { + if (!active) { + return; + } + + setError(loadError instanceof Error ? loadError.message : "Unable to load catalog"); + } finally { + if (active) { + setLoading(false); + } + } + } + + void load(); + + return () => { + active = false; + }; + }, []); + + return { products, categories, loading, error }; +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 0000000..f022e50 --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,19 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import { BrowserRouter } from "react-router-dom"; +import App from "./App"; +import { AuthProvider } from "./state/AuthContext"; +import { CartProvider } from "./state/CartContext"; +import "./styles.css"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + + + + + + + +); diff --git a/frontend/src/pages/AccountPage.tsx b/frontend/src/pages/AccountPage.tsx new file mode 100644 index 0000000..d17346f --- /dev/null +++ b/frontend/src/pages/AccountPage.tsx @@ -0,0 +1,93 @@ +import { useEffect, useState } from "react"; +import { api } from "../services/api"; +import { useAuth } from "../state/AuthContext"; +import type { Order } from "../types"; +import { StatusView } from "../ui/StatusView"; + +export function AccountPage() { + const { user } = useAuth(); + const [orders, setOrders] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + let active = true; + + async function loadOrders() { + try { + const nextOrders = await api.getOrders(); + if (active) { + setOrders(nextOrders); + } + } catch (loadError) { + if (active) { + setError(loadError instanceof Error ? loadError.message : "Unable to load orders"); + } + } finally { + if (active) { + setLoading(false); + } + } + } + + void loadOrders(); + + return () => { + active = false; + }; + }, []); + + if (loading) { + return ; + } + + if (error) { + return ; + } + + return ( +
+
+ Account +

{user?.name}

+

{user?.email}

+
+ +
+
+
+ Orders +

Recent order history

+
+
+ + {orders.length === 0 ? ( + + ) : ( +
+ {orders.map((order) => ( +
+
+ {order.id} +

{new Date(order.createdAt).toLocaleDateString()}

+
+
+ Status + {order.status} +
+
+ Payment + {order.payment.status} +
+
+ Total + EUR {order.total.toFixed(2)} +
+
+ ))} +
+ )} +
+
+ ); +} diff --git a/frontend/src/pages/CartPage.tsx b/frontend/src/pages/CartPage.tsx new file mode 100644 index 0000000..e751bc1 --- /dev/null +++ b/frontend/src/pages/CartPage.tsx @@ -0,0 +1,76 @@ +import { Link } from "react-router-dom"; +import { useCart } from "../state/CartContext"; +import { QuantityControl } from "../ui/QuantityControl"; +import { StatusView } from "../ui/StatusView"; + +export function CartPage() { + const { items, removeItem, updateQuantity, subtotal } = useCart(); + + if (items.length === 0) { + return ( + + Browse products + + } + /> + ); + } + + return ( +
+
+
+
+ Cart +

Review selected items

+
+
+ +
+ {items.map((item) => ( +
+
+
+

{item.product.name}

+

{item.product.description}

+
+ updateQuantity(item.product.id, quantity)} + /> + EUR {(item.unitPrice * item.quantity).toFixed(2)} + +
+ ))} +
+
+ + +
+ ); +} diff --git a/frontend/src/pages/CheckoutPage.tsx b/frontend/src/pages/CheckoutPage.tsx new file mode 100644 index 0000000..37b82e5 --- /dev/null +++ b/frontend/src/pages/CheckoutPage.tsx @@ -0,0 +1,132 @@ +import { FormEvent, useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { api } from "../services/api"; +import { useAuth } from "../state/AuthContext"; +import { useCart } from "../state/CartContext"; +import type { CheckoutForm } from "../types"; +import { StatusView } from "../ui/StatusView"; + +export function CheckoutPage() { + const { user } = useAuth(); + const { items, subtotal, clearCart } = useCart(); + const navigate = useNavigate(); + const [submitting, setSubmitting] = useState(false); + const [error, setError] = useState(null); + const [form, setForm] = useState({ + fullName: user?.name ?? "", + email: user?.email ?? "", + address: "", + city: "", + postalCode: "", + paymentMethod: "CreditCard" + }); + + if (items.length === 0) { + return ; + } + + async function handleSubmit(event: FormEvent) { + event.preventDefault(); + setSubmitting(true); + setError(null); + + try { + const order = await api.createOrder(form, items); + clearCart(); + navigate(`/order-confirmation/${order.id}`, { state: { order } }); + } catch (submitError) { + setError(submitError instanceof Error ? submitError.message : "Unable to create order"); + } finally { + setSubmitting(false); + } + } + + return ( +
+
+ Checkout +

Collect shipping and payment details

+
+ + + + + + +
+ {error ?

{error}

: null} + +
+ + +
+ ); +} diff --git a/frontend/src/pages/HomePage.tsx b/frontend/src/pages/HomePage.tsx new file mode 100644 index 0000000..0060604 --- /dev/null +++ b/frontend/src/pages/HomePage.tsx @@ -0,0 +1,91 @@ +import { Link } from "react-router-dom"; +import { useCatalog } from "../hooks/useCatalog"; +import { ProductCard } from "../ui/ProductCard"; +import { StatusView } from "../ui/StatusView"; +import { useCart } from "../state/CartContext"; + +export function HomePage() { + const { products, categories, loading, error } = useCatalog(); + const { addItem } = useCart(); + + if (loading) { + return ; + } + + if (error) { + return ; + } + + const featuredProducts = products.filter((product) => product.featured).slice(0, 3); + + return ( +
+
+
+ Fluxon storefront +

Build a demo-ready shop now, then swap in real APIs as the backend catches up.

+

+ This frontend is structured for hybrid delivery: polished enough for presentation, flexible enough for + incomplete endpoints. +

+
+ + Explore Products + + + Create Demo Account + +
+
+
+
+ {products.length} + Curated products +
+
+ {categories.length} + Shop categories +
+
+ Mock + API + Safe for evolving backend +
+
+
+ +
+
+
+ Categories +

Shape the browsing experience around the backend data model

+
+
+
+ {categories.map((category) => ( +
+

{category.name}

+

Use this category as a filter, navigation cue, and featured-content block.

+
+ ))} +
+
+ +
+
+
+ Featured +

Presentation-friendly products for your MVP demo flow

+
+ + View All + +
+
+ {featuredProducts.map((product) => ( + + ))} +
+
+
+ ); +} diff --git a/frontend/src/pages/LoginPage.tsx b/frontend/src/pages/LoginPage.tsx new file mode 100644 index 0000000..540979b --- /dev/null +++ b/frontend/src/pages/LoginPage.tsx @@ -0,0 +1,53 @@ +import { FormEvent, useState } from "react"; +import { Link, useLocation, useNavigate } from "react-router-dom"; +import { useAuth } from "../state/AuthContext"; + +export function LoginPage() { + const [email, setEmail] = useState("demo@fluxon.shop"); + const [password, setPassword] = useState("demo123"); + const [error, setError] = useState(null); + const [submitting, setSubmitting] = useState(false); + const { login } = useAuth(); + const navigate = useNavigate(); + const location = useLocation(); + + async function handleSubmit(event: FormEvent) { + event.preventDefault(); + setSubmitting(true); + setError(null); + + try { + await login({ email, password }); + navigate((location.state as { from?: string } | null)?.from ?? "/account"); + } catch (loginError) { + setError(loginError instanceof Error ? loginError.message : "Unable to login"); + } finally { + setSubmitting(false); + } + } + + return ( +
+
+ Login +

Sign in to continue checkout

+

Use the demo credentials or any email/password while mock auth is enabled.

+ + + {error ?

{error}

: null} + +

+ No account yet? Create one +

+
+
+ ); +} diff --git a/frontend/src/pages/NotFoundPage.tsx b/frontend/src/pages/NotFoundPage.tsx new file mode 100644 index 0000000..05b566a --- /dev/null +++ b/frontend/src/pages/NotFoundPage.tsx @@ -0,0 +1,16 @@ +import { Link } from "react-router-dom"; +import { StatusView } from "../ui/StatusView"; + +export function NotFoundPage() { + return ( + + Return home + + } + /> + ); +} diff --git a/frontend/src/pages/OrderConfirmationPage.tsx b/frontend/src/pages/OrderConfirmationPage.tsx new file mode 100644 index 0000000..16219d3 --- /dev/null +++ b/frontend/src/pages/OrderConfirmationPage.tsx @@ -0,0 +1,53 @@ +import { Link, useLocation, useParams } from "react-router-dom"; +import type { Order } from "../types"; +import { StatusView } from "../ui/StatusView"; + +export function OrderConfirmationPage() { + const { orderId } = useParams(); + const location = useLocation(); + const order = (location.state as { order?: Order } | null)?.order; + + if (!order) { + return ( + + View account + + } + /> + ); + } + + return ( +
+ Order confirmed +

{order.id}

+

Your order has been submitted successfully and the frontend flow is ready for demo use.

+
+ Status + {order.status} +
+
+ Payment + + {order.payment.method} / {order.payment.status} + +
+
+ Total + EUR {order.total.toFixed(2)} +
+
+ + Continue shopping + + + View account + +
+
+ ); +} diff --git a/frontend/src/pages/ProductDetailsPage.tsx b/frontend/src/pages/ProductDetailsPage.tsx new file mode 100644 index 0000000..dbd404c --- /dev/null +++ b/frontend/src/pages/ProductDetailsPage.tsx @@ -0,0 +1,97 @@ +import { useEffect, useState } from "react"; +import { Link, useParams } from "react-router-dom"; +import { api } from "../services/api"; +import type { Product } from "../types"; +import { StatusView } from "../ui/StatusView"; +import { QuantityControl } from "../ui/QuantityControl"; +import { useCart } from "../state/CartContext"; + +export function ProductDetailsPage() { + const { productId } = useParams(); + const { addItem } = useCart(); + const [product, setProduct] = useState(null); + const [quantity, setQuantity] = useState(1); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + let active = true; + + async function loadProduct() { + if (!productId) { + setError("Missing product id"); + setLoading(false); + return; + } + + try { + const nextProduct = await api.getProductById(Number(productId)); + if (active) { + setProduct(nextProduct); + } + } catch (loadError) { + if (active) { + setError(loadError instanceof Error ? loadError.message : "Unable to load product"); + } + } finally { + if (active) { + setLoading(false); + } + } + } + + void loadProduct(); + + return () => { + active = false; + }; + }, [productId]); + + if (loading) { + return ; + } + + if (error || !product) { + return ( + + Back to shop + + } + /> + ); + } + + return ( +
+
+
+ {product.category?.name ?? "Product details"} +

{product.name}

+

{product.description}

+
+
+ Price + EUR {product.price.toFixed(2)} +
+
+ Availability + {product.stock > 0 ? `${product.stock} ready to ship` : "Sold out"} +
+
+ +
+ + + Go to cart + +
+
+
+ ); +} diff --git a/frontend/src/pages/ProductsPage.tsx b/frontend/src/pages/ProductsPage.tsx new file mode 100644 index 0000000..e73d9a6 --- /dev/null +++ b/frontend/src/pages/ProductsPage.tsx @@ -0,0 +1,105 @@ +import { useMemo, useState } from "react"; +import { useCatalog } from "../hooks/useCatalog"; +import { ProductCard } from "../ui/ProductCard"; +import { CategoryPill } from "../ui/CategoryPill"; +import { StatusView } from "../ui/StatusView"; +import { useCart } from "../state/CartContext"; + +export function ProductsPage() { + const { products, categories, loading, error } = useCatalog(); + const { addItem } = useCart(); + const [query, setQuery] = useState(""); + const [categoryId, setCategoryId] = useState("all"); + const [sort, setSort] = useState("featured"); + + const filteredProducts = useMemo(() => { + let next = [...products]; + + if (categoryId !== "all") { + next = next.filter((product) => product.categoryId === categoryId); + } + + if (query.trim()) { + const lowered = query.toLowerCase(); + next = next.filter( + (product) => + product.name.toLowerCase().includes(lowered) || product.description.toLowerCase().includes(lowered) + ); + } + + switch (sort) { + case "price-asc": + next.sort((a, b) => a.price - b.price); + break; + case "price-desc": + next.sort((a, b) => b.price - a.price); + break; + case "stock": + next.sort((a, b) => b.stock - a.stock); + break; + default: + next.sort((a, b) => Number(b.featured) - Number(a.featured)); + break; + } + + return next; + }, [categoryId, products, query, sort]); + + if (loading) { + return ; + } + + if (error) { + return ; + } + + return ( +
+
+
+
+ Shop +

Browse, filter, and sort products

+
+
+ +
+ setQuery(event.target.value)} + className="search-input" + placeholder="Search products" + /> + +
+ +
+ setCategoryId("all")} /> + {categories.map((category) => ( + setCategoryId(category.id)} + /> + ))} +
+
+ + {filteredProducts.length === 0 ? ( + + ) : ( +
+ {filteredProducts.map((product) => ( + + ))} +
+ )} +
+ ); +} diff --git a/frontend/src/pages/RegisterPage.tsx b/frontend/src/pages/RegisterPage.tsx new file mode 100644 index 0000000..cbb476d --- /dev/null +++ b/frontend/src/pages/RegisterPage.tsx @@ -0,0 +1,57 @@ +import { FormEvent, useState } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import { useAuth } from "../state/AuthContext"; + +export function RegisterPage() { + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [password, setPassword] = useState(""); + const [error, setError] = useState(null); + const [submitting, setSubmitting] = useState(false); + const { register } = useAuth(); + const navigate = useNavigate(); + + async function handleSubmit(event: FormEvent) { + event.preventDefault(); + setSubmitting(true); + setError(null); + + try { + await register({ name, email, password }); + navigate("/account"); + } catch (registerError) { + setError(registerError instanceof Error ? registerError.message : "Unable to register"); + } finally { + setSubmitting(false); + } + } + + return ( +
+
+ Register +

Create a customer account

+

This screen already matches the backend registration DTO and can run on mock or real auth.

+ + + + {error ?

{error}

: null} + +

+ Already registered? Login +

+
+
+ ); +} diff --git a/frontend/src/services/api.ts b/frontend/src/services/api.ts new file mode 100644 index 0000000..450624e --- /dev/null +++ b/frontend/src/services/api.ts @@ -0,0 +1,109 @@ +import { config } from "../config"; +import { mockApi } from "./mockApi"; +import type { + AuthUser, + Category, + CheckoutForm, + LoginInput, + Order, + Product, + RegisterInput +} from "../types"; + +async function request(path: string, init?: RequestInit): Promise { + const response = await fetch(`${config.apiBaseUrl}${path}`, { + headers: { + "Content-Type": "application/json", + ...(init?.headers ?? {}) + }, + ...init + }); + + if (!response.ok) { + throw new Error(`Request failed with status ${response.status}`); + } + + return (await response.json()) as T; +} + +async function withFallback(primary: () => Promise, fallback: () => Promise): Promise { + if (config.useMockApi) { + return fallback(); + } + + try { + return await primary(); + } catch { + return fallback(); + } +} + +export const api = { + getProducts(): Promise { + return withFallback( + () => request("/api/product"), + () => mockApi.getProducts() + ); + }, + + getProductById(productId: number): Promise { + return withFallback( + () => request(`/api/product/${productId}`), + () => mockApi.getProductById(productId) + ); + }, + + getCategories(): Promise { + return withFallback( + () => request("/api/category"), + () => mockApi.getCategories() + ); + }, + + login(input: LoginInput): Promise { + return withFallback( + () => + request("/api/auth/login", { + method: "POST", + body: JSON.stringify(input) + }), + () => mockApi.login(input) + ); + }, + + register(input: RegisterInput): Promise { + return withFallback( + () => + request("/api/auth/register", { + method: "POST", + body: JSON.stringify(input) + }), + () => mockApi.register(input) + ); + }, + + getOrders(): Promise { + return withFallback( + () => request("/api/order"), + () => mockApi.getOrders() + ); + }, + + createOrder(input: CheckoutForm, cart: { product: Product; quantity: number; unitPrice: number }[]): Promise { + return withFallback( + () => + request("/api/order", { + method: "POST", + body: JSON.stringify({ + ...input, + items: cart.map((item) => ({ + productId: item.product.id, + quantity: item.quantity, + unitPrice: item.unitPrice + })) + }) + }), + () => mockApi.createOrder(input, cart) + ); + } +}; diff --git a/frontend/src/services/mockApi.ts b/frontend/src/services/mockApi.ts new file mode 100644 index 0000000..8e55507 --- /dev/null +++ b/frontend/src/services/mockApi.ts @@ -0,0 +1,99 @@ +import { mockCategories, mockDemoUser, mockOrders, mockProducts } from "../data/mockData"; +import type { + AuthUser, + CheckoutForm, + LoginInput, + Order, + Product, + RegisterInput +} from "../types"; + +const wait = (ms = 300) => new Promise((resolve) => setTimeout(resolve, ms)); + +let orderStore = [...mockOrders]; + +export const mockApi = { + async getProducts(): Promise { + await wait(); + return mockProducts.map((product) => ({ + ...product, + category: mockCategories.find((category) => category.id === product.categoryId) + })); + }, + + async getProductById(productId: number): Promise { + await wait(); + const product = mockProducts.find((item) => item.id === productId); + if (!product) { + throw new Error("Product not found"); + } + + return { + ...product, + category: mockCategories.find((category) => category.id === product.categoryId) + }; + }, + + async getCategories() { + await wait(); + return mockCategories; + }, + + async login(input: LoginInput): Promise { + await wait(); + if (!input.email || !input.password) { + throw new Error("Email and password are required"); + } + + return { + ...mockDemoUser, + email: input.email + }; + }, + + async register(input: RegisterInput): Promise { + await wait(); + if (!input.name || !input.email || !input.password) { + throw new Error("All fields are required"); + } + + return { + name: input.name, + email: input.email, + token: "mock-registered-token" + }; + }, + + async getOrders(): Promise { + await wait(); + return orderStore; + }, + + async createOrder(input: CheckoutForm, cart: { product: Product; quantity: number; unitPrice: number }[]): Promise { + await wait(); + + const total = cart.reduce((sum, item) => sum + item.unitPrice * item.quantity, 0); + const order: Order = { + id: `FX-2026-${1000 + orderStore.length + 1}`, + createdAt: new Date().toISOString(), + status: "Confirmed", + total, + items: cart.map((item) => ({ + productId: item.product.id, + productName: item.product.name, + quantity: item.quantity, + unitPrice: item.unitPrice + })), + payment: { + method: input.paymentMethod, + amount: total, + status: "Paid" + }, + customerEmail: input.email, + shippingAddress: `${input.address}, ${input.city}, ${input.postalCode}` + }; + + orderStore = [order, ...orderStore]; + return order; + } +}; diff --git a/frontend/src/state/AuthContext.tsx b/frontend/src/state/AuthContext.tsx new file mode 100644 index 0000000..7ee4501 --- /dev/null +++ b/frontend/src/state/AuthContext.tsx @@ -0,0 +1,53 @@ +import type { ReactNode } from "react"; +import { createContext, useContext, useEffect, useState } from "react"; +import { api } from "../services/api"; +import type { AuthUser, LoginInput, RegisterInput } from "../types"; + +type AuthContextValue = { + user: AuthUser | null; + login: (input: LoginInput) => Promise; + register: (input: RegisterInput) => Promise; + logout: () => void; +}; + +const AuthContext = createContext(undefined); +const storageKey = "fluxon.auth"; + +export function AuthProvider({ children }: { children: ReactNode }) { + const [user, setUser] = useState(null); + + useEffect(() => { + const saved = window.localStorage.getItem(storageKey); + if (saved) { + setUser(JSON.parse(saved) as AuthUser); + } + }, []); + + async function login(input: LoginInput) { + const nextUser = await api.login(input); + setUser(nextUser); + window.localStorage.setItem(storageKey, JSON.stringify(nextUser)); + } + + async function register(input: RegisterInput) { + const nextUser = await api.register(input); + setUser(nextUser); + window.localStorage.setItem(storageKey, JSON.stringify(nextUser)); + } + + function logout() { + setUser(null); + window.localStorage.removeItem(storageKey); + } + + return {children}; +} + +export function useAuth() { + const context = useContext(AuthContext); + if (!context) { + throw new Error("useAuth must be used inside AuthProvider"); + } + + return context; +} diff --git a/frontend/src/state/CartContext.tsx b/frontend/src/state/CartContext.tsx new file mode 100644 index 0000000..6aec2e8 --- /dev/null +++ b/frontend/src/state/CartContext.tsx @@ -0,0 +1,88 @@ +import type { ReactNode } from "react"; +import { createContext, useContext, useEffect, useMemo, useState } from "react"; +import type { CartItem, Product } from "../types"; + +type CartContextValue = { + items: CartItem[]; + addItem: (product: Product, quantity?: number) => void; + removeItem: (productId: number) => void; + updateQuantity: (productId: number, quantity: number) => void; + clearCart: () => void; + itemCount: number; + subtotal: number; +}; + +const CartContext = createContext(undefined); +const storageKey = "fluxon.cart"; + +export function CartProvider({ children }: { children: ReactNode }) { + const [items, setItems] = useState([]); + + useEffect(() => { + const saved = window.localStorage.getItem(storageKey); + if (saved) { + setItems(JSON.parse(saved) as CartItem[]); + } + }, []); + + useEffect(() => { + window.localStorage.setItem(storageKey, JSON.stringify(items)); + }, [items]); + + function addItem(product: Product, quantity = 1) { + setItems((current) => { + const existing = current.find((item) => item.product.id === product.id); + if (existing) { + return current.map((item) => + item.product.id === product.id + ? { ...item, quantity: Math.min(item.quantity + quantity, product.stock) } + : item + ); + } + + return [...current, { product, quantity: Math.min(quantity, product.stock), unitPrice: product.price }]; + }); + } + + function removeItem(productId: number) { + setItems((current) => current.filter((item) => item.product.id !== productId)); + } + + function updateQuantity(productId: number, quantity: number) { + setItems((current) => + current.map((item) => + item.product.id === productId + ? { ...item, quantity: Math.max(1, Math.min(quantity, item.product.stock)) } + : item + ) + ); + } + + function clearCart() { + setItems([]); + } + + const value = useMemo( + () => ({ + items, + addItem, + removeItem, + updateQuantity, + clearCart, + itemCount: items.reduce((sum, item) => sum + item.quantity, 0), + subtotal: items.reduce((sum, item) => sum + item.unitPrice * item.quantity, 0) + }), + [items] + ); + + return {children}; +} + +export function useCart() { + const context = useContext(CartContext); + if (!context) { + throw new Error("useCart must be used inside CartProvider"); + } + + return context; +} diff --git a/frontend/src/styles.css b/frontend/src/styles.css new file mode 100644 index 0000000..506bd19 --- /dev/null +++ b/frontend/src/styles.css @@ -0,0 +1,587 @@ +:root { + font-family: "Trebuchet MS", "Segoe UI", sans-serif; + color: #132238; + background: + radial-gradient(circle at top left, rgba(255, 186, 117, 0.45), transparent 28%), + radial-gradient(circle at top right, rgba(81, 169, 187, 0.28), transparent 24%), + linear-gradient(180deg, #fef6ee 0%, #f7fbfc 52%, #eef4f7 100%); + line-height: 1.5; + font-weight: 400; + color-scheme: light; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + --surface: rgba(255, 255, 255, 0.82); + --surface-strong: rgba(255, 255, 255, 0.94); + --border: rgba(19, 34, 56, 0.1); + --accent: #ff7a45; + --accent-deep: #db5b25; + --ink-soft: #5b6f84; + --shadow: 0 16px 50px rgba(35, 57, 93, 0.12); + --radius-lg: 28px; + --radius-md: 18px; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + min-width: 320px; + min-height: 100vh; +} + +a { + color: inherit; + text-decoration: none; +} + +button, +input, +select { + font: inherit; +} + +button, +.cta-button, +.ghost-button { + border: 0; + border-radius: 999px; + padding: 0.9rem 1.3rem; + cursor: pointer; + transition: transform 180ms ease, box-shadow 180ms ease, background 180ms ease; +} + +button:hover, +.cta-button:hover, +.ghost-button:hover { + transform: translateY(-1px); +} + +button, +.cta-button { + color: white; + background: linear-gradient(135deg, var(--accent) 0%, var(--accent-deep) 100%); + box-shadow: 0 12px 30px rgba(219, 91, 37, 0.24); +} + +.ghost-button, +.nav-action { + background: rgba(255, 255, 255, 0.65); + color: #132238; + border: 1px solid var(--border); +} + +.nav-action { + padding: 0.65rem 1rem; +} + +button:disabled { + opacity: 0.6; + cursor: not-allowed; + transform: none; +} + +input, +select { + width: 100%; + padding: 0.95rem 1rem; + border-radius: 14px; + border: 1px solid rgba(19, 34, 56, 0.12); + background: rgba(255, 255, 255, 0.85); +} + +label { + display: grid; + gap: 0.45rem; + font-weight: 600; + color: #20364f; +} + +#root { + min-height: 100vh; +} + +.app-shell { + width: min(1180px, calc(100vw - 32px)); + margin: 0 auto; + padding: 24px 0 48px; +} + +.site-header, +.site-footer, +.panel, +.hero-panel, +.product-card, +.category-card, +.order-card, +.status-view { + backdrop-filter: blur(18px); +} + +.site-header { + position: sticky; + top: 16px; + z-index: 10; + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-bottom: 28px; + padding: 1rem 1.25rem; + border: 1px solid var(--border); + border-radius: 999px; + background: rgba(255, 255, 255, 0.68); + box-shadow: var(--shadow); +} + +.brand-mark { + display: inline-flex; + align-items: center; + gap: 0.85rem; + font-weight: 800; + letter-spacing: 0.02em; +} + +.brand-mark small { + display: block; + font-size: 0.72rem; + color: var(--ink-soft); + font-weight: 600; +} + +.brand-badge { + display: grid; + place-items: center; + width: 44px; + height: 44px; + border-radius: 14px; + color: white; + background: linear-gradient(135deg, #132238 0%, #2a6f97 100%); +} + +.main-nav { + display: flex; + align-items: center; + gap: 0.75rem; +} + +.main-nav a { + padding: 0.65rem 1rem; + border-radius: 999px; + color: var(--ink-soft); + font-weight: 700; +} + +.main-nav a.active, +.main-nav a:hover { + color: #132238; + background: rgba(255, 255, 255, 0.74); +} + +.cart-link span { + display: inline-grid; + place-items: center; + min-width: 24px; + height: 24px; + margin-left: 0.4rem; + border-radius: 999px; + background: #132238; + color: white; + font-size: 0.8rem; +} + +.menu-toggle { + display: none; +} + +.page-stack { + display: grid; + gap: 24px; +} + +.hero-panel, +.panel, +.status-view { + border: 1px solid var(--border); + border-radius: var(--radius-lg); + background: var(--surface); + box-shadow: var(--shadow); +} + +.hero-panel { + display: grid; + grid-template-columns: 1.4fr 1fr; + gap: 24px; + padding: 34px; +} + +.hero-copy h1, +.panel h1, +.panel h2, +.status-view h2 { + margin: 0; + line-height: 1.05; + letter-spacing: -0.03em; +} + +.hero-copy h1 { + font-size: clamp(2.3rem, 4vw, 4.6rem); +} + +.hero-copy p, +.panel p, +.status-view p { + color: var(--ink-soft); +} + +.hero-card-grid, +.category-grid, +.product-grid, +.footer-grid, +.order-list { + display: grid; + gap: 18px; +} + +.hero-card-grid { + grid-template-columns: repeat(2, 1fr); +} + +.hero-stat, +.category-card, +.order-card { + padding: 1.1rem; + border-radius: var(--radius-md); + border: 1px solid var(--border); + background: var(--surface-strong); +} + +.hero-stat strong { + display: block; + font-size: 1.5rem; +} + +.hero-stat.accent { + grid-column: 1 / -1; + background: linear-gradient(135deg, rgba(255, 122, 69, 0.18) 0%, rgba(19, 34, 56, 0.08) 100%); +} + +.eyebrow { + display: inline-block; + margin-bottom: 0.55rem; + color: var(--accent-deep); + font-size: 0.82rem; + font-weight: 800; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.section-heading, +.toolbar, +.summary-row, +.product-actions, +.meta-row, +.inline-actions, +.detail-meta { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; +} + +.panel { + padding: 28px; +} + +.panel.compact { + padding: 22px 28px; +} + +.category-grid { + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); +} + +.category-card h3, +.product-card h3 { + margin: 0 0 0.35rem; +} + +.product-grid { + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); +} + +.product-card { + display: grid; + gap: 0; + overflow: hidden; + border: 1px solid var(--border); + border-radius: 26px; + background: var(--surface-strong); + box-shadow: var(--shadow); +} + +.product-visual, +.detail-visual, +.cart-visual { + min-height: 220px; +} + +.product-copy { + display: grid; + gap: 0.8rem; + padding: 20px; +} + +.chip, +.stock, +.category-pill { + display: inline-flex; + align-items: center; + justify-content: center; + padding: 0.45rem 0.8rem; + border-radius: 999px; + font-size: 0.82rem; + font-weight: 700; +} + +.chip, +.category-pill { + background: rgba(255, 122, 69, 0.12); + color: var(--accent-deep); +} + +.stock.available { + background: rgba(97, 192, 191, 0.15); + color: #17655d; +} + +.stock.sold-out { + background: rgba(170, 31, 57, 0.12); + color: #8b1e33; +} + +.toolbar { + flex-wrap: wrap; +} + +.search-input { + flex: 1 1 320px; +} + +.select-input { + width: min(240px, 100%); +} + +.pill-row { + display: flex; + flex-wrap: wrap; + gap: 0.75rem; + margin-top: 1rem; +} + +.category-pill { + border: 1px solid transparent; +} + +.category-pill.active { + background: #132238; + color: white; +} + +.product-detail-layout, +.checkout-layout { + display: grid; + grid-template-columns: 1.1fr 0.9fr; + gap: 24px; +} + +.detail-visual { + border-radius: var(--radius-lg); + min-height: 520px; + box-shadow: var(--shadow); +} + +.lead { + font-size: 1.08rem; +} + +.quantity-control { + display: inline-flex; + align-items: center; + gap: 0.75rem; + padding: 0.35rem; + border-radius: 999px; + background: rgba(19, 34, 56, 0.06); +} + +.quantity-control button { + min-width: 42px; + box-shadow: none; +} + +.cart-list, +.form-grid { + display: grid; + gap: 16px; +} + +.cart-row { + display: grid; + grid-template-columns: 120px 1.4fr auto auto auto; + align-items: center; + gap: 16px; + padding: 1rem 0; + border-bottom: 1px solid rgba(19, 34, 56, 0.08); +} + +.cart-visual { + min-height: 88px; + border-radius: 20px; +} + +.cart-copy h3, +.confirmation-card h1 { + margin: 0; +} + +.order-summary { + align-self: start; + position: sticky; + top: 112px; +} + +.summary-row.total { + margin-top: 0.75rem; + padding-top: 0.75rem; + border-top: 1px solid rgba(19, 34, 56, 0.08); +} + +.auth-shell { + display: grid; + place-items: center; + min-height: 70vh; +} + +.auth-card { + width: min(520px, 100%); + display: grid; + gap: 1rem; +} + +.error-text { + color: #aa1f39; + font-weight: 700; +} + +.muted { + margin: 0; + color: var(--ink-soft); +} + +.confirmation-card, +.status-view { + max-width: 720px; +} + +.status-view { + display: grid; + gap: 1rem; + padding: 36px; +} + +.text-button { + background: transparent; + color: #8b1e33; + box-shadow: none; + padding-inline: 0; +} + +.site-footer { + display: flex; + justify-content: space-between; + gap: 2rem; + margin-top: 34px; + padding: 24px 28px; + border: 1px solid var(--border); + border-radius: var(--radius-lg); + background: rgba(255, 255, 255, 0.6); +} + +.footer-grid { + grid-template-columns: repeat(3, auto); + align-content: center; +} + +@media (max-width: 900px) { + .hero-panel, + .product-detail-layout, + .checkout-layout, + .site-footer { + grid-template-columns: 1fr; + } + + .cart-row { + grid-template-columns: 1fr; + justify-items: start; + } + + .order-summary { + position: static; + } + + .site-header { + border-radius: 28px; + align-items: flex-start; + flex-wrap: wrap; + } + + .menu-toggle { + display: inline-flex; + } + + .main-nav { + display: none; + width: 100%; + flex-direction: column; + align-items: stretch; + } + + .main-nav.open { + display: flex; + } +} + +@media (max-width: 640px) { + .app-shell { + width: min(100vw - 20px, 1180px); + padding-top: 14px; + } + + .hero-panel, + .panel, + .status-view { + padding: 22px; + } + + .hero-card-grid { + grid-template-columns: 1fr; + } + + .section-heading, + .toolbar, + .product-actions, + .meta-row, + .inline-actions, + .detail-meta, + .site-footer { + flex-direction: column; + align-items: flex-start; + } + + .footer-grid { + grid-template-columns: 1fr; + } +} diff --git a/frontend/src/types.ts b/frontend/src/types.ts new file mode 100644 index 0000000..76bf902 --- /dev/null +++ b/frontend/src/types.ts @@ -0,0 +1,72 @@ +export type Category = { + id: number; + name: string; +}; + +export type Product = { + id: number; + name: string; + description: string; + price: number; + stock: number; + categoryId: number; + category?: Category; + image: string; + featured?: boolean; +}; + +export type CartItem = { + product: Product; + quantity: number; + unitPrice: number; +}; + +export type LoginInput = { + email: string; + password: string; +}; + +export type RegisterInput = { + name: string; + email: string; + password: string; +}; + +export type AuthUser = { + name: string; + email: string; + token: string; +}; + +export type CheckoutForm = { + fullName: string; + email: string; + address: string; + city: string; + postalCode: string; + paymentMethod: "CreditCard" | "PayPal" | "CashOnDelivery"; +}; + +export type OrderItem = { + productId: number; + productName: string; + quantity: number; + unitPrice: number; +}; + +export type Payment = { + method: string; + amount: number; + status: string; +}; + +export type Order = { + id: string; + createdAt: string; + status: string; + total: number; + items: OrderItem[]; + payment: Payment; + customerEmail: string; + shippingAddress: string; +}; diff --git a/frontend/src/ui/CategoryPill.tsx b/frontend/src/ui/CategoryPill.tsx new file mode 100644 index 0000000..956b7aa --- /dev/null +++ b/frontend/src/ui/CategoryPill.tsx @@ -0,0 +1,15 @@ +import type { Category } from "../types"; + +type CategoryPillProps = { + category: Category | { id: number; name: string }; + active: boolean; + onClick: () => void; +}; + +export function CategoryPill({ category, active, onClick }: CategoryPillProps) { + return ( + + ); +} diff --git a/frontend/src/ui/Layout.tsx b/frontend/src/ui/Layout.tsx new file mode 100644 index 0000000..477d1a1 --- /dev/null +++ b/frontend/src/ui/Layout.tsx @@ -0,0 +1,67 @@ +import type { ReactNode } from "react"; +import { useState } from "react"; +import { Link, NavLink } from "react-router-dom"; +import { useCart } from "../state/CartContext"; +import { useAuth } from "../state/AuthContext"; + +export function Layout({ children }: { children: ReactNode }) { + const [menuOpen, setMenuOpen] = useState(false); + const { itemCount } = useCart(); + const { user, logout } = useAuth(); + + return ( +
+
+ + F + + Fluxon + Visual commerce demo + + + + + + +
+ +
{children}
+ +
+
+ Fluxon +

Frontend demo built to stay presentable even while the API is still evolving.

+
+
+ Hybrid API mode + Responsive storefront + Checkout-ready flow +
+
+
+ ); +} diff --git a/frontend/src/ui/ProductCard.tsx b/frontend/src/ui/ProductCard.tsx new file mode 100644 index 0000000..8cbdca4 --- /dev/null +++ b/frontend/src/ui/ProductCard.tsx @@ -0,0 +1,36 @@ +import { Link } from "react-router-dom"; +import type { Product } from "../types"; + +type ProductCardProps = { + product: Product; + onAdd: (product: Product) => void; +}; + +export function ProductCard({ product, onAdd }: ProductCardProps) { + return ( +
+
+
+
+ {product.category?.name ?? "Category"} + 0 ? "stock available" : "stock sold-out"}> + {product.stock > 0 ? `${product.stock} in stock` : "Sold out"} + +
+

{product.name}

+

{product.description}

+
+ EUR {product.price.toFixed(2)} +
+ + Details + + +
+
+
+
+ ); +} diff --git a/frontend/src/ui/QuantityControl.tsx b/frontend/src/ui/QuantityControl.tsx new file mode 100644 index 0000000..352e45a --- /dev/null +++ b/frontend/src/ui/QuantityControl.tsx @@ -0,0 +1,23 @@ +type QuantityControlProps = { + value: number; + min?: number; + max?: number; + onChange: (value: number) => void; +}; + +export function QuantityControl({ value, min = 1, max = 99, onChange }: QuantityControlProps) { + const nextDown = Math.max(min, value - 1); + const nextUp = Math.min(max, value + 1); + + return ( +
+ + {value} + +
+ ); +} diff --git a/frontend/src/ui/RequireAuth.tsx b/frontend/src/ui/RequireAuth.tsx new file mode 100644 index 0000000..3781b31 --- /dev/null +++ b/frontend/src/ui/RequireAuth.tsx @@ -0,0 +1,14 @@ +import type { ReactNode } from "react"; +import { Navigate, useLocation } from "react-router-dom"; +import { useAuth } from "../state/AuthContext"; + +export function RequireAuth({ children }: { children: ReactNode }) { + const { user } = useAuth(); + const location = useLocation(); + + if (!user) { + return ; + } + + return <>{children}; +} diff --git a/frontend/src/ui/StatusView.tsx b/frontend/src/ui/StatusView.tsx new file mode 100644 index 0000000..e087457 --- /dev/null +++ b/frontend/src/ui/StatusView.tsx @@ -0,0 +1,19 @@ +import type { ReactNode } from "react"; + +export function StatusView({ + title, + message, + action +}: { + title: string; + message: string; + action?: ReactNode; +}) { + return ( +
+

{title}

+

{message}

+ {action} +
+ ); +} diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000..cddfda2 --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "exclude": ["src/**/*.test.ts", "src/**/*.test.tsx"] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..426eda2 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,6 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" } + ] +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..5072d0b --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()], + server: { + port: 5173 + } +});