11 Commits

Author SHA1 Message Date
saidamirkattan 3bd8076bf5 Rebuild Tailwind CSS after class changes 2026-08-09 23:23:20 +03:00
saidamirkattan b8a0d4afe9 Force data-theme=test to ensure orange primary is applied site-wide 2026-08-09 19:31:10 +03:00
saidamirkattan d30d3d31f0 Change DaisyUI primary color from cyan to orange (matching accent and navbar) 2026-08-09 18:42:10 +03:00
saidamirkattan 5e83d6fa30 Add site-wide dark gradient background (TEST) - keep original card/text colors 2026-08-09 18:32:59 +03:00
saidamirkattan 7a1248bf19 Add professional gold gear loading screen with animated brand loader 2026-08-09 18:22:48 +03:00
saidamirkattan 76049afe29 Fix RTL: properly extract culture code from cookie format 'c=ar|uic=ar' 2026-08-08 18:10:11 +03:00
saidamirkattan 728187d049 Add RTL support: set dir attribute based on language (ar, he, fa, ur are RTL) 2026-08-08 18:07:35 +03:00
saidamirkattan aef74182ff Update launchSettings with boolean launchBrowser, add LayoutLib namespace for MainLayout, fix app initialization 2026-08-08 18:04:53 +03:00
saidamirkattan 06972a5764 Fix: Use base address for localization, enable AuthModule services
- Changed Localization URL from localhost:2004 to HostEnvironment.BaseAddress
- Uncommented AuthModuleServices() to register AuthenticationStateProvider
- Added using directives for Auth.Module namespace
2026-08-07 02:47:18 +03:00
saidamirkattan 34c361e7df Add Dockerfile and nginx config 2026-08-07 02:42:25 +03:00
saidamirkattan f9288ec245 Update: Add gitignore and update paths after restructure 2026-08-07 02:41:24 +03:00
29 changed files with 5888 additions and 10262 deletions
+7
View File
@@ -0,0 +1,7 @@
bin/
obj/
node_modules/
wwwroot/lib/
*.user
*.suo
*.swp
+8 -6
View File
@@ -1,9 +1,11 @@
@using LayoutLib
@if (_isLoaded)
{
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(Program).Assembly" AdditionalAssemblies="new[] {
typeof(ECommerceModule.Components.Pages.Shop.Shop).Assembly
}">
<Router AppAssembly="@typeof(Program).Assembly" AdditionalAssemblies="new[] {
typeof(ECommerce.Module.Components.Pages.Shop.Shop).Assembly
}">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
@@ -16,7 +18,7 @@
</Found>
<NotFound>
<LayoutView Layout="@typeof(MainLayout)">
<p>Sorry, there's nothing at this address.</p>
<div class="p-4 text-white">404 - Page not found at @DateTime.Now</div>
</LayoutView>
</NotFound>
</Router>
@@ -24,8 +26,8 @@
}
else
{
<div>Loading translations...</div>
}
<div class="text-white">Loading translations... @DateTime.Now</div>
}
@code {
private bool _isLoaded;
+22 -23
View File
@@ -1,26 +1,25 @@
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using UI
@using UI.Components
@using Layout
@using System.Net.Http.Headers
@using ECommerceModule.Components
@using System.Text
@using System;
@using System.Collections.Generic;
@using System.Linq;
@using System.Security.Claims;
@using System.Threading.Tasks;
@using System.Globalization;
@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using UI
@using UI.Components
@using Layout
@using System.Net.Http.Headers
@using System.Text
@using System;
@using System.Collections.Generic;
@using System.Linq;
@using System.Security.Claims;
@using System.Threading.Tasks;
@using System.Globalization;
@using System.Text.Json;
+3 -3
View File
@@ -12,9 +12,9 @@ namespace UI.Config.PostBuild
{
public static async Task LoadTranslations(this IServiceProvider services)
{
var authLocalizer = services.GetRequiredService<IStringLocalizer<Auth.RCL.SharedRes>>();
var layoutLocalizer = services.GetRequiredService<IStringLocalizer<LayoutLib.RCL.SharedRes>>();
var ecommerceLocalizer = services.GetRequiredService<IStringLocalizer<ECommerce.RCL.SharedRes>>();
var authLocalizer = services.GetRequiredService<IStringLocalizer<Auth.Module.SharedRes>>();
var layoutLocalizer = services.GetRequiredService<IStringLocalizer<LayoutLib.Layout.SharedRes>>();
var ecommerceLocalizer = services.GetRequiredService<IStringLocalizer<ECommerce.Module.SharedRes>>();
await Task.WhenAll(
authLocalizer.LoadAsync().AsTask(),
+1 -1
View File
@@ -27,7 +27,7 @@ namespace UI.Config.Register
{
options.ResourcesPath = "resources";
options.Assemblies = [typeof(LayoutLib.RCL.SharedRes).Assembly, typeof(Auth.RCL.SharedRes).Assembly, typeof(ECommerce.RCL.SharedRes).Assembly];
options.Assemblies = [typeof(LayoutLib.Layout.SharedRes).Assembly, typeof(Auth.Module.SharedRes).Assembly, typeof(ECommerce.Module.SharedRes).Assembly];
options.HttpClientBuilder = sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient(nameof(LocalizationHttpClient));
});
+10 -6
View File
@@ -2,8 +2,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
// using AuthModule;
// using AuthModule.Services;
using Auth.Module.Config;
using Auth.Module.Services;
using ECommerceModule.Config;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Components.Authorization;
@@ -28,7 +28,7 @@ public static class RegisteringServices
public static IServiceCollection RegisteredServices(this IServiceCollection services)
{
// services.AuthModuleServices();
services.AuthModuleServices();
services.ECommerceModuleServices();
// Common Services
@@ -44,25 +44,29 @@ public static class RegisteringServices
IConfiguration config
)
{
var authUrl = config.GetValue<string>("ApiBaseUrls:Auth") ?? "https://api.mass-tech.net/api/v1/";
var commerceUrl = config.GetValue<string>("ApiBaseUrls:Commerce") ?? "https://ecommerceapi.mass-tech.net/api/v1/";
var cdnUrl = config.GetValue<string>("ApiBaseUrls:CDN") ?? "https://cdn.mass-tech.net/api/v1/";
services.AddHttpClient(
"Auth",
client =>
{
client.BaseAddress = new Uri("http://localhost:2002/api/v1/");
client.BaseAddress = new Uri(authUrl);
}
);
services.AddHttpClient(
"Commerce",
client =>
{
client.BaseAddress = new Uri("http://localhost:2001/api/v1/");
client.BaseAddress = new Uri(commerceUrl);
}
);
services.AddHttpClient(
"CDN",
client =>
{
client.BaseAddress = new Uri("http://localhost:2003/api/v1/");
client.BaseAddress = new Uri(cdnUrl);
}
);
+17
View File
@@ -0,0 +1,17 @@
# Build stage
FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine AS build
WORKDIR /src
COPY UI.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet build -c Release -o /build
RUN dotnet publish -c Release -o /app/publish /p:BlazorWebAssemblyLoadAllGlobalizationData=true
# Serve with nginx
FROM nginx:alpine AS runtime
COPY --from=build /app/publish/wwwroot /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
+1 -1
View File
@@ -25,7 +25,7 @@ builder.RootComponents.Add<HeadOutlet>("head::after");
builder.Services.AddSingleton(new Uri(builder.HostEnvironment.BaseAddress));
builder.Services.RegLocalization("http://localhost:2004/");
builder.Services.RegLocalization(builder.HostEnvironment.BaseAddress);
builder.Services.RegisterServices(builder.Configuration);
+15 -24
View File
@@ -1,25 +1,16 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "http://localhost:2004",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "https://localhost:7062;http://localhost:5055",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"UI": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "http://localhost:2004",
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "http://localhost:2004",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
+5 -5
View File
@@ -31,11 +31,11 @@
<ProjectReference Include="..\..\..\..\Backend\APIs\Commerce\Contracts\Contracts.csproj" />
</ItemGroup> -->
<ItemGroup>
<ProjectReference Include="..\..\..\Libs\Layouts\LayoutLib\LayoutLib.RCL\LayoutLib.RCL.csproj" />
<ProjectReference Include="..\..\..\Libs\Generic\Media\Media.RCL\Media.RCL.csproj" />
<ProjectReference Include="..\..\..\Libs\Modules\ERP\Commerce\ECommerce\ECommerce.RCL\ECommerce.RCL.csproj" />
<ProjectReference Include="..\..\..\Libs\Modules\Auth\Auth.RCL\Auth.RCL.csproj" />
<ItemGroup>
<ProjectReference Include="..\..\..\Libs\Layouts\LayoutLib.Layout\LayoutLib.Layout.csproj" />
<ProjectReference Include="..\..\..\Libs\Generic\Media.RCL\Media.RCL.csproj" />
<ProjectReference Include="..\..\..\Libs\Modules\ERP\Commerce\ECommerce.Module\ECommerce.Module.csproj" />
<ProjectReference Include="..\..\..\Libs\Modules\Auth.Module\Auth.Module.csproj" />
<!-- <ProjectReference Include="..\..\..\Libs\Libs\LandingPagesLib\LandingPagesLib.csproj" /> -->
+7
View File
@@ -0,0 +1,7 @@
{
"ApiBaseUrls": {
"Auth": "http://localhost:2002/api/v1/",
"Commerce": "http://localhost:2001/api/v1/",
"CDN": "http://localhost:2003/api/v1/"
}
}
+7
View File
@@ -0,0 +1,7 @@
{
"ApiBaseUrls": {
"Auth": "https://api.mass-tech.net/api/v1/",
"Commerce": "https://ecommerceapi.mass-tech.net/api/v1/",
"CDN": "https://cdn.mass-tech.net/api/v1/"
}
}
+28
View File
@@ -0,0 +1,28 @@
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html =404;
}
location /api/ {
proxy_pass http://masstech-api:80/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
}
}
+1 -1
View File
@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("UI")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+206dfeabd74212fb6442b2ac195b5904b0472cb7")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+b8a0d4afe9e3be7089649c581f84a739a2257a72")]
[assembly: System.Reflection.AssemblyProductAttribute("UI")]
[assembly: System.Reflection.AssemblyTitleAttribute("UI")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
@@ -1 +1 @@
768650b9279d15badf39b6fcf029357ead37478028cce29567c771b2298f1b20
b300afb94f22e242f1efa88cb0387c02b34a9602ad55eaa04a417d72753aac9a
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
+67 -67
View File
@@ -756,7 +756,7 @@
"bin/placeholder/Auth.Contracts.dll": {}
}
},
"Auth.RCL/1.0.0": {
"Auth.Module/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v10.0",
"dependencies": {
@@ -764,7 +764,7 @@
"Blazored.LocalStorage": "4.5.0",
"Common.RCL": "1.0.0",
"Generic.CL": "1.0.0",
"LayoutLib.RCL": "1.0.0",
"LayoutLib.Layout": "1.0.0",
"Media.RCL": "1.0.0",
"Microsoft.AspNetCore.Components.Authorization": "10.0.1",
"Microsoft.AspNetCore.Components.Web": "10.0.1",
@@ -773,23 +773,23 @@
"MudBlazor": "8.9.0"
},
"compile": {
"bin/placeholder/Auth.RCL.dll": {}
"bin/placeholder/Auth.Module.dll": {}
},
"runtime": {
"bin/placeholder/Auth.RCL.dll": {}
"bin/placeholder/Auth.Module.dll": {}
}
},
"Carousel.RCL/1.0.0": {
"Carousel/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v10.0",
"framework": ".NETCoreApp,Version=v9.0",
"dependencies": {
"Microsoft.AspNetCore.Components.Web": "10.0.1"
"Microsoft.AspNetCore.Components.Web": "9.0.0"
},
"compile": {
"bin/placeholder/Carousel.RCL.dll": {}
"bin/placeholder/Carousel.dll": {}
},
"runtime": {
"bin/placeholder/Carousel.RCL.dll": {}
"bin/placeholder/Carousel.dll": {}
}
},
"Common.RCL/1.0.0": {
@@ -819,28 +819,28 @@
"bin/placeholder/ECommerce.Contracts.dll": {}
}
},
"ECommerce.RCL/1.0.0": {
"ECommerce.Module/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v10.0",
"dependencies": {
"Blazored.FluentValidation": "2.2.0",
"Blazored.LocalStorage": "4.5.0",
"Carousel.RCL": "1.0.0",
"Carousel": "1.0.0",
"Common.RCL": "1.0.0",
"ECommerce.Contracts": "1.0.0",
"Generic.CL": "1.0.0",
"ImageViewer.RCL": "1.0.0",
"LayoutLib.RCL": "1.0.0",
"LayoutLib.Layout": "1.0.0",
"Media.RCL": "1.0.0",
"Microsoft.AspNetCore.Components.Web": "10.0.1",
"Microsoft.Extensions.Localization": "10.0.1",
"MudBlazor": "8.9.0"
},
"compile": {
"bin/placeholder/ECommerce.RCL.dll": {}
"bin/placeholder/ECommerce.Module.dll": {}
},
"runtime": {
"bin/placeholder/ECommerce.RCL.dll": {}
"bin/placeholder/ECommerce.Module.dll": {}
}
},
"Generic.CL/1.0.0": {
@@ -866,7 +866,7 @@
"bin/placeholder/ImageViewer.RCL.dll": {}
}
},
"LayoutLib.RCL/1.0.0": {
"LayoutLib.Layout/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v10.0",
"dependencies": {
@@ -875,10 +875,10 @@
"MudBlazor": "8.9.0"
},
"compile": {
"bin/placeholder/LayoutLib.RCL.dll": {}
"bin/placeholder/LayoutLib.Layout.dll": {}
},
"runtime": {
"bin/placeholder/LayoutLib.RCL.dll": {}
"bin/placeholder/LayoutLib.Layout.dll": {}
}
},
"Media.RCL/1.0.0": {
@@ -1654,7 +1654,7 @@
"bin/placeholder/Auth.Contracts.dll": {}
}
},
"Auth.RCL/1.0.0": {
"Auth.Module/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v10.0",
"dependencies": {
@@ -1662,7 +1662,7 @@
"Blazored.LocalStorage": "4.5.0",
"Common.RCL": "1.0.0",
"Generic.CL": "1.0.0",
"LayoutLib.RCL": "1.0.0",
"LayoutLib.Layout": "1.0.0",
"Media.RCL": "1.0.0",
"Microsoft.AspNetCore.Components.Authorization": "10.0.1",
"Microsoft.AspNetCore.Components.Web": "10.0.1",
@@ -1671,23 +1671,23 @@
"MudBlazor": "8.9.0"
},
"compile": {
"bin/placeholder/Auth.RCL.dll": {}
"bin/placeholder/Auth.Module.dll": {}
},
"runtime": {
"bin/placeholder/Auth.RCL.dll": {}
"bin/placeholder/Auth.Module.dll": {}
}
},
"Carousel.RCL/1.0.0": {
"Carousel/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v10.0",
"framework": ".NETCoreApp,Version=v9.0",
"dependencies": {
"Microsoft.AspNetCore.Components.Web": "10.0.1"
"Microsoft.AspNetCore.Components.Web": "9.0.0"
},
"compile": {
"bin/placeholder/Carousel.RCL.dll": {}
"bin/placeholder/Carousel.dll": {}
},
"runtime": {
"bin/placeholder/Carousel.RCL.dll": {}
"bin/placeholder/Carousel.dll": {}
}
},
"Common.RCL/1.0.0": {
@@ -1717,28 +1717,28 @@
"bin/placeholder/ECommerce.Contracts.dll": {}
}
},
"ECommerce.RCL/1.0.0": {
"ECommerce.Module/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v10.0",
"dependencies": {
"Blazored.FluentValidation": "2.2.0",
"Blazored.LocalStorage": "4.5.0",
"Carousel.RCL": "1.0.0",
"Carousel": "1.0.0",
"Common.RCL": "1.0.0",
"ECommerce.Contracts": "1.0.0",
"Generic.CL": "1.0.0",
"ImageViewer.RCL": "1.0.0",
"LayoutLib.RCL": "1.0.0",
"LayoutLib.Layout": "1.0.0",
"Media.RCL": "1.0.0",
"Microsoft.AspNetCore.Components.Web": "10.0.1",
"Microsoft.Extensions.Localization": "10.0.1",
"MudBlazor": "8.9.0"
},
"compile": {
"bin/placeholder/ECommerce.RCL.dll": {}
"bin/placeholder/ECommerce.Module.dll": {}
},
"runtime": {
"bin/placeholder/ECommerce.RCL.dll": {}
"bin/placeholder/ECommerce.Module.dll": {}
}
},
"Generic.CL/1.0.0": {
@@ -1764,7 +1764,7 @@
"bin/placeholder/ImageViewer.RCL.dll": {}
}
},
"LayoutLib.RCL/1.0.0": {
"LayoutLib.Layout/1.0.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v10.0",
"dependencies": {
@@ -1773,10 +1773,10 @@
"MudBlazor": "8.9.0"
},
"compile": {
"bin/placeholder/LayoutLib.RCL.dll": {}
"bin/placeholder/LayoutLib.Layout.dll": {}
},
"runtime": {
"bin/placeholder/LayoutLib.RCL.dll": {}
"bin/placeholder/LayoutLib.Layout.dll": {}
}
},
"Media.RCL/1.0.0": {
@@ -3020,58 +3020,58 @@
"path": "../../../../Backend/APIs/Auth/Auth.Contracts/Auth.Contracts.csproj",
"msbuildProject": "../../../../Backend/APIs/Auth/Auth.Contracts/Auth.Contracts.csproj"
},
"Auth.RCL/1.0.0": {
"Auth.Module/1.0.0": {
"type": "project",
"path": "../../../Libs/Modules/Auth/Auth.RCL/Auth.RCL.csproj",
"msbuildProject": "../../../Libs/Modules/Auth/Auth.RCL/Auth.RCL.csproj"
"path": "../../../Libs/Modules/Auth.Module/Auth.Module.csproj",
"msbuildProject": "../../../Libs/Modules/Auth.Module/Auth.Module.csproj"
},
"Carousel.RCL/1.0.0": {
"Carousel/1.0.0": {
"type": "project",
"path": "../../../Libs/Generic/Carousel/Carousel.RCL/Carousel.RCL.csproj",
"msbuildProject": "../../../Libs/Generic/Carousel/Carousel.RCL/Carousel.RCL.csproj"
"path": "../../../Libs/Generic/Carousel.RCL/Carousel.csproj",
"msbuildProject": "../../../Libs/Generic/Carousel.RCL/Carousel.csproj"
},
"Common.RCL/1.0.0": {
"type": "project",
"path": "../../../Libs/Generic/Common/Common.RCL/Common.RCL.csproj",
"msbuildProject": "../../../Libs/Generic/Common/Common.RCL/Common.RCL.csproj"
"path": "../../../Libs/Generic/Common.RCL/Common.RCL.csproj",
"msbuildProject": "../../../Libs/Generic/Common.RCL/Common.RCL.csproj"
},
"ECommerce.Contracts/1.0.0": {
"type": "project",
"path": "../../../../Backend/TempProjects/Templates/API_Template/ECommerce.Contracts/ECommerce.Contracts.csproj",
"msbuildProject": "../../../../Backend/TempProjects/Templates/API_Template/ECommerce.Contracts/ECommerce.Contracts.csproj"
"path": "../../../../Backend/APIs/ERP/Commerce/ECommerce/ECommerce.Contracts/ECommerce.Contracts.csproj",
"msbuildProject": "../../../../Backend/APIs/ERP/Commerce/ECommerce/ECommerce.Contracts/ECommerce.Contracts.csproj"
},
"ECommerce.RCL/1.0.0": {
"ECommerce.Module/1.0.0": {
"type": "project",
"path": "../../../Libs/Modules/ERP/Commerce/ECommerce/ECommerce.RCL/ECommerce.RCL.csproj",
"msbuildProject": "../../../Libs/Modules/ERP/Commerce/ECommerce/ECommerce.RCL/ECommerce.RCL.csproj"
"path": "../../../Libs/Modules/ERP/Commerce/ECommerce.Module/ECommerce.Module.csproj",
"msbuildProject": "../../../Libs/Modules/ERP/Commerce/ECommerce.Module/ECommerce.Module.csproj"
},
"Generic.CL/1.0.0": {
"type": "project",
"path": "../../../../Backend/SharedLogic/Generic/Generic.CL/Generic.CL.csproj",
"msbuildProject": "../../../../Backend/SharedLogic/Generic/Generic.CL/Generic.CL.csproj"
"path": "../../../../Backend/SharedLogic/Generic/Generic.CL.csproj",
"msbuildProject": "../../../../Backend/SharedLogic/Generic/Generic.CL.csproj"
},
"ImageViewer.RCL/1.0.0": {
"type": "project",
"path": "../../../Libs/Generic/ImageViewer/ImageViewer.RCL/ImageViewer.RCL.csproj",
"msbuildProject": "../../../Libs/Generic/ImageViewer/ImageViewer.RCL/ImageViewer.RCL.csproj"
"path": "../../../Libs/Generic/ImageViewer.RCL/ImageViewer.RCL.csproj",
"msbuildProject": "../../../Libs/Generic/ImageViewer.RCL/ImageViewer.RCL.csproj"
},
"LayoutLib.RCL/1.0.0": {
"LayoutLib.Layout/1.0.0": {
"type": "project",
"path": "../../../Libs/Layouts/LayoutLib/LayoutLib.RCL/LayoutLib.RCL.csproj",
"msbuildProject": "../../../Libs/Layouts/LayoutLib/LayoutLib.RCL/LayoutLib.RCL.csproj"
"path": "../../../Libs/Layouts/LayoutLib.Layout/LayoutLib.Layout.csproj",
"msbuildProject": "../../../Libs/Layouts/LayoutLib.Layout/LayoutLib.Layout.csproj"
},
"Media.RCL/1.0.0": {
"type": "project",
"path": "../../../Libs/Generic/Media/Media.RCL/Media.RCL.csproj",
"msbuildProject": "../../../Libs/Generic/Media/Media.RCL/Media.RCL.csproj"
"path": "../../../Libs/Generic/Media.RCL/Media.RCL.csproj",
"msbuildProject": "../../../Libs/Generic/Media.RCL/Media.RCL.csproj"
}
},
"projectFileDependencyGroups": {
"net10.0": [
"Auth.RCL >= 1.0.0",
"Auth.Module >= 1.0.0",
"Blazored.LocalStorage >= 4.5.0",
"ECommerce.RCL >= 1.0.0",
"LayoutLib.RCL >= 1.0.0",
"ECommerce.Module >= 1.0.0",
"LayoutLib.Layout >= 1.0.0",
"Media.RCL >= 1.0.0",
"Microsoft.AspNetCore.App.Internal.Assets >= 10.0.2",
"Microsoft.AspNetCore.Components.Authorization >= 10.0.1",
@@ -3111,17 +3111,17 @@
"net10.0": {
"targetAlias": "net10.0",
"projectReferences": {
"/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Generic/Media/Media.RCL/Media.RCL.csproj": {
"projectPath": "/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Generic/Media/Media.RCL/Media.RCL.csproj"
"/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Generic/Media.RCL/Media.RCL.csproj": {
"projectPath": "/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Generic/Media.RCL/Media.RCL.csproj"
},
"/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Layouts/LayoutLib/LayoutLib.RCL/LayoutLib.RCL.csproj": {
"projectPath": "/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Layouts/LayoutLib/LayoutLib.RCL/LayoutLib.RCL.csproj"
"/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Layouts/LayoutLib.Layout/LayoutLib.Layout.csproj": {
"projectPath": "/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Layouts/LayoutLib.Layout/LayoutLib.Layout.csproj"
},
"/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Modules/Auth/Auth.RCL/Auth.RCL.csproj": {
"projectPath": "/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Modules/Auth/Auth.RCL/Auth.RCL.csproj"
"/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Modules/Auth.Module/Auth.Module.csproj": {
"projectPath": "/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Modules/Auth.Module/Auth.Module.csproj"
},
"/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Modules/ERP/Commerce/ECommerce/ECommerce.RCL/ECommerce.RCL.csproj": {
"projectPath": "/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Modules/ERP/Commerce/ECommerce/ECommerce.RCL/ECommerce.RCL.csproj"
"/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Modules/ERP/Commerce/ECommerce.Module/ECommerce.Module.csproj": {
"projectPath": "/mnt/data/Work/Programming/MainProgram/Frontend/Libs/Modules/ERP/Commerce/ECommerce.Module/ECommerce.Module.csproj"
}
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"version": 2,
"dgSpecHash": "R09/Z/OaVVM=",
"dgSpecHash": "v65Eq0loLbI=",
"success": true,
"projectFilePath": "/mnt/data/Work/Programming/MainProgram/Frontend/Apps/MassTech/UI/UI.csproj",
"expectedPackageFiles": [
+5
View File
@@ -12,6 +12,11 @@
"description": "",
"main": "tailwind.config.js",
"scripts": {
"build:css": "npx tailwindcss -o ./wwwroot/css/app.css",
"watch:css": "npx tailwindcss -o ./wwwroot/css/app.css --watch",
"publish": "npm run build:css && dotnet publish --configuration Release -o ../Infrastructure/Deployable/Apps/MassTech_App/dist/UI/wwwroot",
"rebuild:ui": "cd ../Infrastructure/Deployable/Apps/MassTech_App && docker build --no-cache -f DockerImages/UI/Dockerfile -t masstech-ui:MassTech_App . && docker-compose up -d ui",
"deploy": "npm run publish && npm run rebuild:ui",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
+3 -3
View File
@@ -42,12 +42,12 @@ module.exports = {
themes: [
{
test: {
primary: "#4ECEDA",
secondary: "#44B4BE",
primary: "#E9B135",
secondary: "#D4A030",
accent: "#E9B135",
neutral: "#27666C",
"base-100": "#ffffff",
info: "#fde047",
info: "#fbbf24",
success: "#15803d",
warning: "#b91c1c",
error: "#ffffff",
+7
View File
@@ -0,0 +1,7 @@
{
"ApiBaseUrls": {
"Auth": "http://localhost:2002/api/v1/",
"Commerce": "http://localhost:2001/api/v1/",
"CDN": "http://localhost:2003/api/v1/"
}
}
+7
View File
@@ -0,0 +1,7 @@
{
"ApiBaseUrls": {
"Auth": "https://api.mass-tech.net/api/v1/",
"Commerce": "https://ecommerceapi.mass-tech.net/api/v1/",
"CDN": "https://cdn.mass-tech.net/api/v1/"
}
}
+3730 -793
View File
File diff suppressed because it is too large Load Diff
-8616
View File
File diff suppressed because it is too large Load Diff
+275 -25
View File
@@ -1,13 +1,217 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" data-theme="test">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>UI</title>
<title>MassTech - Premium Marketplace</title>
<base href="/" />
<link rel="stylesheet" href="css/app.css" />
<link rel="stylesheet" href="css/app.min.css" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<style>
/* Site-wide Gradient Background (TEST) */
.site-gradient-bg {
background: linear-gradient(135deg, #0f172a 0%, #1e293b 50%, #312e81 100%) !important;
min-height: 100vh;
}
.site-gradient-bg::before {
content: '';
position: fixed;
inset: 0;
background: radial-gradient(circle at 30% 20%, rgba(99, 102, 241, 0.15) 0%, transparent 50%),
radial-gradient(circle at 70% 80%, rgba(168, 85, 247, 0.15) 0%, transparent 50%);
pointer-events: none;
z-index: -1;
animation: gradient-shift 8s ease-in-out infinite;
}
/* App Loader - Professional Loading Screen */
.app-loader {
position: fixed;
inset: 0;
background: linear-gradient(135deg, #0f172a 0%, #1e293b 50%, #312e81 100%);
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
font-family: 'Inter', system-ui, -apple-system, sans-serif;
overflow: hidden;
}
.app-loader::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(circle at 30% 20%, rgba(99, 102, 241, 0.3) 0%, transparent 50%),
radial-gradient(circle at 70% 80%, rgba(168, 85, 247, 0.3) 0%, transparent 50%);
animation: gradient-shift 8s ease-in-out infinite;
}
@keyframes gradient-shift {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.7; transform: scale(1.1); }
}
.loader-content {
position: relative;
text-align: center;
color: white;
padding: 2rem;
animation: fade-in 0.8s ease-out;
}
@keyframes fade-in {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.logo-wrapper {
position: relative;
width: 96px;
height: 96px;
margin: 0 auto 2rem;
display: flex;
align-items: center;
justify-content: center;
}
.gear-wrapper {
position: relative;
width: 180px;
height: 180px;
margin: 0 auto 2.5rem;
display: flex;
align-items: center;
justify-content: center;
}
.gear-orbit {
position: absolute;
inset: 0;
border-radius: 50%;
border: 2px dashed rgba(255, 215, 0, 0.3);
animation: orbit-rotate 12s linear infinite;
}
@keyframes orbit-rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.gear {
position: absolute;
filter: drop-shadow(0 0 20px rgba(255, 215, 0, 0.6))
drop-shadow(0 0 40px rgba(255, 215, 0, 0.3));
}
.gear-large {
width: 110px;
height: 110px;
animation: gear-spin 4s linear infinite;
}
.gear-large svg {
width: 100%;
height: 100%;
fill: url(#goldGradient);
}
.gear-small {
width: 60px;
height: 60px;
top: 10px;
right: 10px;
animation: gear-spin-reverse 3s linear infinite;
}
.gear-small svg {
width: 100%;
height: 100%;
fill: url(#goldGradient);
}
@keyframes gear-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
@keyframes gear-spin-reverse {
from { transform: rotate(0deg); }
to { transform: rotate(-360deg); }
}
.logo-icon {
display: none;
}
.brand-name {
font-size: 3rem;
font-weight: 900;
letter-spacing: -0.05em;
margin: 0 0 0.5rem;
background: linear-gradient(135deg, #ffffff 0%, #c7d2fe 100%);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: 0 4px 30px rgba(255, 255, 255, 0.1);
}
.brand-tagline {
font-size: 0.95rem;
font-weight: 500;
color: #94a3b8;
margin: 0 0 2.5rem;
letter-spacing: 0.025em;
}
.progress-bar {
width: 240px;
height: 4px;
background: rgba(255, 255, 255, 0.1);
border-radius: 999px;
margin: 0 auto 1rem;
overflow: hidden;
backdrop-filter: blur(10px);
}
.progress-fill {
height: 100%;
background: linear-gradient(90deg, #6366f1, #a855f7, #ec4899);
background-size: 200% 100%;
border-radius: 999px;
animation: progress-slide 2s ease-in-out infinite, gradient-flow 3s linear infinite;
}
@keyframes progress-slide {
0% { width: 0%; margin-left: 0; }
50% { width: 60%; margin-left: 20%; }
100% { width: 0%; margin-left: 100%; }
}
@keyframes gradient-flow {
0% { background-position: 0% 50%; }
100% { background-position: 200% 50%; }
}
.loading-text {
font-size: 0.875rem;
font-weight: 500;
color: #64748b;
margin: 0;
letter-spacing: 0.025em;
animation: text-pulse 2s ease-in-out infinite;
}
@keyframes text-pulse {
0%, 100% { opacity: 0.6; }
50% { opacity: 1; }
}
</style>
<link rel="icon" type="image/png" href="favicon.png" />
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
@@ -15,13 +219,43 @@
<link href="_content/MudBlazor/MudBlazor.min.css?v=1" rel="stylesheet" />
</head>
<body>
<body class="site-gradient-bg">
<!-- SVG Gradient Definition for Gold Gears -->
<svg width="0" height="0" style="position:absolute">
<defs>
<linearGradient id="goldGradient" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#fef3c7;stop-opacity:1" />
<stop offset="30%" style="stop-color:#fde68a;stop-opacity:1" />
<stop offset="60%" style="stop-color:#fbbf24;stop-opacity:1" />
<stop offset="100%" style="stop-color:#d97706;stop-opacity:1" />
</linearGradient>
</defs>
</svg>
<div id="app">
<svg class="loading-progress">
<circle r="40%" cx="50%" cy="50%" />
<circle r="40%" cx="50%" cy="50%" />
</svg>
<div class="loading-progress-text"></div>
<div class="app-loader">
<div class="loader-content">
<div class="gear-wrapper">
<div class="gear-orbit"></div>
<div class="gear gear-large">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"/>
</svg>
</div>
<div class="gear gear-small">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z"/>
</svg>
</div>
</div>
<h1 class="brand-name">MassTech</h1>
<p class="brand-tagline">Premium Quality Marketplace</p>
<div class="progress-bar">
<div class="progress-fill"></div>
</div>
<p class="loading-text">Loading your experience...</p>
</div>
</div>
</div>
<div id="blazor-error-ui">
@@ -29,25 +263,22 @@
<a href="." class="reload">Reload</a>
<span class="dismiss">🗙</span>
</div>
<script src="_framework/blazor.webassembly.js"></script>
<script src="_content/MudBlazor/MudBlazor.min.js?v=1"></script>
<!-- Media Component Assets -->
<link href="_content/Media/lib/cropper.min.css" rel="stylesheet" />
<script src="_content/Media/lib/cropper.min.js"></script>
<!-- <script src="_content/LayoutLib/Resources"></script>
<script src="_content/LayoutLib"></script> -->
<script src="_content/Media/"></script>
<script src="_content/Media/lib/cropper.min.js"></script>
<script src="_content/Media/js/mediaInterop.js"></script>
<!-- Carousel Scripts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
<script src="_content/Common/css/carousal.js"></script>
<script>
// Set initial direction and language from cookie on page load
(function() {
const value = "; " + document.cookie;
const parts = value.split("; .AspNetCore.Culture=");
if (parts.length == 2) {
const cookieValue = decodeURIComponent(parts.pop().split(";").shift());
// Extract just the culture code (format: "c=en|uic=en")
const culture = cookieValue.split('|')[0].split('=')[1];
const rtlLanguages = ['ar', 'he', 'fa', 'ur'];
document.documentElement.dir = rtlLanguages.some(lang => culture === lang) ? 'rtl' : 'ltr';
document.documentElement.lang = culture;
}
})();
window.cultureInfo = {
get: () => {
const value = "; " + document.cookie;
@@ -57,10 +288,29 @@
set: (value) => {
const cookieValue = encodeURIComponent(`c=${value}|uic=${value}`);
document.cookie = `.AspNetCore.Culture=${cookieValue}; path=/; max-age=31536000`;
// Set RTL direction for Arabic and other RTL languages
const rtlLanguages = ['ar', 'he', 'fa', 'ur'];
document.documentElement.dir = rtlLanguages.some(lang => value === lang) ? 'rtl' : 'ltr';
document.documentElement.lang = value;
}
};
</script>
<script src="_framework/blazor.webassembly.js"></script>
<script src="_content/MudBlazor/MudBlazor.min.js?v=1"></script>
<!-- Media Component Assets -->
<link href="_content/Media.RCL/lib/cropper.min.css" rel="stylesheet" />
<script src="_content/Media.RCL/lib/cropper.min.js"></script>
<!-- <script src="_content/LayoutLib/Resources"></script>
<script src="_content/LayoutLib"></script> -->
<script src="_content/Media.RCL/js/mediaInterop.js"></script>
<!-- Carousel Scripts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
<script src="_content/Common.RCL/css/carousal.js"></script>
</body>
</html>