From d88376f2fbda97bb0f2503bf46b87e8e4a9bc05a Mon Sep 17 00:00:00 2001 From: ChiaraBm Date: Sat, 12 Jul 2025 23:53:43 +0200 Subject: [PATCH] Refactored css classes to match flyonui. Switched to postgres arrays for permissions. Migrated file manager. Adjusted everything to work with the latest mooncore version --- .../Moonlight.ApiServer.Runtime.csproj | 2 +- .../Database/Entities/ApiKey.cs | 9 +- Moonlight.ApiServer/Database/Entities/User.cs | 8 +- ...itchedToPgArraysForPermissions.Designer.cs | 393 +++++ ...202608_SwitchedToPgArraysForPermissions.cs | 62 + .../CoreDataContextModelSnapshot.cs | 16 +- .../Admin/ApiKeys/ApiKeysController.cs | 10 +- .../Controllers/Admin/Sys/FilesController.cs | 78 +- .../Controllers/Admin/Sys/SystemController.cs | 9 +- .../Admin/Users/UsersController.cs | 14 +- .../Http/Controllers/Auth/AuthController.cs | 9 +- .../Controllers/Frontend/FrontendPage.razor | 8 +- .../Controllers/OAuth2/OAuth2Controller.cs | 2 +- .../Implementations/Startup/CoreStartup.cs | 2 +- .../Moonlight.ApiServer.csproj | 7 +- .../Properties/launchSettings.json | 29 - Moonlight.ApiServer/Services/ApiKeyService.cs | 6 +- .../Moonlight.Client.Runtime.csproj | 9 +- .../Styles/additions/animations.css | 9 - .../Styles/additions/buttons.css | 93 -- .../Styles/additions/cards.css | 23 - .../Styles/additions/fonts.css | 8 - .../Styles/additions/forms.css | 77 - .../Styles/additions/loaders.css | 28 - .../Styles/additions/progress.css | 25 - .../Styles/additions/scrollbar.css | 9 - .../Styles/additions/tabs.css | 11 - .../Styles/additions/theme.css | 46 - .../Styles/additions/theme.white.css | 23 - Moonlight.Client.Runtime/Styles/exports.css | 26 - .../Styles/extract-classes.js | 30 + .../Styles/mappings/mooncore.map | 1093 +++++++------- .../Styles/package-lock.json | 1317 +++++++++++------ Moonlight.Client.Runtime/Styles/package.json | 29 +- .../Styles/postcss.config.js | 11 + .../Styles/preTailwind.css | 1 - .../Styles/resolveNuget.js | 80 - Moonlight.Client.Runtime/Styles/style.css | 21 - Moonlight.Client.Runtime/Styles/styles.css | 112 ++ Moonlight.Client.Runtime/Styles/theme.css | 33 + .../Implementations/SysFileSystemProvider.cs | 134 -- .../Implementations/SystemFsAccess.cs | 88 ++ Moonlight.Client/Moonlight.Client.csproj | 13 +- Moonlight.Client/Moonlight.Client.targets | 8 + .../Properties/launchSettings.json | 14 - .../Services/RemoteAuthStateManager.cs | 2 +- Moonlight.Client/Styles/mappings/mooncore.map | 513 +++++++ Moonlight.Client/UI/Components/StatCard.razor | 4 +- .../UI/Components/ThemeColorSelector.razor | 2 +- .../Components/WelcomeOverviewElement.razor | 2 +- Moonlight.Client/UI/Layouts/MainLayout.razor | 14 +- Moonlight.Client/UI/Partials/AppHeader.razor | 8 +- Moonlight.Client/UI/Partials/AppSidebar.razor | 46 +- .../UI/Views/Admin/Api/Create.razor | 28 +- .../UI/Views/Admin/Api/Index.razor | 8 +- .../UI/Views/Admin/Api/Update.razor | 8 +- .../UI/Views/Admin/Sys/Advanced.razor | 3 +- .../UI/Views/Admin/Sys/Diagnose.razor | 7 +- .../UI/Views/Admin/Sys/Files.razor | 17 +- .../UI/Views/Admin/Sys/Index.razor | 4 +- .../UI/Views/Admin/Users/Create.razor | 25 +- .../UI/Views/Admin/Users/Index.razor | 4 +- .../UI/Views/Admin/Users/Update.razor | 29 +- Moonlight.Client/wwwroot/js/moonCore.js | 316 ---- .../Admin/ApiKeys/CreateApiKeyRequest.cs | 2 +- .../Requests/Admin/Users/CreateUserRequest.cs | 2 +- .../Requests/Admin/Users/UpdateUserRequest.cs | 4 +- .../Responses/Admin/ApiKeys/ApiKeyResponse.cs | 4 +- .../Admin/ApiKeys/CreateApiKeyResponse.cs | 4 +- .../Admin/Sys/FileSystemEntryResponse.cs | 2 +- .../Responses/Admin/Users/UserResponse.cs | 2 +- .../Http/Responses/Auth/CheckResponse.cs | 2 +- 72 files changed, 2870 insertions(+), 2227 deletions(-) create mode 100644 Moonlight.ApiServer/Database/Migrations/20250712202608_SwitchedToPgArraysForPermissions.Designer.cs create mode 100644 Moonlight.ApiServer/Database/Migrations/20250712202608_SwitchedToPgArraysForPermissions.cs delete mode 100644 Moonlight.ApiServer/Properties/launchSettings.json delete mode 100644 Moonlight.Client.Runtime/Styles/additions/animations.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/buttons.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/cards.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/fonts.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/forms.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/loaders.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/progress.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/scrollbar.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/tabs.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/theme.css delete mode 100644 Moonlight.Client.Runtime/Styles/additions/theme.white.css delete mode 100644 Moonlight.Client.Runtime/Styles/exports.css create mode 100644 Moonlight.Client.Runtime/Styles/extract-classes.js mode change 100644 => 100755 Moonlight.Client.Runtime/Styles/mappings/mooncore.map create mode 100644 Moonlight.Client.Runtime/Styles/postcss.config.js delete mode 100644 Moonlight.Client.Runtime/Styles/preTailwind.css delete mode 100644 Moonlight.Client.Runtime/Styles/resolveNuget.js delete mode 100644 Moonlight.Client.Runtime/Styles/style.css create mode 100644 Moonlight.Client.Runtime/Styles/styles.css create mode 100644 Moonlight.Client.Runtime/Styles/theme.css delete mode 100644 Moonlight.Client/Implementations/SysFileSystemProvider.cs create mode 100644 Moonlight.Client/Implementations/SystemFsAccess.cs create mode 100644 Moonlight.Client/Moonlight.Client.targets delete mode 100644 Moonlight.Client/Properties/launchSettings.json create mode 100755 Moonlight.Client/Styles/mappings/mooncore.map delete mode 100644 Moonlight.Client/wwwroot/js/moonCore.js diff --git a/Moonlight.ApiServer.Runtime/Moonlight.ApiServer.Runtime.csproj b/Moonlight.ApiServer.Runtime/Moonlight.ApiServer.Runtime.csproj index c9706e8e..4a92b3c9 100644 --- a/Moonlight.ApiServer.Runtime/Moonlight.ApiServer.Runtime.csproj +++ b/Moonlight.ApiServer.Runtime/Moonlight.ApiServer.Runtime.csproj @@ -15,7 +15,7 @@ - + diff --git a/Moonlight.ApiServer/Database/Entities/ApiKey.cs b/Moonlight.ApiServer/Database/Entities/ApiKey.cs index afb869f4..3dbfb9c8 100644 --- a/Moonlight.ApiServer/Database/Entities/ApiKey.cs +++ b/Moonlight.ApiServer/Database/Entities/ApiKey.cs @@ -8,12 +8,9 @@ public class ApiKey public string Description { get; set; } - [Column(TypeName="jsonb")] - public string PermissionsJson { get; set; } = "[]"; + public string[] Permissions { get; set; } = []; - [Column(TypeName = "timestamp with time zone")] - public DateTime ExpiresAt { get; set; } + public DateTimeOffset ExpiresAt { get; set; } - [Column(TypeName = "timestamp with time zone")] - public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow; } \ No newline at end of file diff --git a/Moonlight.ApiServer/Database/Entities/User.cs b/Moonlight.ApiServer/Database/Entities/User.cs index 13d6b135..0a13fafb 100644 --- a/Moonlight.ApiServer/Database/Entities/User.cs +++ b/Moonlight.ApiServer/Database/Entities/User.cs @@ -9,10 +9,6 @@ public class User public string Username { get; set; } public string Email { get; set; } public string Password { get; set; } - - [Column(TypeName="timestamp with time zone")] - public DateTime TokenValidTimestamp { get; set; } = DateTime.MinValue; - - [Column(TypeName="jsonb")] - public string PermissionsJson { get; set; } = "[]"; + public DateTimeOffset TokenValidTimestamp { get; set; } = DateTimeOffset.MinValue; + public string[] Permissions { get; set; } = []; } \ No newline at end of file diff --git a/Moonlight.ApiServer/Database/Migrations/20250712202608_SwitchedToPgArraysForPermissions.Designer.cs b/Moonlight.ApiServer/Database/Migrations/20250712202608_SwitchedToPgArraysForPermissions.Designer.cs new file mode 100644 index 00000000..fcf228a0 --- /dev/null +++ b/Moonlight.ApiServer/Database/Migrations/20250712202608_SwitchedToPgArraysForPermissions.Designer.cs @@ -0,0 +1,393 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Moonlight.ApiServer.Database; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Moonlight.ApiServer.Database.Migrations +{ + [DbContext(typeof(CoreDataContext))] + [Migration("20250712202608_SwitchedToPgArraysForPermissions")] + partial class SwitchedToPgArraysForPermissions + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireCounter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Value"); + + b.ToTable("HangfireCounter"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireHash", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Field") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Field"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireHash"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("InvocationData") + .IsRequired() + .HasColumnType("text"); + + b.Property("StateId") + .HasColumnType("bigint"); + + b.Property("StateName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("StateId"); + + b.HasIndex("StateName"); + + b.ToTable("HangfireJob"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("JobId", "Name"); + + b.ToTable("HangfireJobParameter"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireList", b => + { + b.Property("Key") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Position") + .HasColumnType("integer"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Key", "Position"); + + b.HasIndex("ExpireAt"); + + b.ToTable("HangfireList"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireLock", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("AcquiredAt") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.ToTable("HangfireLock"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FetchedAt") + .IsConcurrencyToken() + .HasColumnType("timestamp with time zone"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Queue") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.HasIndex("Queue", "FetchedAt"); + + b.ToTable("HangfireQueuedJob"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireServer", b => + { + b.Property("Id") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Heartbeat") + .HasColumnType("timestamp with time zone"); + + b.Property("Queues") + .IsRequired() + .HasColumnType("text"); + + b.Property("StartedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("WorkerCount") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Heartbeat"); + + b.ToTable("HangfireServer"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireSet", b => + { + b.Property("Key") + .HasMaxLength(100) + .HasColumnType("character varying(100)"); + + b.Property("Value") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("ExpireAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Score") + .HasColumnType("double precision"); + + b.HasKey("Key", "Value"); + + b.HasIndex("ExpireAt"); + + b.HasIndex("Key", "Score"); + + b.ToTable("HangfireSet"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Data") + .IsRequired() + .HasColumnType("text"); + + b.Property("JobId") + .HasColumnType("bigint"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property("Reason") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("JobId"); + + b.ToTable("HangfireState"); + }); + + modelBuilder.Entity("Moonlight.ApiServer.Database.Entities.ApiKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("ExpiresAt") + .HasColumnType("timestamp with time zone"); + + b.PrimitiveCollection("Permissions") + .IsRequired() + .HasColumnType("text[]"); + + b.HasKey("Id"); + + b.ToTable("Core_ApiKeys", (string)null); + }); + + modelBuilder.Entity("Moonlight.ApiServer.Database.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Email") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.PrimitiveCollection("Permissions") + .IsRequired() + .HasColumnType("text[]"); + + b.Property("TokenValidTimestamp") + .HasColumnType("timestamp with time zone"); + + b.Property("Username") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Core_Users", (string)null); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireState", "State") + .WithMany() + .HasForeignKey("StateId"); + + b.Navigation("State"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJobParameter", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("Parameters") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireQueuedJob", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("QueuedJobs") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireState", b => + { + b.HasOne("Hangfire.EntityFrameworkCore.HangfireJob", "Job") + .WithMany("States") + .HasForeignKey("JobId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Job"); + }); + + modelBuilder.Entity("Hangfire.EntityFrameworkCore.HangfireJob", b => + { + b.Navigation("Parameters"); + + b.Navigation("QueuedJobs"); + + b.Navigation("States"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Moonlight.ApiServer/Database/Migrations/20250712202608_SwitchedToPgArraysForPermissions.cs b/Moonlight.ApiServer/Database/Migrations/20250712202608_SwitchedToPgArraysForPermissions.cs new file mode 100644 index 00000000..887066c4 --- /dev/null +++ b/Moonlight.ApiServer/Database/Migrations/20250712202608_SwitchedToPgArraysForPermissions.cs @@ -0,0 +1,62 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Moonlight.ApiServer.Database.Migrations +{ + /// + public partial class SwitchedToPgArraysForPermissions : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "PermissionsJson", + table: "Core_Users"); + + migrationBuilder.DropColumn( + name: "PermissionsJson", + table: "Core_ApiKeys"); + + migrationBuilder.AddColumn( + name: "Permissions", + table: "Core_Users", + type: "text[]", + nullable: false, + defaultValue: new string[0]); + + migrationBuilder.AddColumn( + name: "Permissions", + table: "Core_ApiKeys", + type: "text[]", + nullable: false, + defaultValue: new string[0]); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "Permissions", + table: "Core_Users"); + + migrationBuilder.DropColumn( + name: "Permissions", + table: "Core_ApiKeys"); + + migrationBuilder.AddColumn( + name: "PermissionsJson", + table: "Core_Users", + type: "jsonb", + nullable: false, + defaultValue: ""); + + migrationBuilder.AddColumn( + name: "PermissionsJson", + table: "Core_ApiKeys", + type: "jsonb", + nullable: false, + defaultValue: ""); + } + } +} diff --git a/Moonlight.ApiServer/Database/Migrations/CoreDataContextModelSnapshot.cs b/Moonlight.ApiServer/Database/Migrations/CoreDataContextModelSnapshot.cs index f1945795..7935e606 100644 --- a/Moonlight.ApiServer/Database/Migrations/CoreDataContextModelSnapshot.cs +++ b/Moonlight.ApiServer/Database/Migrations/CoreDataContextModelSnapshot.cs @@ -17,7 +17,7 @@ namespace Moonlight.ApiServer.Database.Migrations { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "8.0.11") + .HasAnnotation("ProductVersion", "9.0.7") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); @@ -283,19 +283,19 @@ namespace Moonlight.ApiServer.Database.Migrations NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("CreatedAt") + b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("Description") .IsRequired() .HasColumnType("text"); - b.Property("ExpiresAt") + b.Property("ExpiresAt") .HasColumnType("timestamp with time zone"); - b.Property("PermissionsJson") + b.PrimitiveCollection("Permissions") .IsRequired() - .HasColumnType("jsonb"); + .HasColumnType("text[]"); b.HasKey("Id"); @@ -318,11 +318,11 @@ namespace Moonlight.ApiServer.Database.Migrations .IsRequired() .HasColumnType("text"); - b.Property("PermissionsJson") + b.PrimitiveCollection("Permissions") .IsRequired() - .HasColumnType("jsonb"); + .HasColumnType("text[]"); - b.Property("TokenValidTimestamp") + b.Property("TokenValidTimestamp") .HasColumnType("timestamp with time zone"); b.Property("Username") diff --git a/Moonlight.ApiServer/Http/Controllers/Admin/ApiKeys/ApiKeysController.cs b/Moonlight.ApiServer/Http/Controllers/Admin/ApiKeys/ApiKeysController.cs index 7eb1dadd..370ed26e 100644 --- a/Moonlight.ApiServer/Http/Controllers/Admin/ApiKeys/ApiKeysController.cs +++ b/Moonlight.ApiServer/Http/Controllers/Admin/ApiKeys/ApiKeysController.cs @@ -45,7 +45,7 @@ public class ApiKeysController : Controller .Select(x => new ApiKeyResponse() { Id = x.Id, - PermissionsJson = x.PermissionsJson, + Permissions = x.Permissions, Description = x.Description, ExpiresAt = x.ExpiresAt }) @@ -75,7 +75,7 @@ public class ApiKeysController : Controller return new ApiKeyResponse() { Id = apiKey.Id, - PermissionsJson = apiKey.PermissionsJson, + Permissions = apiKey.Permissions, Description = apiKey.Description, ExpiresAt = apiKey.ExpiresAt }; @@ -88,7 +88,7 @@ public class ApiKeysController : Controller var apiKey = new ApiKey() { Description = request.Description, - PermissionsJson = request.PermissionsJson, + Permissions = request.Permissions, ExpiresAt = request.ExpiresAt }; @@ -97,7 +97,7 @@ public class ApiKeysController : Controller var response = new CreateApiKeyResponse { Id = finalApiKey.Id, - PermissionsJson = finalApiKey.PermissionsJson, + Permissions = finalApiKey.Permissions, Description = finalApiKey.Description, ExpiresAt = finalApiKey.ExpiresAt, Secret = ApiKeyService.GenerateJwt(finalApiKey) @@ -125,7 +125,7 @@ public class ApiKeysController : Controller { Id = apiKey.Id, Description = apiKey.Description, - PermissionsJson = apiKey.PermissionsJson, + Permissions = apiKey.Permissions, ExpiresAt = apiKey.ExpiresAt }; } diff --git a/Moonlight.ApiServer/Http/Controllers/Admin/Sys/FilesController.cs b/Moonlight.ApiServer/Http/Controllers/Admin/Sys/FilesController.cs index fdec530c..ce81517d 100644 --- a/Moonlight.ApiServer/Http/Controllers/Admin/Sys/FilesController.cs +++ b/Moonlight.ApiServer/Http/Controllers/Admin/Sys/FilesController.cs @@ -17,8 +17,40 @@ namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys; public class FilesController : Controller { private readonly string BaseDirectory = "storage"; - private readonly long ChunkSize = ByteConverter.FromMegaBytes(20).Bytes; + private readonly long MaxChunkSize = ByteConverter.FromMegaBytes(20).Bytes; + [HttpPost("touch")] + public async Task CreateFile([FromQuery] string path) + { + var safePath = SanitizePath(path); + var physicalPath = Path.Combine(BaseDirectory, safePath); + + if (System.IO.File.Exists(physicalPath)) + throw new HttpApiException("A file already exists at that path", 400); + + if (Directory.Exists(path)) + throw new HttpApiException("A folder already exists at that path", 400); + + await using var fs = System.IO.File.Create(physicalPath); + fs.Close(); + } + + [HttpPost("mkdir")] + public Task CreateFolder([FromQuery] string path) + { + var safePath = SanitizePath(path); + var physicalPath = Path.Combine(BaseDirectory, safePath); + + if (Directory.Exists(path)) + throw new HttpApiException("A folder already exists at that path", 400); + + if (System.IO.File.Exists(physicalPath)) + throw new HttpApiException("A file already exists at that path", 400); + + Directory.CreateDirectory(physicalPath); + return Task.CompletedTask; + } + [HttpGet("list")] public Task List([FromQuery] string path) { @@ -38,7 +70,7 @@ public class FilesController : Controller Name = fi.Name, Size = fi.Length, CreatedAt = fi.CreationTimeUtc, - IsFile = true, + IsFolder = false, UpdatedAt = fi.LastWriteTimeUtc }); } @@ -55,7 +87,7 @@ public class FilesController : Controller Size = 0, CreatedAt = di.CreationTimeUtc, UpdatedAt = di.LastWriteTimeUtc, - IsFile = false + IsFolder = true }); } @@ -65,23 +97,23 @@ public class FilesController : Controller } [HttpPost("upload")] - public async Task Upload([FromQuery] string path, [FromQuery] long totalSize, [FromQuery] int chunkId) + public async Task Upload([FromQuery] string path, [FromQuery] long chunkSize, [FromQuery] long totalSize, [FromQuery] int chunkId) { if (Request.Form.Files.Count != 1) throw new HttpApiException("You need to provide exactly one file", 400); var file = Request.Form.Files[0]; - if (file.Length > ChunkSize) + if (file.Length > chunkSize) throw new HttpApiException("The provided data exceeds the chunk size limit", 400); - var chunks = totalSize / ChunkSize; - chunks += totalSize % ChunkSize > 0 ? 1 : 0; + var chunks = totalSize / chunkSize; + chunks += totalSize % chunkSize > 0 ? 1 : 0; if (chunkId > chunks) throw new HttpApiException("Invalid chunk id: Out of bounds", 400); - var positionToSkipTo = ChunkSize * chunkId; + var positionToSkipTo = chunkSize * chunkId; var safePath = SanitizePath(path); var physicalPath = Path.Combine(BaseDirectory, safePath); @@ -156,16 +188,6 @@ public class FilesController : Controller return Task.CompletedTask; } - [HttpPost("mkdir")] - public Task CreateDirectory([FromQuery] string path) - { - var safePath = SanitizePath(path); - var physicalPath = Path.Combine(BaseDirectory, safePath); - - Directory.CreateDirectory(physicalPath); - return Task.CompletedTask; - } - [HttpGet("download")] public async Task Download([FromQuery] string path) { @@ -431,5 +453,23 @@ public class FilesController : Controller #endregion private string SanitizePath(string path) - => path.Replace("..", ""); + { + if (string.IsNullOrWhiteSpace(path)) + return string.Empty; + + // Normalize separators + path = path.Replace('\\', '/'); + + // Remove ".." and "." + var parts = path.Split('/', StringSplitOptions.RemoveEmptyEntries) + .Where(part => part != ".." && part != "."); + + var sanitized = string.Join("/", parts); + + // Ensure it does not start with a slash + if (sanitized.StartsWith('/')) + sanitized = sanitized.TrimStart('/'); + + return sanitized; + } } \ No newline at end of file diff --git a/Moonlight.ApiServer/Http/Controllers/Admin/Sys/SystemController.cs b/Moonlight.ApiServer/Http/Controllers/Admin/Sys/SystemController.cs index eeadaf3c..a8883a4b 100644 --- a/Moonlight.ApiServer/Http/Controllers/Admin/Sys/SystemController.cs +++ b/Moonlight.ApiServer/Http/Controllers/Admin/Sys/SystemController.cs @@ -1,7 +1,5 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using MoonCore.Attributes; -using Moonlight.ApiServer.Interfaces; using Moonlight.ApiServer.Services; using Moonlight.Shared.Http.Responses.Admin.Sys; @@ -12,13 +10,10 @@ namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys; public class SystemController : Controller { private readonly ApplicationService ApplicationService; - private readonly IEnumerable DiagnoseProviders; - - - public SystemController(ApplicationService applicationService, IEnumerable diagnoseProviders) + + public SystemController(ApplicationService applicationService) { ApplicationService = applicationService; - DiagnoseProviders = diagnoseProviders; } [HttpGet] diff --git a/Moonlight.ApiServer/Http/Controllers/Admin/Users/UsersController.cs b/Moonlight.ApiServer/Http/Controllers/Admin/Users/UsersController.cs index 5dffef0c..495f1370 100644 --- a/Moonlight.ApiServer/Http/Controllers/Admin/Users/UsersController.cs +++ b/Moonlight.ApiServer/Http/Controllers/Admin/Users/UsersController.cs @@ -45,7 +45,7 @@ public class UsersController : Controller Id = x.Id, Email = x.Email, Username = x.Username, - PermissionsJson = x.PermissionsJson + Permissions = x.Permissions }) .ToArray(); @@ -75,7 +75,7 @@ public class UsersController : Controller Id = user.Id, Email = user.Email, Username = user.Username, - PermissionsJson = user.PermissionsJson + Permissions = user.Permissions }; } @@ -101,7 +101,7 @@ public class UsersController : Controller Email = request.Email, Username = request.Username, Password = hashedPassword, - PermissionsJson = request.PermissionsJson + Permissions = request.Permissions }; var finalUser = await UserRepository.Add(user); @@ -111,7 +111,7 @@ public class UsersController : Controller Id = finalUser.Id, Email = finalUser.Email, Username = finalUser.Username, - PermissionsJson = finalUser.PermissionsJson + Permissions = finalUser.Permissions }; } @@ -144,9 +144,9 @@ public class UsersController : Controller user.TokenValidTimestamp = DateTime.UtcNow; // Log out user after password change } - if (user.PermissionsJson != request.PermissionsJson) + if (request.Permissions.Any(x => !user.Permissions.Contains(x))) { - user.PermissionsJson = request.PermissionsJson; + user.Permissions = request.Permissions; user.TokenValidTimestamp = DateTime.UtcNow; // Log out user after permission change } @@ -160,7 +160,7 @@ public class UsersController : Controller Id = user.Id, Email = user.Email, Username = user.Username, - PermissionsJson = user.PermissionsJson + Permissions = user.Permissions }; } diff --git a/Moonlight.ApiServer/Http/Controllers/Auth/AuthController.cs b/Moonlight.ApiServer/Http/Controllers/Auth/AuthController.cs index a705fc24..61de0a4f 100644 --- a/Moonlight.ApiServer/Http/Controllers/Auth/AuthController.cs +++ b/Moonlight.ApiServer/Http/Controllers/Auth/AuthController.cs @@ -73,9 +73,6 @@ public class AuthController : Controller if (user == null) throw new HttpApiException("Unable to load user data", 500); - // - var permissions = JsonSerializer.Deserialize(user.PermissionsJson) ?? []; - // Generate token var securityTokenDescriptor = new SecurityTokenDescriptor() { @@ -90,7 +87,7 @@ public class AuthController : Controller }, { "permissions", - string.Join(";", permissions) + string.Join(";", user.Permissions) } }, SigningCredentials = new SigningCredentials( @@ -122,13 +119,11 @@ public class AuthController : Controller var userId = int.Parse(userIdClaim.Value); var user = await UserRepository.Get().FirstAsync(x => x.Id == userId); - var permissions = JsonSerializer.Deserialize(user.PermissionsJson) ?? []; - return new() { Email = user.Email, Username = user.Username, - Permissions = string.Join(";", permissions) + Permissions = user.Permissions }; } } \ No newline at end of file diff --git a/Moonlight.ApiServer/Http/Controllers/Frontend/FrontendPage.razor b/Moonlight.ApiServer/Http/Controllers/Frontend/FrontendPage.razor index 277bed24..f9f7adc3 100644 --- a/Moonlight.ApiServer/Http/Controllers/Frontend/FrontendPage.razor +++ b/Moonlight.ApiServer/Http/Controllers/Frontend/FrontendPage.razor @@ -1,6 +1,6 @@ @using Moonlight.Shared.Misc - + @@ -18,15 +18,15 @@ - +
-
-
+
+
diff --git a/Moonlight.ApiServer/Http/Controllers/OAuth2/OAuth2Controller.cs b/Moonlight.ApiServer/Http/Controllers/OAuth2/OAuth2Controller.cs index 14c3d3b0..50d359aa 100644 --- a/Moonlight.ApiServer/Http/Controllers/OAuth2/OAuth2Controller.cs +++ b/Moonlight.ApiServer/Http/Controllers/OAuth2/OAuth2Controller.cs @@ -291,7 +291,7 @@ public partial class OAuth2Controller : Controller var userCount = await UserRepository.Get().CountAsync(); if (userCount == 0) - user.PermissionsJson = "[\"*\"]"; + user.Permissions = ["*"]; } diff --git a/Moonlight.ApiServer/Implementations/Startup/CoreStartup.cs b/Moonlight.ApiServer/Implementations/Startup/CoreStartup.cs index a125946c..f041be1b 100644 --- a/Moonlight.ApiServer/Implementations/Startup/CoreStartup.cs +++ b/Moonlight.ApiServer/Implementations/Startup/CoreStartup.cs @@ -89,7 +89,7 @@ public class CoreStartup : IPluginStartup { Scripts = [ - "/_content/Moonlight.Client/js/moonlight.js", "/_content/Moonlight.Client/js/moonCore.js", + "/_content/Moonlight.Client/js/moonlight.js", "/_content/MoonCore.Blazor.FlyonUi/moonCore.js", "/_content/Moonlight.Client/ace/ace.js" ], Styles = ["/css/style.min.css"] diff --git a/Moonlight.ApiServer/Moonlight.ApiServer.csproj b/Moonlight.ApiServer/Moonlight.ApiServer.csproj index b84c8850..9209e3af 100644 --- a/Moonlight.ApiServer/Moonlight.ApiServer.csproj +++ b/Moonlight.ApiServer/Moonlight.ApiServer.csproj @@ -20,7 +20,7 @@ Moonlight.ApiServer - 2.1.1 + 2.1.2 Moonlight Panel A build of the api server for moonlight development https://github.com/Moonlight-Panel/Moonlight @@ -34,9 +34,9 @@ - + - + @@ -58,5 +58,6 @@ + \ No newline at end of file diff --git a/Moonlight.ApiServer/Properties/launchSettings.json b/Moonlight.ApiServer/Properties/launchSettings.json deleted file mode 100644 index 8c3160eb..00000000 --- a/Moonlight.ApiServer/Properties/launchSettings.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "http://localhost:5165", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development", - "HTTP_PROXY": "", - "HTTPS_PROXY": "" - }, - "hotReloadEnabled": true - }, - "WASM Debug": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "http://localhost:5165", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development", - "HTTP_PROXY": "", - "HTTPS_PROXY": "" - }, - "hotReloadEnabled": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}" - } - } -} \ No newline at end of file diff --git a/Moonlight.ApiServer/Services/ApiKeyService.cs b/Moonlight.ApiServer/Services/ApiKeyService.cs index 83adc200..72411ff5 100644 --- a/Moonlight.ApiServer/Services/ApiKeyService.cs +++ b/Moonlight.ApiServer/Services/ApiKeyService.cs @@ -20,13 +20,11 @@ public class ApiKeyService public string GenerateJwt(ApiKey apiKey) { - var permissions = JsonSerializer.Deserialize(apiKey.PermissionsJson) ?? []; - var jwtSecurityTokenHandler = new JwtSecurityTokenHandler(); var descriptor = new SecurityTokenDescriptor() { - Expires = apiKey.ExpiresAt, + Expires = apiKey.ExpiresAt.UtcDateTime, IssuedAt = DateTime.Now, NotBefore = DateTime.Now.AddMinutes(-1), Claims = new Dictionary() @@ -37,7 +35,7 @@ public class ApiKeyService }, { "permissions", - string.Join(";", permissions) + string.Join(";", apiKey.Permissions) } }, SigningCredentials = new SigningCredentials( diff --git a/Moonlight.Client.Runtime/Moonlight.Client.Runtime.csproj b/Moonlight.Client.Runtime/Moonlight.Client.Runtime.csproj index 54698be4..34411a77 100644 --- a/Moonlight.Client.Runtime/Moonlight.Client.Runtime.csproj +++ b/Moonlight.Client.Runtime/Moonlight.Client.Runtime.csproj @@ -12,8 +12,8 @@ - - + + @@ -50,6 +50,11 @@ styles Never + + true + styles + Never + diff --git a/Moonlight.Client.Runtime/Styles/additions/animations.css b/Moonlight.Client.Runtime/Styles/additions/animations.css deleted file mode 100644 index cabfea90..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/animations.css +++ /dev/null @@ -1,9 +0,0 @@ -@keyframes shimmer { - 0% { - background-position: 0 0 - } - - to { - background-position: -200% 0 - } -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/buttons.css b/Moonlight.Client.Runtime/Styles/additions/buttons.css deleted file mode 100644 index 7429cca8..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/buttons.css +++ /dev/null @@ -1,93 +0,0 @@ -/* Buttons */ - -.btn, -.btn-lg, -.btn-sm, -.btn-xs { - @apply cursor-pointer font-medium text-sm inline-flex items-center justify-center border border-transparent rounded-lg leading-5 shadow-sm transition active:scale-95; -} - -.btn { - @apply px-3 py-2; -} - -.btn-lg { - @apply px-4 py-3; -} - -.btn-sm { - @apply px-2.5 py-1.5; -} - -.btn-xs { - @apply px-2 py-0.5; -} - -/* Colors */ - -.btn-primary { - @apply bg-primary hover:bg-primary/90 focus-visible:outline-primary text-diffcolor; -} - -.btn-secondary { - @apply bg-secondary hover:bg-secondary/90 focus-visible:outline-secondary text-diffcolor; -} - -.btn-tertiary { - @apply bg-tertiary hover:bg-tertiary/90 focus-visible:outline-tertiary text-diffcolor; -} - -.btn-danger { - @apply bg-danger hover:bg-danger/90 focus-visible:outline-danger text-diffcolor; -} - -.btn-warning { - @apply bg-warning hover:bg-warning/90 focus-visible:outline-warning text-diffcolor; -} - -.btn-info { - @apply bg-info hover:bg-info/90 focus-visible:outline-info text-diffcolor; -} - -.btn-success { - @apply bg-success hover:bg-success/90 focus-visible:outline-success text-diffcolor; -} - -/* Disabled Buttons */ - -.btn:disabled, -.btn-lg:disabled, -.btn-sm:disabled, -.btn-xs:disabled { - @apply opacity-50 cursor-not-allowed pointer-events-none; -} - -/* Colors for Disabled States */ - -.btn-primary:disabled { - @apply bg-primary/80 text-gray-300; -} - -.btn-secondary:disabled { - @apply bg-secondary/80 text-gray-400; -} - -.btn-tertiary:disabled { - @apply bg-tertiary/80 text-gray-300; -} - -.btn-danger:disabled { - @apply bg-danger/80 text-gray-300; -} - -.btn-warning:disabled { - @apply bg-warning/80 text-gray-400; -} - -.btn-info:disabled { - @apply bg-info/80 text-gray-300; -} - -.btn-success:disabled { - @apply bg-success/80 text-gray-300; -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/cards.css b/Moonlight.Client.Runtime/Styles/additions/cards.css deleted file mode 100644 index d8ff26f9..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/cards.css +++ /dev/null @@ -1,23 +0,0 @@ -.card { - @apply flex flex-col bg-gray-800 shadow-sm rounded-xl; -} - -.card-header { - @apply p-5; -} - -.card-header:has(+ .card-body) { - @apply pb-0; -} - -.card-title { - @apply text-2xl font-semibold text-white; -} - -.card-body { - @apply p-5 text-gray-200; -} - -.card-footer { - @apply p-5; -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/fonts.css b/Moonlight.Client.Runtime/Styles/additions/fonts.css deleted file mode 100644 index 30676ad8..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/fonts.css +++ /dev/null @@ -1,8 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=fallback') layer(base); -@import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&display=swap') layer(base); -@import url("https://cdn.jsdelivr.net/npm/lucide-static/font/lucide.css") layer(base); - -@theme { - --font-inter: "Inter", var(--font-sans); - --font-scp: "Source Code Pro", var(--font-mono); -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/forms.css b/Moonlight.Client.Runtime/Styles/additions/forms.css deleted file mode 100644 index 5b762902..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/forms.css +++ /dev/null @@ -1,77 +0,0 @@ -/* Forms */ -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-results-button, -input[type="search"]::-webkit-search-results-decoration { - -webkit-appearance: none; -} - -.form-input, -.form-textarea, -.form-multiselect, -.form-select, -.form-checkbox, -.form-radio { - @apply bg-gray-700/60 border-2 focus:ring-0 focus:ring-offset-0 disabled:bg-gray-700/30 disabled:border-gray-700 disabled:hover:border-gray-700; -} - -.form-checkbox { - @apply rounded; -} - -.form-input, -.form-textarea, -.form-multiselect, -.form-select { - @apply text-sm text-gray-100 leading-5 py-2 px-3 border-gray-700 focus:border-primary shadow-sm rounded-lg; -} - -.form-input, -.form-textarea { - @apply placeholder-gray-700; -} - -.form-select { - @apply pr-10; -} - -.form-checkbox, -.form-radio { - @apply text-primary checked:bg-primary checked:border-transparent border border-gray-700/60 focus:border-primary/50; -} - -/* Switch element */ -.form-switch { - @apply relative select-none; - width: 44px; -} - -.form-switch label { - @apply block overflow-hidden cursor-pointer h-6 rounded-full; -} - -.form-switch label > span:first-child { - @apply absolute block rounded-full; - width: 20px; - height: 20px; - top: 2px; - left: 2px; - right: 50%; - transition: all .15s ease-out; -} - -.form-switch input[type="checkbox"]:checked + label { - @apply bg-primary; -} - -.form-switch input[type="checkbox"]:checked + label > span:first-child { - left: 22px; -} - -.form-switch input[type="checkbox"]:disabled + label { - @apply cursor-not-allowed bg-gray-700/20 border border-gray-700/60; -} - -.form-switch input[type="checkbox"]:disabled + label > span:first-child { - @apply bg-gray-600; -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/loaders.css b/Moonlight.Client.Runtime/Styles/additions/loaders.css deleted file mode 100644 index 3c40c729..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/loaders.css +++ /dev/null @@ -1,28 +0,0 @@ -.loader-spinner { - width: 2.5rem; - height: 2.5rem; - border-radius: 50%; - position: relative; - animation: loader-spinner-rotate 1s linear infinite -} -.loader-spinner::before { - content: ""; - box-sizing: border-box; - position: absolute; - inset: 0px; - border-radius: 50%; - border: 3px solid #FFF; - animation: loader-spinner-prixClipFix 2s linear infinite ; -} - -@keyframes loader-spinner-rotate { - 100% {transform: rotate(360deg)} -} - -@keyframes loader-spinner-prixClipFix { - 0% {clip-path:polygon(50% 50%,0 0,0 0,0 0,0 0,0 0)} - 25% {clip-path:polygon(50% 50%,0 0,100% 0,100% 0,100% 0,100% 0)} - 50% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%)} - 75% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 100%)} - 100% {clip-path:polygon(50% 50%,0 0,100% 0,100% 100%,0 100%,0 0)} -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/progress.css b/Moonlight.Client.Runtime/Styles/additions/progress.css deleted file mode 100644 index 3044143e..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/progress.css +++ /dev/null @@ -1,25 +0,0 @@ -.progress { - @apply bg-gray-800 rounded-full overflow-hidden; -} - -.progress-bar { - @apply bg-primary rounded-full h-3; - transition: width 0.6s ease; -} - -.progress-bar.progress-intermediate { - animation: progress-animation 1s infinite linear; - transform-origin: 0 50% -} - -@keyframes progress-animation { - 0% { - transform: translateX(0) scaleX(0); - } - 40% { - transform: translateX(0) scaleX(0.4); - } - 100% { - transform: translateX(100%) scaleX(0.5); - } -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/scrollbar.css b/Moonlight.Client.Runtime/Styles/additions/scrollbar.css deleted file mode 100644 index ac98733e..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/scrollbar.css +++ /dev/null @@ -1,9 +0,0 @@ -* { - scrollbar-width: thin; - scrollbar-color: #64748b transparent; -} - -.no-scrollbar { - scrollbar-width: none; - scrollbar-color: transparent transparent; -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/tabs.css b/Moonlight.Client.Runtime/Styles/additions/tabs.css deleted file mode 100644 index ab6568d8..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/tabs.css +++ /dev/null @@ -1,11 +0,0 @@ -.tabs { - @apply flex gap-x-1 bg-gray-800 rounded-lg transition p-1; -} - -.tabs .tabs-segment { - @apply cursor-pointer font-medium text-sm inline-flex items-center justify-center border border-transparent rounded-lg leading-5 text-gray-300 hover:text-primary py-1.5 px-3.5; -} - -.tabs .tabs-segment-active { - @apply bg-primary hover:bg-primary/90 focus-visible:outline-primary text-diffcolor hover:text-diffcolor; -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/theme.css b/Moonlight.Client.Runtime/Styles/additions/theme.css deleted file mode 100644 index 0b85f02a..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/theme.css +++ /dev/null @@ -1,46 +0,0 @@ -@theme { - /* Color Variables */ - - --color-primary: oklch(.511 .262 276.966); - --color-secondary: rgb(31, 41, 55); - --color-tertiary: oklch(.627 .265 303.9); - --color-warning: oklch(.828 .189 84.429); - --color-danger: oklch(.586 .253 17.585); - --color-success: oklch(.627 .194 149.214); - --color-info: oklch(.546 .245 262.881); - - /* Gray */ - - --color-gray-50: #e8eefc; - --color-gray-100: rgb(249 249 249); - --color-gray-200: rgb(241 241 242); - --color-gray-300: rgb(219 223 233); - --color-gray-400: rgb(181 181 195); - --color-gray-500: rgb(153 161 183); - --color-gray-600: rgb(112 121 147); - --color-gray-700: rgb(68 78 107); - --color-gray-750: rgb(41 50 73); - --color-gray-800: rgb(28 36 56); - --color-gray-900: rgb(17 23 33); - --color-gray-950: rgb(14 18 28); - -/* - --color-gray-50: #e8eefc; - --color-gray-100: #ccd6ee; - --color-gray-200: #bec9e1; - --color-gray-300: #a3b2d5; - --color-gray-400: #7d91bb; - --color-gray-500: #5f719d; - --color-gray-600: #1a2640; - --color-gray-700: #101a2e; - --color-gray-750: #0f1729; - --color-gray-800: #0c1221; - --color-gray-900: #050a16; - --color-gray-950: #03060e; - */ - /* Full Colors */ - - --color-white: rgb(255 255 255); - --color-black: rgb(0 0 0); - --color-diffcolor: rgb(var(--color-white)); -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/additions/theme.white.css b/Moonlight.Client.Runtime/Styles/additions/theme.white.css deleted file mode 100644 index a28f2554..00000000 --- a/Moonlight.Client.Runtime/Styles/additions/theme.white.css +++ /dev/null @@ -1,23 +0,0 @@ -@theme { - /* Gray (Inverted for White Mode) */ - - --color-gray-100: rgb(14 18 28); /* Formerly gray-950 */ - --color-gray-200: rgb(17 23 33); /* Formerly gray-900 */ - --color-gray-300: rgb(28 36 56); /* Formerly gray-800 */ - --color-gray-400: rgb(41 50 73); /* Formerly gray-750 */ - --color-gray-500: rgb(68 78 107); /* Formerly gray-700 */ - --color-gray-600: rgb(112 121 147); /* Formerly gray-600 */ - --color-gray-700: rgb(153 161 183); /* Formerly gray-500 */ - --color-gray-750: rgb(181 181 195); /* Formerly gray-400 */ - --color-gray-800: rgb(219 223 233); /* Formerly gray-300 */ - --color-gray-900: rgb(241 241 242); /* Formerly gray-200 */ - --color-gray-950: rgb(249 249 249); /* Formerly gray-100 */ - - /* Full Colors (Inverted) */ - - --color-white: rgb(0 0 0); /* Inverted to black */ - --color-black: rgb(255 255 255); /* Inverted to white */ - - /* Special light mode stuff */ - --color-diffcolor: rgb(255 255 255); -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/exports.css b/Moonlight.Client.Runtime/Styles/exports.css deleted file mode 100644 index b1a4106a..00000000 --- a/Moonlight.Client.Runtime/Styles/exports.css +++ /dev/null @@ -1,26 +0,0 @@ -@import "./additions/fonts.css"; -@import "./additions/theme.css" layer(theme); - -/* @import "./additions/theme.white.css"; */ - -@import "./additions/buttons.css" layer(components); -@import "./additions/cards.css" layer(components); -@import "./additions/forms.css" layer(components); -@import "./additions/progress.css" layer(components); -@import "./additions/scrollbar.css" layer(components); -@import "./additions/loaders.css" layer(components); -@import "./additions/tabs.css" layer(components); - -@source "./mappings/*.map"; - -#blazor-error-ui { - display: none; -} - -#blazor-loader-label:after { - content: var(--blazor-load-percentage-text, "Loading"); -} - -#blazor-loader-progress { - width: var(--blazor-load-percentage, 0%); -} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/extract-classes.js b/Moonlight.Client.Runtime/Styles/extract-classes.js new file mode 100644 index 00000000..db8d9a62 --- /dev/null +++ b/Moonlight.Client.Runtime/Styles/extract-classes.js @@ -0,0 +1,30 @@ +// extract-classes.js +const fs = require('fs'); + +module.exports = (opts = {}) => { + const classSet = new Set(); + + return { + postcssPlugin: 'extract-tailwind-classes', + Rule(rule) { + const selectorParser = require('postcss-selector-parser'); + selectorParser(selectors => { + selectors.walkClasses(node => { + classSet.add(node.value); + }); + }).processSync(rule.selector); + }, + OnceExit() { + const classArray = Array.from(classSet).sort(); + + if (!fs.existsSync("./mappings")){ + fs.mkdirSync("./mappings"); + } + + fs.writeFileSync('./mappings/mooncore.map', classArray.join('\n')); + console.log(`✅ Extracted ${classArray.length} Tailwind classes to tailwind-classes.txt`); + } + }; +}; + +module.exports.postcss = true; \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/mappings/mooncore.map b/Moonlight.Client.Runtime/Styles/mappings/mooncore.map old mode 100644 new mode 100755 index 3f504924..e51bbd7d --- a/Moonlight.Client.Runtime/Styles/mappings/mooncore.map +++ b/Moonlight.Client.Runtime/Styles/mappings/mooncore.map @@ -1,580 +1,513 @@ -[ - "btn", - "btn-lg", - "btn-sm", - "btn-xs", - "1))", - "1));", - "btn", - "btn-lg", - "btn-sm", - "5);", - "5);", - "btn-xs", - "5);", - "btn-primary", - "511", - "262", - "966)", - "btn-secondary", - "btn-tertiary", - "627", - "265", - "9)", - "btn-danger", - "586", - "253", - "585)", - "btn-warning", - "828", - "189", - "429)", - "btn-info", - "546", - "245", - "881)", - "btn-success", - "627", - "194", - "214)", - "btn:disabled", - "btn-lg:disabled", - "btn-sm:disabled", - "btn-xs:disabled", - "btn-primary:disabled", - "511", - "262", - "966)", - "btn-secondary:disabled", - "btn-tertiary:disabled", - "627", - "265", - "9)", - "btn-danger:disabled", - "586", - "253", - "585)", - "btn-warning:disabled", - "828", - "189", - "429)", - "btn-info:disabled", - "546", - "245", - "881)", - "btn-success:disabled", - "627", - "194", - "214)", - "card", - "1))", - "1));", - "card-header", - "card-header:has(\u002B", - "card-body)", - "card-title", - "card-body", - "card-footer", - "form-input", - "form-textarea", - "form-multiselect", - "form-select", - "form-checkbox", - "form-radio", - "form-checkbox", - "25rem;", - "form-input", - "form-textarea", - "form-multiselect", - "form-select", - "1))", - "1));", - "form-input", - "form-textarea", - "form-select", - "form-checkbox", - "form-radio", - "511", - "262", - "966)", - "form-switch", - "form-switch", - "form-switch", - "15s", - "form-switch", - "form-switch", - "form-switch", - "form-switch", - "progress", - "progress-bar", - "6s", - "progress-bar.progress-intermediate", - "4);", - "5);", - "no-scrollbar", - "loader-spinner", - "5rem;", - "5rem;", - "loader-spinner::before", - "tabs", - "tabs", - "tabs-segment", - "5);", - "5);", - "tabs", - "tabs-segment-active", - "511", - "262", - "966)", - "pointer-events-auto", - "pointer-events-none", - "sr-only", - "absolute", - "fixed", - "relative", - "static", - "inset-0", - "inset-y-0", - "inset-y-2", - "right-auto", - "bottom-0", - "bottom-full", - "-left-4", - "left-0", - "left-1/2", - "left-auto", - "isolate", - "z-10", - "z-40", - "z-50", - "col-span-1", - "col-span-2", - "col-span-3", - "-m-3", - "m-1", - "m-3", - "m-10", - "mx-0.5", - "5);", - "mx-auto", - "my-1", - "my-3", - "my-5", - "my-8", - "ms-0.5", - "5);", - "ms-1", - "ms-2", - "ms-3", - "me-1", - "me-2", - "me-2.5", - "5);", - "me-3", - "mt-1", - "mt-2", - "mt-2.5", - "5);", - "mt-3", - "mt-4", - "mt-5", - "mt-6", - "mt-8", - "mt-10", - "mt-auto", - "mr-2", - "mr-4", - "mb-1", - "mb-2", - "mb-3", - "mb-4", - "mb-5", - "mb-6", - "mb-8", - "-ml-4", - "ml-2", - "ml-3", - "ml-4", - "ml-auto", - "block", - "flex", - "grid", - "hidden", - "inline", - "inline-block", - "inline-flex", - "inline-grid", - "h-4", - "h-5", - "h-8", - "h-10", - "h-12", - "h-20", - "h-64", - "h-[20vh]", - "h-full", - "h-screen", - "max-h-56", - "max-h-60", - "min-h-0", - "min-h-full", - "min-h-svh", - "w-0", - "w-0.5", - "5);", - "w-4", - "w-5", - "w-8", - "w-10", - "w-12", - "w-20", - "w-24", - "w-32", - "w-40", - "w-64", - "w-full", - "w-screen", - "max-w-2xl", - "max-w-3xl", - "max-w-7xl", - "max-w-80", - "max-w-lg", - "max-w-sm", - "max-w-xl", - "min-w-0", - "min-w-60", - "flex-1", - "flex-shrink-0", - "shrink-0", - "flex-grow", - "grow", - "table-auto", - "-translate-x-1/2", - "-translate-x-full", - "translate-x-0", - "translate-y-0", - "translate-y-2", - "transform", - "animate-spin", - "cursor-default", - "cursor-none", - "cursor-not-allowed", - "cursor-pointer", - "list-disc", - "grid-flow-col", - "grid-cols-1", - "grid-cols-2", - "grid-cols-3", - "grid-cols-4", - "grid-cols-6", - "grid-cols-7", - "grid-cols-12", - "flex-col", - "flex-row", - "flex-wrap", - "items-center", - "items-end", - "items-start", - "justify-between", - "justify-center", - "justify-end", - "justify-start", - "justify-stretch", - "gap-0.5", - "5);", - "gap-1.5", - "5);", - "gap-2", - "gap-3", - "gap-4", - "gap-5", - "gap-6", - "gap-8", - "space-y-1", - "space-y-2", - "space-y-3", - "space-y-4", - "space-y-6", - "space-y-8", - "gap-x-2", - "space-x-0.5", - "5)", - "5)", - "space-x-1", - "space-x-2", - "space-x-5", - "gap-y-2", - "gap-y-3", - "gap-y-5", - "divide-y", - "divide-gray-700/60", - "truncate", - "overflow-auto", - "overflow-hidden", - "overflow-x-auto", - "overflow-y-auto", - "rounded", - "25rem;", - "rounded-full", - "rounded-lg", - "rounded-md", - "rounded-t-lg", - "rounded-b-lg", - "border", - "border-0", - "border-2", - "border-t", - "border-b", - "border-dashed", - "border-none", - "border-gray-600", - "border-gray-700", - "border-gray-700/60", - "border-red-600", - "border-transparent", - "border-white/5", - "bg-black/30", - "bg-danger", - "bg-gray-50", - "bg-gray-100", - "bg-gray-200", - "bg-gray-300", - "bg-gray-400", - "bg-gray-500", - "bg-gray-600", - "bg-gray-700", - "bg-gray-700/50", - "bg-gray-700/60", - "bg-gray-750", - "bg-gray-800", - "bg-gray-900", - "bg-gray-900/75", - "bg-gray-950", - "bg-indigo-600", - "bg-info", - "bg-primary", - "bg-red-600", - "bg-success", - "bg-transparent", - "bg-warning", - "bg-white", - "bg-white/5", - "bg-gradient-to-t", - "from-gray-700", - "from-primary", - "to-gray-800", - "to-primary", - "fill-current", - "fill-primary", - "p-0", - "p-1", - "p-2", - "p-3", - "p-4", - "p-5", - "p-6", - "px-1", - "px-2", - "px-3", - "px-4", - "px-5", - "px-6", - "py-1", - "py-1.5", - "5);", - "py-2", - "py-2.5", - "5);", - "py-3", - "py-6", - "py-8", - "py-12", - "ps-1", - "pt-0.5", - "5);", - "pt-3", - "pt-5", - "pr-3", - "pr-8", - "pb-4", - "pb-6", - "pl-3", - "pl-5", - "pl-9", - "pl-12", - "text-center", - "text-left", - "align-middle", - "font-inter", - "text-2xl", - "text-3xl", - "text-4xl", - "text-base", - "text-base/6", - "text-lg", - "text-sm", - "text-sm/5", - "text-xl", - "text-xs", - "text-xs/5", - "leading-6", - "leading-9", - "font-bold", - "font-medium", - "font-normal", - "font-semibold", - "tracking-tight", - "text-danger", - "text-diffcolor", - "text-gray-100", - "text-gray-200", - "text-gray-300", - "text-gray-400", - "text-gray-500", - "text-gray-600", - "text-gray-800", - "text-green-500", - "text-info", - "text-primary", - "text-red-500", - "text-success", - "text-tertiary", - "text-warning", - "text-white", - "uppercase", - "italic", - "underline", - "placeholder-gray-500", - "opacity-0", - "opacity-100", - "shadow", - "1))", - "1));", - "shadow-lg", - "1))", - "1));", - "shadow-none", - "shadow-sm", - "1))", - "1));", - "shadow-xl", - "1))", - "1));", - "shadow-xs", - "05));", - "ring-1", - "ring-black", - "ring-white/10", - "filter", - "transition", - "transition-all", - "transition-opacity", - "duration-200", - "duration-300", - "ease-in-out", - "ease-linear", - "ease-out", - "select-none", - "group-hover:text-gray-500", - "group):hover", - "hover:border-gray-500", - "hover:bg-gray-600", - "hover:bg-gray-700", - "hover:bg-indigo-500", - "hover:bg-primary", - "hover:bg-red-500", - "hover:bg-white/5", - "hover:text-diffcolor", - "hover:text-gray-100", - "hover:text-gray-500", - "hover:text-white", - "focus:ring-0", - "focus:ring-2", - "focus:ring-indigo-500", - "focus:ring-offset-0", - "focus:ring-offset-2", - "focus:outline-none", - "focus-visible:outline", - "focus-visible:outline-2", - "focus-visible:outline-offset-2", - "focus-visible:outline-indigo-600", - "focus-visible:outline-red-600", - "disabled:cursor-not-allowed", - "disabled:border-gray-200", - "disabled:border-gray-700", - "disabled:bg-gray-100", - "disabled:bg-gray-800", - "disabled:text-gray-400", - "disabled:text-gray-600", - "max-lg:hidden", - "max-lg:flex-col", - "sm:mx-auto", - "sm:mt-5", - "sm:mt-6", - "sm:mb-0", - "sm:block", - "sm:flex", - "sm:w-full", - "sm:max-w-2xl", - "sm:max-w-3xl", - "sm:max-w-4xl", - "sm:max-w-5xl", - "sm:max-w-6xl", - "sm:max-w-7xl", - "sm:max-w-[480px]", - "sm:max-w-lg", - "sm:max-w-md", - "sm:max-w-xl", - "sm:auto-cols-max", - "sm:items-center", - "sm:items-end", - "sm:justify-between", - "sm:justify-end", - "sm:rounded-lg", - "sm:p-0", - "sm:p-6", - "sm:px-6", - "sm:px-12", - "sm:py-2", - "sm:pb-4", - "sm:text-sm", - "sm:text-sm/5", - "md:ms-2", - "md:table-cell", - "md:h-[40vh]", - "md:grid-cols-2", - "md:grid-cols-3", - "md:flex-row", - "md:items-center", - "md:space-y-0", - "md:gap-x-5", - "md:space-x-2", - "md:gap-y-0", - "md:text-3xl", - "lg:hidden", - "lg:min-w-0", - "lg:rounded-lg", - "lg:bg-gray-900/80", - "lg:bg-gray-950/80", - "lg:p-10", - "lg:px-8", - "lg:pt-5", - "lg:pr-3.5", - "5);", - "lg:pb-5", - "lg:pl-64", - "lg:shadow-xs", - "05));", - "lg:ring-1", - "lg:ring-white/10", - "dark:bg-gray-700", - "dark:text-gray-100", - "dark:text-gray-400", - "dark:text-gray-500", - "dark:group-hover:text-gray-400", - "group):hover", - "dark:disabled:border-gray-700", - "dark:disabled:bg-gray-800", - "dark:disabled:text-gray-600", - "dark:disabled:placeholder:text-gray-600" -] \ No newline at end of file +!bg-base-100 +!border-base-content/40 +!border-none +!flex +!font-medium +!font-semibold +!h-2.5 +!justify-between +!me-1.5 +!ms-auto +!px-2.5 +!rounded-full +!text-sm +!w-2.5 +*:[grid-area:1/1] +*:first:rounded-tl-lg +*:last:rounded-tr-lg +-left-4 +-ml-4 +-translate-x-full +-translate-y-1/2 +absolute +accordion +accordion-bordered +accordion-toggle +active +active-tab:bg-primary +active-tab:text-base-content +advance-select-menu +advance-select-option +advance-select-tag +advance-select-toggle +alert +alert-error +alert-outline +alert-soft +align-bottom +align-middle +animate-bounce +animate-ping +aria-[current='page']:text-bg-soft-primary +avatar +avatar-away-bottom +avatar-away-top +avatar-busy-bottom +avatar-busy-top +avatar-offline-bottom +avatar-offline-top +avatar-online-bottom +avatar-online-top +avatar-placeholder +badge +badge-error +badge-info +badge-outline +badge-primary +badge-soft +badge-success +bg-background +bg-background/60 +bg-base-100 +bg-base-150 +bg-base-200 +bg-base-200/50 +bg-base-300 +bg-base-300/45 +bg-base-300/50 +bg-base-300/60 +bg-error +bg-info +bg-primary +bg-primary/5 +bg-success +bg-transparent +bg-warning +block +blur +border +border-0 +border-2 +border-b +border-base-content +border-base-content/20 +border-base-content/40 +border-base-content/5 +border-dashed +border-t +border-transparent +bottom-0 +bottom-full +break-words +btn +btn-accent +btn-active +btn-circle +btn-disabled +btn-error +btn-info +btn-outline +btn-primary +btn-secondary +btn-sm +btn-soft +btn-square +btn-success +btn-text +btn-warning +card +card-alert +card-body +card-border +card-footer +card-header +card-title +carousel +carousel-body +carousel-next +carousel-prev +carousel-slide +chat +chat-avatar +chat-bubble +chat-footer +chat-header +chat-receiver +chat-sender +checkbox +checkbox-primary +checkbox-xs +col-span-1 +collapse +combo-box-selected:block +combo-box-selected:dropdown-active +complete +container +contents +cursor-default +cursor-not-allowed +cursor-pointer +diff +disabled +divide-base-150/60 +divide-y +drop-shadow +dropdown +dropdown-disabled +dropdown-item +dropdown-menu +dropdown-open:opacity-100 +dropdown-open:rotate-180 +dropdown-toggle +duration-300 +duration-500 +ease-in-out +ease-linear +end-3 +file-upload-complete:progress-success +fill-black +filter +filter-reset +fixed +flex +flex-1 +flex-col +flex-grow +flex-nowrap +flex-row +flex-shrink-0 +flex-wrap +focus-visible:outline-none +focus-within:border-primary +focus:border-primary +focus:outline-1 +focus:outline-none +focus:outline-primary +focus:ring-0 +font-bold +font-inter +font-medium +font-normal +font-semibold +gap-0.5 +gap-1 +gap-1.5 +gap-2 +gap-3 +gap-4 +gap-5 +gap-6 +gap-x-1 +gap-x-2 +gap-x-3 +gap-y-1 +gap-y-3 +grid +grid-cols-1 +grid-flow-col +grow +grow-0 +h-12 +h-2 +h-32 +h-64 +h-8 +h-auto +h-full +h-screen +helper-text +hidden +hover:bg-primary/5 +hover:bg-transparent +hover:text-base-content +hover:text-base-content/60 +hover:text-primary +image-full +inline +inline-block +inline-flex +inline-grid +input +input-floating +input-floating-label +input-lg +input-md +input-sm +input-xl +inset-0 +inset-y-0 +inset-y-2 +invisible +is-invalid +is-valid +isolate +italic +items-center +items-end +items-start +join +join-item +justify-between +justify-center +justify-end +justify-start +justify-stretch +label-text +leading-3 +leading-3.5 +leading-6 +left-0 +lg:bg-base-100/20 +lg:flex +lg:gap-y-0 +lg:grid-cols-2 +lg:hidden +lg:justify-end +lg:justify-start +lg:min-w-0 +lg:p-10 +lg:pb-5 +lg:pl-64 +lg:pr-3.5 +lg:pt-5 +lg:ring-1 +lg:ring-base-content/10 +lg:rounded-lg +lg:shadow-xs +list-disc +list-inside +loading +loading-lg +loading-sm +loading-spinner +loading-xl +loading-xs +lowercase +m-10 +mask +max-lg:flex-col +max-lg:hidden +max-w-7xl +max-w-80 +max-w-full +max-w-lg +max-w-sm +max-w-xl +mb-0.5 +mb-1 +mb-2 +mb-3 +mb-4 +mb-5 +md:table-cell +md:text-3xl +me-1 +me-1.5 +me-2 +me-5 +menu +menu-active +menu-disabled +menu-dropdown +menu-dropdown-show +menu-focus +menu-horizontal +menu-title +min-h-0 +min-h-svh +min-w-0 +min-w-28 +min-w-48 +min-w-60 +min-w-[100px] +ml-3 +ml-4 +modal +modal-content +modal-dialog +modal-middle +modal-title +mr-4 +ms-1 +ms-2 +ms-3 +mt-1 +mt-1.5 +mt-10 +mt-12 +mt-2 +mt-2.5 +mt-3 +mt-4 +mt-5 +mt-8 +mx-1 +mx-auto +my-3 +my-auto +opacity-0 +opacity-100 +open +origin-top-left +outline +outline-0 +overflow-hidden +overflow-x-auto +overflow-y-auto +overlay-open:duration-50 +overlay-open:opacity-100 +p-0.5 +p-1 +p-2 +p-3 +p-4 +p-5 +p-6 +p-8 +pin-input +pin-input-underline +placeholder-base-content/60 +pointer-events-auto +pointer-events-none +progress +progress-bar +progress-indeterminate +progress-primary +pt-0.5 +pt-3 +px-1.5 +px-2 +px-3 +px-4 +px-5 +py-0.5 +py-1.5 +py-2 +py-2.5 +py-6 +radio +range +relative +resize +ring-0 +ring-1 +ring-white/10 +rounded-box +rounded-field +rounded-full +rounded-lg +rounded-md +rounded-t-lg +row-active +row-hover +rtl:!mr-0 +select +select-disabled:opacity-40 +select-disabled:pointer-events-none +select-floating +select-floating-label +selected +selected:select-active +shadow-base-300/20 +shadow-lg +shadow-xs +shrink-0 +size-10 +size-4 +size-5 +size-8 +skeleton +skeleton-animated +sm:auto-cols-max +sm:flex +sm:items-center +sm:items-end +sm:justify-between +sm:justify-end +sm:max-w-2xl +sm:max-w-3xl +sm:max-w-4xl +sm:max-w-5xl +sm:max-w-6xl +sm:max-w-7xl +sm:max-w-lg +sm:max-w-md +sm:max-w-xl +sm:mb-0 +sm:mt-5 +sm:mt-6 +sm:p-6 +sm:py-2 +sm:text-sm/5 +space-x-1 +space-y-1 +space-y-4 +sr-only +static +status +status-error +sticky +switch +tab +tab-active +table +table-pin-cols +table-pin-rows +tabs +tabs-bordered +tabs-lg +tabs-lifted +tabs-md +tabs-sm +tabs-xl +tabs-xs +text-2xl +text-4xl +text-accent +text-base +text-base-content +text-base-content/40 +text-base-content/50 +text-base-content/60 +text-base-content/70 +text-base-content/80 +text-base/6 +text-center +text-error +text-error-content +text-gray-400 +text-info +text-info-content +text-left +text-lg +text-primary +text-primary-content +text-sm +text-sm/5 +text-success +text-success-content +text-warning +text-warning-content +text-xl +text-xs +text-xs/5 +textarea +textarea-floating +textarea-floating-label +theme-controller +tooltip +tooltip-content +top-0 +top-1/2 +top-full +transform +transition +transition-all +transition-opacity +translate-x-0 +truncate +underline +uppercase +validate +w-0 +w-0.5 +w-12 +w-4 +w-56 +w-64 +w-fit +w-full +whitespace-nowrap +z-10 +z-40 +z-50 \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/package-lock.json b/Moonlight.Client.Runtime/Styles/package-lock.json index 5f77706a..5fedb79c 100644 --- a/Moonlight.Client.Runtime/Styles/package-lock.json +++ b/Moonlight.Client.Runtime/Styles/package-lock.json @@ -1,362 +1,155 @@ { - "name": "Styles", + "name": "styles", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { + "name": "styles", + "version": "1.0.0", + "license": "ISC", "dependencies": { - "@tailwindcss/cli": "^4.1.4", - "@tailwindcss/forms": "^0.5.10", - "tailwindcss": "^4.1.4", - "xml2js": "^0.6.2" + "@tailwindcss/postcss": "^4.1.11", + "flyonui": "^2.2.0", + "postcss": "^8.5.6", + "postcss-cli": "^11.0.1", + "postcss-selector-parser": "^7.1.0", + "tailwindcss": "^4.1.11" + }, + "devDependencies": {} + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "hasInstallScript": true, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" + "node": ">=6.0.0" } }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/cli": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.5.tgz", - "integrity": "sha512-Kr567rDwDjY1VUnfqh5/+DCpRf4B8lPs5O9flP4kri7n4AM2aubrIxGSh5GN8s+awUKw/U4+6kNlEnZbBNfUeg==", + "node_modules/@floating-ui/core": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", + "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", "dependencies": { - "@parcel/watcher": "^2.5.1", - "@tailwindcss/node": "4.1.5", - "@tailwindcss/oxide": "4.1.5", - "enhanced-resolve": "^5.18.1", - "mri": "^1.2.0", - "picocolors": "^1.1.1", - "tailwindcss": "4.1.5" - }, - "bin": { - "tailwindcss": "dist/index.mjs" + "@floating-ui/utils": "^0.2.10" } }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", + "node_modules/@floating-ui/dom": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", + "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", "dependencies": { - "mini-svg-data-uri": "^1.2.3" + "@floating-ui/core": "^1.7.2", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dependencies": { + "minipass": "^7.0.4" }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@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==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@tailwindcss/node": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", - "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz", + "integrity": "sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==", "dependencies": { + "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", - "lightningcss": "1.29.2", - "tailwindcss": "4.1.5" + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", - "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz", + "integrity": "sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-x64": "4.1.5", - "@tailwindcss/oxide-freebsd-x64": "4.1.5", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-x64-musl": "4.1.5", - "@tailwindcss/oxide-wasm32-wasi": "4.1.5", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", - "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.11.tgz", + "integrity": "sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==", "cpu": [ "arm64" ], @@ -369,9 +162,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", - "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.11.tgz", + "integrity": "sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==", "cpu": [ "arm64" ], @@ -384,9 +177,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", - "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.11.tgz", + "integrity": "sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==", "cpu": [ "x64" ], @@ -399,9 +192,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", - "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.11.tgz", + "integrity": "sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==", "cpu": [ "x64" ], @@ -414,9 +207,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", - "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.11.tgz", + "integrity": "sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==", "cpu": [ "arm" ], @@ -429,9 +222,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", - "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.11.tgz", + "integrity": "sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==", "cpu": [ "arm64" ], @@ -444,9 +237,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", - "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.11.tgz", + "integrity": "sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==", "cpu": [ "arm64" ], @@ -459,9 +252,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", - "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.11.tgz", + "integrity": "sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==", "cpu": [ "x64" ], @@ -474,9 +267,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", - "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.11.tgz", + "integrity": "sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==", "cpu": [ "x64" ], @@ -489,9 +282,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", - "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz", + "integrity": "sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -508,7 +301,7 @@ "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.9", + "@napi-rs/wasm-runtime": "^0.2.11", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, @@ -517,9 +310,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", - "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.11.tgz", + "integrity": "sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==", "cpu": [ "arm64" ], @@ -532,9 +325,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", - "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.11.tgz", + "integrity": "sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==", "cpu": [ "x64" ], @@ -546,6 +339,63 @@ "node": ">= 10" } }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz", + "integrity": "sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "postcss": "^8.4.41", + "tailwindcss": "4.1.11" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -557,21 +407,102 @@ "node": ">=8" } }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "bin": { - "detect-libc": "bin/detect-libc.js" + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=0.10" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "engines": { + "node": ">=18" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -580,6 +511,14 @@ "node": ">=10.13.0" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -591,11 +530,75 @@ "node": ">=8" } }, + "node_modules/flyonui": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/flyonui/-/flyonui-2.2.0.tgz", + "integrity": "sha512-Gncal89zwklAYpqV8IjSgN/1edsXnbTlxhfKRcYa2WgeY8jBSuoNBQWqdL1DSLuXarxYluimwIv34YaRKNuSzg==", + "dependencies": { + "@floating-ui/dom": "^1.6.13" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -604,6 +607,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -631,10 +642,21 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/lightningcss": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", - "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dependencies": { "detect-libc": "^2.0.3" }, @@ -646,22 +668,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.2", - "lightningcss-darwin-x64": "1.29.2", - "lightningcss-freebsd-x64": "1.29.2", - "lightningcss-linux-arm-gnueabihf": "1.29.2", - "lightningcss-linux-arm64-gnu": "1.29.2", - "lightningcss-linux-arm64-musl": "1.29.2", - "lightningcss-linux-x64-gnu": "1.29.2", - "lightningcss-linux-x64-musl": "1.29.2", - "lightningcss-win32-arm64-msvc": "1.29.2", - "lightningcss-win32-x64-msvc": "1.29.2" + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", - "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", "cpu": [ "arm64" ], @@ -678,9 +700,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", - "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", "cpu": [ "x64" ], @@ -697,9 +719,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", - "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", "cpu": [ "x64" ], @@ -716,9 +738,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", - "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", "cpu": [ "arm" ], @@ -735,9 +757,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", - "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", "cpu": [ "arm64" ], @@ -754,9 +776,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", - "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", "cpu": [ "arm64" ], @@ -773,9 +795,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", "cpu": [ "x64" ], @@ -792,9 +814,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", "cpu": [ "x64" ], @@ -811,9 +833,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", "cpu": [ "arm64" ], @@ -830,9 +852,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", - "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", "cpu": [ "x64" ], @@ -848,46 +870,82 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss/node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dependencies": { + "minipass": "^7.1.2" }, "engines": { - "node": ">=8.6" + "node": ">= 18" } }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "mkdirp": "dist/cjs/src/bin.js" + }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/picocolors": { "version": "1.1.1", @@ -905,24 +963,294 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-cli": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", + "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", + "dependencies": { + "chokidar": "^3.3.0", + "dependency-graph": "^1.0.0", + "fs-extra": "^11.0.0", + "picocolors": "^1.0.0", + "postcss-load-config": "^5.0.0", + "postcss-reporter": "^7.0.0", + "pretty-hrtime": "^1.0.3", + "read-cache": "^1.0.0", + "slash": "^5.0.0", + "tinyglobby": "^0.2.12", + "yargs": "^17.0.0" + }, + "bin": { + "postcss": "index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-reporter": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", + "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "picocolors": "^1.0.0", + "thenby": "^1.3.4" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } }, "node_modules/tailwindcss": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", - "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==" + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz", + "integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "engines": { "node": ">=6" } }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/thenby": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", + "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -934,24 +1262,85 @@ "node": ">=8.0" } }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { - "node": ">=4.0.0" + "node": ">= 10.0.0" } }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "engines": { + "node": ">=18" + } + }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" } } } diff --git a/Moonlight.Client.Runtime/Styles/package.json b/Moonlight.Client.Runtime/Styles/package.json index 716d25ce..d528236e 100644 --- a/Moonlight.Client.Runtime/Styles/package.json +++ b/Moonlight.Client.Runtime/Styles/package.json @@ -1,14 +1,23 @@ { - "dependencies": { - "@tailwindcss/cli": "^4.1.4", - "@tailwindcss/forms": "^0.5.10", - "tailwindcss": "^4.1.4", - "xml2js": "^0.6.2" - }, + "name": "styles", + "version": "1.0.0", + "description": "", + "main": "index.js", "scripts": { - "pretailwind-build": "node resolveNuget.js ../Moonlight.Client.Runtime.csproj", - "tailwind-build": "npx tailwindcss -i style.css -o ../wwwroot/css/style.min.css", - "pretailwind": "node resolveNuget.js ../Moonlight.Client.Runtime.csproj", - "tailwind": "npx tailwindcss -i style.css -o ../wwwroot/css/style.min.css --watch" + "tailwind": "npx postcss styles.css -o ../wwwroot/css/style.min.css --watch", + "tailwind-build": "npx postcss styles.css -o ../wwwroot/css/style.min.css", + "mappings": "EXTRACT_CLASSES=true npx postcss styles.css -o ../wwwroot/css/style.min.css " + }, + "author": "", + "license": "ISC", + "dependencies": { + "@tailwindcss/postcss": "^4.1.11", + "flyonui": "^2.2.0", + "tailwindcss": "^4.1.11", + "postcss": "^8.5.6", + "postcss-cli": "^11.0.1", + "postcss-selector-parser": "^7.1.0" + }, + "devDependencies": { } } diff --git a/Moonlight.Client.Runtime/Styles/postcss.config.js b/Moonlight.Client.Runtime/Styles/postcss.config.js new file mode 100644 index 00000000..82078a37 --- /dev/null +++ b/Moonlight.Client.Runtime/Styles/postcss.config.js @@ -0,0 +1,11 @@ +const tailwindcss = require('@tailwindcss/postcss'); +const extractClasses = require('./extract-classes'); + +module.exports = { + plugins: [ + tailwindcss + ], +}; + +if(process.env.EXTRACT_CLASSES === "true") + module.exports.plugins.push(extractClasses); \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/preTailwind.css b/Moonlight.Client.Runtime/Styles/preTailwind.css deleted file mode 100644 index 84c676a4..00000000 --- a/Moonlight.Client.Runtime/Styles/preTailwind.css +++ /dev/null @@ -1 +0,0 @@ -@import "./additions/fonts.css"; \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/resolveNuget.js b/Moonlight.Client.Runtime/Styles/resolveNuget.js deleted file mode 100644 index 15fcb577..00000000 --- a/Moonlight.Client.Runtime/Styles/resolveNuget.js +++ /dev/null @@ -1,80 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const os = require('os'); -const xml2js = require('xml2js'); - -// Helpers -function getPackageRefs(csprojPath) { - const xml = fs.readFileSync(csprojPath, 'utf8'); - const parser = new xml2js.Parser(); - - return new Promise((resolve, reject) => { - parser.parseString(xml, (err, result) => { - if (err) return reject(err); - - const itemGroups = result.Project.ItemGroup || []; - const refs = []; - - for (const group of itemGroups) { - const packages = group.PackageReference || []; - for (const pkg of packages) { - const name = pkg.$.Include; - const version = pkg.$.Version || (pkg.Version && pkg.Version[0]); - if (name && version) { - refs.push({ name: name.toLowerCase(), version }); - } - } - } - resolve(refs); - }); - }); -} - -async function main() { - const csprojPath = process.argv[2]; - if (!csprojPath || !fs.existsSync(csprojPath)) { - console.error('Usage: Missing csproj path'); - process.exit(1); - } - - const nugetPath = path.join(os.homedir(), '.nuget', 'packages'); - const moonlightDir = path.join(__dirname, 'node_modules', 'moonlight'); - fs.mkdirSync(moonlightDir, { recursive: true }); - - const refs = await getPackageRefs(csprojPath); - - var outputCss = ""; - var preOutputCss = ""; - - for (const { name, version } of refs) { - const packagePath = path.join(nugetPath, name, version); - const exportsFile = path.join(packagePath, 'styles', 'exports.css'); - const preTailwindFile = path.join(packagePath, 'styles', 'preTailwind.css'); - const sourceFolder = path.join(packagePath, 'src'); - - const rel = (p) => p.replace(/\\/g, '/'); - - if (fs.existsSync(exportsFile)) { - outputCss += `@import "${rel(exportsFile)}";\n`; - } - - if (fs.existsSync(preTailwindFile)) { - preOutputCss += `@import "${rel(preTailwindFile)}";\n`; - } - - if (fs.existsSync(sourceFolder)) { - outputCss += `@source "${rel(path.join(sourceFolder, "**", "*.razor"))}";\n`; - outputCss += `@source "${rel(path.join(sourceFolder, "**", "*.cs"))}";\n`; - outputCss += `@source "${rel(path.join(sourceFolder, "**", "*.html"))}";\n`; - } - } - - fs.writeFileSync(path.join(moonlightDir, 'nuget.css'), outputCss); - fs.writeFileSync(path.join(moonlightDir, 'preTailwind.nuget.css'), preOutputCss); - console.log(`Generated nuget.css in ${moonlightDir}`); -} - -main().catch(err => { - console.error(err); - process.exit(1); -}); \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/style.css b/Moonlight.Client.Runtime/Styles/style.css deleted file mode 100644 index e79f77f2..00000000 --- a/Moonlight.Client.Runtime/Styles/style.css +++ /dev/null @@ -1,21 +0,0 @@ -@import "./preTailwind.css"; -@import "moonlight/preTailwind.nuget.css"; - -@import "tailwindcss"; - -@import "./exports.css"; -@import "moonlight/nuget.css"; - -@plugin "@tailwindcss/forms" { - strategy: "base"; -} - -@source "../**/*.razor"; -@source "../**/*.cs"; -@source "../**/*.html"; - -@source "../../Moonlight.Client/**/*.razor"; -@source "../../Moonlight.Client/**/*.cs"; -@source "../../Moonlight.Client/**/*.html"; - -@source "./mappings/*.map"; \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/styles.css b/Moonlight.Client.Runtime/Styles/styles.css new file mode 100644 index 00000000..8fce4f02 --- /dev/null +++ b/Moonlight.Client.Runtime/Styles/styles.css @@ -0,0 +1,112 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=fallback') layer(base); +@import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&display=swap') layer()base; +@import url("https://cdn.jsdelivr.net/npm/lucide-static/font/lucide.css") layer(base); + +@import "tailwindcss"; +@import "./node_modules/flyonui/variants.css"; +@import "./theme.css"; + +@theme { + --font-inter: "Inter", var(--font-sans); + --font-scp: "Source Code Pro", var(--font-mono); + + --color-background: var(--mooncore-color-background); + --color-base-150: var(--mooncore-color-base-150); + --color-base-250: var(--mooncore-color-base-250); +} + +@plugin "flyonui" { + themes: mooncore --default; +} + +@source "./node_modules/flyonui/dist/index.js"; + +@source "../**/*.razor"; +@source "../**/*.cs"; +@source "../**/*.html"; + +@source "../../Moonlight.Client/**/*.cs"; +@source "../../Moonlight.Client/**/*.html"; +@source "../../Moonlight.Client/**/*.razor"; +@source "../../Moonlight.Client/Styles/mappings/*.map"; + +@source "../../Moonlight.ApiServer/**/*.razor"; + +#blazor-error-ui { + display: none; +} + +#blazor-loader-label:after { + content: var(--blazor-load-percentage-text, "Loading"); +} + +#blazor-loader-progress { + width: var(--blazor-load-percentage, 0%); +} + +@plugin "flyonui/theme" { + name: "mooncore"; + default: true; + prefersdark: true; + color-scheme: "dark"; + --color-base-100: var(--mooncore-color-base-100); + --color-base-200: var(--mooncore-color-base-200); + --color-base-300: var(--mooncore-color-base-300); + --color-base-content: var(--mooncore-color-base-content); + --color-primary: var(--mooncore-color-primary); + --color-primary-content: var(--mooncore-color-primary-content); + --color-secondary: var(--mooncore-color-secondary); + --color-secondary-content: var(--mooncore-color-secondary-content); + --color-accent: var(--mooncore-color-accent); + --color-accent-content: var(--mooncore-color-accent-content); + --color-neutral: var(--mooncore-color-neutral); + --color-neutral-content: var(--mooncore-color-neutral-content); + --color-info: var(--mooncore-color-info); + --color-info-content: var(--mooncore-color-info-content); + --color-success: var(--mooncore-color-success); + --color-success-content: var(--mooncore-color-success-content); + --color-warning: var(--mooncore-color-warning); + --color-warning-content: var(--mooncore-color-warning-content); + --color-error: var(--mooncore-color-error); + --color-error-content: var(--mooncore-color-error-content); + --radius-selector: var(--mooncore-radius-selector); + --radius-field: var(--mooncore-radius-field); + --radius-box: var(--mooncore-radius-box); + --size-selector: var(--mooncore-size-selector); + --size-field: var(--mooncore-size-field); + --border: var(--mooncore-border); + --depth: var(--mooncore-depth); + --noise: var(--mooncore-noise); +} + +@layer utilities { + .btn { + @apply text-sm font-medium inline-flex items-center justify-center; + } + + .checkbox { + @apply border-base-content/30 bg-base-100; + } + + .input { + @apply !border-base-content/20 border-2 ring-0! outline-0! focus:border-primary! focus-within:border-primary! bg-base-200/50; + } + + .advance-select-toggle { + @apply !border-base-content/20 border-2 ring-0! outline-0! focus:border-primary! focus-within:border-primary! bg-base-200/50; + } + + .table { + :where(th, td) { + @apply py-1.5; + } + } + + .dropdown-item { + @apply px-2.5 py-1.5 text-sm; + } + + .dropdown-menu { + @apply bg-base-150; + } +} \ No newline at end of file diff --git a/Moonlight.Client.Runtime/Styles/theme.css b/Moonlight.Client.Runtime/Styles/theme.css new file mode 100644 index 00000000..4401a5fd --- /dev/null +++ b/Moonlight.Client.Runtime/Styles/theme.css @@ -0,0 +1,33 @@ +@theme { + --mooncore-color-background: #0c0f18; + --mooncore-color-base-100: #1e2b47; + --mooncore-color-base-150: #1a2640; + --mooncore-color-base-200: #101a2e; + --mooncore-color-base-250: #0f1729; + --mooncore-color-base-300: #0c1221; + --mooncore-color-base-content: #dde5f5; + --mooncore-color-primary: oklch(.511 .262 276.966); + --mooncore-color-primary-content: #dde5f5; + --mooncore-color-secondary: oklch(37% 0.034 259.733); + --mooncore-color-secondary-content: #dde5f5; + --mooncore-color-accent: oklch(.627 .265 303.9); + --mooncore-color-accent-content: #dde5f5; + --mooncore-color-neutral: #dde5f5; + --mooncore-color-neutral-content: oklch(14% 0.005 285.823); + --mooncore-color-info: oklch(.546 .245 262.881); + --mooncore-color-info-content: #dde5f5; + --mooncore-color-success: oklch(.627 .194 149.214); + --mooncore-color-success-content: #dde5f5; + --mooncore-color-warning: oklch(.828 .189 84.429); + --mooncore-color-warning-content: #dde5f5; + --mooncore-color-error: oklch(.586 .253 17.585); + --mooncore-color-error-content: #dde5f5; + --mooncore-radius-selector: 0.25rem; + --mooncore-radius-field: 0.5rem; + --mooncore-radius-box: 0.5rem; + --mooncore-size-selector: 0.25rem; + --mooncore-size-field: 0.25rem; + --mooncore-border: 1px; + --mooncore-depth: 0; + --mooncore-noise: 0; +} \ No newline at end of file diff --git a/Moonlight.Client/Implementations/SysFileSystemProvider.cs b/Moonlight.Client/Implementations/SysFileSystemProvider.cs deleted file mode 100644 index 32718012..00000000 --- a/Moonlight.Client/Implementations/SysFileSystemProvider.cs +++ /dev/null @@ -1,134 +0,0 @@ -using MoonCore.Blazor.Services; -using MoonCore.Blazor.Tailwind.Fm; -using MoonCore.Blazor.Tailwind.Fm.Models; -using MoonCore.Helpers; -using Moonlight.Shared.Http.Requests.Admin.Sys.Files; -using Moonlight.Shared.Http.Responses.Admin.Sys; - -namespace Moonlight.Client.Implementations; - -public class SysFileSystemProvider : IFileSystemProvider, ICompressFileSystemProvider -{ - private readonly DownloadService DownloadService; - private readonly HttpApiClient HttpApiClient; - private readonly LocalStorageService LocalStorageService; - private readonly string BaseApiUrl = "api/admin/system/files"; - - public CompressType[] CompressTypes { get; } = - [ - new() - { - Extension = "zip", - DisplayName = "ZIP Archive" - }, - new() - { - Extension = "tar.gz", - DisplayName = "GZ Compressed Tar Archive" - } - ]; - - public SysFileSystemProvider( - HttpApiClient httpApiClient, - DownloadService downloadService, - LocalStorageService localStorageService - ) - { - HttpApiClient = httpApiClient; - DownloadService = downloadService; - LocalStorageService = localStorageService; - } - - public async Task List(string path) - { - var entries = await HttpApiClient.GetJson( - $"{BaseApiUrl}/list?path={path}" - ); - - return entries.Select(x => new FileSystemEntry() - { - Name = x.Name, - Size = x.Size, - CreatedAt = x.CreatedAt, - IsFile = x.IsFile, - UpdatedAt = x.UpdatedAt - }).ToArray(); - } - - public async Task Create(string path, Stream stream) - { - await Upload(_ => Task.CompletedTask, path, stream); - } - - public async Task Move(string oldPath, string newPath) - => await HttpApiClient.Post($"{BaseApiUrl}/move?oldPath={oldPath}&newPath={newPath}"); - - public async Task Delete(string path) - => await HttpApiClient.Delete($"{BaseApiUrl}/delete?path={path}"); - - public async Task CreateDirectory(string path) - => await HttpApiClient.Post($"{BaseApiUrl}/mkdir?path={path}"); - - public async Task Read(string path) - => await HttpApiClient.GetStream($"{BaseApiUrl}/download?path={path}"); - - public async Task Download(Func updateProgress, string path, string fileName) - { - var accessToken = await LocalStorageService.GetString("AccessToken"); - - await DownloadService.DownloadUrl(fileName, $"{BaseApiUrl}/download?path={path}", - async (loaded, total) => - { - var percent = total == 0 ? 0 : (int)Math.Round((float)loaded / total * 100); - await updateProgress.Invoke(percent); - }, - onConfigureHeaders: headers => { headers.Add("Authorization", $"Bearer {accessToken}"); } - ); - } - - public async Task Upload(Func updateProgress, string path, Stream stream) - { - var size = stream.Length; - var chunkSize = ByteConverter.FromMegaBytes(20).Bytes; - - var chunks = size / chunkSize; - chunks += size % chunkSize > 0 ? 1 : 0; - - for (var chunkId = 0; chunkId < chunks; chunkId++) - { - var percent = (int)Math.Round((chunkId + 1f) / chunks * 100); - await updateProgress.Invoke(percent); - - var buffer = new byte[chunkSize]; - var bytesRead = await stream.ReadAsync(buffer); - - var uploadForm = new MultipartFormDataContent(); - uploadForm.Add(new ByteArrayContent(buffer, 0, bytesRead), "file", path); - - await HttpApiClient.Post( - $"{BaseApiUrl}/upload?path={path}&totalSize={size}&chunkId={chunkId}", - uploadForm - ); - } - } - - public async Task Compress(CompressType type, string path, string[] itemsToCompress) - { - await HttpApiClient.Post($"{BaseApiUrl}/compress", new CompressRequest() - { - Type = type.Extension, - Path = path, - ItemsToCompress = itemsToCompress - }); - } - - public async Task Decompress(CompressType type, string path, string destination) - { - await HttpApiClient.Post($"{BaseApiUrl}/decompress", new DecompressRequest() - { - Type = type.Extension, - Path = path, - Destination = destination - }); - } -} \ No newline at end of file diff --git a/Moonlight.Client/Implementations/SystemFsAccess.cs b/Moonlight.Client/Implementations/SystemFsAccess.cs new file mode 100644 index 00000000..83843570 --- /dev/null +++ b/Moonlight.Client/Implementations/SystemFsAccess.cs @@ -0,0 +1,88 @@ +using MoonCore.Blazor.FlyonUi.Files; +using MoonCore.Blazor.FlyonUi.Files.Manager; +using MoonCore.Helpers; +using Moonlight.Shared.Http.Responses.Admin.Sys; + +namespace Moonlight.Client.Implementations; + +public class SystemFsAccess : IFsAccess +{ + private readonly HttpApiClient ApiClient; + + private const string BaseApiUrl = "api/admin/system/files"; + + public SystemFsAccess(HttpApiClient apiClient) + { + ApiClient = apiClient; + } + + public async Task CreateFile(string path) + { + await ApiClient.Post( + $"{BaseApiUrl}/touch?path={path}" + ); + } + + public async Task CreateDirectory(string path) + { + await ApiClient.Post( + $"{BaseApiUrl}/mkdir?path={path}" + ); + } + + public async Task List(string path) + { + var entries = await ApiClient.GetJson( + $"{BaseApiUrl}/list?path={path}" + ); + + return entries.Select(x => new FsEntry() + { + Name = x.Name, + CreatedAt = x.CreatedAt, + IsFolder = x.IsFolder, + Size = x.Size, + UpdatedAt = x.UpdatedAt + }).ToArray(); + } + + public async Task Move(string oldPath, string newPath) + { + await ApiClient.Post( + $"{BaseApiUrl}/move?oldPath={oldPath}&newPath={newPath}" + ); + } + + public Task Read(string path, Func onHandleData) + { + throw new NotImplementedException(); + } + + public Task Write(string path, Stream dataStream) + { + throw new NotImplementedException(); + } + + public async Task Delete(string path) + { + await ApiClient.Delete( + $"{BaseApiUrl}/delete?path={path}" + ); + } + + public async Task UploadChunk(string path, int chunkId, long chunkSize, long totalSize, byte[] data) + { + using var formContent = new MultipartFormDataContent(); + formContent.Add(new ByteArrayContent(data), "file", "file"); + + await ApiClient.Post( + $"{BaseApiUrl}/upload?path={path}&chunkId={chunkId}&chunkSize={chunkSize}&totalSize={totalSize}", + formContent + ); + } + + public Task DownloadChunk(string path, int chunkId, long chunkSize) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/Moonlight.Client/Moonlight.Client.csproj b/Moonlight.Client/Moonlight.Client.csproj index 46b6a65e..c750ac57 100644 --- a/Moonlight.Client/Moonlight.Client.csproj +++ b/Moonlight.Client/Moonlight.Client.csproj @@ -12,7 +12,7 @@ frontend Moonlight.Client - 2.1.1 + 2.1.2 Moonlight Panel A build of the client for moonlight development https://github.com/Moonlight-Panel/Moonlight @@ -22,9 +22,9 @@ - + - + @@ -58,6 +58,11 @@ - <_ContentIncludedByDefault Remove="wwwroot\css\style.min.css" /> + <_ContentIncludedByDefault Remove="Properties\launchSettings.json" /> + + + + + \ No newline at end of file diff --git a/Moonlight.Client/Moonlight.Client.targets b/Moonlight.Client/Moonlight.Client.targets new file mode 100644 index 00000000..b0852e0a --- /dev/null +++ b/Moonlight.Client/Moonlight.Client.targets @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Moonlight.Client/Properties/launchSettings.json b/Moonlight.Client/Properties/launchSettings.json deleted file mode 100644 index d9cbefe5..00000000 --- a/Moonlight.Client/Properties/launchSettings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", - "applicationUrl": "http://localhost:5165", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/Moonlight.Client/Services/RemoteAuthStateManager.cs b/Moonlight.Client/Services/RemoteAuthStateManager.cs index 43302b90..caae24cb 100644 --- a/Moonlight.Client/Services/RemoteAuthStateManager.cs +++ b/Moonlight.Client/Services/RemoteAuthStateManager.cs @@ -104,7 +104,7 @@ public class RemoteAuthStateManager : AuthenticationStateManager [ new Claim("username", checkData.Username), new Claim("email", checkData.Email), - new Claim("permissions", checkData.Permissions) + new Claim("permissions", string.Join(";", checkData.Permissions)) ], "RemoteAuthStateManager" ) diff --git a/Moonlight.Client/Styles/mappings/mooncore.map b/Moonlight.Client/Styles/mappings/mooncore.map new file mode 100755 index 00000000..e51bbd7d --- /dev/null +++ b/Moonlight.Client/Styles/mappings/mooncore.map @@ -0,0 +1,513 @@ +!bg-base-100 +!border-base-content/40 +!border-none +!flex +!font-medium +!font-semibold +!h-2.5 +!justify-between +!me-1.5 +!ms-auto +!px-2.5 +!rounded-full +!text-sm +!w-2.5 +*:[grid-area:1/1] +*:first:rounded-tl-lg +*:last:rounded-tr-lg +-left-4 +-ml-4 +-translate-x-full +-translate-y-1/2 +absolute +accordion +accordion-bordered +accordion-toggle +active +active-tab:bg-primary +active-tab:text-base-content +advance-select-menu +advance-select-option +advance-select-tag +advance-select-toggle +alert +alert-error +alert-outline +alert-soft +align-bottom +align-middle +animate-bounce +animate-ping +aria-[current='page']:text-bg-soft-primary +avatar +avatar-away-bottom +avatar-away-top +avatar-busy-bottom +avatar-busy-top +avatar-offline-bottom +avatar-offline-top +avatar-online-bottom +avatar-online-top +avatar-placeholder +badge +badge-error +badge-info +badge-outline +badge-primary +badge-soft +badge-success +bg-background +bg-background/60 +bg-base-100 +bg-base-150 +bg-base-200 +bg-base-200/50 +bg-base-300 +bg-base-300/45 +bg-base-300/50 +bg-base-300/60 +bg-error +bg-info +bg-primary +bg-primary/5 +bg-success +bg-transparent +bg-warning +block +blur +border +border-0 +border-2 +border-b +border-base-content +border-base-content/20 +border-base-content/40 +border-base-content/5 +border-dashed +border-t +border-transparent +bottom-0 +bottom-full +break-words +btn +btn-accent +btn-active +btn-circle +btn-disabled +btn-error +btn-info +btn-outline +btn-primary +btn-secondary +btn-sm +btn-soft +btn-square +btn-success +btn-text +btn-warning +card +card-alert +card-body +card-border +card-footer +card-header +card-title +carousel +carousel-body +carousel-next +carousel-prev +carousel-slide +chat +chat-avatar +chat-bubble +chat-footer +chat-header +chat-receiver +chat-sender +checkbox +checkbox-primary +checkbox-xs +col-span-1 +collapse +combo-box-selected:block +combo-box-selected:dropdown-active +complete +container +contents +cursor-default +cursor-not-allowed +cursor-pointer +diff +disabled +divide-base-150/60 +divide-y +drop-shadow +dropdown +dropdown-disabled +dropdown-item +dropdown-menu +dropdown-open:opacity-100 +dropdown-open:rotate-180 +dropdown-toggle +duration-300 +duration-500 +ease-in-out +ease-linear +end-3 +file-upload-complete:progress-success +fill-black +filter +filter-reset +fixed +flex +flex-1 +flex-col +flex-grow +flex-nowrap +flex-row +flex-shrink-0 +flex-wrap +focus-visible:outline-none +focus-within:border-primary +focus:border-primary +focus:outline-1 +focus:outline-none +focus:outline-primary +focus:ring-0 +font-bold +font-inter +font-medium +font-normal +font-semibold +gap-0.5 +gap-1 +gap-1.5 +gap-2 +gap-3 +gap-4 +gap-5 +gap-6 +gap-x-1 +gap-x-2 +gap-x-3 +gap-y-1 +gap-y-3 +grid +grid-cols-1 +grid-flow-col +grow +grow-0 +h-12 +h-2 +h-32 +h-64 +h-8 +h-auto +h-full +h-screen +helper-text +hidden +hover:bg-primary/5 +hover:bg-transparent +hover:text-base-content +hover:text-base-content/60 +hover:text-primary +image-full +inline +inline-block +inline-flex +inline-grid +input +input-floating +input-floating-label +input-lg +input-md +input-sm +input-xl +inset-0 +inset-y-0 +inset-y-2 +invisible +is-invalid +is-valid +isolate +italic +items-center +items-end +items-start +join +join-item +justify-between +justify-center +justify-end +justify-start +justify-stretch +label-text +leading-3 +leading-3.5 +leading-6 +left-0 +lg:bg-base-100/20 +lg:flex +lg:gap-y-0 +lg:grid-cols-2 +lg:hidden +lg:justify-end +lg:justify-start +lg:min-w-0 +lg:p-10 +lg:pb-5 +lg:pl-64 +lg:pr-3.5 +lg:pt-5 +lg:ring-1 +lg:ring-base-content/10 +lg:rounded-lg +lg:shadow-xs +list-disc +list-inside +loading +loading-lg +loading-sm +loading-spinner +loading-xl +loading-xs +lowercase +m-10 +mask +max-lg:flex-col +max-lg:hidden +max-w-7xl +max-w-80 +max-w-full +max-w-lg +max-w-sm +max-w-xl +mb-0.5 +mb-1 +mb-2 +mb-3 +mb-4 +mb-5 +md:table-cell +md:text-3xl +me-1 +me-1.5 +me-2 +me-5 +menu +menu-active +menu-disabled +menu-dropdown +menu-dropdown-show +menu-focus +menu-horizontal +menu-title +min-h-0 +min-h-svh +min-w-0 +min-w-28 +min-w-48 +min-w-60 +min-w-[100px] +ml-3 +ml-4 +modal +modal-content +modal-dialog +modal-middle +modal-title +mr-4 +ms-1 +ms-2 +ms-3 +mt-1 +mt-1.5 +mt-10 +mt-12 +mt-2 +mt-2.5 +mt-3 +mt-4 +mt-5 +mt-8 +mx-1 +mx-auto +my-3 +my-auto +opacity-0 +opacity-100 +open +origin-top-left +outline +outline-0 +overflow-hidden +overflow-x-auto +overflow-y-auto +overlay-open:duration-50 +overlay-open:opacity-100 +p-0.5 +p-1 +p-2 +p-3 +p-4 +p-5 +p-6 +p-8 +pin-input +pin-input-underline +placeholder-base-content/60 +pointer-events-auto +pointer-events-none +progress +progress-bar +progress-indeterminate +progress-primary +pt-0.5 +pt-3 +px-1.5 +px-2 +px-3 +px-4 +px-5 +py-0.5 +py-1.5 +py-2 +py-2.5 +py-6 +radio +range +relative +resize +ring-0 +ring-1 +ring-white/10 +rounded-box +rounded-field +rounded-full +rounded-lg +rounded-md +rounded-t-lg +row-active +row-hover +rtl:!mr-0 +select +select-disabled:opacity-40 +select-disabled:pointer-events-none +select-floating +select-floating-label +selected +selected:select-active +shadow-base-300/20 +shadow-lg +shadow-xs +shrink-0 +size-10 +size-4 +size-5 +size-8 +skeleton +skeleton-animated +sm:auto-cols-max +sm:flex +sm:items-center +sm:items-end +sm:justify-between +sm:justify-end +sm:max-w-2xl +sm:max-w-3xl +sm:max-w-4xl +sm:max-w-5xl +sm:max-w-6xl +sm:max-w-7xl +sm:max-w-lg +sm:max-w-md +sm:max-w-xl +sm:mb-0 +sm:mt-5 +sm:mt-6 +sm:p-6 +sm:py-2 +sm:text-sm/5 +space-x-1 +space-y-1 +space-y-4 +sr-only +static +status +status-error +sticky +switch +tab +tab-active +table +table-pin-cols +table-pin-rows +tabs +tabs-bordered +tabs-lg +tabs-lifted +tabs-md +tabs-sm +tabs-xl +tabs-xs +text-2xl +text-4xl +text-accent +text-base +text-base-content +text-base-content/40 +text-base-content/50 +text-base-content/60 +text-base-content/70 +text-base-content/80 +text-base/6 +text-center +text-error +text-error-content +text-gray-400 +text-info +text-info-content +text-left +text-lg +text-primary +text-primary-content +text-sm +text-sm/5 +text-success +text-success-content +text-warning +text-warning-content +text-xl +text-xs +text-xs/5 +textarea +textarea-floating +textarea-floating-label +theme-controller +tooltip +tooltip-content +top-0 +top-1/2 +top-full +transform +transition +transition-all +transition-opacity +translate-x-0 +truncate +underline +uppercase +validate +w-0 +w-0.5 +w-12 +w-4 +w-56 +w-64 +w-fit +w-full +whitespace-nowrap +z-10 +z-40 +z-50 \ No newline at end of file diff --git a/Moonlight.Client/UI/Components/StatCard.razor b/Moonlight.Client/UI/Components/StatCard.razor index 9be60247..16c026b9 100644 --- a/Moonlight.Client/UI/Components/StatCard.razor +++ b/Moonlight.Client/UI/Components/StatCard.razor @@ -1,11 +1,11 @@ 
-

+

@Text

-

@Title

+

@Title

@code diff --git a/Moonlight.Client/UI/Components/ThemeColorSelector.razor b/Moonlight.Client/UI/Components/ThemeColorSelector.razor index a8e8b742..150bd8e0 100644 --- a/Moonlight.Client/UI/Components/ThemeColorSelector.razor +++ b/Moonlight.Client/UI/Components/ThemeColorSelector.razor @@ -17,7 +17,7 @@ @(currentHex) -
diff --git a/Moonlight.Client/UI/Components/WelcomeOverviewElement.razor b/Moonlight.Client/UI/Components/WelcomeOverviewElement.razor index b8b118fc..3d5bec1b 100644 --- a/Moonlight.Client/UI/Components/WelcomeOverviewElement.razor +++ b/Moonlight.Client/UI/Components/WelcomeOverviewElement.razor @@ -5,7 +5,7 @@
Welcome, @(Username)
-
What do you want to do today?
+
What do you want to do today?
diff --git a/Moonlight.Client/UI/Layouts/MainLayout.razor b/Moonlight.Client/UI/Layouts/MainLayout.razor index 1a12401e..c47f49f2 100644 --- a/Moonlight.Client/UI/Layouts/MainLayout.razor +++ b/Moonlight.Client/UI/Layouts/MainLayout.razor @@ -1,13 +1,14 @@ @using Moonlight.Client.UI.Partials +@using MoonCore.Blazor.FlyonUi.Files.Drop @inherits LayoutComponentBase -
+
-
+
@Body @@ -15,20 +16,21 @@
-
+ +
-
+
- + An unhandled error has occurred.
diff --git a/Moonlight.Client/UI/Partials/AppHeader.razor b/Moonlight.Client/UI/Partials/AppHeader.razor index 33e97e46..7cf6266f 100644 --- a/Moonlight.Client/UI/Partials/AppHeader.razor +++ b/Moonlight.Client/UI/Partials/AppHeader.razor @@ -2,11 +2,11 @@ @inject NavigationManager Navigation -
+
@@ -18,12 +18,12 @@
-
+
diff --git a/Moonlight.Client/UI/Partials/AppSidebar.razor b/Moonlight.Client/UI/Partials/AppSidebar.razor index f47ef4aa..815cf189 100644 --- a/Moonlight.Client/UI/Partials/AppSidebar.razor +++ b/Moonlight.Client/UI/Partials/AppSidebar.razor @@ -17,17 +17,17 @@