diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.csproj b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.csproj
index 2231cba0..017c195d 100644
--- a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.csproj
+++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI.csproj
@@ -9,6 +9,16 @@
+
+
+
+
+
+
+
+
+ PreserveNewest
+
diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/Program.cs b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/Program.cs
index 8dfc98c8..19799648 100644
--- a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/Program.cs
+++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/Program.cs
@@ -1,12 +1,31 @@
using EnvelopeGenerator.WebUI.Components;
+using DevExpress.Blazor;
var builder = WebApplication.CreateBuilder(args);
+// Load YARP configuration
+builder.Configuration.AddJsonFile("yarp.json", optional: false, reloadOnChange: true);
+
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents()
.AddInteractiveWebAssemblyComponents();
+// YARP Reverse Proxy
+builder.Services.AddReverseProxy()
+ .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
+
+// DevExpress Server-Side Services (CRITICAL for DxPdfViewer)
+builder.Services.AddDevExpressBlazor(configure => configure.BootstrapVersion = BootstrapVersion.v5);
+builder.Services.AddDevExpressServerSideBlazorPdfViewer();
+// builder.Services.AddDevExpressBlazorReportViewer(); // Will be enabled after Options migration
+
+// Configuration Options (will be enabled in Phase 5 after Options migration)
+// builder.Services.Configure(
+// builder.Configuration.GetSection("ApiOptions"));
+// builder.Services.Configure(
+// builder.Configuration.GetSection("PdfViewerOptions"));
+
var app = builder.Build();
// Configure the HTTP request pipeline.
@@ -26,9 +45,13 @@ app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();
+// Blazor routing (BEFORE YARP - important order!)
app.MapRazorComponents()
.AddInteractiveServerRenderMode()
.AddInteractiveWebAssemblyRenderMode()
.AddAdditionalAssemblies(typeof(EnvelopeGenerator.WebUI.Client._Imports).Assembly);
+// YARP proxy (AFTER Blazor - catch-all for /api/*)
+app.MapReverseProxy();
+
app.Run();
diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/appsettings.json b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/appsettings.json
index 10f68b8c..46430479 100644
--- a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/appsettings.json
+++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/appsettings.json
@@ -5,5 +5,14 @@
"Microsoft.AspNetCore": "Warning"
}
},
- "AllowedHosts": "*"
+ "AllowedHosts": "*",
+ "ApiOptions": {
+ "BaseUrl": ""
+ },
+ "PdfViewerOptions": {
+ "ThumbnailBaseScale": 0.75,
+ "ThumbnailEnableHiDPI": true,
+ "MainCanvasEnableHiDPI": true,
+ "ZoomStepPercentage": 5
+ }
}
diff --git a/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/yarp.json b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/yarp.json
new file mode 100644
index 00000000..63b6fb2e
--- /dev/null
+++ b/EnvelopeGenerator.WebUI/EnvelopeGenerator.WebUI/yarp.json
@@ -0,0 +1,39 @@
+{
+ "ReverseProxy": {
+ "Routes": {
+ "api-route": {
+ "ClusterId": "api-cluster",
+ "Match": {
+ "Path": "/api/{**catch-all}"
+ }
+ },
+ "swagger-route": {
+ "ClusterId": "api-cluster",
+ "Match": {
+ "Path": "/swagger/{**catch-all}"
+ }
+ },
+ "openapi-route": {
+ "ClusterId": "api-cluster",
+ "Match": {
+ "Path": "/openapi/{**catch-all}"
+ }
+ },
+ "scalar-route": {
+ "ClusterId": "api-cluster",
+ "Match": {
+ "Path": "/scalar/{**catch-all}"
+ }
+ }
+ },
+ "Clusters": {
+ "api-cluster": {
+ "Destinations": {
+ "api-destination": {
+ "Address": "https://localhost:8088"
+ }
+ }
+ }
+ }
+ }
+}